Implements settings for member fields closes #223 #300
5 changed files with 41 additions and 10 deletions
|
|
@ -600,18 +600,21 @@ defmodule Mv.Membership.Member do
|
||||||
"""
|
"""
|
||||||
@spec show_in_overview?(atom()) :: boolean()
|
@spec show_in_overview?(atom()) :: boolean()
|
||||||
def show_in_overview?(field) when is_atom(field) do
|
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
|
case Mv.Membership.get_settings() do
|
||||||
{:ok, settings} ->
|
{:ok, settings} ->
|
||||||
visibility_config = settings.member_field_visibility || %{}
|
visibility_config = settings.member_field_visibility || %{}
|
||||||
# Normalize map keys to atoms (JSONB may return string keys)
|
# Normalize map keys to atoms (JSONB may return string keys)
|
||||||
normalized_config = normalize_visibility_config(visibility_config)
|
normalized_config = normalize_visibility_config(visibility_config)
|
||||||
|
|
||||||
# Get value from normalized config, default to true
|
# Get value from normalized config, use field-specific default
|
||||||
Map.get(normalized_config, field, true)
|
Map.get(normalized_config, field, default_visibility)
|
||||||
|
|
||||||
{:error, _} ->
|
{:error, _} ->
|
||||||
# If settings can't be loaded, default to visible
|
# If settings can't be loaded, use field-specific default
|
||||||
true
|
default_visibility
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,10 @@ defmodule Mv.Membership do
|
||||||
default_club_name = System.get_env("ASSOCIATION_NAME") || "Club Name"
|
default_club_name = System.get_env("ASSOCIATION_NAME") || "Club Name"
|
||||||
|
|
||||||
Mv.Membership.Setting
|
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__)
|
|> Ash.create!(domain: __MODULE__)
|
||||||
|> then(fn settings -> {:ok, settings} end)
|
|> then(fn settings -> {:ok, settings} end)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ defmodule MvWeb.MemberFieldLive.IndexComponent do
|
||||||
## Features
|
## Features
|
||||||
- List all member fields from Mv.Constants.member_fields()
|
- List all member fields from Mv.Constants.member_fields()
|
||||||
- Display show_in_overview status as badge (Yes/No)
|
- 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)
|
- Edit member field properties (expandable form like custom fields)
|
||||||
- Updates Settings.member_field_visibility
|
- Updates Settings.member_field_visibility
|
||||||
"""
|
"""
|
||||||
|
|
@ -15,8 +15,6 @@ defmodule MvWeb.MemberFieldLive.IndexComponent do
|
||||||
alias MvWeb.Translations.MemberFields
|
alias MvWeb.Translations.MemberFields
|
||||||
alias MvWeb.Translations.FieldTypes
|
alias MvWeb.Translations.FieldTypes
|
||||||
|
|
||||||
@required_fields [:first_name, :last_name, :email]
|
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def render(assigns) do
|
def render(assigns) do
|
||||||
assigns =
|
assigns =
|
||||||
|
|
@ -245,6 +243,13 @@ defmodule MvWeb.MemberFieldLive.IndexComponent do
|
||||||
|
|
||||||
defp normalize_visibility_config(_), 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
|
defp required?(_), do: false
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -257,6 +257,24 @@
|
||||||
>
|
>
|
||||||
{MvWeb.MemberLive.Index.format_date(member.join_date)}
|
{MvWeb.MemberLive.Index.format_date(member.join_date)}
|
||||||
</:col>
|
</:col>
|
||||||
|
<: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>
|
||||||
<:col
|
<:col
|
||||||
:let={member}
|
:let={member}
|
||||||
label={gettext("Membership Fee Status")}
|
label={gettext("Membership Fee Status")}
|
||||||
|
|
|
||||||
|
|
@ -183,7 +183,9 @@ defmodule MvWeb.MemberLive.Index.FieldVisibility do
|
||||||
|
|
||||||
Enum.reduce(member_fields, %{}, fn field, acc ->
|
Enum.reduce(member_fields, %{}, fn field, acc ->
|
||||||
field_string = Atom.to_string(field)
|
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)
|
Map.put(acc, field_string, show_in_overview)
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue