feat: adds member visibility to live view

This commit is contained in:
carla 2025-12-02 09:23:37 +01:00 committed by Rafael Epplée
parent 397cbde9d6
commit e81aecce48
2 changed files with 51 additions and 35 deletions

View file

@ -61,6 +61,8 @@ defmodule MvWeb.MemberLive.Index do
|> assign_new(:sort_order, fn -> :asc end) |> assign_new(:sort_order, fn -> :asc end)
|> assign(:selected_members, MapSet.new()) |> assign(:selected_members, MapSet.new())
|> assign(:custom_fields_visible, custom_fields_visible) |> assign(:custom_fields_visible, custom_fields_visible)
|> assign(:member_field_configurations, get_member_field_configurations())
|> assign(:member_fields_visible, get_visible_member_fields())
# We call handle params to use the query from the URL # We call handle params to use the query from the URL
{:ok, socket} {:ok, socket}
@ -796,4 +798,39 @@ defmodule MvWeb.MemberLive.Index do
"#{name} <#{member.email}>" "#{name} <#{member.email}>"
end end
end end
# Gets the configuration for all member fields with their show_in_overview values.
#
# Reads the visibility configuration from Settings and returns a map with all member fields
# and their show_in_overview values (true or false). Fields not configured in settings
# default to true.
#
# Returns a map: %{field_name => show_in_overview}
#
# This can be used for:
# - Rendering the overview (filtering visible fields)
# - UI configuration dropdowns (showing all fields with their current state)
# - Dynamic field management
#
# Fields are read from the global Constants module.
defp get_member_field_configurations do
# Get all eligible fields from the global constants
all_fields = Mv.Constants.member_fields()
Enum.reduce(all_fields, %{}, fn field, acc ->
show_in_overview = Mv.Membership.Member.show_in_overview?(field)
Map.put(acc, field, show_in_overview)
end)
end
# Gets the list of member fields that should be visible in the overview.
#
# Filters the member field configurations to return only fields with show_in_overview: true.
#
# Returns a list of atoms representing visible member field names.
defp get_visible_member_fields do
get_member_field_configurations()
|> Enum.filter(fn {_field, show_in_overview} -> show_in_overview end)
|> Enum.map(fn {field, _show_in_overview} -> field end)
end
end end

View file

@ -87,9 +87,7 @@
> >
{member.first_name} {member.last_name} {member.first_name} {member.last_name}
</:col> </:col>
<:col <:col :if={:email in @member_fields_visible} :let={member} label={
:let={member}
label={
~H""" ~H"""
<.live_component <.live_component
module={MvWeb.Components.SortHeaderComponent} module={MvWeb.Components.SortHeaderComponent}
@ -100,13 +98,10 @@
sort_order={@sort_order} sort_order={@sort_order}
/> />
""" """
} }>
>
{member.email} {member.email}
</:col> </:col>
<:col <:col :if={:street in @member_fields_visible} :let={member} label={
:let={member}
label={
~H""" ~H"""
<.live_component <.live_component
module={MvWeb.Components.SortHeaderComponent} module={MvWeb.Components.SortHeaderComponent}
@ -117,13 +112,10 @@
sort_order={@sort_order} sort_order={@sort_order}
/> />
""" """
} }>
>
{member.street} {member.street}
</:col> </:col>
<:col <:col :if={:house_number in @member_fields_visible} :let={member} label={
:let={member}
label={
~H""" ~H"""
<.live_component <.live_component
module={MvWeb.Components.SortHeaderComponent} module={MvWeb.Components.SortHeaderComponent}
@ -134,13 +126,10 @@
sort_order={@sort_order} sort_order={@sort_order}
/> />
""" """
} }>
>
{member.house_number} {member.house_number}
</:col> </:col>
<:col <:col :if={:postal_code in @member_fields_visible} :let={member} label={
:let={member}
label={
~H""" ~H"""
<.live_component <.live_component
module={MvWeb.Components.SortHeaderComponent} module={MvWeb.Components.SortHeaderComponent}
@ -151,13 +140,10 @@
sort_order={@sort_order} sort_order={@sort_order}
/> />
""" """
} }>
>
{member.postal_code} {member.postal_code}
</:col> </:col>
<:col <:col :if={:city in @member_fields_visible} :let={member} label={
:let={member}
label={
~H""" ~H"""
<.live_component <.live_component
module={MvWeb.Components.SortHeaderComponent} module={MvWeb.Components.SortHeaderComponent}
@ -168,13 +154,10 @@
sort_order={@sort_order} sort_order={@sort_order}
/> />
""" """
} }>
>
{member.city} {member.city}
</:col> </:col>
<:col <:col :if={:phone_number in @member_fields_visible} :let={member} label={
:let={member}
label={
~H""" ~H"""
<.live_component <.live_component
module={MvWeb.Components.SortHeaderComponent} module={MvWeb.Components.SortHeaderComponent}
@ -185,13 +168,10 @@
sort_order={@sort_order} sort_order={@sort_order}
/> />
""" """
} }>
>
{member.phone_number} {member.phone_number}
</:col> </:col>
<:col <:col :if={:join_date in @member_fields_visible} :let={member} label={
:let={member}
label={
~H""" ~H"""
<.live_component <.live_component
module={MvWeb.Components.SortHeaderComponent} module={MvWeb.Components.SortHeaderComponent}
@ -202,8 +182,7 @@
sort_order={@sort_order} sort_order={@sort_order}
/> />
""" """
} }>
>
{member.join_date} {member.join_date}
</:col> </:col>
<:action :let={member}> <:action :let={member}>