refactor: improve email copy with MapSet, RFC 5322 commas, and cond
All checks were successful
continuous-integration/drone/push Build is passing

Performance optimization, RFC-compliant separator, better tests
This commit is contained in:
Moritz 2025-12-02 12:10:59 +01:00
parent ba78a6ac7a
commit 39d2cb7820
4 changed files with 92 additions and 271 deletions

View file

@ -59,7 +59,7 @@ defmodule MvWeb.MemberLive.Index do
|> assign(:query, "")
|> assign_new(:sort_field, fn -> :first_name end)
|> assign_new(:sort_order, fn -> :asc end)
|> assign(:selected_members, [])
|> assign(:selected_members, MapSet.new())
|> assign(:custom_fields_visible, custom_fields_visible)
# We call handle params to use the query from the URL
@ -92,10 +92,10 @@ defmodule MvWeb.MemberLive.Index do
@impl true
def handle_event("select_member", %{"id" => id}, socket) do
selected =
if id in socket.assigns.selected_members do
List.delete(socket.assigns.selected_members, id)
if MapSet.member?(socket.assigns.selected_members, id) do
MapSet.delete(socket.assigns.selected_members, id)
else
[id | socket.assigns.selected_members]
MapSet.put(socket.assigns.selected_members, id)
end
{:noreply, assign(socket, :selected_members, selected)}
@ -103,13 +103,11 @@ defmodule MvWeb.MemberLive.Index do
@impl true
def handle_event("select_all", _params, socket) do
members = socket.assigns.members
all_ids = Enum.map(members, & &1.id)
all_ids = socket.assigns.members |> Enum.map(& &1.id) |> MapSet.new()
selected =
if Enum.sort(socket.assigns.selected_members) == Enum.sort(all_ids) do
[]
if MapSet.equal?(socket.assigns.selected_members, all_ids) do
MapSet.new()
else
all_ids
end
@ -121,26 +119,26 @@ defmodule MvWeb.MemberLive.Index do
def handle_event("copy_emails", _params, socket) do
selected_ids = socket.assigns.selected_members
if selected_ids == [] do
{:noreply, put_flash(socket, :error, gettext("No members selected"))}
else
# Filter members that are in the selection
selected_members =
socket.assigns.members
|> Enum.filter(fn member -> member.id in selected_ids end)
# Filter members that are in the selection and have email addresses
formatted_emails =
socket.assigns.members
|> Enum.filter(fn member ->
MapSet.member?(selected_ids, member.id) && member.email && member.email != ""
end)
|> Enum.map(&format_member_email/1)
# Format emails and filter out members without email
formatted_emails =
selected_members
|> Enum.filter(fn member -> member.email && member.email != "" end)
|> Enum.map(&format_member_email/1)
email_count = length(formatted_emails)
email_count = length(formatted_emails)
cond do
MapSet.size(selected_ids) == 0 ->
{:noreply, put_flash(socket, :error, gettext("No members selected"))}
if email_count == 0 do
email_count == 0 ->
{:noreply, put_flash(socket, :error, gettext("No email addresses found"))}
else
email_string = Enum.join(formatted_emails, "; ")
true ->
# RFC 5322 uses comma as separator for email address lists
email_string = Enum.join(formatted_emails, ", ")
socket =
socket
@ -160,7 +158,6 @@ defmodule MvWeb.MemberLive.Index do
)
{:noreply, socket}
end
end
end