This commit is contained in:
parent
cb932ad6ef
commit
397f7a7975
3 changed files with 52 additions and 38 deletions
|
|
@ -272,24 +272,34 @@ defmodule Mv.Membership.MemberExport.Build do
|
||||||
if field == "groups" do
|
if field == "groups" do
|
||||||
sort_members_by_groups_export(members, order)
|
sort_members_by_groups_export(members, order)
|
||||||
else
|
else
|
||||||
id_str = String.trim_leading(field, @custom_field_prefix)
|
sort_by_custom_field_value(members, field, order, custom_fields)
|
||||||
custom_field = Enum.find(custom_fields, fn cf -> to_string(cf.id) == id_str end)
|
|
||||||
|
|
||||||
if is_nil(custom_field), do: members
|
|
||||||
|
|
||||||
key_fn = fn member ->
|
|
||||||
cfv = find_cfv(member, custom_field)
|
|
||||||
raw = if cfv, do: cfv.value, else: nil
|
|
||||||
MemberExportSort.custom_field_sort_key(custom_field.value_type, raw)
|
|
||||||
end
|
|
||||||
|
|
||||||
members
|
|
||||||
|> Enum.map(fn m -> {m, key_fn.(m)} end)
|
|
||||||
|> Enum.sort(fn {_, ka}, {_, kb} -> MemberExportSort.key_lt(ka, kb, order) end)
|
|
||||||
|> Enum.map(fn {m, _} -> m end)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp sort_by_custom_field_value(members, field, order, custom_fields) do
|
||||||
|
id_str = String.trim_leading(field, @custom_field_prefix)
|
||||||
|
custom_field = Enum.find(custom_fields, fn cf -> to_string(cf.id) == id_str end)
|
||||||
|
|
||||||
|
if is_nil(custom_field) do
|
||||||
|
members
|
||||||
|
else
|
||||||
|
sort_members_with_custom_field(members, custom_field, order)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp sort_members_with_custom_field(members, custom_field, order) do
|
||||||
|
key_fn = fn member ->
|
||||||
|
cfv = find_cfv(member, custom_field)
|
||||||
|
raw = if cfv, do: cfv.value, else: nil
|
||||||
|
MemberExportSort.custom_field_sort_key(custom_field.value_type, raw)
|
||||||
|
end
|
||||||
|
|
||||||
|
members
|
||||||
|
|> Enum.map(fn m -> {m, key_fn.(m)} end)
|
||||||
|
|> Enum.sort(fn {_, ka}, {_, kb} -> MemberExportSort.key_lt(ka, kb, order) end)
|
||||||
|
|> Enum.map(fn {m, _} -> m end)
|
||||||
|
end
|
||||||
|
|
||||||
defp sort_members_by_groups_export(members, order) do
|
defp sort_members_by_groups_export(members, order) do
|
||||||
# Members with groups first, then by first group name alphabetically (min = first by sort order)
|
# Members with groups first, then by first group name alphabetically (min = first by sort order)
|
||||||
# Match table behavior from MvWeb.MemberLive.Index.sort_members_by_groups/2
|
# Match table behavior from MvWeb.MemberLive.Index.sort_members_by_groups/2
|
||||||
|
|
|
||||||
|
|
@ -380,33 +380,37 @@ defmodule MvWeb.MemberExportController do
|
||||||
if field == "groups" do
|
if field == "groups" do
|
||||||
sort_members_by_groups_export(members, order)
|
sort_members_by_groups_export(members, order)
|
||||||
else
|
else
|
||||||
id_str = String.trim_leading(field, @custom_field_prefix)
|
sort_by_custom_field_value(members, field, order, custom_fields)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
custom_field =
|
defp sort_by_custom_field_value(members, field, order, custom_fields) do
|
||||||
Enum.find(custom_fields, fn cf -> to_string(cf.id) == id_str end)
|
id_str = String.trim_leading(field, @custom_field_prefix)
|
||||||
|
|
||||||
if is_nil(custom_field) do
|
custom_field =
|
||||||
members
|
Enum.find(custom_fields, fn cf -> to_string(cf.id) == id_str end)
|
||||||
else
|
|
||||||
# Match table:
|
|
||||||
# 1) values first, empty last
|
|
||||||
# 2) sort only values
|
|
||||||
# 3) for desc, reverse only the values-part
|
|
||||||
{with_values, without_values} =
|
|
||||||
Enum.split_with(members, fn member ->
|
|
||||||
has_non_empty_custom_field_value?(member, custom_field)
|
|
||||||
end)
|
|
||||||
|
|
||||||
sorted_with_values =
|
if is_nil(custom_field) do
|
||||||
Enum.sort_by(with_values, fn member ->
|
members
|
||||||
extract_member_sort_value(member, custom_field)
|
else
|
||||||
end)
|
# Match table:
|
||||||
|
# 1) values first, empty last
|
||||||
|
# 2) sort only values
|
||||||
|
# 3) for desc, reverse only the values-part
|
||||||
|
{with_values, without_values} =
|
||||||
|
Enum.split_with(members, fn member ->
|
||||||
|
has_non_empty_custom_field_value?(member, custom_field)
|
||||||
|
end)
|
||||||
|
|
||||||
sorted_with_values =
|
sorted_with_values =
|
||||||
if order == "desc", do: Enum.reverse(sorted_with_values), else: sorted_with_values
|
Enum.sort_by(with_values, fn member ->
|
||||||
|
extract_member_sort_value(member, custom_field)
|
||||||
|
end)
|
||||||
|
|
||||||
sorted_with_values ++ without_values
|
sorted_with_values =
|
||||||
end
|
if order == "desc", do: Enum.reverse(sorted_with_values), else: sorted_with_values
|
||||||
|
|
||||||
|
sorted_with_values ++ without_values
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -686,6 +686,7 @@ defmodule MvWeb.MemberLive.Index do
|
||||||
socket =
|
socket =
|
||||||
if socket.assigns[:sort_needs_update] do
|
if socket.assigns[:sort_needs_update] do
|
||||||
old_field = socket.assigns[:previous_sort_field] || socket.assigns.sort_field
|
old_field = socket.assigns[:previous_sort_field] || socket.assigns.sort_field
|
||||||
|
|
||||||
socket
|
socket
|
||||||
|> update_sort_components(old_field, socket.assigns.sort_field, socket.assigns.sort_order)
|
|> update_sort_components(old_field, socket.assigns.sort_field, socket.assigns.sort_order)
|
||||||
|> assign(:sort_needs_update, false)
|
|> assign(:sort_needs_update, false)
|
||||||
|
|
@ -1066,7 +1067,6 @@ defmodule MvWeb.MemberLive.Index do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
defp apply_sort_to_query(query, field, order) do
|
defp apply_sort_to_query(query, field, order) do
|
||||||
cond do
|
cond do
|
||||||
# Groups sort -> after load (in memory)
|
# Groups sort -> after load (in memory)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue