feat: add groups to export
This commit is contained in:
parent
31fc4f4d0c
commit
01f62297fc
6 changed files with 98 additions and 6 deletions
|
|
@ -18,7 +18,8 @@ defmodule MvWeb.MemberExportController do
|
|||
alias MvWeb.MemberLive.Index.MembershipFeeStatus
|
||||
use Gettext, backend: MvWeb.Gettext
|
||||
|
||||
@member_fields_allowlist Mv.Constants.member_fields() |> Enum.map(&Atom.to_string/1)
|
||||
@member_fields_allowlist (Mv.Constants.member_fields() |> Enum.map(&Atom.to_string/1)) ++
|
||||
["groups"]
|
||||
@computed_export_fields ["membership_fee_status"]
|
||||
@custom_field_prefix Mv.Constants.custom_field_prefix()
|
||||
|
||||
|
|
@ -83,6 +84,7 @@ defmodule MvWeb.MemberExportController do
|
|||
domain_fields = Mv.Constants.member_fields() |> Enum.map(&Atom.to_string/1)
|
||||
selectable = Enum.filter(member_fields, fn f -> f in domain_fields end)
|
||||
computed = Enum.filter(member_fields, fn f -> f in @computed_export_fields end)
|
||||
# "groups" is neither a domain field nor a computed field, it's handled separately
|
||||
{selectable, computed}
|
||||
end
|
||||
|
||||
|
|
@ -235,12 +237,15 @@ defmodule MvWeb.MemberExportController do
|
|||
need_cycles =
|
||||
parsed.computed_fields != [] and "membership_fee_status" in parsed.computed_fields
|
||||
|
||||
need_groups = "groups" in parsed.member_fields
|
||||
|
||||
query =
|
||||
Member
|
||||
|> Ash.Query.new()
|
||||
|> Ash.Query.select(select_fields)
|
||||
|> load_custom_field_values_query(parsed.custom_field_ids)
|
||||
|> maybe_load_cycles(need_cycles, parsed.show_current_cycle)
|
||||
|> maybe_load_groups(need_groups)
|
||||
|
||||
query =
|
||||
if parsed.selected_ids != [] do
|
||||
|
|
@ -284,6 +289,13 @@ defmodule MvWeb.MemberExportController do
|
|||
MembershipFeeStatus.load_cycles_for_members(query, show_current)
|
||||
end
|
||||
|
||||
defp maybe_load_groups(query, false), do: query
|
||||
|
||||
defp maybe_load_groups(query, true) do
|
||||
# Load groups with id and name only (for export formatting)
|
||||
Ash.Query.load(query, groups: [:id, :name])
|
||||
end
|
||||
|
||||
# Adds computed field values to members (e.g. membership_fee_status)
|
||||
defp add_computed_fields(members, computed_fields, show_current_cycle) do
|
||||
if "membership_fee_status" in computed_fields do
|
||||
|
|
@ -441,6 +453,19 @@ defmodule MvWeb.MemberExportController do
|
|||
}
|
||||
end)
|
||||
|
||||
groups_col =
|
||||
if "groups" in parsed.member_fields do
|
||||
[
|
||||
%{
|
||||
header: groups_field_header(conn),
|
||||
kind: :groups,
|
||||
key: :groups
|
||||
}
|
||||
]
|
||||
else
|
||||
[]
|
||||
end
|
||||
|
||||
custom_cols =
|
||||
parsed.custom_field_ids
|
||||
|> Enum.map(fn id ->
|
||||
|
|
@ -459,7 +484,7 @@ defmodule MvWeb.MemberExportController do
|
|||
end)
|
||||
|> Enum.reject(&is_nil/1)
|
||||
|
||||
member_cols ++ computed_cols ++ custom_cols
|
||||
member_cols ++ computed_cols ++ groups_col ++ custom_cols
|
||||
end
|
||||
|
||||
# --- headers: use MemberFields.label for translations ---
|
||||
|
|
@ -499,6 +524,10 @@ defmodule MvWeb.MemberExportController do
|
|||
cf.name
|
||||
end
|
||||
|
||||
defp groups_field_header(_conn) do
|
||||
MemberFields.label(:groups)
|
||||
end
|
||||
|
||||
defp humanize_field(str) do
|
||||
str
|
||||
|> String.replace("_", " ")
|
||||
|
|
|
|||
|
|
@ -1620,6 +1620,10 @@ defmodule MvWeb.MemberLive.Index do
|
|||
FieldVisibility.computed_member_fields()
|
||||
|> Enum.filter(&(&1 in member_fields_computed))
|
||||
|
||||
# Groups is always included in export if it's visible in the table
|
||||
# (groups column is always shown in the table, so we always include it in export)
|
||||
member_fields_with_groups = ordered_member_fields_db ++ ["groups"]
|
||||
|
||||
# Order custom fields like the table (same as dynamic_cols / all_custom_fields order)
|
||||
ordered_custom_field_ids =
|
||||
socket.assigns.all_custom_fields
|
||||
|
|
@ -1628,7 +1632,10 @@ defmodule MvWeb.MemberLive.Index do
|
|||
|
||||
%{
|
||||
selected_ids: socket.assigns.selected_members |> MapSet.to_list(),
|
||||
member_fields: Enum.map(ordered_member_fields_db, &Atom.to_string/1),
|
||||
member_fields: Enum.map(member_fields_with_groups, fn
|
||||
f when is_atom(f) -> Atom.to_string(f)
|
||||
f when is_binary(f) -> f
|
||||
end),
|
||||
computed_fields: Enum.map(ordered_computed_fields, &Atom.to_string/1),
|
||||
custom_field_ids: ordered_custom_field_ids,
|
||||
column_order:
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ defmodule MvWeb.Translations.MemberFields do
|
|||
def label(:postal_code), do: gettext("Postal Code")
|
||||
def label(:membership_fee_start_date), do: gettext("Membership Fee Start Date")
|
||||
def label(:membership_fee_status), do: gettext("Membership Fee Status")
|
||||
def label(:groups), do: gettext("Groups")
|
||||
|
||||
# Fallback for unknown fields
|
||||
def label(field) do
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue