Aggiunge filtri avanzati per i destinatari delle campagne email.
La scelta della lista passa da un wizard a tre passi, con anteprima del conteggio e lista congelata solo dopo la conferma. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
<%# locals: name:, title:, hint:, open:, count: 0 %>
|
||||
<details data-section="<%= name %>" class="<%= card_class %> group" <%= "open" if open %>>
|
||||
<summary class="flex cursor-pointer list-none items-center justify-between gap-3 p-4 md:px-6 [&::-webkit-details-marker]:hidden">
|
||||
<div>
|
||||
<div class="text-sm font-semibold"><%= title %></div>
|
||||
<% if hint.present? %>
|
||||
<p class="mt-0.5 text-xs text-zinc-500"><%= hint %></p>
|
||||
<% end %>
|
||||
</div>
|
||||
<div class="flex shrink-0 items-center gap-2">
|
||||
<% if count.to_i.positive? %>
|
||||
<span class="rounded-full bg-zinc-900 px-2 py-0.5 text-xs font-medium text-white dark:bg-zinc-100 dark:text-zinc-900"><%= count %></span>
|
||||
<% end %>
|
||||
<svg class="size-4 text-zinc-400 transition group-open:rotate-180" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||
<path fill-rule="evenodd" d="M5.23 7.21a.75.75 0 0 1 1.06.02L10 10.94l3.71-3.71a.75.75 0 1 1 1.06 1.06l-4.24 4.24a.75.75 0 0 1-1.06 0L5.21 8.29a.75.75 0 0 1 .02-1.08Z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
</div>
|
||||
</summary>
|
||||
<div class="space-y-4 border-t border-zinc-100 p-4 md:p-6 dark:border-zinc-800">
|
||||
<%= yield %>
|
||||
</div>
|
||||
</details>
|
||||
@@ -16,20 +16,15 @@
|
||||
<%= 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>
|
||||
<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">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 class="rounded-lg border border-zinc-200 p-4 dark:border-zinc-700" data-controller="send-window">
|
||||
@@ -120,7 +115,7 @@
|
||||
</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" %>
|
||||
<%= f.submit mailing.new_record? ? "Continua: destinatari" : "Salva messaggio", 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>
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
<%
|
||||
steps = [
|
||||
["Messaggio", mailing.persisted? ? edit_mailing_path(mailing) : new_mailing_path, current == :message],
|
||||
["Destinatari", mailing.persisted? && mailing.editable? ? audience_mailing_path(mailing) : nil, current == :audience],
|
||||
["Revisione", mailing.persisted? ? mailing_path(mailing) : nil, current == :review]
|
||||
]
|
||||
%>
|
||||
<nav class="flex flex-wrap gap-2 text-sm" aria-label="Passi invio">
|
||||
<% steps.each_with_index do |(label, path, active), index| %>
|
||||
<% classes = if active
|
||||
"rounded-full bg-zinc-900 px-3 py-1.5 font-medium text-white dark:bg-zinc-100 dark:text-zinc-900"
|
||||
else
|
||||
"rounded-full bg-zinc-100 px-3 py-1.5 text-zinc-600 dark:bg-zinc-800 dark:text-zinc-300"
|
||||
end %>
|
||||
<% if path && !active %>
|
||||
<%= link_to "#{index + 1}. #{label}", path, class: classes %>
|
||||
<% else %>
|
||||
<span class="<%= classes %>"><%= index + 1 %>. <%= label %></span>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</nav>
|
||||
@@ -0,0 +1,261 @@
|
||||
<%
|
||||
preset_hints = {
|
||||
"to_send" => "Chi in campagna è ancora da contattare. È la scelta giusta quasi sempre.",
|
||||
"all" => "Tutte le società del progetto, anche già inviate o clienti.",
|
||||
"test_a" => "Solo chi ha già Test A in scheda.",
|
||||
"test_b" => "Solo chi ha già Test B in scheda."
|
||||
}
|
||||
extra_parts = @filters.summary_parts.drop(1)
|
||||
compact_select = "#{input_class} h-28 py-1"
|
||||
org_open = @filters.organization_extra_active? || @open_sections.include?("organization")
|
||||
campaign_open = @filters.campaign_extra_active? || @open_sections.include?("campaign")
|
||||
history_open = @filters.history_active? || @open_sections.include?("history")
|
||||
exclude_open = @filters.exclusions_active? || @open_sections.include?("exclusions")
|
||||
%>
|
||||
|
||||
<div class="mx-auto max-w-5xl space-y-6">
|
||||
<%= render "mailings/wizard", mailing: @mailing, current: :audience %>
|
||||
|
||||
<div>
|
||||
<h1 class="text-2xl font-semibold tracking-tight">Destinatari</h1>
|
||||
<p class="mt-1 text-sm text-zinc-500">
|
||||
Scegli da dove parti, eventualmente raffina, poi genera la lista. I filtri avanzati stanno nei box sotto.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<%= form_with url: audience_mailing_path(@mailing), method: :patch, class: "grid gap-6 xl:grid-cols-[1fr_20rem]",
|
||||
data: { controller: "audience-preview", action: "change->audience-preview#refresh" } do %>
|
||||
<%= hidden_field_tag :intent, "preview", data: { audience_preview_target: "intent" } %>
|
||||
<div class="order-2 space-y-4 xl:order-1">
|
||||
<section class="<%= card_class %> space-y-4 p-4 md:p-6">
|
||||
<div>
|
||||
<h2 class="text-base font-semibold">Chi deve ricevere questa email?</h2>
|
||||
<p class="mt-1 text-sm text-zinc-500">Tre cose bastano: lista di partenza, sport, regione. Il resto è opzionale.</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">Lista di partenza</label>
|
||||
<%= select_tag "filters[preset]", options_for_select(Catalog::MAILING_AUDIENCES.map { |k, v| [v, k] }, @filters.preset), class: input_class %>
|
||||
<p class="mt-1 text-xs text-zinc-500"><%= preset_hints[@filters.preset] %></p>
|
||||
</div>
|
||||
|
||||
<div class="grid gap-4 md:grid-cols-2">
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">Sport</label>
|
||||
<%= hidden_field_tag "filters[sports][]", "" %>
|
||||
<%= select_tag "filters[sports][]", options_for_select(@sport_options, @filters["sports"]),
|
||||
multiple: true, size: 5, class: compact_select %>
|
||||
<p class="mt-1 text-xs text-zinc-500">Vuoto = tutti gli sport. Tieni premuto Ctrl o Cmd per più valori.</p>
|
||||
</div>
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">Regione</label>
|
||||
<%= hidden_field_tag "filters[regions][]", "" %>
|
||||
<%= select_tag "filters[regions][]", options_for_select(@region_options, @filters["regions"]),
|
||||
multiple: true, size: 5, class: compact_select %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<% if extra_parts.any? %>
|
||||
<div class="flex flex-wrap gap-1.5">
|
||||
<% extra_parts.each do |part| %>
|
||||
<span class="rounded-full bg-zinc-100 px-2.5 py-1 text-xs text-zinc-700 dark:bg-zinc-800 dark:text-zinc-200"><%= part %></span>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</section>
|
||||
|
||||
<%= render layout: "mailings/audience_disclosure", locals: {
|
||||
name: "organization",
|
||||
title: "Altri dati società",
|
||||
hint: "M/F, provincia, streaming, stato, numero in lista",
|
||||
open: org_open,
|
||||
count: @filters.organization_extra_count
|
||||
} do %>
|
||||
<div class="grid gap-4 md:grid-cols-2">
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">M/F</label>
|
||||
<%= hidden_field_tag "filters[team_genders][]", "" %>
|
||||
<%= select_tag "filters[team_genders][]", options_for_select(Catalog::TEAM_GENDERS.map { |k, v| [v, k] }, @filters["team_genders"]),
|
||||
multiple: true, size: 3, class: compact_select %>
|
||||
</div>
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">Provincia</label>
|
||||
<%= hidden_field_tag "filters[provinces][]", "" %>
|
||||
<%= select_tag "filters[provinces][]", options_for_select(@province_options, @filters["provinces"]),
|
||||
multiple: true, size: 4, class: compact_select %>
|
||||
</div>
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">Streaming</label>
|
||||
<%= hidden_field_tag "filters[streaming_statuses][]", "" %>
|
||||
<%= select_tag "filters[streaming_statuses][]", options_for_select(Catalog::STREAMING_STATUSES.map { |k, v| [v, k] }, @filters["streaming_statuses"]),
|
||||
multiple: true, size: 4, class: compact_select %>
|
||||
</div>
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">Stato organizzazione</label>
|
||||
<%= hidden_field_tag "filters[statuses][]", "" %>
|
||||
<%= select_tag "filters[statuses][]", options_for_select(Catalog::ORGANIZATION_STATUSES.map { |k, v| [v, k] }, @filters["statuses"]),
|
||||
multiple: true, size: 4, class: compact_select %>
|
||||
</div>
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">N. lista da</label>
|
||||
<%= number_field_tag "filters[list_min]", @filters["list_min"], min: 1, class: input_class %>
|
||||
</div>
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">N. lista a</label>
|
||||
<%= number_field_tag "filters[list_max]", @filters["list_max"], min: 1, class: input_class %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<%= render layout: "mailings/audience_disclosure", locals: {
|
||||
name: "campaign",
|
||||
title: "Campagna e trattativa",
|
||||
hint: "Stato invio, test A/B, stage, valore stimato",
|
||||
open: campaign_open,
|
||||
count: @filters.campaign_extra_count
|
||||
} do %>
|
||||
<div class="grid gap-4 md:grid-cols-2">
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">Stato invio campagna</label>
|
||||
<%= hidden_field_tag "filters[send_statuses][]", "" %>
|
||||
<%= select_tag "filters[send_statuses][]", options_for_select(Catalog::SEND_STATUSES.map { |k, v| [v, k] }, @filters["send_statuses"]),
|
||||
multiple: true, size: 3, class: compact_select %>
|
||||
<p class="mt-1 text-xs text-zinc-500">Serve soprattutto se la lista di partenza è «tutte».</p>
|
||||
</div>
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">Test A/B in scheda</label>
|
||||
<%= hidden_field_tag "filters[ab_variants][]", "" %>
|
||||
<%= select_tag "filters[ab_variants][]", options_for_select(Catalog::AB_VARIANTS.map { |k, v| [v, k] }, @filters["ab_variants"]),
|
||||
multiple: true, size: 2, class: compact_select %>
|
||||
</div>
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">Stage pipeline</label>
|
||||
<%= hidden_field_tag "filters[pipeline_stages][]", "" %>
|
||||
<%= select_tag "filters[pipeline_stages][]", options_for_select(Catalog::PIPELINE_STAGES.map { |k, v| [v, k] }, @filters["pipeline_stages"]),
|
||||
multiple: true, size: 5, class: compact_select %>
|
||||
</div>
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">Valore stimato</label>
|
||||
<%= select_tag "filters[estimated_value]", options_for_select([["Qualsiasi", "any"], ["Presente", "present"], ["Assente", "blank"]], @filters["estimated_value"]), class: input_class %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<%= render layout: "mailings/audience_disclosure", locals: {
|
||||
name: "history",
|
||||
title: "Storico email",
|
||||
hint: "Chi ha già ricevuto o aperto una campagna",
|
||||
open: history_open,
|
||||
count: @filters.history_active? ? 1 : 0
|
||||
} do %>
|
||||
<div class="grid gap-4 md:grid-cols-2">
|
||||
<div class="md:col-span-2">
|
||||
<label class="mb-1 block text-sm font-medium">Criterio</label>
|
||||
<%= select_tag "filters[history_kind]", options_for_select([
|
||||
["Nessun filtro storico", ""],
|
||||
["Mai ricevuta una campagna", "never"],
|
||||
["Ha ricevuto questa campagna", "received"],
|
||||
["Non ha ricevuto questa campagna", "not_received"],
|
||||
["Ha aperto questa campagna", "opened"],
|
||||
["Ha ricevuto ma non aperto questa campagna", "not_opened"],
|
||||
["Inviata negli ultimi N giorni", "recent"]
|
||||
], @filters.history_kind), class: input_class %>
|
||||
</div>
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">Campagna</label>
|
||||
<%= select_tag "filters[history_mailing_id]",
|
||||
options_from_collection_for_select(@history_mailings, :id, :name, @filters.history_mailing_id),
|
||||
include_blank: "Scegli campagna", class: input_class %>
|
||||
</div>
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">Ultimi N giorni</label>
|
||||
<%= number_field_tag "filters[history_days]", @filters.history_days, min: 1, placeholder: "30", class: input_class %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<%= render layout: "mailings/audience_disclosure", locals: {
|
||||
name: "exclusions",
|
||||
title: "Escludi dalla lista",
|
||||
hint: "Clienti, già ricevute, già aperte, invii recenti",
|
||||
open: exclude_open,
|
||||
count: @filters.exclusions_count
|
||||
} do %>
|
||||
<label class="flex min-h-11 items-center gap-3 text-sm">
|
||||
<%= hidden_field_tag "filters[exclude_customers]", "0" %>
|
||||
<%= check_box_tag "filters[exclude_customers]", "1", @filters["exclude_customers"], class: "size-5" %>
|
||||
Clienti attivi e inattivi
|
||||
</label>
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">Chi ha già ricevuto</label>
|
||||
<%= hidden_field_tag "filters[exclude_received_mailing_ids][]", "" %>
|
||||
<%= select_tag "filters[exclude_received_mailing_ids][]",
|
||||
options_from_collection_for_select(@history_mailings, :id, :name, @filters["exclude_received_mailing_ids"]),
|
||||
multiple: true, size: 4, class: compact_select %>
|
||||
</div>
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">Chi ha aperto</label>
|
||||
<%= hidden_field_tag "filters[exclude_opened_mailing_ids][]", "" %>
|
||||
<%= select_tag "filters[exclude_opened_mailing_ids][]",
|
||||
options_from_collection_for_select(@history_mailings, :id, :name, @filters["exclude_opened_mailing_ids"]),
|
||||
multiple: true, size: 4, class: compact_select %>
|
||||
</div>
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">Chi ha ricevuto qualcosa negli ultimi N giorni</label>
|
||||
<%= number_field_tag "filters[exclude_mailed_within_days]", @filters["exclude_mailed_within_days"], min: 1, class: input_class %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<div class="flex flex-col gap-2 sm:flex-row xl:hidden">
|
||||
<%= button_tag "Genera lista e rivedi", type: "submit", class: "#{btn_primary} w-full sm:w-auto",
|
||||
data: { action: "audience-preview#apply" } %>
|
||||
<%= link_to "Vai alla revisione senza rigenerare", @mailing, class: "#{btn_secondary} w-full sm:w-auto" %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<aside class="order-1 space-y-4 self-start xl:sticky xl:top-4 xl:order-2">
|
||||
<div class="<%= card_class %> p-4">
|
||||
<div class="text-xs uppercase tracking-wide text-zinc-500">Corrispondenze</div>
|
||||
<% if @audience_counts[:with_email].zero? %>
|
||||
<div class="mt-1 text-3xl font-semibold tabular-nums">0</div>
|
||||
<p class="mt-1 text-sm text-amber-800 dark:text-amber-200">Nessuna società con email. Allarga i filtri.</p>
|
||||
<% else %>
|
||||
<div class="mt-1 text-3xl font-semibold tabular-nums"><%= @audience_counts[:with_email] %></div>
|
||||
<p class="mt-1 text-sm text-zinc-500">
|
||||
<%= @audience_counts[:with_email] == 1 ? "società con email valida" : "società con email valida" %>
|
||||
su <%= @audience_counts[:total] %>
|
||||
</p>
|
||||
<% end %>
|
||||
<% if @mailing.mailing_recipients.any? %>
|
||||
<p class="mt-3 text-xs text-zinc-500">
|
||||
Lista già generata: <%= @mailing.pending_count %> da inviare.
|
||||
Generando di nuovo la sostituisci.
|
||||
</p>
|
||||
<% else %>
|
||||
<p class="mt-3 text-xs text-zinc-500">La lista si congela solo quando premi genera.</p>
|
||||
<% end %>
|
||||
|
||||
<div class="mt-4 hidden flex-col gap-2 xl:flex">
|
||||
<%= button_tag "Genera lista e rivedi", type: "submit", class: "#{btn_primary} w-full",
|
||||
data: { action: "audience-preview#apply" } %>
|
||||
<%= link_to "Vai alla revisione senza rigenerare", @mailing, class: "#{btn_secondary} w-full" %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="<%= card_class %> p-4">
|
||||
<h2 class="text-sm font-semibold">Anteprima</h2>
|
||||
<ul class="mt-3 space-y-2 text-sm">
|
||||
<% @audience_preview.each do |org| %>
|
||||
<li>
|
||||
<div class="font-medium"><%= org.name %></div>
|
||||
<div class="text-xs text-zinc-500"><%= [org.sport, org.region, org.list_position].compact.join(" · ") %></div>
|
||||
</li>
|
||||
<% end %>
|
||||
<% if @audience_preview.empty? %>
|
||||
<li class="text-zinc-500">Nessuna organizzazione con questi filtri.</li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
<% end %>
|
||||
</div>
|
||||
@@ -1,4 +1,5 @@
|
||||
<div class="mx-auto max-w-5xl space-y-6">
|
||||
<%= render "mailings/wizard", mailing: @mailing, current: :message %>
|
||||
<div>
|
||||
<h1 class="text-2xl font-semibold tracking-tight">Modifica invio</h1>
|
||||
<p class="mt-1 text-sm text-zinc-500"><%= @mailing.name %></p>
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
<div class="mx-auto max-w-5xl space-y-6">
|
||||
<%= render "mailings/wizard", mailing: @mailing, current: :message %>
|
||||
<div>
|
||||
<h1 class="text-2xl font-semibold tracking-tight">Nuovo invio</h1>
|
||||
<p class="mt-1 text-sm text-zinc-500">Scegli mittente, lista e contenuto. Dopo il salvataggio fai il check dei destinatari.</p>
|
||||
<p class="mt-1 text-sm text-zinc-500">Prima il messaggio, poi i filtri sui destinatari, poi la revisione della lista.</p>
|
||||
</div>
|
||||
|
||||
<%= render "form", mailing: @mailing %>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<%= turbo_frame_tag "mailing_live", target: "_top", refresh: "morph" do %>
|
||||
<%= tag.div class: "space-y-6", data: (@mailing.sending? ? { controller: "auto-reload", auto_reload_interval_value: 10_000 } : {}) do %>
|
||||
<%= render "mailings/wizard", mailing: @mailing, current: :review %>
|
||||
<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>
|
||||
@@ -30,7 +31,8 @@
|
||||
<%= 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 %>
|
||||
<%= link_to "Raffina destinatari", audience_mailing_path(@mailing), class: btn_secondary %>
|
||||
<%= button_to "Rigenera 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,
|
||||
@@ -126,6 +128,13 @@
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<% if @mailing.editable? && @recipients.empty? %>
|
||||
<div class="border-b border-zinc-100 px-4 py-4 text-sm text-zinc-600 dark:border-zinc-800 dark:text-zinc-300">
|
||||
Nessuna lista generata. Raffina i filtri e genera la lista congelata.
|
||||
<%= link_to "Scegli destinatari", audience_mailing_path(@mailing), class: "font-medium underline" %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<%= form_with url: update_recipients_mailing_path(@mailing), method: :patch do %>
|
||||
<div data-controller="check-all">
|
||||
<% if @mailing.editable? %>
|
||||
|
||||
Reference in New Issue
Block a user