feat(member): make overview columns sortable through accessible sort headers

This commit is contained in:
Simon 2026-07-06 10:48:28 +02:00
parent dfc616257d
commit 0c375234c8
9 changed files with 350 additions and 51 deletions

View file

@ -1450,7 +1450,9 @@ defmodule MvWeb.MemberLive.Index do
defp valid_sort_field_db_or_custom?(field) when is_atom(field) do
non_sortable_fields = [:notes]
valid_fields = Mv.Constants.member_fields() -- non_sortable_fields
field in valid_fields or custom_field_sort?(field) or field in [:groups, :membership_fee_type]
field in valid_fields or custom_field_sort?(field) or
field in [:groups, :membership_fee_type, :name, :address]
end
defp valid_sort_field_db_or_custom?(field) when is_binary(field) do
@ -1458,6 +1460,8 @@ defmodule MvWeb.MemberLive.Index do
cond do
field == "groups" -> :groups
field == "membership_fee_type" -> :membership_fee_type
field == "name" -> :name
field == "address" -> :address
true -> safe_member_field_atom_only(field)
end
@ -1508,10 +1512,16 @@ defmodule MvWeb.MemberLive.Index do
defp determine_field(default, ""), do: default
defp determine_field(default, nil), do: default
# Computed/pseudo fields that are nonetheless sortable (they resolve to DB
# sort keys in OverviewQuery): groups aggregate and the composite Name/Address
# columns. Other computed fields (e.g. membership_fee_status) are not sortable.
@sortable_computed_fields [:groups, :name, :address]
defp determine_field(default, sf) when is_binary(sf) do
# Handle "groups" specially - it's in computed_member_fields() but can be sorted
if sf == "groups" do
:groups
sortable_strings = Enum.map(@sortable_computed_fields, &Atom.to_string/1)
if sf in sortable_strings do
String.to_existing_atom(sf)
else
computed_strings = Enum.map(FieldVisibility.computed_member_fields(), &Atom.to_string/1)
@ -1522,9 +1532,8 @@ defmodule MvWeb.MemberLive.Index do
end
defp determine_field(default, sf) when is_atom(sf) do
# Handle :groups specially - it's in computed_member_fields() but can be sorted
if sf == :groups do
:groups
if sf in @sortable_computed_fields do
sf
else
if sf in FieldVisibility.computed_member_fields(),
do: default,