Files
eminuxCRM/app/views/mailings/_form.html.erb
T
eminuxandCursor a33a281a96
CI / scan_ruby (push) Failing after 11m35s
CI / scan_js (push) Successful in 11m13s
CI / lint (push) Failing after 11m53s
Migliora pipeline e form per l'uso da cellulare.
Rende la pipeline verticale su mobile e semplifica i form lunghi con sezioni, tap target più grandi e azioni più facili da usare in movimento.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-18 11:38:48 +02:00

132 lines
7.5 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 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 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-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? ? "Crea bozza" : "Salva", 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 %>