Rende usabili i filtri destinatari e permette di eliminare le bozze email.
CI / scan_ruby (push) Failing after 12m54s
CI / scan_js (push) Successful in 12m34s
CI / lint (push) Failing after 13m10s

Le listbox non applicavano sport e altri criteri; ora i filtri sono checkbox, c'è «mai contattati» e dal cruscotto si cancellano le bozze. La lista organizzazioni allinea le colonne al foglio campagna.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-07 07:57:50 +02:00
co-authored by Cursor
parent e492c43bf8
commit 3e73e708e4
16 changed files with 1114 additions and 90 deletions
+36 -41
View File
@@ -6,7 +6,6 @@
"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")
@@ -30,7 +29,7 @@
<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>
<p class="mt-1 text-sm text-zinc-500">Lista di partenza, sport, regione e chi non ha mai ricevuto una email. Il resto è opzionale.</p>
</div>
<div>
@@ -39,19 +38,25 @@
<p class="mt-1 text-xs text-zinc-500"><%= preset_hints[@filters.preset] %></p>
</div>
<label class="flex min-h-11 cursor-pointer items-start gap-3 text-sm">
<%= hidden_field_tag "filters[never_contacted]", "0" %>
<%= check_box_tag "filters[never_contacted]", "1", @filters.history_kind == "never", class: "mt-1 size-5 shrink-0" %>
<span>
<span class="font-medium">Solo mai contattati</span>
<span class="mt-0.5 block text-xs text-zinc-500">Nessuna email di campagna inviata dal CRM, né in questa né in altre liste.</span>
</span>
</label>
<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>
<%= render "mailings/audience_choices", name: "filters[sports]",
choices: @sport_options.map { |sport| [sport, sport] }, selected: @filters["sports"] %>
</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 %>
<%= render "mailings/audience_choices", name: "filters[regions]",
choices: @region_options.map { |region| [region, region] }, selected: @filters["regions"], scroll: true %>
</div>
</div>
@@ -74,27 +79,23 @@
<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 %>
<%= render "mailings/audience_choices", name: "filters[team_genders]",
choices: Catalog::TEAM_GENDERS.map { |k, v| [v, k] }, selected: @filters["team_genders"] %>
</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 %>
<%= render "mailings/audience_choices", name: "filters[provinces]",
choices: @province_options.map { |province| [province, province] }, selected: @filters["provinces"], scroll: true %>
</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 %>
<%= render "mailings/audience_choices", name: "filters[streaming_statuses]",
choices: Catalog::STREAMING_STATUSES.map { |k, v| [v, k] }, selected: @filters["streaming_statuses"] %>
</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 %>
<%= render "mailings/audience_choices", name: "filters[statuses]",
choices: Catalog::ORGANIZATION_STATUSES.map { |k, v| [v, k] }, selected: @filters["statuses"] %>
</div>
<div>
<label class="mb-1 block text-sm font-medium">N. lista da</label>
@@ -117,22 +118,19 @@
<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 %>
<%= render "mailings/audience_choices", name: "filters[send_statuses]",
choices: Catalog::SEND_STATUSES.map { |k, v| [v, k] }, selected: @filters["send_statuses"] %>
<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 %>
<%= render "mailings/audience_choices", name: "filters[ab_variants]",
choices: Catalog::AB_VARIANTS.map { |k, v| [v, k] }, selected: @filters["ab_variants"] %>
</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 %>
<%= render "mailings/audience_choices", name: "filters[pipeline_stages]",
choices: Catalog::PIPELINE_STAGES.map { |k, v| [v, k] }, selected: @filters["pipeline_stages"] %>
</div>
<div>
<label class="mb-1 block text-sm font-medium">Valore stimato</label>
@@ -144,7 +142,7 @@
<%= render layout: "mailings/audience_disclosure", locals: {
name: "history",
title: "Storico email",
hint: "Chi ha già ricevuto o aperto una campagna",
hint: "Ricevute, aperte o invii recenti (i mai contattati stanno sopra)",
open: history_open,
count: @filters.history_active? ? 1 : 0
} do %>
@@ -153,13 +151,12 @@
<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 %>
], @filters.history_kind == "never" ? "" : @filters.history_kind), class: input_class %>
</div>
<div>
<label class="mb-1 block text-sm font-medium">Campagna</label>
@@ -188,17 +185,15 @@
</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 %>
<%= render "mailings/audience_choices", name: "filters[exclude_received_mailing_ids]",
choices: @history_mailings.map { |mailing| [mailing.name, mailing.id] },
selected: @filters["exclude_received_mailing_ids"], scroll: true %>
</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 %>
<%= render "mailings/audience_choices", name: "filters[exclude_opened_mailing_ids]",
choices: @history_mailings.map { |mailing| [mailing.name, mailing.id] },
selected: @filters["exclude_opened_mailing_ids"], scroll: true %>
</div>
<div>
<label class="mb-1 block text-sm font-medium">Chi ha ricevuto qualcosa negli ultimi N giorni</label>