fix(member): order member list chronologically by custom :date fields

This commit is contained in:
Moritz 2026-06-15 16:14:14 +02:00
parent 1aaa0ece5d
commit 6d4629ef5b
2 changed files with 66 additions and 16 deletions

View file

@ -32,6 +32,7 @@ defmodule MvWeb.MemberLive.Index do
import MvWeb.LiveHelpers, only: [current_actor: 1]
alias Mv.Membership
alias Mv.Membership.CustomFieldSort
alias Mv.Membership.Member, as: MemberResource
alias Mv.MembershipFees
alias Mv.MembershipFees.MembershipFeeType
@ -1414,8 +1415,7 @@ defmodule MvWeb.MemberLive.Index do
false
cfv ->
extracted = extract_sort_value(cfv.value, custom_field.value_type)
not empty_value?(extracted, custom_field.value_type)
not empty_value?(cfv.value, custom_field.value_type)
end
end
@ -1423,29 +1423,22 @@ defmodule MvWeb.MemberLive.Index do
sorted =
Enum.sort_by(members_with_values, fn member ->
cfv = get_custom_field_value(member, custom_field)
extracted = extract_sort_value(cfv.value, custom_field.value_type)
normalize_sort_value(extracted, order)
CustomFieldSort.sort_key(cfv.value, custom_field.value_type)
end)
if order == :desc, do: Enum.reverse(sorted), else: sorted
end
defp extract_sort_value(%Ash.Union{value: value, type: type}, _expected_type),
do: extract_sort_value(value, type)
defp empty_value?(%Ash.Union{value: value, type: type}, _expected_type),
do: empty_value?(value, type)
defp extract_sort_value(value, :string) when is_binary(value), do: value
defp extract_sort_value(value, :integer) when is_integer(value), do: value
defp extract_sort_value(value, :boolean) when is_boolean(value), do: value
defp extract_sort_value(%Date{} = date, :date), do: date
defp extract_sort_value(value, :email) when is_binary(value), do: value
defp extract_sort_value(value, _type), do: to_string(value)
defp empty_value?(nil, _type), do: true
defp empty_value?(value, type) when type in [:string, :email] and is_binary(value),
do: String.trim(value) == ""
defp empty_value?(value, :string) when is_binary(value), do: String.trim(value) == ""
defp empty_value?(value, :email) when is_binary(value), do: String.trim(value) == ""
defp empty_value?(_value, _type), do: false
defp normalize_sort_value(value, _order), do: value
defp maybe_update_sort(socket, %{"sort_field" => sf, "sort_order" => so}) do
field = determine_field(socket.assigns.sort_field, sf)
order = determine_order(socket.assigns.sort_order, so)