Rework Filter using a filter builder #556

Open
simon wants to merge 22 commits from issue/mitgliederverwaltung-548 into main
Owner

Description of the implemented changes

The changes were:

  • Bugfixing
  • New Feature
  • Breaking Change
  • Refactoring

Redesign of the member-overview filtering: the unbounded vertical filter panel is replaced by an add-filter builder (searchable grouped field picker → type-aware value control → applied, editable chips, all encoded in the URL), and the fees column becomes a period-scoped payment view that shows how many billing cycles a member has left unpaid — over a calendar-aligned contribution period or over that member's own current or previous cycle.

What has been changed?

  • Index fee cycles by member, status and end date
  • Scope a member's payment status to a contribution period
  • Replace the filter panel with an add-filter builder
  • Make every filter kind editable as a chip in the builder
  • Show unpaid and suspended cycles in one payment popover list
  • Make the payment status a three-valued single choice
  • Filter payments by each member's current or previous cycle
  • Stop the member sort menu inheriting the table density font size
  • Explain on hover why the bulk mail action is disabled
  • Open the fees tab when a payment popover entry is clicked
  • Bind contribution periods to whole calendar units
  • Keep the fees column badge label short whatever deviates
  • Keep the cycle popover reachable after a filter flips the cell
  • Correct the filter defaults and bound decoded link values
  • Extract the payment cell and fix its popover and hints
  • Navigate and announce the filter builder by keyboard
  • Collapse the duplication the filter rework left behind
  • Correct filter editing, scope reporting and sort handling
  • Batch filter commits and validate every crafted payload
  • Carry filter changes as a delta and keep selections canonical
  • Record the changes under Unreleased in the changelog

Definition of Done

Code Quality

  • No new technical depths
  • Linting passed
  • Documentation is added were needed

Accessibility

  • New elements are properly defined with html-tags
  • Colour contrast follows WCAG criteria
  • Aria labels are added when needed
  • Everything is accessible by keyboard
  • Tab-Order is comprehensible
  • All interactive elements have a visible focus

Testing

  • Tests for new code are written
  • All tests pass
  • axe-core dev tools show no critical or major issues

Additional Notes

  • The last seven commits each bundle several fixes from the review loop, so their subjects summarise rather than enumerate. Larger diffs to expect: the filter-panel swap and the chip rework each touch ~35–40 files, and the clean-up commit ("Collapse the duplication…") bundles thirteen source commits across the overview, the filter builder, JS and tests.
  • The branch was rebased onto main after #553 (member overview rework) and again after #560 (#559's migration fix); it is current with main as of 07ffeacd and was re-verified green on that base.
  • Accessibility work is in the diff but unverified by tooling: the keyboard flow, focus indicators, dialog semantics and live regions were built against WCAG criteria, but no axe-core run was performed. The six accessibility boxes above are left for the reviewer.
  • Follow-ups deliberately deferred to their own issues rather than folded in — recommended first: the date_filters map still travels as a whole map recomputed from the component's snapshot, so two date chips removed in quick succession can resurrect the first (the same defect class this PR fixes for the group, fee-type and boolean dimensions). Also deferred: a component-size and duplication clean-up, an endpoint :max_frame_size bound, and the per-toggle re-encode of the selection.
  • Backtracks during the run (5): solutions → requirements (payment model pivoted to a period-scoped unpaid-cycle count); ui_tune → requirements (filter-builder v2 maturity); finalize → requirements (post-rebase follow-ups folded in before the push); requirements → clarify (member-relative cycle modes had three unresolved definitions); accept → requirements (day-relative presets structurally mismatched calendar-aligned cycle data).
## Description of the implemented changes The changes were: - [x] Bugfixing - [x] New Feature - [ ] Breaking Change - [x] Refactoring Redesign of the member-overview filtering: the unbounded vertical filter panel is replaced by an add-filter builder (searchable grouped field picker → type-aware value control → applied, editable chips, all encoded in the URL), and the fees column becomes a period-scoped payment view that shows how many billing cycles a member has left unpaid — over a calendar-aligned contribution period or over that member's own current or previous cycle. ## What has been changed? - Index fee cycles by member, status and end date - Scope a member's payment status to a contribution period - Replace the filter panel with an add-filter builder - Make every filter kind editable as a chip in the builder - Show unpaid and suspended cycles in one payment popover list - Make the payment status a three-valued single choice - Filter payments by each member's current or previous cycle - Stop the member sort menu inheriting the table density font size - Explain on hover why the bulk mail action is disabled - Open the fees tab when a payment popover entry is clicked - Bind contribution periods to whole calendar units - Keep the fees column badge label short whatever deviates - Keep the cycle popover reachable after a filter flips the cell - Correct the filter defaults and bound decoded link values - Extract the payment cell and fix its popover and hints - Navigate and announce the filter builder by keyboard - Collapse the duplication the filter rework left behind - Correct filter editing, scope reporting and sort handling - Batch filter commits and validate every crafted payload - Carry filter changes as a delta and keep selections canonical - Record the changes under Unreleased in the changelog ## Definition of Done ### Code Quality - [ ] No new technical depths - [x] Linting passed - [ ] Documentation is added were needed ### Accessibility - [ ] New elements are properly defined with html-tags - [ ] Colour contrast follows WCAG criteria - [ ] Aria labels are added when needed - [ ] Everything is accessible by keyboard - [ ] Tab-Order is comprehensible - [ ] All interactive elements have a visible focus ### Testing - [x] Tests for new code are written - [x] All tests pass - [ ] axe-core dev tools show no critical or major issues ## Additional Notes - The last seven commits each bundle several fixes from the review loop, so their subjects summarise rather than enumerate. Larger diffs to expect: the filter-panel swap and the chip rework each touch ~35–40 files, and the clean-up commit ("Collapse the duplication…") bundles thirteen source commits across the overview, the filter builder, JS and tests. - The branch was rebased onto `main` after #553 (member overview rework) and again after #560 (#559's migration fix); it is current with `main` as of `07ffeacd` and was re-verified green on that base. - Accessibility work is in the diff but unverified by tooling: the keyboard flow, focus indicators, dialog semantics and live regions were built against WCAG criteria, but no axe-core run was performed. The six accessibility boxes above are left for the reviewer. - Follow-ups deliberately deferred to their own issues rather than folded in — recommended first: the `date_filters` map still travels as a whole map recomputed from the component's snapshot, so two date chips removed in quick succession can resurrect the first (the same defect class this PR fixes for the group, fee-type and boolean dimensions). Also deferred: a component-size and duplication clean-up, an endpoint `:max_frame_size` bound, and the per-toggle re-encode of the selection. - Backtracks during the run (5): solutions → requirements (payment model pivoted to a period-scoped unpaid-cycle count); ui_tune → requirements (filter-builder v2 maturity); finalize → requirements (post-rebase follow-ups folded in before the push); requirements → clarify (member-relative cycle modes had three unresolved definitions); accept → requirements (day-relative presets structurally mismatched calendar-aligned cycle data).
Counts each member's unpaid billing cycles that fall inside the selected
period. Cycle boundaries are member-relative — derived from each member's
fee-type interval — so "the current cycle" spans different calendar dates
per member.
Swaps the unbounded vertical filter panel for a Polaris-style add-filter
builder (searchable grouped field picker, type-aware value control, applied
chips) and colour-codes the fees column with each member's period-scoped
unpaid-cycle count.
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.
docs(changelog): record member-overview filter redesign under Unreleased
Some checks failed
continuous-integration/drone/push Build is failing
fc634813d8
simon changed target branch from issue/mitgliederverwaltung-547 to main 2026-07-28 10:21:12 +02:00
simon force-pushed issue/mitgliederverwaltung-548 from fc634813d8
Some checks failed
continuous-integration/drone/push Build is failing
to 3794506796
All checks were successful
continuous-integration/drone/push Build is passing
2026-07-31 14:19:15 +02:00
Compare
Some checks are pending
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production
Required
Some required checks are missing.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin issue/mitgliederverwaltung-548:issue/mitgliederverwaltung-548
git switch issue/mitgliederverwaltung-548
Sign in to join this conversation.
No description provided.