diff --git a/lib/mv_web/helpers/member_helpers.ex b/lib/mv_web/helpers/member_helpers.ex new file mode 100644 index 0000000..047bd12 --- /dev/null +++ b/lib/mv_web/helpers/member_helpers.ex @@ -0,0 +1,64 @@ +defmodule MvWeb.Helpers.MemberHelpers do + @moduledoc """ + Helper functions for member-related operations in the web layer. + + Provides utilities for formatting and displaying member information. + """ + + alias Mv.Membership.Member + + @doc """ + Returns a display name for a member. + + Combines first_name and last_name if available, otherwise falls back to email. + This ensures that members without names still have a meaningful display name. + + ## Examples + + iex> member = %Member{first_name: "John", last_name: "Doe", email: "john@example.com"} + iex> MvWeb.Helpers.MemberHelpers.display_name(member) + "John Doe" + + iex> member = %Member{first_name: nil, last_name: nil, email: "john@example.com"} + iex> MvWeb.Helpers.MemberHelpers.display_name(member) + "john@example.com" + + iex> member = %Member{first_name: "John", last_name: nil, email: "john@example.com"} + iex> MvWeb.Helpers.MemberHelpers.display_name(member) + "John" + """ + def display_name(%Member{} = member) do + name_parts = + [member.first_name, member.last_name] + |> Enum.reject(&blank?/1) + |> Enum.map_join(" ", &String.trim/1) + + if name_parts == "" do + member.email + else + name_parts + end + end + + @doc """ + Checks if a value is blank (nil, empty string, or only whitespace). + + ## Examples + + iex> MvWeb.Helpers.MemberHelpers.blank?(nil) + true + + iex> MvWeb.Helpers.MemberHelpers.blank?("") + true + + iex> MvWeb.Helpers.MemberHelpers.blank?(" ") + true + + iex> MvWeb.Helpers.MemberHelpers.blank?("John") + false + """ + def blank?(nil), do: true + def blank?(""), do: true + def blank?(value) when is_binary(value), do: String.trim(value) == "" + def blank?(_), do: false +end diff --git a/lib/mv_web/live/contribution_period_live/show.ex b/lib/mv_web/live/contribution_period_live/show.ex index f297bf2..b6a2574 100644 --- a/lib/mv_web/live/contribution_period_live/show.ex +++ b/lib/mv_web/live/contribution_period_live/show.ex @@ -36,7 +36,7 @@ defmodule MvWeb.ContributionPeriodLive.Show do <.mockup_warning /> <.header> - {gettext("Contributions for %{name}", name: MvWeb.MemberLive.Index.display_name(@member))} + {gettext("Contributions for %{name}", name: MvWeb.Helpers.MemberHelpers.display_name(@member))} <:subtitle> {gettext("Contribution type")}: {@member.contribution_type} diff --git a/lib/mv_web/live/custom_field_value_live/form.ex b/lib/mv_web/live/custom_field_value_live/form.ex index 4ed1a23..6ff6432 100644 --- a/lib/mv_web/live/custom_field_value_live/form.ex +++ b/lib/mv_web/live/custom_field_value_live/form.ex @@ -52,7 +52,7 @@ defmodule MvWeb.CustomFieldValueLive.Form do options={custom_field_options(@custom_fields)} prompt={gettext("Choose a custom field")} /> - + <.input field={@form[:member_id]} @@ -61,7 +61,7 @@ defmodule MvWeb.CustomFieldValueLive.Form do options={member_options(@members)} prompt={gettext("Choose a member")} /> - + <%= if @selected_custom_field do %> <.union_value_input form={@form} custom_field={@selected_custom_field} /> @@ -289,6 +289,6 @@ defmodule MvWeb.CustomFieldValueLive.Form do end defp member_options(members) do - Enum.map(members, &{MvWeb.MemberLive.Index.display_name(&1), &1.id}) + Enum.map(members, &{MvWeb.Helpers.MemberHelpers.display_name(&1), &1.id}) end end diff --git a/lib/mv_web/live/member_live/form.ex b/lib/mv_web/live/member_live/form.ex index 16ad195..0a05e1f 100644 --- a/lib/mv_web/live/member_live/form.ex +++ b/lib/mv_web/live/member_live/form.ex @@ -43,7 +43,7 @@ defmodule MvWeb.MemberLive.Form do
- {MvWeb.MemberLive.Index.display_name(@user.member)} + {MvWeb.Helpers.MemberHelpers.display_name(@user.member)}
{@user.member.email}
{MvWeb.MemberLive.Index.display_name(member)}
+{MvWeb.Helpers.MemberHelpers.display_name(member)}
{member.email}