From 8f53d2aa4c249c67685ed8e2dd3528172c207a74 Mon Sep 17 00:00:00 2001 From: maebeale Date: Thu, 25 Jun 2026 00:30:54 -0400 Subject: [PATCH 01/12] Show recipient emails on bulk-email confirm page and rename to "Send bulk emails" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The comma-separated recipient list on the confirm page existed so an admin could copy addresses into another tool, but it rendered names — useless for that purpose. Switch it to emails. Also rename the menu link and page titles from "Send reminder emails" to "Send bulk emails" since the flow is no longer reminder-specific. Co-Authored-By: Claude Opus 4.8 --- app/views/events/_bulk_actions_menu.html.erb | 2 +- app/views/events/confirm_reminder.html.erb | 4 ++-- app/views/events/preview_reminder.html.erb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/views/events/_bulk_actions_menu.html.erb b/app/views/events/_bulk_actions_menu.html.erb index c8ef88da8f..54a03473bc 100644 --- a/app/views/events/_bulk_actions_menu.html.erb +++ b/app/views/events/_bulk_actions_menu.html.erb @@ -13,7 +13,7 @@ data-dropdown-target="content" class="hidden absolute right-0 z-10 mt-1 bg-white border border-gray-200 rounded-md shadow-lg py-1 min-w-[180px]"> <%= link_to "Onboarding tracker", onboarding_event_path(@event), class: item_class %> - <%= link_to "Send reminder emails", preview_reminder_event_path(@event), class: item_class %> + <%= link_to "Send bulk emails", preview_reminder_event_path(@event), class: item_class %> <%= link_to "Bulk payments", bulk_payments_event_path(@event), class: item_class %> <%= link_to registrants_event_path(@event, format: :csv), class: item_class, data: { turbo_frame: "_top" } do %> Download CSV diff --git a/app/views/events/confirm_reminder.html.erb b/app/views/events/confirm_reminder.html.erb index b04dde1784..6420df05b8 100644 --- a/app/views/events/confirm_reminder.html.erb +++ b/app/views/events/confirm_reminder.html.erb @@ -8,7 +8,7 @@
-

Send reminder emails

+

Send bulk emails

<%= @event.title %><% if @event.start_date.present? %> • <%= @event.date_range %><% end %>

@@ -30,7 +30,7 @@

Comma-separated

- <%= @event_registrations.map { |reg| reg.registrant.full_name }.join(", ") %> + <%= @event_registrations.map { |reg| reg.registrant.preferred_email }.join(", ") %>

Full list

diff --git a/app/views/events/preview_reminder.html.erb b/app/views/events/preview_reminder.html.erb index f960258c0c..45960169fc 100644 --- a/app/views/events/preview_reminder.html.erb +++ b/app/views/events/preview_reminder.html.erb @@ -8,7 +8,7 @@

- Send reminder emails + Send bulk emails

<%= @event.title %><% if @event.start_date.present? %> • <%= @event.date_range %><% end %> From b24cb29932f65fb9827b6d35f082a3b55eb73705 Mon Sep 17 00:00:00 2001 From: maebeale Date: Thu, 25 Jun 2026 11:13:34 -0400 Subject: [PATCH 02/12] Keep comma-separated names and add comma-separated emails on confirm page Restore the names list (admins still want it) and add a separate emails list alongside it, rather than replacing one with the other. Co-Authored-By: Claude Opus 4.8 --- app/views/events/confirm_reminder.html.erb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/views/events/confirm_reminder.html.erb b/app/views/events/confirm_reminder.html.erb index 6420df05b8..5b3b97435d 100644 --- a/app/views/events/confirm_reminder.html.erb +++ b/app/views/events/confirm_reminder.html.erb @@ -28,7 +28,12 @@

Recipients (<%= count %>)

-

Comma-separated

+

Comma-separated names

+

+ <%= @event_registrations.map { |reg| reg.registrant.full_name }.join(", ") %> +

+ +

Comma-separated emails

<%= @event_registrations.map { |reg| reg.registrant.preferred_email }.join(", ") %>

From 585b6abf16873dfb0041ca65f96880547174bf58 Mon Sep 17 00:00:00 2001 From: maebeale Date: Thu, 25 Jun 2026 11:15:26 -0400 Subject: [PATCH 03/12] White background on subject and message inputs in bulk-email preview The page sits on a tinted domain-theme background, which bled through the inputs. Force bg-white so the editable fields read as editable. Co-Authored-By: Claude Opus 4.8 --- app/views/events/preview_reminder.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/events/preview_reminder.html.erb b/app/views/events/preview_reminder.html.erb index 45960169fc..f0608884ff 100644 --- a/app/views/events/preview_reminder.html.erb +++ b/app/views/events/preview_reminder.html.erb @@ -37,7 +37,7 @@ The subject line recipients will see. Edit it as you like — leave it as is to use the default.

<%= text_field_tag :custom_subject, @custom_subject, - class: "w-full rounded border-gray-300 shadow-sm px-3 py-2 text-sm", + class: "w-full rounded border-gray-300 shadow-sm px-3 py-2 text-sm bg-white", data: { reminder_preview_target: "subjectInput", action: "input->reminder-preview#updateSubject" } %>
@@ -50,7 +50,7 @@

<%= text_area_tag :custom_message, @custom_message, rows: 4, - class: "w-full rounded border-gray-300 shadow-sm px-3 py-2 text-sm font-mono", + class: "w-full rounded border-gray-300 shadow-sm px-3 py-2 text-sm font-mono bg-white", data: { reminder_preview_target: "input", action: "input->reminder-preview#update" } %>
<% if @reminder_preview_html.present? %> From 45135a9a00157a7cb8549ef05789aa013ba80dee Mon Sep 17 00:00:00 2001 From: maebeale Date: Thu, 25 Jun 2026 11:17:33 -0400 Subject: [PATCH 04/12] Group subject and message under an "Email draft" header Top-level sections are now Recipients, Email draft, and Preview. Subject and message become subheads indented under Email draft, with extra space above the group to separate it from the recipient list. Co-Authored-By: Claude Opus 4.8 --- app/views/events/preview_reminder.html.erb | 47 ++++++++++++---------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/app/views/events/preview_reminder.html.erb b/app/views/events/preview_reminder.html.erb index f0608884ff..028d2d97ef 100644 --- a/app/views/events/preview_reminder.html.erb +++ b/app/views/events/preview_reminder.html.erb @@ -31,27 +31,32 @@ reminder-preview drives the live message/subject preview as the admin types. %> <%= form_with url: confirm_reminder_event_path(@event), method: :post, data: { controller: "reminder-preview", turbo: false } do |f| %> <%= render "events/reminder_recipients" %> -
-

Subject

-

- The subject line recipients will see. Edit it as you like — leave it as is to use the default. -

- <%= text_field_tag :custom_subject, @custom_subject, - class: "w-full rounded border-gray-300 shadow-sm px-3 py-2 text-sm bg-white", - data: { reminder_preview_target: "subjectInput", action: "input->reminder-preview#updateSubject" } %> -
-
-

Message

-

- The intro shown near the top of the reminder, above the event details. Edit it or clear it as you like — the event details and the "View ticket" button are always included. -

-

- Accepts basic HTML — bold, italics, links, lists, and line breaks. -

- <%= text_area_tag :custom_message, @custom_message, - rows: 4, - class: "w-full rounded border-gray-300 shadow-sm px-3 py-2 text-sm font-mono bg-white", - data: { reminder_preview_target: "input", action: "input->reminder-preview#update" } %> +
+

Email draft

+
+
+

Subject

+

+ The subject line recipients will see. Edit it as you like — leave it as is to use the default. +

+ <%= text_field_tag :custom_subject, @custom_subject, + class: "w-full rounded border-gray-300 shadow-sm px-3 py-2 text-sm bg-white", + data: { reminder_preview_target: "subjectInput", action: "input->reminder-preview#updateSubject" } %> +
+
+

Message

+

+ The intro shown near the top of the reminder, above the event details. Edit it or clear it as you like — the event details and the "View ticket" button are always included. +

+

+ Accepts basic HTML — bold, italics, links, lists, and line breaks. +

+ <%= text_area_tag :custom_message, @custom_message, + rows: 4, + class: "w-full rounded border-gray-300 shadow-sm px-3 py-2 text-sm font-mono bg-white", + data: { reminder_preview_target: "input", action: "input->reminder-preview#update" } %> +
+
<% if @reminder_preview_html.present? %>
From d7263e9391a6c2cc4abb796d8699713c8dcd73a5 Mon Sep 17 00:00:00 2001 From: maebeale Date: Thu, 25 Jun 2026 11:19:35 -0400 Subject: [PATCH 05/12] Tighten recipient-filter help copy Co-Authored-By: Claude Opus 4.8 --- app/views/events/preview_reminder.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/events/preview_reminder.html.erb b/app/views/events/preview_reminder.html.erb index 028d2d97ef..939d30692d 100644 --- a/app/views/events/preview_reminder.html.erb +++ b/app/views/events/preview_reminder.html.erb @@ -21,8 +21,8 @@

Recipients

Choose who will receive this reminder. Filters keep everyone in the list and - simply check the registrants who match. Separate multiple values with - -- to match any of them (e.g. + check the matches. Separate multiple values with + '--' to match multiple values (e.g. amy--aisha).

<%= render "events/reminder_recipient_filters" %> From fa7429d027348490bff38c17d680cbd45cc54880 Mon Sep 17 00:00:00 2001 From: maebeale Date: Thu, 25 Jun 2026 11:20:25 -0400 Subject: [PATCH 06/12] Wrap Email draft section in a white card with vertical breathing room Co-Authored-By: Claude Opus 4.8 --- app/views/events/preview_reminder.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/events/preview_reminder.html.erb b/app/views/events/preview_reminder.html.erb index 939d30692d..a7d8b8dd2d 100644 --- a/app/views/events/preview_reminder.html.erb +++ b/app/views/events/preview_reminder.html.erb @@ -31,9 +31,9 @@ reminder-preview drives the live message/subject preview as the admin types. %> <%= form_with url: confirm_reminder_event_path(@event), method: :post, data: { controller: "reminder-preview", turbo: false } do |f| %> <%= render "events/reminder_recipients" %> -
-

Email draft

-
+
+

Email draft

+

Subject

From c450c460673e60fa521109ba4709c36117a40cd3 Mon Sep 17 00:00:00 2001 From: maebeale Date: Thu, 25 Jun 2026 11:22:10 -0400 Subject: [PATCH 07/12] Move Email draft header outside its card to match Recipients/Preview Header with underline now sits above the white content card, mirroring the other sections, with extra spacing around the header and card bottom. Co-Authored-By: Claude Opus 4.8 --- app/views/events/preview_reminder.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/events/preview_reminder.html.erb b/app/views/events/preview_reminder.html.erb index a7d8b8dd2d..5251bd1562 100644 --- a/app/views/events/preview_reminder.html.erb +++ b/app/views/events/preview_reminder.html.erb @@ -31,9 +31,9 @@ reminder-preview drives the live message/subject preview as the admin types. %> <%= form_with url: confirm_reminder_event_path(@event), method: :post, data: { controller: "reminder-preview", turbo: false } do |f| %> <%= render "events/reminder_recipients" %> -

-

Email draft

-
+
+

Email draft

+

Subject

From b9bbc00496f35690d38424cf9b2915a16c789175 Mon Sep 17 00:00:00 2001 From: maebeale Date: Thu, 25 Jun 2026 11:22:57 -0400 Subject: [PATCH 08/12] Shrink the live email preview with zoom The email HTML uses fixed px sizing, so zoom scales fonts and elements together while still reflowing to the container width. Co-Authored-By: Claude Opus 4.8 --- app/views/events/preview_reminder.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/events/preview_reminder.html.erb b/app/views/events/preview_reminder.html.erb index 5251bd1562..4a30ef11fd 100644 --- a/app/views/events/preview_reminder.html.erb +++ b/app/views/events/preview_reminder.html.erb @@ -66,7 +66,7 @@ Subject: <%= @custom_subject %>

- From ff155efd06c0e9afa82ae84b60d3ce47bc1fd26d Mon Sep 17 00:00:00 2001 From: maebeale Date: Thu, 25 Jun 2026 11:23:32 -0400 Subject: [PATCH 09/12] Move HTML-support note to a hint below the message field Co-Authored-By: Claude Opus 4.8 --- app/views/events/preview_reminder.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/events/preview_reminder.html.erb b/app/views/events/preview_reminder.html.erb index 4a30ef11fd..38b7b4a259 100644 --- a/app/views/events/preview_reminder.html.erb +++ b/app/views/events/preview_reminder.html.erb @@ -48,13 +48,13 @@

The intro shown near the top of the reminder, above the event details. Edit it or clear it as you like — the event details and the "View ticket" button are always included.

-

- Accepts basic HTML — bold, italics, links, lists, and line breaks. -

<%= text_area_tag :custom_message, @custom_message, rows: 4, class: "w-full rounded border-gray-300 shadow-sm px-3 py-2 text-sm font-mono bg-white", data: { reminder_preview_target: "input", action: "input->reminder-preview#update" } %> +

+ Accepts basic HTML — bold, italics, links, lists, and line breaks. +

From 14e264dd60e3122fb2a44c130f435b0b2896b553 Mon Sep 17 00:00:00 2001 From: maebeale Date: Thu, 25 Jun 2026 11:25:45 -0400 Subject: [PATCH 10/12] Add space before Preview, lighten HTML hint, and rebuild Vite CSS The earlier spacing/hint classes (mt-*, text-xs) weren't in the compiled CSS because Tailwind doesn't rescan ERB on its own, so they served stale. Force a dev build so the utilities actually exist. Co-Authored-By: Claude Opus 4.8 --- app/views/events/preview_reminder.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/events/preview_reminder.html.erb b/app/views/events/preview_reminder.html.erb index 38b7b4a259..2df051c470 100644 --- a/app/views/events/preview_reminder.html.erb +++ b/app/views/events/preview_reminder.html.erb @@ -52,14 +52,14 @@ rows: 4, class: "w-full rounded border-gray-300 shadow-sm px-3 py-2 text-sm font-mono bg-white", data: { reminder_preview_target: "input", action: "input->reminder-preview#update" } %> -

+

Accepts basic HTML — bold, italics, links, lists, and line breaks.

<% if @reminder_preview_html.present? %> -
+

Preview (sample registrant)

From 497d3d0c2cca3b6700feed9528da58b6b3a3830b Mon Sep 17 00:00:00 2001 From: maebeale Date: Thu, 25 Jun 2026 11:26:59 -0400 Subject: [PATCH 11/12] Symmetric, slightly larger spacing around the Email draft section Co-Authored-By: Claude Opus 4.8 --- app/views/events/preview_reminder.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/events/preview_reminder.html.erb b/app/views/events/preview_reminder.html.erb index 2df051c470..a093a8ec56 100644 --- a/app/views/events/preview_reminder.html.erb +++ b/app/views/events/preview_reminder.html.erb @@ -31,7 +31,7 @@ reminder-preview drives the live message/subject preview as the admin types. %> <%= form_with url: confirm_reminder_event_path(@event), method: :post, data: { controller: "reminder-preview", turbo: false } do |f| %> <%= render "events/reminder_recipients" %> -
+

Email draft

@@ -59,7 +59,7 @@
<% if @reminder_preview_html.present? %> -
+

Preview (sample registrant)

From 0d09fb2704a49609e0fb441b11e19958178f9ee1 Mon Sep 17 00:00:00 2001 From: maebeale Date: Thu, 25 Jun 2026 11:28:36 -0400 Subject: [PATCH 12/12] Shrink the live email preview further (zoom 0.6) Co-Authored-By: Claude Opus 4.8 --- app/views/events/preview_reminder.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/events/preview_reminder.html.erb b/app/views/events/preview_reminder.html.erb index a093a8ec56..e7b0295cac 100644 --- a/app/views/events/preview_reminder.html.erb +++ b/app/views/events/preview_reminder.html.erb @@ -66,7 +66,7 @@ Subject: <%= @custom_subject %>
-