From ae07e3efc2c8330ac3a8ad4264c8957f22b8f446 Mon Sep 17 00:00:00 2001 From: Moritz Date: Mon, 9 Mar 2026 14:28:31 +0100 Subject: [PATCH] Add filter prefix constants and shared FilterParams module - Mv.Constants: group_filter_prefix/0, fee_type_filter_prefix/0 - MvWeb.MemberLive.Index.FilterParams: parse_in_not_in_value/1 for URL param parsing --- lib/mv/constants.ex | 14 ++++++++++++ .../live/member_live/index/filter_params.ex | 22 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 lib/mv_web/live/member_live/index/filter_params.ex diff --git a/lib/mv/constants.ex b/lib/mv/constants.ex index 7bb6274..517ad2f 100644 --- a/lib/mv/constants.ex +++ b/lib/mv/constants.ex @@ -22,6 +22,10 @@ defmodule Mv.Constants do @boolean_filter_prefix "bf_" + @group_filter_prefix "group_" + + @fee_type_filter_prefix "fee_type_" + @max_boolean_filters 50 @max_uuid_length 36 @@ -70,6 +74,16 @@ defmodule Mv.Constants do """ def boolean_filter_prefix, do: @boolean_filter_prefix + @doc """ + Returns the prefix for group filter URL parameters (e.g. group_=in|not_in). + """ + def group_filter_prefix, do: @group_filter_prefix + + @doc """ + Returns the prefix for fee type filter URL parameters (e.g. fee_type_=in|not_in). + """ + def fee_type_filter_prefix, do: @fee_type_filter_prefix + @doc """ Returns the maximum number of boolean custom field filters allowed per request. diff --git a/lib/mv_web/live/member_live/index/filter_params.ex b/lib/mv_web/live/member_live/index/filter_params.ex new file mode 100644 index 0000000..9b5e800 --- /dev/null +++ b/lib/mv_web/live/member_live/index/filter_params.ex @@ -0,0 +1,22 @@ +defmodule MvWeb.MemberLive.Index.FilterParams do + @moduledoc """ + Shared parsing helpers for member list filter URL/params (in/not_in style). + Used by MemberLive.Index and MemberFilterComponent to avoid duplication and recursion bugs. + """ + @doc """ + Parses a value for group or fee-type filter params. + Returns `:in`, `:not_in`, or `nil`. Handles trimmed strings; no recursion. + """ + def parse_in_not_in_value("in"), do: :in + def parse_in_not_in_value("not_in"), do: :not_in + + def parse_in_not_in_value(val) when is_binary(val) do + case String.trim(val) do + "in" -> :in + "not_in" -> :not_in + _ -> nil + end + end + + def parse_in_not_in_value(_), do: nil +end