Files
eminuxCRM/app/views/mailings/show.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

234 lines
12 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.
<%= tag.div class: "space-y-6", data: (@mailing.sending? ? { controller: "auto-reload", auto_reload_interval_value: 10_000 } : {}) do %>
<div class="flex flex-wrap items-start justify-between gap-3">
<div>
<h1 class="text-2xl font-semibold tracking-tight"><%= @mailing.name %></h1>
<p class="mt-1 text-sm text-zinc-500">
<%= mailing_status_badge(@mailing.status) %>
· <%= @mailing.audience_label %>
· da <%= @mailing.mail_identity.from_email %>
<% if @mailing.ab_test? %>
· Test A/B · <%= @mailing.ab_assignment_label %>
<% end %>
<% if @mailing.interval_seconds.positive? %>
· pausa <%= @mailing.interval_seconds %>s
<% end %>
<% if @mailing.send_window_enabled? %>
· fascia <%= @mailing.send_window_label %>
<% end %>
</p>
<% if @mailing.sending? && @mailing.next_send_at.present? && @mailing.next_send_at > Time.current %>
<p class="mt-2 rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-sm text-amber-900 dark:border-amber-900 dark:bg-amber-950 dark:text-amber-100">
In pausa fino a <%= l(@mailing.next_send_at, format: :long) %>
<% if @mailing.send_window_enabled? %>
(fuori fascia o giorno non lavorativo).
<% end %>
</p>
<% end %>
</div>
<div class="flex flex-wrap gap-2">
<%= link_to "Cruscotto invii", dashboard_mailings_path, class: btn_secondary %>
<% if @mailing.editable? %>
<%= link_to "Modifica contenuto", edit_mailing_path(@mailing), class: btn_secondary %>
<%= button_to "Aggiorna lista", refresh_recipients_mailing_path(@mailing), method: :post, class: btn_secondary %>
<% end %>
</div>
</div>
<% if @mailing.sending? || @mailing.sent? %>
<%= render "mailings/progress_card", mailing: @mailing %>
<% end %>
<div class="grid gap-4 sm:grid-cols-4">
<div class="<%= card_class %> p-4">
<div class="text-xs uppercase tracking-wide text-zinc-500">Da inviare</div>
<div class="mt-1 text-2xl font-semibold"><%= @mailing.pending_count %></div>
</div>
<div class="<%= card_class %> p-4">
<div class="text-xs uppercase tracking-wide text-zinc-500">Esclusi</div>
<div class="mt-1 text-2xl font-semibold"><%= @mailing.skipped_count %></div>
</div>
<div class="<%= card_class %> p-4">
<div class="text-xs uppercase tracking-wide text-zinc-500">Inviate</div>
<div class="mt-1 text-2xl font-semibold"><%= @mailing.sent_count %></div>
</div>
<div class="<%= card_class %> p-4">
<div class="text-xs uppercase tracking-wide text-zinc-500">Errori</div>
<div class="mt-1 text-2xl font-semibold"><%= @mailing.failed_count %></div>
</div>
</div>
<% if @mailing.ab_test? %>
<div class="grid gap-4 sm:grid-cols-2">
<div class="<%= card_class %> p-4">
<div class="flex items-center justify-between">
<div class="text-xs uppercase tracking-wide text-zinc-500">Variante A</div>
<%= ab_variant_badge("A") %>
</div>
<div class="mt-1 text-2xl font-semibold"><%= @mailing.variant_sent_count("A") %> inviate</div>
<p class="mt-1 text-xs text-zinc-500"><%= @mailing.variant_pending_count("A") %> in coda · <%= @mailing.subject %></p>
</div>
<div class="<%= card_class %> p-4">
<div class="flex items-center justify-between">
<div class="text-xs uppercase tracking-wide text-zinc-500">Variante B</div>
<%= ab_variant_badge("B") %>
</div>
<div class="mt-1 text-2xl font-semibold"><%= @mailing.variant_sent_count("B") %> inviate</div>
<p class="mt-1 text-xs text-zinc-500"><%= @mailing.variant_pending_count("B") %> in coda · <%= @mailing.subject_b %></p>
</div>
</div>
<% end %>
<% if @mailing.files.attached? %>
<div class="<%= card_class %> p-4 text-sm">
<div class="font-medium">Allegati</div>
<ul class="mt-2 space-y-1 text-zinc-600 dark:text-zinc-300">
<% @mailing.files.each do |file| %>
<li><%= file.filename %> <span class="text-xs text-zinc-400">(<%= number_to_human_size(file.byte_size) %>)</span></li>
<% end %>
</ul>
</div>
<% end %>
<div class="grid gap-6 xl:grid-cols-[1.4fr_1fr]">
<section class="<%= card_class %> overflow-hidden">
<div class="flex flex-wrap items-center justify-between gap-2 border-b border-zinc-100 px-4 py-3 dark:border-zinc-800">
<h2 class="font-semibold">Destinatari</h2>
<% if @mailing.editable? %>
<p class="text-xs text-zinc-500">Spunta chi deve ricevere la mail, poi salva la selezione.</p>
<% end %>
</div>
<%= form_with url: update_recipients_mailing_path(@mailing), method: :patch do %>
<div class="overflow-x-auto" data-controller="check-all">
<table class="<%= table_class %>">
<thead class="border-b border-zinc-100 bg-zinc-50 text-left text-xs font-medium uppercase tracking-wide text-zinc-500 dark:border-zinc-800 dark:bg-zinc-800 dark:text-zinc-400">
<tr>
<% if @mailing.editable? %>
<th class="px-4 py-3">
<input type="checkbox" data-check-all-target="source" data-action="check-all#toggle" aria-label="Seleziona tutti">
</th>
<% end %>
<th class="px-4 py-3">Organizzazione</th>
<th class="px-4 py-3">Email</th>
<% if @mailing.ab_test? %>
<th class="px-4 py-3">Test</th>
<% end %>
<th class="px-4 py-3">Stato</th>
<th class="px-4 py-3"></th>
</tr>
</thead>
<tbody class="divide-y divide-zinc-100 dark:divide-zinc-800">
<% @recipients.each do |recipient| %>
<tr class="<%= "opacity-60" unless recipient.email_ok? %>">
<% if @mailing.editable? %>
<td class="px-4 py-3">
<% if recipient.email_ok? %>
<%= check_box_tag "pending_ids[]", recipient.id, recipient.pending?,
id: "recipient_#{recipient.id}",
data: { check_all_target: "checkbox" } %>
<% else %>
<span class="text-zinc-400"></span>
<% end %>
</td>
<% end %>
<td class="px-4 py-3">
<%= link_to recipient.organization.name, recipient.organization, class: "font-medium hover:underline" %>
<div class="text-xs text-zinc-500"><%= recipient.contact&.full_name.presence || "Nessun contatto" %></div>
</td>
<td class="px-4 py-3 text-sm">
<% if recipient.email_ok? %>
<%= recipient.email %>
<% else %>
<span class="text-rose-700"><%= recipient.email.presence || "manca email" %></span>
<% end %>
<% if recipient.skip_reason.present? && !recipient.pending? %>
<div class="text-xs text-zinc-500"><%= recipient.skip_reason %></div>
<% end %>
<% if recipient.error_message.present? %>
<div class="text-xs text-rose-700"><%= recipient.error_message %></div>
<% end %>
</td>
<% if @mailing.ab_test? %>
<td class="px-4 py-3"><%= ab_variant_badge(recipient.ab_variant) || "—" %></td>
<% end %>
<td class="px-4 py-3"><%= mailing_recipient_status_badge(recipient.status) %></td>
<td class="px-4 py-3 text-right text-sm">
<% if recipient.email_ok? %>
<%= link_to "Anteprima", mailing_path(@mailing, recipient_id: recipient.id, variant: recipient.ab_variant), class: "text-zinc-700 hover:underline dark:text-zinc-300" %>
<% end %>
</td>
</tr>
<% end %>
</tbody>
</table>
</div>
<% if @mailing.editable? %>
<div class="flex flex-wrap items-center gap-2 border-t border-zinc-100 px-4 py-3 dark:border-zinc-800">
<%= submit_tag "Salva selezione", class: btn_secondary %>
<span class="text-xs text-zinc-500">I non spuntati restano esclusi da questo invio.</span>
</div>
<% end %>
<% end %>
</section>
<section class="space-y-4">
<% if @mailing.draft? %>
<div class="<%= card_class %> space-y-3 p-4">
<h2 class="font-semibold">1. Prova con dati manuali</h2>
<p class="text-sm text-zinc-500">Compila i campi, controlla lanteprima e manda <strong>una sola email subito</strong> a un indirizzo tuo. Non parte linvio di massa.</p>
<% if @mailing.tested? %>
<p class="rounded-lg border border-emerald-200 bg-emerald-50 px-3 py-2 text-sm text-emerald-900 dark:border-emerald-900 dark:bg-emerald-950 dark:text-emerald-100">
Ultima prova inviata a <%= @mailing.test_sent_to %> il <%= l(@mailing.test_sent_at, format: :short) %>.
</p>
<% end %>
<%= render "mailings/test_send_form", mailing: @mailing %>
</div>
<% end %>
<div class="<%= card_class %> p-4">
<div class="flex items-center justify-between gap-2">
<h2 class="font-semibold">Anteprima da lista<%= " #{@preview_variant}" if @mailing.ab_test? %></h2>
<% if @preview_recipient %>
<span class="text-xs text-zinc-500"><%= @preview_recipient.organization.name %></span>
<% end %>
</div>
<% if @mailing.ab_test? %>
<div class="mt-3 flex gap-2">
<%= link_to "Variante A", mailing_path(@mailing, recipient_id: @preview_recipient&.id, variant: "A"),
class: @preview_variant == "A" ? btn_primary : btn_secondary %>
<%= link_to "Variante B", mailing_path(@mailing, recipient_id: @preview_recipient&.id, variant: "B"),
class: @preview_variant == "B" ? btn_primary : btn_secondary %>
</div>
<% end %>
<p class="mt-2 text-sm font-medium"><%= @preview_subject %></p>
<div class="mt-3 max-h-[28rem] overflow-auto rounded-lg border border-zinc-100 bg-white p-4 text-sm text-zinc-800 dark:border-zinc-800 dark:bg-zinc-950 dark:text-zinc-100">
<%= sanitize_email_html(@preview_html) %>
</div>
</div>
<% if @mailing.draft? %>
<div class="<%= card_class %> space-y-3 p-4">
<h2 class="font-semibold">2. Autorizza linvio di massa</h2>
<% if @mailing.tested? && @mailing.pending_count.positive? %>
<p class="text-sm text-zinc-500">Se loutput della prova è corretto, autorizza il job. Partirà rispettando pausa e fascia oraria.</p>
<%= button_to "Autorizza invio a #{@mailing.pending_count} destinatari", queue_mailing_path(@mailing), method: :post,
class: btn_primary,
form: { data: { turbo_confirm: @mailing.send_window_enabled? ? "Autorizzare l'invio di #{@mailing.pending_count} email da #{@mailing.mail_identity.from_email} nella fascia #{@mailing.send_window_label}?" : "Autorizzare l'invio di #{@mailing.pending_count} email da #{@mailing.mail_identity.from_email}?" } } %>
<% elsif @mailing.pending_count.zero? %>
<p class="text-sm text-zinc-500">Nessun destinatario da inviare. Spunta almeno un contatto con email valida.</p>
<% else %>
<p class="text-sm text-zinc-500">Linvio di massa resta bloccato finché non mandi una prova.</p>
<% end %>
</div>
<% end %>
<% if @mailing.draft? %>
<%= button_to "Elimina bozza", mailing_path(@mailing), method: :delete,
class: btn_danger,
form: { data: { turbo_confirm: "Eliminare questa bozza?" } } %>
<% end %>
</section>
</div>
<% end %>