Files
eminuxCRM/app/views/mailings/_form.html.erb
T
eminuxandCursor 98dcdbbf82
CI / lint (push) Failing after 16m2s
CI / scan_ruby (push) Has been cancelled
CI / scan_js (push) Has been cancelled
Aggiunge fascia oraria, prova manuale obbligatoria e cruscotto invii email.
Le campagne rispettano orario e giorni lavorativi, richiedono una mail di test con dati inseriti a mano prima dell'invio massivo e offrono una dashboard per monitorare l'avanzamento.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-18 00:04:33 +02:00

132 lines
7.4 KiB
ERB
Raw 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 text-zinc-900 dark:border-zinc-800 dark:bg-zinc-900 dark:text-zinc-100 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 class="grid gap-4 md:grid-cols-2">
<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">Lista destinatari</label>
<%= f.select :audience, Catalog::MAILING_AUDIENCES.map { |k, v| [v, k] }, {}, class: input_class %>
</div>
<div class="md:col-span-2">
<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>
<div class="rounded-lg border border-zinc-200 p-4 dark:border-zinc-700" data-controller="send-window">
<label class="flex items-start gap-2 text-sm">
<%= f.check_box :send_window_enabled, { 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-2 text-sm">
<%= f.check_box :ab_test, { 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-wrap items-center gap-2 border-t border-zinc-100 pt-4 dark:border-zinc-800">
<%= f.submit mailing.new_record? ? "Crea bozza" : "Salva", class: btn_primary %>
<%= link_to "Annulla", mailing.new_record? ? dashboard_mailings_path : mailing_path(mailing), class: btn_secondary %>
</div>
</div>
<div>
<%= render "shared/merge_tokens" %>
</div>
<% end %>