diff --git a/lib/mv_web/helpers/date_formatter.ex b/lib/mv_web/helpers/date_formatter.ex new file mode 100644 index 0000000..eaa9271 --- /dev/null +++ b/lib/mv_web/helpers/date_formatter.ex @@ -0,0 +1,27 @@ +defmodule MvWeb.Helpers.DateFormatter do + @moduledoc """ + Centralized date formatting helper for the application. + Formats dates in European format (dd.mm.yyyy). + """ + + use Gettext, backend: MvWeb.Gettext + + @doc """ + Formats a Date struct to European format (dd.mm.yyyy). + + ## Examples + + iex> MvWeb.Helpers.DateFormatter.format_date(~D[2024-03-15]) + "15.03.2024" + + iex> MvWeb.Helpers.DateFormatter.format_date(nil) + "" + """ + def format_date(%Date{} = date) do + Calendar.strftime(date, "%d.%m.%Y") + end + + def format_date(nil), do: "" + + def format_date(_), do: "Invalid date" +end diff --git a/lib/mv_web/live/member_live/index.ex b/lib/mv_web/live/member_live/index.ex index 3d30d76..69a3dd6 100644 --- a/lib/mv_web/live/member_live/index.ex +++ b/lib/mv_web/live/member_live/index.ex @@ -32,6 +32,7 @@ defmodule MvWeb.MemberLive.Index do alias Mv.Membership alias MvWeb.MemberLive.Index.Formatter + alias MvWeb.Helpers.DateFormatter # Prefix used in sort field names for custom fields (e.g., "custom_field_") @custom_field_prefix "custom_field_" @@ -932,4 +933,7 @@ defmodule MvWeb.MemberLive.Index do Map.get(visibility_config, Atom.to_string(field), true) end) end + + # Public helper function to format dates for use in templates + def format_date(date), do: DateFormatter.format_date(date) end diff --git a/lib/mv_web/live/member_live/index.html.heex b/lib/mv_web/live/member_live/index.html.heex index 58e22b6..7554d6f 100644 --- a/lib/mv_web/live/member_live/index.html.heex +++ b/lib/mv_web/live/member_live/index.html.heex @@ -219,7 +219,7 @@ """ } > - {member.join_date} + {MvWeb.MemberLive.Index.format_date(member.join_date)} <:col :let={member} label={gettext("Paid")}> Date.to_string(date) + {:ok, date} -> DateFormatter.format_date(date) _ -> value end end diff --git a/lib/mv_web/live/member_live/show.ex b/lib/mv_web/live/member_live/show.ex index de46a3a..7601f46 100644 --- a/lib/mv_web/live/member_live/show.ex +++ b/lib/mv_web/live/member_live/show.ex @@ -23,6 +23,7 @@ defmodule MvWeb.MemberLive.Show do """ use MvWeb, :live_view import Ash.Query + alias MvWeb.Helpers.DateFormatter @impl true def render(assigns) do @@ -52,8 +53,8 @@ defmodule MvWeb.MemberLive.Show do {if @member.paid, do: gettext("Yes"), else: gettext("No")} <:item title={gettext("Phone Number")}>{@member.phone_number} - <:item title={gettext("Join Date")}>{@member.join_date} - <:item title={gettext("Exit Date")}>{@member.exit_date} + <:item title={gettext("Join Date")}>{DateFormatter.format_date(@member.join_date)} + <:item title={gettext("Exit Date")}>{DateFormatter.format_date(@member.exit_date)} <:item title={gettext("Notes")}>{@member.notes} <:item title={gettext("City")}>{@member.city} <:item title={gettext("Street")}>{@member.street} @@ -81,10 +82,7 @@ defmodule MvWeb.MemberLive.Show do # name cfv.custom_field && cfv.custom_field.name, # value - case cfv.value do - %{value: v} -> v - v -> v - end + format_custom_field_value(cfv) } end) } /> @@ -114,4 +112,17 @@ defmodule MvWeb.MemberLive.Show do defp page_title(:show), do: gettext("Show Member") defp page_title(:edit), do: gettext("Edit Member") + + defp format_custom_field_value(cfv) do + value = + case cfv.value do + %{value: v} -> v + v -> v + end + + case value do + %Date{} = date -> DateFormatter.format_date(date) + other -> other + end + end end diff --git a/test/mv_web/member_live/index_custom_fields_display_test.exs b/test/mv_web/member_live/index_custom_fields_display_test.exs index 0485f5e..802cc8f 100644 --- a/test/mv_web/member_live/index_custom_fields_display_test.exs +++ b/test/mv_web/member_live/index_custom_fields_display_test.exs @@ -231,8 +231,8 @@ defmodule MvWeb.MemberLive.IndexCustomFieldsDisplayTest do conn = conn_with_oidc_user(conn) {:ok, _view, html} = live(conn, "/members") - # Date should be displayed in readable format - assert html =~ "1990" or html =~ "1990-05-15" or html =~ "15.05.1990" + # Date should be displayed in European format (dd.mm.yyyy) + assert html =~ "15.05.1990" end test "formats email custom field values correctly", %{conn: conn, member1: _member1} do