112 lines
6.2 KiB
ERB
112 lines
6.2 KiB
ERB
<%= 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 l’altro (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 l’altra, 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">
|
||
<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? ? mailings_path : mailing_path(mailing), class: btn_secondary %>
|
||
</div>
|
||
</div>
|
||
|
||
<div>
|
||
<%= render "shared/merge_tokens" %>
|
||
</div>
|
||
<% end %>
|