fix: sort Fee Type by name in LiveView and exports
Use Ash related-field sort (membership_fee_type.name) instead of membership_fee_type_id so column order is alphabetical. Load membership_fee_type when sorting by it even if column is hidden. In-memory re-sort (Build) uses loaded fee type name.
This commit is contained in:
parent
d41d13d122
commit
94bcb5dc8c
3 changed files with 48 additions and 19 deletions
|
|
@ -133,7 +133,10 @@ defmodule Mv.Membership.MemberExport.Build do
|
|||
"membership_fee_status" in parsed.member_fields
|
||||
|
||||
need_groups = "groups" in parsed.member_fields
|
||||
need_membership_fee_type = "membership_fee_type" in parsed.member_fields
|
||||
|
||||
need_membership_fee_type =
|
||||
"membership_fee_type" in parsed.member_fields or
|
||||
parsed.sort_field == "membership_fee_type"
|
||||
|
||||
query =
|
||||
Member
|
||||
|
|
@ -199,10 +202,9 @@ defmodule Mv.Membership.MemberExport.Build do
|
|||
field_atom = String.to_existing_atom(field)
|
||||
|
||||
if field_atom in Mv.Constants.member_fields() or field_atom == :membership_fee_type do
|
||||
sort_field =
|
||||
if field_atom == :membership_fee_type, do: :membership_fee_type_id, else: field_atom
|
||||
|
||||
sort_by_field(members, sort_field, order)
|
||||
key_fn = sort_key_fn_for_field(field_atom)
|
||||
compare_fn = build_compare_fn(order)
|
||||
Enum.sort_by(members, key_fn, compare_fn)
|
||||
else
|
||||
members
|
||||
end
|
||||
|
|
@ -212,13 +214,17 @@ defmodule Mv.Membership.MemberExport.Build do
|
|||
|
||||
defp sort_members_in_memory(members, _field, _order), do: members
|
||||
|
||||
defp sort_by_field(members, field_atom, order) do
|
||||
key_fn = fn member -> Map.get(member, field_atom) end
|
||||
compare_fn = build_compare_fn(order)
|
||||
|
||||
Enum.sort_by(members, key_fn, compare_fn)
|
||||
defp sort_key_fn_for_field(:membership_fee_type) do
|
||||
fn member ->
|
||||
case Map.get(member, :membership_fee_type) do
|
||||
nil -> nil
|
||||
rel -> Map.get(rel, :name)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
defp sort_key_fn_for_field(field_atom), do: fn member -> Map.get(member, field_atom) end
|
||||
|
||||
defp build_compare_fn("asc"), do: fn a, b -> a <= b end
|
||||
defp build_compare_fn("desc"), do: fn a, b -> b <= a end
|
||||
defp build_compare_fn(_), do: fn _a, _b -> true end
|
||||
|
|
@ -261,7 +267,7 @@ defmodule Mv.Membership.MemberExport.Build do
|
|||
|
||||
defp apply_fee_type_sort(query, order) do
|
||||
order_atom = if order == "desc", do: :desc, else: :asc
|
||||
{Ash.Query.sort(query, membership_fee_type_id: order_atom), false}
|
||||
{Ash.Query.sort(query, [{"membership_fee_type.name", order_atom}]), false}
|
||||
end
|
||||
|
||||
defp apply_standard_member_sort(query, field, order) do
|
||||
|
|
@ -275,9 +281,11 @@ defmodule Mv.Membership.MemberExport.Build do
|
|||
order_atom = if order == "desc", do: :desc, else: :asc
|
||||
|
||||
sort_field =
|
||||
if field_atom == :membership_fee_type, do: :membership_fee_type_id, else: field_atom
|
||||
if field_atom == :membership_fee_type,
|
||||
do: {"membership_fee_type.name", order_atom},
|
||||
else: {field_atom, order_atom}
|
||||
|
||||
{Ash.Query.sort(query, [{sort_field, order_atom}]), false}
|
||||
{Ash.Query.sort(query, [sort_field]), false}
|
||||
else
|
||||
{query, false}
|
||||
end
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue