Files
eminuxCRM/app/views/mailings/show.html.erb
T
eminuxandCursor 0e8730b889
CI / scan_ruby (push) Failing after 11m43s
CI / scan_js (push) Successful in 11m18s
CI / lint (push) Failing after 11m56s
Rende il CRM comodo da usare anche da cellulare.
Aggiunge navigazione mobile dedicata e trasforma le principali liste operative in layout più leggibili e facili da toccare.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-18 10:55:50 +02:00

283 lines
15 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 class="min-w-0">
<h1 class="text-xl font-semibold tracking-tight md:text-2xl"><%= @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 w-full flex-wrap gap-2 sm:w-auto">
<%= link_to "Cruscotto invii", dashboard_mailings_path, class: "#{btn_secondary} flex-1 sm:flex-none" %>
<% 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 %>
<% elsif @mailing.sending? %>
<%= button_to "Ferma invio", cancel_mailing_path(@mailing), method: :post,
class: btn_danger,
form: { data: { turbo_confirm: "Fermare l'invio? Le #{@mailing.sent_count} già inviate restano, #{@mailing.pending_count + @mailing.queued_count} in coda verranno annullate." } } %>
<% end %>
</div>
</div>
<% if @mailing.sending? || @mailing.sent? %>
<%= render "mailings/progress_card", mailing: @mailing %>
<% end %>
<div class="grid grid-cols-2 gap-3 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 data-controller="check-all">
<% if @mailing.editable? %>
<label class="flex min-h-11 items-center gap-2 border-b border-zinc-100 px-4 py-3 text-sm dark:border-zinc-800">
<input type="checkbox" data-check-all-target="source" data-action="check-all#toggle" aria-label="Seleziona tutti">
Seleziona tutti
</label>
<% end %>
<div class="divide-y divide-zinc-100 dark:divide-zinc-800 md:hidden">
<% @recipients.each do |recipient| %>
<div class="flex gap-3 p-4 <%= "opacity-60" unless recipient.email_ok? %>">
<% if @mailing.editable? %>
<div class="pt-1">
<% if recipient.email_ok? %>
<%= check_box_tag "pending_ids[]", recipient.id, recipient.pending?,
id: "recipient_#{recipient.id}",
class: "size-5",
data: { check_all_target: "checkbox" } %>
<% else %>
<span class="text-zinc-400"></span>
<% end %>
</div>
<% end %>
<div class="min-w-0 flex-1">
<div class="flex flex-wrap items-center gap-2">
<%= link_to recipient.organization.name, recipient.organization, class: "font-medium hover:underline" %>
<%= mailing_recipient_status_badge(recipient.status) %>
<% if @mailing.ab_test? %><%= ab_variant_badge(recipient.ab_variant) %><% end %>
</div>
<div class="mt-1 text-sm break-anywhere text-zinc-600 dark:text-zinc-300">
<%= recipient.contact&.full_name.presence || "Nessun contatto" %>
·
<% if recipient.email_ok? %>
<%= recipient.email %>
<% else %>
<span class="text-rose-700"><%= recipient.email.presence || "manca email" %></span>
<% end %>
</div>
<% if recipient.skip_reason.present? && !recipient.pending? %>
<div class="mt-1 text-xs text-zinc-500"><%= recipient.skip_reason %></div>
<% end %>
<% if recipient.error_message.present? %>
<div class="mt-1 text-xs text-rose-700"><%= recipient.error_message %></div>
<% end %>
<% if recipient.email_ok? %>
<%= link_to "Anteprima", mailing_path(@mailing, recipient_id: recipient.id, variant: recipient.ab_variant), class: "mt-2 inline-block text-sm text-zinc-700 hover:underline dark:text-zinc-300" %>
<% end %>
</div>
</div>
<% end %>
</div>
<div class="hidden md:block">
<div class="<%= table_wrap_class %>">
<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>
<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? %>">
<td class="px-4 py-3">
<% if @mailing.editable? && recipient.email_ok? %>
<%= check_box_tag "pending_ids[]", recipient.id, recipient.pending?,
id: "recipient_desktop_#{recipient.id}",
class: "mr-2",
data: { check_all_target: "checkbox" } %>
<% end %>
<%= 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>
</div>
</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 %>