feat(overview): rework filter builder with editable chips and native date ranges

Editable filter chips, uniformly-sized value controls, working field-picker
search, and native date-range inputs with relative presets in place of the
vendored calendar — native inputs give year-jump, manual entry and keyboard
accessibility for free.
This commit is contained in:
Simon 2026-07-10 16:27:15 +02:00
parent c0d1550401
commit 8303a39041
23 changed files with 1905 additions and 565 deletions

View file

@ -472,6 +472,8 @@ defmodule MvWeb.MemberLive.Index do
%{
payment_filter: nil,
payment_period: PaymentAging.default_period(),
suspended: false,
stichtag: nil,
group_filters: %{},
fee_type_filters: %{},
boolean_filters: %{},
@ -481,6 +483,46 @@ defmodule MvWeb.MemberLive.Index do
)
end
@impl true
def handle_info({:suspended_changed, suspended}, socket) do
socket =
socket
|> assign(:suspended, suspended)
|> load_members()
|> scroll_list_to_top()
|> update_selection_assigns()
query_params =
build_query_params(opts_for_query_params(socket, %{suspended: suspended}))
|> maybe_add_field_selection(
socket.assigns[:user_field_selection],
socket.assigns[:fields_in_url?] || false
)
new_path = ~p"/members?#{query_params}"
{:noreply, push_reload(socket, new_path)}
end
@impl true
def handle_info({:stichtag_changed, stichtag}, socket) do
socket =
socket
|> assign(:stichtag, stichtag)
|> load_members()
|> scroll_list_to_top()
|> update_selection_assigns()
query_params =
build_query_params(opts_for_query_params(socket, %{stichtag: stichtag}))
|> maybe_add_field_selection(
socket.assigns[:user_field_selection],
socket.assigns[:fields_in_url?] || false
)
new_path = ~p"/members?#{query_params}"
{:noreply, push_reload(socket, new_path)}
end
@impl true
def handle_info({:boolean_filter_changed, custom_field_id_str, filter_value}, socket) do
updated_filters =
@ -595,6 +637,8 @@ defmodule MvWeb.MemberLive.Index do
|> assign(:fee_type_filters, Map.get(opts, :fee_type_filters, %{}))
|> assign(:boolean_custom_field_filters, Map.get(opts, :boolean_filters, %{}))
|> assign(:date_filters, Map.get(opts, :date_filters, DateFilter.default()))
|> assign(:suspended, Map.get(opts, :suspended, false))
|> assign(:stichtag, Map.get(opts, :stichtag))
|> load_members()
|> scroll_list_to_top()
|> update_selection_assigns()