Commit iniziale di eminuxCRM: CRM Rails con pipeline, campagne email e Docker.
Include autenticazione, progetti isolati, mail marketing HTML con SMTP, test A/B e editor WYSIWYG. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
<%= 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 text-zinc-900 dark:border-zinc-800 dark:bg-zinc-900 dark:text-zinc-100 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 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>
|
||||
|
||||
<div class="rounded-lg border border-zinc-200 p-4 dark:border-zinc-700">
|
||||
<label class="flex items-start gap-2 text-sm">
|
||||
<%= f.check_box :ab_test, { 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 di oggetto e HTML. Ogni destinatario riceve A o B.</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>
|
||||
|
||||
<div class="grid gap-6 <%= "lg:grid-cols-2" if mailing.ab_test? %>" data-ab-test-target="grid">
|
||||
<div class="space-y-4">
|
||||
<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 (opzionale)</label>
|
||||
<%= f.collection_select :mail_template_id, @mail_templates, :id, :name, { include_blank: "Nessuno" }, { class: input_class } %>
|
||||
</div>
|
||||
<% unless mailing.new_record? %>
|
||||
<label class="flex items-center gap-2 text-sm">
|
||||
<%= check_box_tag :use_template_content, "1", false %>
|
||||
Sostituisci oggetto e HTML A dal template
|
||||
</label>
|
||||
<% end %>
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">Oggetto A</label>
|
||||
<%= f.text_field :subject, required: true, class: input_class %>
|
||||
</div>
|
||||
<div>
|
||||
<%= render "shared/wysiwyg_field", form: f, method: :body_html, label: "Corpo HTML A" %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="space-y-4 <%= "hidden" unless mailing.ab_test? %>" data-ab-test-target="panel">
|
||||
<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 (opzionale)</label>
|
||||
<%= f.collection_select :mail_template_b_id, @mail_templates, :id, :name, { include_blank: "Nessuno" }, { class: input_class } %>
|
||||
</div>
|
||||
<% unless mailing.new_record? %>
|
||||
<label class="flex items-center gap-2 text-sm">
|
||||
<%= check_box_tag :use_template_b_content, "1", false %>
|
||||
Sostituisci oggetto e HTML B dal template
|
||||
</label>
|
||||
<% end %>
|
||||
<div>
|
||||
<label class="mb-1 block text-sm font-medium">Oggetto B</label>
|
||||
<%= f.text_field :subject_b, class: input_class %>
|
||||
</div>
|
||||
<div>
|
||||
<%= render "shared/wysiwyg_field", form: f, method: :body_html_b, label: "Corpo HTML B" %>
|
||||
</div>
|
||||
</div>
|
||||
</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-wrap items-center gap-2 border-t border-zinc-100 pt-4 dark:border-zinc-800">
|
||||
<%= f.submit mailing.new_record? ? "Crea bozza" : "Salva", class: btn_primary %>
|
||||
<%= link_to "Annulla", mailing.new_record? ? mailings_path : mailing_path(mailing), class: btn_secondary %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<%= render "shared/merge_tokens" %>
|
||||
</div>
|
||||
<% end %>
|
||||
Reference in New Issue
Block a user