Commit graph

1749 commits

Author SHA1 Message Date
0a23d03d9d fix(member-export): split composite Name and Address into component columns on export 2026-07-16 09:38:54 +02:00
a64835fe6d fix(member-live): re-read view-settings cookie on live navigation 2026-07-16 09:38:53 +02:00
fe6d1c52f9 Merge remote-tracking branch 'origin/main' into issue/mitgliederverwaltung-547
# Conflicts:
#	lib/mv_web/live/member_live/index.html.heex
2026-07-12 12:29:47 +02:00
1f2f8aa023 Merge pull request 'chore(deps): update mix dependencies' (#552) from renovate/mix-dependencies into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #552
2026-07-12 12:28:07 +02:00
0511836895 fix(deps): pin ash_authentication below 4.14 to unblock OIDC build
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is passing
2026-07-11 14:29:32 +02:00
08bae3ce55
chore: disable mix hex.audit as long as unfixable security advisories can't be skipped
Some checks failed
continuous-integration/drone/push Build is failing
2026-07-06 19:51:26 +02:00
eb20c8f3b6
style: fix formatting
Some checks failed
continuous-integration/drone/push Build is failing
2026-07-06 18:12:31 +02:00
ce49d751ea
fix: missing type declaration for buttons causing new warnings
Some checks failed
continuous-integration/drone/push Build is failing
2026-07-06 17:27:01 +02:00
cdb8b03ce1 test(member): move the cycle-status test beside its OverviewQuery
Some checks failed
continuous-integration/drone/push Build is failing
2026-07-06 15:42:58 +02:00
c9dd900a5f docs(member): clarify the :overview vs :read read actions 2026-07-06 15:42:32 +02:00
4adb6be5e5 refactor(member): drop the unused second-sticky-column table option 2026-07-06 15:42:01 +02:00
0cc37f7e9b docs(changelog): record member overview data foundation and redesign under Unreleased
Some checks failed
continuous-integration/drone/push Build is failing
2026-07-06 11:01:05 +02:00
1c67527c56 docs(member-live): document the overview and use English throughout its internals 2026-07-06 11:00:29 +02:00
77fc11a0b0 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.
2026-07-06 11:00:29 +02:00
c2cb3edab8 feat(member): bring the overview table up to WCAG 2.2 AA 2026-07-06 11:00:29 +02:00
0c375234c8 feat(member): make overview columns sortable through accessible sort headers 2026-07-06 10:48:28 +02:00
dfc616257d feat(member): let members tailor overview density and visible columns
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.
2026-07-06 10:45:53 +02:00
af2cc2e0d4 feat(member): condense the overview into composite name and address cells 2026-07-03 11:35:46 +02:00
b79d7ac9ea feat(member): stream the overview with keyset infinite scroll instead of loading every member 2026-07-03 11:31:44 +02:00
b09cdf7f3a feat(member): resolve custom-field filters and sorting in PostgreSQL
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.
2026-07-03 11:19:59 +02:00
e64f55c36a feat(member): back the overview with a keyset-paginated :overview read action 2026-07-03 11:12:38 +02:00
b745b13ca5 feat(membership-fees): denormalize cycle_end so fee status filters run in the database
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.
2026-07-03 11:04:43 +02:00
Renovate Bot
ba39632c38 chore(deps): update mix dependencies
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
2026-07-01 00:09:58 +00:00
a629bfb617 Merge pull request 'fix existing flakiness + cut runtime closes #533' (#544) from issue/mitgliederverwaltung-533 into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #544
2026-06-16 18:30:14 +02:00
84e1cf1cb8 Merge branch 'main' into issue/mitgliederverwaltung-533
Some checks reported errors
continuous-integration/drone/push Build was killed
continuous-integration/drone/promote/production Build is passing
# Conflicts:
#	test/mv_web/member_live/index_test.exs
2026-06-16 18:13:03 +02:00
6d7ece20a8 docs(changelog): record member-creation deadlock fix under Unreleased 2026-06-16 17:55:24 +02:00
3d792e8b04 docs(testing): document create_member deadlock fix and async-test-safety 2026-06-16 17:54:32 +02:00
c0f40a13ce test(member-live): keep deadlock-prone member tests synchronous
These member/group/custom-field LiveView tests stay async: false. With the
foreign keys now deferrable the create_member deadlock no longer forces it, so
the rationale is updated: they remain synchronous as a deferred scope decision,
and index_groups_url_params/member_filter_component additionally have separate
async-isolation issues that must be fixed before they can run in parallel.
2026-06-16 17:53:59 +02:00
5e84c342b7 test(repo): assert member/user foreign keys are deferrable 2026-06-16 17:53:25 +02:00
ef94d2ef10 fix(repo): make member/user foreign keys deferrable to avoid create_member deadlock
Concurrent create_member transactions took FK FOR KEY SHARE (MultiXact) locks
on shared rows across members/users/membership_fee_types and could form a
cross-transaction cycle, producing intermittent PostgreSQL deadlocks (40P01)
under load. Making the three foreign keys DEFERRABLE INITIALLY DEFERRED moves
the check to commit time and breaks the cycle, without weakening integrity
(NOT NULL and ON DELETE RESTRICT are unaffected).
2026-06-16 17:52:51 +02:00
cb54c2c46e test(member-live): build date-filter property bounds without a reject-filter
The bound-pair generator filtered out ~1/4 of generated values, so unlucky
seeds hit StreamData's FilterTooNarrowError under full property runs.
Construct an at-least-one-bound-set pair directly instead, preserving the
exact domain with no rejection.
2026-06-16 17:52:17 +02:00
655fd80524 test: wait on observable state instead of blind sleeps
Replace the fixed Process.sleep waits in the import, members-PDF and
field-visibility tests with event-based / bounded-poll waits on the
observable condition, removing a known flakiness vector.
2026-06-16 17:51:43 +02:00
ccd1f81e3e test(member-live): assert rendered behavior instead of socket internals in the index view
Replace :sys.get_state assertions on the LiveView socket with assertions on
rendered output, so the tests pin user-visible behavior rather than internal
state; the few sites with no observable equivalent are kept and annotated.
2026-06-16 17:50:57 +02:00
3bd55fbfec test(seeds): drop the dead per-process seeds-run guard 2026-06-16 17:50:24 +02:00
18fb954f73 test(membership-fees): share create_fee_type and create_cycle fixtures
Replace the create_fee_type/create_cycle helpers duplicated across 18/8
membership-fee test files with a single shared definition in Mv.Fixtures,
reconciling the divergent local signatures (including the reversed
argument order) into one superset so behavior is unchanged.
2026-06-16 17:49:50 +02:00
82effde6a1 Merge pull request 'Mechanical cleanup, quick fixes & deduplication closes #531' (#543) from issue/mitgliederverwaltung-531 into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #543
2026-06-16 16:06:52 +02:00
4f3050cc35 docs(changelog): record cleanup and quick fixes under Unreleased
Some checks reported errors
continuous-integration/drone/push Build was killed
continuous-integration/drone/promote/production Build is passing
2026-06-16 15:51:07 +02:00
a12fedcb5b ci(credo): enforce StrictModuleLayout and additional zero-violation checks 2026-06-16 15:51:07 +02:00
fe534319ee style: order module directives per StrictModuleLayout 2026-06-16 15:51:07 +02:00
3f073d4365 refactor(membership-fees): share fee-type delete handling between LiveViews 2026-06-16 15:51:07 +02:00
18bf4dab2b refactor(web): use canonical DateFormatter for all date display 2026-06-16 15:51:07 +02:00
ea105186a5 refactor(vereinfacht): reuse EmailSync.Loader for linked-member lookup 2026-06-16 15:51:07 +02:00
0cf27c95ca refactor(membership-fees): fold cycle-generation run/0 into run/1 2026-06-16 15:51:07 +02:00
ef70dd2935 refactor(settings): unify JSONB single-field update between member-field changes 2026-06-16 15:51:07 +02:00
e66fb5d3d9 refactor(email): share build/deliver skeleton across join emails 2026-06-16 15:51:07 +02:00
1adf6aa664 refactor(web): extract shared current_actor controller helper 2026-06-16 15:51:07 +02:00
561779e704 refactor(web): share member-dropdown keyboard navigation between LiveViews 2026-06-16 15:51:07 +02:00
164826d3aa refactor(authorization): unify own_data read check across linked resources 2026-06-16 15:51:07 +02:00
924dbd3bb8 refactor(oidc): drop OidcRoleSyncConfig passthrough and use Mv.Config directly 2026-06-16 15:51:07 +02:00
c4a695329c refactor(member-export): remove dead fetch/2 export chain 2026-06-16 15:51:07 +02:00