Files
eminuxandCursor 1f946f63ba
CI / scan_ruby (push) Failing after 18m40s
CI / scan_js (push) Successful in 11m46s
CI / lint (push) Failing after 13m8s
Aggiunge filtri avanzati per i destinatari delle campagne email.
La scelta della lista passa da un wizard a tre passi, con anteprima del conteggio e lista congelata solo dopo la conferma.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-24 21:00:11 +02:00

127 lines
7.2 KiB
ERB
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<%= form_with model: mailing, class: "grid gap-6 lg:grid-cols-[1fr_16rem]", html: { multipart: true } do |f| %>
<div class="space-y-6 rounded-xl border border-zinc-200 bg-white p-4 text-zinc-900 dark:border-zinc-800 dark:bg-zinc-900 dark:text-zinc-100 md:p-6" data-controller="ab-test">
<%= render "shared/errors", object: mailing %>
<% if @mail_identities.blank? %>
<div class="rounded-lg border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-900 dark:border-amber-900 dark:bg-amber-950 dark:text-amber-100">
Serve almeno un account SMTP attivo.
<% if current_user.admin? %>
<%= link_to "Censiscine uno", new_mail_identity_path, class: "font-medium underline" %>.
<% end %>
</div>
<% end %>
<div>
<label class="mb-1 block text-sm font-medium">Nome invio</label>
<%= f.text_field :name, required: true, class: input_class %>
</div>
<div>
<label class="mb-1 block text-sm font-medium">Account mittente</label>
<%= f.collection_select :mail_identity_id, @mail_identities, :id, :name, { prompt: "Scegli SMTP" }, { class: input_class, required: true } %>
</div>
<div>
<label class="mb-1 block text-sm font-medium">Pausa tra un invio e laltro (secondi)</label>
<%= f.number_field :interval_seconds, min: 0, max: 86_400, class: input_class %>
<p class="mt-1 text-xs text-zinc-500">0 = in coda una dopo laltra, senza attesa. Es. 120 = una email ogni 2 minuti.</p>
</div>
<div class="rounded-lg border border-zinc-200 p-4 dark:border-zinc-700" data-controller="send-window">
<label class="flex items-start gap-3 text-sm">
<%= f.check_box :send_window_enabled, { class: "mt-0.5 size-5", data: { send_window_target: "checkbox", action: "send-window#toggle" } } %>
<span>
<span class="font-medium">Invia solo in fascia oraria</span>
<span class="mt-1 block text-xs text-zinc-500">Le email partono solo nei giorni lavorativi (lunven, esclusi i festivi italiani). Se la fascia finisce, linvio riprende dal giorno lavorativo successivo.</span>
</span>
</label>
<div class="mt-4 grid gap-4 md:grid-cols-2 <%= "hidden" unless mailing.send_window_enabled? %>" data-send-window-target="panel">
<div>
<label class="mb-1 block text-sm font-medium">Dalle</label>
<%= f.time_field :send_window_start_tod, include_seconds: false, step: 60, class: input_class %>
</div>
<div>
<label class="mb-1 block text-sm font-medium">Alle</label>
<%= f.time_field :send_window_end_tod, include_seconds: false, step: 60, class: input_class %>
</div>
</div>
</div>
<div class="rounded-lg border border-zinc-200 p-4 dark:border-zinc-700">
<label class="flex items-start gap-3 text-sm">
<%= f.check_box :ab_test, { class: "mt-0.5 size-5", data: { ab_test_target: "checkbox", action: "ab-test#toggle" } } %>
<span>
<span class="font-medium">Test A/B su questa comunicazione</span>
<span class="mt-1 block text-xs text-zinc-500">Due versioni della stessa email. Carica un template A e un template B nelle colonne: ogni destinatario ne riceve una.</span>
</span>
</label>
<div class="mt-4 <%= "hidden" unless mailing.ab_test? %>" data-ab-test-target="panel">
<label class="mb-1 block text-sm font-medium">Come assegnare A e B</label>
<%= f.select :ab_assignment, Catalog::MAILING_AB_ASSIGNMENTS.map { |k, v| [v, k] }, {}, class: input_class %>
<p class="mt-1 text-xs text-zinc-500">«Già in scheda» usa il Test A/B della trattativa (es. campagna MatchLiveTV). «Suddividi a metà» alterna A e B sulla lista.</p>
</div>
</div>
<% templates_payload = mail_templates_picker_payload(@mail_templates) %>
<div class="grid gap-6 <%= "lg:grid-cols-2" if mailing.ab_test? %>" data-ab-test-target="grid">
<%= tag.div class: "space-y-4", data: { controller: "template-picker", template_picker_templates_value: templates_payload } do %>
<h2 class="text-sm font-semibold uppercase tracking-wide text-zinc-500">Variante A</h2>
<div>
<label class="mb-1 block text-sm font-medium">Template A</label>
<%= f.collection_select :mail_template_id, @mail_templates, :id, :name,
{ include_blank: "Nessuno — scrivi a mano" },
{ class: input_class, data: { template_picker_target: "select", action: "change->template-picker#apply" } } %>
<p class="mt-1 text-xs text-zinc-500">Scegliendo un template, oggetto e testo si copiano qui sotto. Poi puoi modificarli solo per questo invio.</p>
</div>
<div>
<label class="mb-1 block text-sm font-medium">Oggetto A</label>
<%= f.text_field :subject, required: true, class: input_class, data: { template_picker_target: "subject" } %>
</div>
<div>
<%= render "shared/wysiwyg_field", form: f, method: :body_html, label: "Corpo HTML A" %>
</div>
<% end %>
<%= tag.div class: "space-y-4 #{'hidden' unless mailing.ab_test?}", data: { controller: "template-picker", template_picker_templates_value: templates_payload, ab_test_target: "panel" } do %>
<h2 class="text-sm font-semibold uppercase tracking-wide text-zinc-500">Variante B</h2>
<div>
<label class="mb-1 block text-sm font-medium">Template B</label>
<%= f.collection_select :mail_template_b_id, @mail_templates, :id, :name,
{ include_blank: "Nessuno — scrivi a mano" },
{ class: input_class, data: { template_picker_target: "select", action: "change->template-picker#apply" } } %>
<p class="mt-1 text-xs text-zinc-500">Stesso meccanismo della variante A: il template riempie oggetto e corpo B.</p>
</div>
<div>
<label class="mb-1 block text-sm font-medium">Oggetto B</label>
<%= f.text_field :subject_b, class: input_class, data: { template_picker_target: "subject" } %>
</div>
<div>
<%= render "shared/wysiwyg_field", form: f, method: :body_html_b, label: "Corpo HTML B" %>
</div>
<% end %>
</div>
<div>
<label class="mb-1 block text-sm font-medium">Allegati (stessi per A e B)</label>
<%= f.file_field :files, multiple: true, class: "block w-full text-sm text-zinc-600 file:mr-3 file:rounded-lg file:border-0 file:bg-zinc-900 file:px-3 file:py-2 file:text-sm file:font-medium file:text-white dark:text-zinc-300 dark:file:bg-zinc-100 dark:file:text-zinc-900" %>
<% if mailing.files.attached? %>
<ul class="mt-2 space-y-1 text-sm text-zinc-600 dark:text-zinc-300">
<% mailing.files.each do |file| %>
<li><%= file.filename %></li>
<% end %>
</ul>
<% end %>
</div>
<div class="flex flex-col gap-2 border-t border-zinc-100 pt-4 sm:flex-row dark:border-zinc-800">
<%= f.submit mailing.new_record? ? "Continua: destinatari" : "Salva messaggio", class: "#{btn_primary} w-full sm:w-auto" %>
<%= link_to "Annulla", mailing.new_record? ? dashboard_mailings_path : mailing_path(mailing), class: "#{btn_secondary} w-full sm:w-auto" %>
</div>
</div>
<div>
<%= render "shared/merge_tokens" %>
</div>
<% end %>