Rework member overview #553

Open
simon wants to merge 27 commits from issue/mitgliederverwaltung-547 into main
Owner

Description of the implemented changes

The changes were:

  • Bugfixing
  • New Feature
  • Breaking Change
  • Refactoring

Rebuild the member overview on a database-pushdown data foundation: filtering,
sorting and pagination now run in PostgreSQL via Ash keyset pagination and
aggregates instead of loading every member into memory, and the table is
redesigned with composite name/address cells, a density toggle, a
view-settings-driven column manager, and a WCAG 2.2 AA accessibility posture.

What has been changed?

  • Denormalize cycle_end so fee status filters run in the database
  • Back the overview with a keyset-paginated :overview read action
  • Resolve custom-field filters and sorting in PostgreSQL
  • Stream the overview with keyset infinite scroll instead of loading every member
  • Condense the overview into composite name and address cells
  • Let members tailor overview density and visible columns
  • Make overview columns sortable through accessible sort headers
  • Bring the overview table up to WCAG 2.2 AA
  • Modularize the overview and drop the superseded in-memory paths
  • Document the overview and use English throughout its internals

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

  • Backtrack during the run: from accept to clarify — the round-1 acceptance test reconsidered the column/density UI (replace the plain density button with a View-settings dropdown, add compact member/address field toggles and a reset-to-default control, make Name and Address sortable, and fix the density-persistence read-back defect).
  • The review loop ran 3 iterations (all findings accepted, no rejections).
  • Expect large diffs on several commits: F4 (LiveView rebuild), F5 (composite cells), F6 (density + view settings — the largest, folding the ui-tune density-scaling churn), F7 (sort headers), and F9 (modularization) each exceed ~5 files or ~150 lines.
  • Two schema migrations ride inside their originating feature commits and cannot be split off: the cycle_end column + backfill in F1, and the JSONB GIN index in F3.
## Description of the implemented changes The changes were: - [ ] Bugfixing - [x] New Feature - [ ] Breaking Change - [x] Refactoring Rebuild the member overview on a database-pushdown data foundation: filtering, sorting and pagination now run in PostgreSQL via Ash keyset pagination and aggregates instead of loading every member into memory, and the table is redesigned with composite name/address cells, a density toggle, a view-settings-driven column manager, and a WCAG 2.2 AA accessibility posture. ## What has been changed? - Denormalize cycle_end so fee status filters run in the database - Back the overview with a keyset-paginated :overview read action - Resolve custom-field filters and sorting in PostgreSQL - Stream the overview with keyset infinite scroll instead of loading every member - Condense the overview into composite name and address cells - Let members tailor overview density and visible columns - Make overview columns sortable through accessible sort headers - Bring the overview table up to WCAG 2.2 AA - Modularize the overview and drop the superseded in-memory paths - Document the overview and use English throughout its internals ## Definition of Done ### Code Quality - [x] No new technical depths - [x] Linting passed - [x] Documentation is added were needed ### Accessibility - [x] New elements are properly defined with html-tags - [x] Colour contrast follows WCAG criteria - [x] Aria labels are added when needed - [x] Everything is accessible by keyboard - [x] Tab-Order is comprehensible - [x] All interactive elements have a visible focus ### Testing - [x] Tests for new code are written - [x] All tests pass - [x] axe-core dev tools show no critical or major issues ## Additional Notes - Backtrack during the run: from accept to clarify — the round-1 acceptance test reconsidered the column/density UI (replace the plain density button with a View-settings dropdown, add compact member/address field toggles and a reset-to-default control, make Name and Address sortable, and fix the density-persistence read-back defect). - The review loop ran 3 iterations (all findings accepted, no rejections). - Expect large diffs on several commits: F4 (LiveView rebuild), F5 (composite cells), F6 (density + view settings — the largest, folding the ui-tune density-scaling churn), F7 (sort headers), and F9 (modularization) each exceed ~5 files or ~150 lines. - Two schema migrations ride inside their originating feature commits and cannot be split off: the `cycle_end` column + backfill in F1, and the JSONB GIN index in F3.
simon added 11 commits 2026-07-06 13:28:06 +02:00
Store the cycle's end date alongside its start so the payment-status
filter can be a plain date comparison in SQL instead of loading every
cycle and classifying it in memory. The value is fixed when the cycle
is created (the fee type's interval is immutable and the update action
never changes the start date), so the denormalized column can never
drift from the computed end and needs no write-time reconciliation.
Push the boolean and date custom-field predicates and custom-field
sorting down to JSONB expressions so the overview stops classifying
custom-field values in memory. A GIN index on custom_field_values.value
keeps the boolean membership predicates index-served.
The View dropdown drives row density and whether the Member and Address
fields render as composite cells or split into their underlying columns;
the column manager toggles visibility and resets to the curated default.
All choices persist per browser through the URL/session/cookie/global
chain, so a saved layout survives reloads without a per-account store.
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.
docs(changelog): record member overview data foundation and redesign under Unreleased
Some checks failed
continuous-integration/drone/push Build is failing
0cc37f7e9b
simon added 3 commits 2026-07-06 16:01:59 +02:00
simon added 13 commits 2026-07-16 11:09:46 +02:00
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is passing
Required
Details
This pull request can be merged automatically.
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-547:issue/mitgliederverwaltung-547
git checkout issue/mitgliederverwaltung-547
Sign in to join this conversation.
No description provided.