refactor(member-live): modularize the overview and drop the superseded in-memory paths
Extract the cookie parser, export-payload builder and fee-status helper into their own modules and remove the filter/sort/load helpers the database pushdown made dead, so the overview LiveView stays a thin coordinator over focused units.
This commit is contained in:
parent
c2cb3edab8
commit
77fc11a0b0
17 changed files with 375 additions and 875 deletions
|
|
@ -60,30 +60,12 @@ defmodule MvWeb.MemberLive.Index.FieldVisibility do
|
|||
:join_date
|
||||
])
|
||||
|
||||
@doc """
|
||||
The curated default-visible columns (member-field atoms) for a first visit.
|
||||
"""
|
||||
@spec default_visible_fields() :: [atom()]
|
||||
def default_visible_fields, do: MapSet.to_list(@default_visible_fields)
|
||||
|
||||
@doc """
|
||||
The curated default-visible columns for the given view settings.
|
||||
|
||||
In compact mode the composite `:name` / `:address` columns are visible by
|
||||
default; when a composite is switched off, its constituent columns take over
|
||||
as the defaults instead (§7b).
|
||||
|
||||
While the Member composite is compact, `include_email` decides where the email
|
||||
lives: folded into the Member cell (`true`, no separate column), or as a
|
||||
default-visible `:email` column (`false`).
|
||||
"""
|
||||
@spec default_visible_fields(boolean(), boolean(), boolean()) :: [atom()]
|
||||
def default_visible_fields(compact_member, include_email, compact_address) do
|
||||
compact_member
|
||||
|> default_visible_set(include_email, compact_address)
|
||||
|> MapSet.to_list()
|
||||
end
|
||||
|
||||
# The curated default-visible column set for the given view settings. In
|
||||
# compact mode the composite `:name` / `:address` columns are default; when a
|
||||
# composite is switched off, its constituent columns take over as the defaults
|
||||
# instead (§7b). While the Member composite is compact, `include_email` decides
|
||||
# where the email lives: folded into the Member cell (`true`, no separate
|
||||
# column) or as a default-visible `:email` column (`false`).
|
||||
defp default_visible_set(compact_member, include_email, compact_address) do
|
||||
@default_visible_fields
|
||||
|> apply_name_default(compact_member, include_email)
|
||||
|
|
@ -205,48 +187,12 @@ defmodule MvWeb.MemberLive.Index.FieldVisibility do
|
|||
end
|
||||
|
||||
@doc """
|
||||
Gets all available fields for selection.
|
||||
Builds field selection from URL, scoped to the columns offered for the given
|
||||
view settings (`:compact_member` / `:member_include_email` / `:compact_address`
|
||||
in `opts`): fields in `url_selection` are visible, all others false.
|
||||
|
||||
Returns a list of field identifiers:
|
||||
- Member fields as atoms (e.g., `:first_name`, `:email`)
|
||||
- Custom fields as strings (e.g., `"custom_field_abc-123"`)
|
||||
|
||||
## Parameters
|
||||
|
||||
- `custom_fields` - List of CustomField resources that are available
|
||||
|
||||
## Returns
|
||||
|
||||
List of field identifiers (atoms and strings)
|
||||
"""
|
||||
@spec get_all_available_fields([struct()]) :: [atom() | String.t()]
|
||||
def get_all_available_fields(custom_fields) do
|
||||
member_fields =
|
||||
overview_member_fields()
|
||||
|> Enum.reject(fn field -> field == @export_only_alias end)
|
||||
|
||||
custom_field_names = Enum.map(custom_fields, &"custom_field_#{&1.id}")
|
||||
|
||||
member_fields ++ custom_field_names
|
||||
end
|
||||
|
||||
@doc """
|
||||
Builds field selection from URL only: fields in `url_selection` are visible, all others false.
|
||||
Use when `?fields=...` is in the URL so column visibility is not merged with global settings.
|
||||
"""
|
||||
@spec selection_from_url_only(%{String.t() => boolean()}, [struct()]) :: %{
|
||||
String.t() => boolean()
|
||||
}
|
||||
def selection_from_url_only(url_selection, custom_fields) when is_map(url_selection) do
|
||||
do_selection_from_url_only(url_selection, get_all_available_fields(custom_fields))
|
||||
end
|
||||
|
||||
def selection_from_url_only(_, _), do: %{}
|
||||
|
||||
@doc """
|
||||
Like `selection_from_url_only/2`, but scoped to the columns offered for the
|
||||
given view settings (`:compact_member` / `:member_include_email` /
|
||||
`:compact_address` in `opts`).
|
||||
Use when `?fields=...` is in the URL so column visibility is not merged with
|
||||
global settings.
|
||||
"""
|
||||
@spec selection_from_url_only(%{String.t() => boolean()}, [struct()], keyword()) :: %{
|
||||
String.t() => boolean()
|
||||
|
|
@ -276,48 +222,16 @@ defmodule MvWeb.MemberLive.Index.FieldVisibility do
|
|||
end
|
||||
|
||||
@doc """
|
||||
Merges user field selection with global settings.
|
||||
|
||||
User selection takes priority over global settings. If a field is not in the
|
||||
user selection, the global setting is used. If a field is not in global settings,
|
||||
it defaults to `true` (visible).
|
||||
|
||||
## Parameters
|
||||
|
||||
- `user_selection` - Map of field names (strings) to boolean visibility
|
||||
- `global_settings` - Settings struct with `member_field_visibility` field
|
||||
- `custom_fields` - List of CustomField resources
|
||||
|
||||
## Returns
|
||||
|
||||
Map of field names (strings) to boolean visibility values
|
||||
|
||||
## Examples
|
||||
|
||||
iex> user_selection = %{"first_name" => false}
|
||||
iex> settings = %{member_field_visibility: %{first_name: true, email: true}}
|
||||
iex> merge_with_global_settings(user_selection, settings, [])
|
||||
%{"first_name" => false, "email" => true} # User selection overrides global
|
||||
"""
|
||||
@spec merge_with_global_settings(
|
||||
%{String.t() => boolean()},
|
||||
map(),
|
||||
[struct()]
|
||||
) :: %{String.t() => boolean()}
|
||||
def merge_with_global_settings(user_selection, global_settings, custom_fields) do
|
||||
all_fields = get_all_available_fields(custom_fields)
|
||||
do_merge(user_selection, global_settings, custom_fields, all_fields, @default_visible_fields)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Like `merge_with_global_settings/3`, but scoped to the columns offered for the
|
||||
given view settings (`:compact_member` / `:member_include_email` /
|
||||
Merges user field selection with global settings, scoped to the columns offered
|
||||
for the given view settings (`:compact_member` / `:member_include_email` /
|
||||
`:compact_address` in `opts`).
|
||||
|
||||
Only offered columns appear in the result, so a column that is not applicable
|
||||
in the current mode (e.g. `:first_name` while the composite "Name" is on) never
|
||||
leaks into the visible set. Defaults follow the mode via
|
||||
`default_visible_fields/2`.
|
||||
User selection takes priority over global settings. If a field is not in the
|
||||
user selection, the global setting is used; if a field is not in global
|
||||
settings, it defaults to visible. Only offered columns appear in the result, so
|
||||
a column that is not applicable in the current mode (e.g. `:first_name` while
|
||||
the composite "Name" is on) never leaks into the visible set. Defaults follow
|
||||
the mode via `default_visible_set/3`.
|
||||
"""
|
||||
@spec merge_with_global_settings(%{String.t() => boolean()}, map(), [struct()], keyword()) ::
|
||||
%{String.t() => boolean()}
|
||||
|
|
@ -345,35 +259,6 @@ defmodule MvWeb.MemberLive.Index.FieldVisibility do
|
|||
end)
|
||||
end
|
||||
|
||||
@doc """
|
||||
Gets the list of visible fields from a field selection map.
|
||||
|
||||
Returns only fields where visibility is `true`.
|
||||
|
||||
## Parameters
|
||||
|
||||
- `field_selection` - Map of field names to boolean visibility
|
||||
|
||||
## Returns
|
||||
|
||||
List of field identifiers (atoms for member fields, strings for custom fields)
|
||||
|
||||
## Examples
|
||||
|
||||
iex> selection = %{"first_name" => true, "email" => false, "street" => true}
|
||||
iex> get_visible_fields(selection)
|
||||
[:first_name, :street]
|
||||
"""
|
||||
@spec get_visible_fields(%{String.t() => boolean()}) :: [atom() | String.t()]
|
||||
def get_visible_fields(field_selection) when is_map(field_selection) do
|
||||
field_selection
|
||||
|> Enum.filter(fn {_field, visible} -> visible end)
|
||||
|> Enum.map(fn {field_string, _visible} -> to_field_identifier(field_string) end)
|
||||
|> Enum.uniq()
|
||||
end
|
||||
|
||||
def get_visible_fields(_), do: []
|
||||
|
||||
@doc """
|
||||
Gets visible member fields from field selection.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue