diff --git a/lib/membership/member.ex b/lib/membership/member.ex index 6ae9307..51da8ff 100644 --- a/lib/membership/member.ex +++ b/lib/membership/member.ex @@ -600,18 +600,21 @@ defmodule Mv.Membership.Member do """ @spec show_in_overview?(atom()) :: boolean() def show_in_overview?(field) when is_atom(field) do + # exit_date defaults to false (hidden) instead of true + default_visibility = if field == :exit_date, do: false, else: true + case Mv.Membership.get_settings() do {:ok, settings} -> visibility_config = settings.member_field_visibility || %{} # Normalize map keys to atoms (JSONB may return string keys) normalized_config = normalize_visibility_config(visibility_config) - # Get value from normalized config, default to true - Map.get(normalized_config, field, true) + # Get value from normalized config, use field-specific default + Map.get(normalized_config, field, default_visibility) {:error, _} -> - # If settings can't be loaded, default to visible - true + # If settings can't be loaded, use field-specific default + default_visibility end end diff --git a/lib/membership/membership.ex b/lib/membership/membership.ex index 4917c7c..c711bcd 100644 --- a/lib/membership/membership.ex +++ b/lib/membership/membership.ex @@ -89,7 +89,10 @@ defmodule Mv.Membership do default_club_name = System.get_env("ASSOCIATION_NAME") || "Club Name" Mv.Membership.Setting - |> Ash.Changeset.for_create(:create, %{club_name: default_club_name}) + |> Ash.Changeset.for_create(:create, %{ + club_name: default_club_name, + member_field_visibility: %{"exit_date" => false} + }) |> Ash.create!(domain: __MODULE__) |> then(fn settings -> {:ok, settings} end) diff --git a/lib/mv_web/live/member_field_live/index_component.ex b/lib/mv_web/live/member_field_live/index_component.ex index 7422f5a..eec98be 100644 --- a/lib/mv_web/live/member_field_live/index_component.ex +++ b/lib/mv_web/live/member_field_live/index_component.ex @@ -5,7 +5,7 @@ defmodule MvWeb.MemberFieldLive.IndexComponent do ## Features - List all member fields from Mv.Constants.member_fields() - Display show_in_overview status as badge (Yes/No) - - Display required status for required fields (first_name, last_name, email) + - Display required status based on actual attribute definitions (allow_nil? false) - Edit member field properties (expandable form like custom fields) - Updates Settings.member_field_visibility """ @@ -15,8 +15,6 @@ defmodule MvWeb.MemberFieldLive.IndexComponent do alias MvWeb.Translations.MemberFields alias MvWeb.Translations.FieldTypes - @required_fields [:first_name, :last_name, :email] - @impl true def render(assigns) do assigns = @@ -245,6 +243,13 @@ defmodule MvWeb.MemberFieldLive.IndexComponent do defp normalize_visibility_config(_), do: %{} - defp required?(field) when field in @required_fields, do: true + # Check if a field is required by checking the actual attribute definition + defp required?(field) when is_atom(field) do + case Ash.Resource.Info.attribute(Mv.Membership.Member, field) do + nil -> false + attribute -> not attribute.allow_nil? + end + end + defp required?(_), do: false end diff --git a/lib/mv_web/live/member_live/index.html.heex b/lib/mv_web/live/member_live/index.html.heex index 1557ed9..b2af205 100644 --- a/lib/mv_web/live/member_live/index.html.heex +++ b/lib/mv_web/live/member_live/index.html.heex @@ -257,6 +257,24 @@ > {MvWeb.MemberLive.Index.format_date(member.join_date)} + <:col + :let={member} + :if={:exit_date in @member_fields_visible} + label={ + ~H""" + <.live_component + module={MvWeb.Components.SortHeaderComponent} + id={:sort_exit_date} + field={:exit_date} + label={gettext("Exit Date")} + sort_field={@sort_field} + sort_order={@sort_order} + /> + """ + } + > + {MvWeb.MemberLive.Index.format_date(member.exit_date)} + <:col :let={member} label={gettext("Membership Fee Status")} diff --git a/lib/mv_web/live/member_live/index/field_visibility.ex b/lib/mv_web/live/member_live/index/field_visibility.ex index c9c8bd6..627bbcf 100644 --- a/lib/mv_web/live/member_live/index/field_visibility.ex +++ b/lib/mv_web/live/member_live/index/field_visibility.ex @@ -183,7 +183,9 @@ defmodule MvWeb.MemberLive.Index.FieldVisibility do Enum.reduce(member_fields, %{}, fn field, acc -> field_string = Atom.to_string(field) - show_in_overview = Map.get(visibility_config, field, true) + # exit_date defaults to false (hidden), all other fields default to true + default_visibility = if field == :exit_date, do: false, else: true + show_in_overview = Map.get(visibility_config, field, default_visibility) Map.put(acc, field_string, show_in_overview) end) end