6831ba046f
Merge remote-tracking branch 'origin/main' into feature/member-overview-groups
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is passing
2026-02-16 15:57:57 +01:00
ace59bbae6
fix: implement review comments
continuous-integration/drone/push Build is passing
2026-02-16 15:30:16 +01:00
5fd7c0e7f6
feat: improve groups fillter
continuous-integration/drone/push Build is failing
2026-02-13 17:45:51 +01:00
22458cd52b
Merge branch 'main' into feature/286_export_pdf
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is passing
2026-02-13 17:40:39 +01:00
baa288bff3
refactor
2026-02-13 17:21:14 +01:00
dce4b2cf33
feat: add groups to member overview
2026-02-13 09:28:16 +01:00
f08c5d59f3
StatisticsLive: load statistics only in handle_params
continuous-integration/drone/push Build was killed
continuous-integration/drone/promote/production Build is passing
2026-02-12 19:35:48 +01:00
4b61289f33
Statistics LiveView: robust URL, load_fee_types error handling, clamp percents
2026-02-12 19:35:48 +01:00
490dced8c8
Statistics: member stats independent of fee type
2026-02-12 19:35:48 +01:00
6e309622a0
Add StatisticsLive: overview, bars by year, pie chart
...
- Summary cards: active/inactive members, open amount
- Joins and exits by year (horizontal bars)
- Contributions by year: table with stacked bar above amounts
- Column order: Paid, Unpaid, Suspended, Total; color dots for legend
- All years combined pie chart
- LiveView tests
2026-02-12 19:35:48 +01:00
919a8e4ebd
Add statistics route, permissions, and sidebar entry
...
- /statistics route and PagePaths.statistics
- Permission sets: viewer and admin can access /statistics
- Sidebar link with can_access_page check
- Plug and sidebar tests updated
2026-02-12 19:35:48 +01:00
2f8a6a2768
Merge remote-tracking branch 'origin/main' into feature/ui-for-adding-members-groups
continuous-integration/drone/push Build is failing
continuous-integration/drone/promote/production Build is passing
2026-02-12 15:16:35 +01:00
900f322422
fix: pr comments
continuous-integration/drone/push Build is passing
2026-02-12 15:08:40 +01:00
fd1f4d02d5
style: fix styling
2026-02-11 13:55:02 +01:00
f6b35f03a5
feat: adds pdf export with imprintor
continuous-integration/drone/push Build is failing
2026-02-11 11:47:26 +01:00
e68a7cf8c7
fix linting
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is passing
2026-02-09 14:08:12 +01:00
e1266944b1
feat: add membership fee status to columns and dropdown
2026-02-09 13:34:38 +01:00
36e57b24be
Merge branch 'main' into feature/export_csv
continuous-integration/drone/push Build is failing
2026-02-06 08:02:05 +01:00
9b9e7ec995
fix: sorting and filter for export
2026-02-05 15:03:25 +01:00
e7d63b9b0a
fix linting
continuous-integration/drone/push Build is failing
2026-02-04 16:55:24 +01:00
c82f4b7fd7
feat: add csv export
continuous-integration/drone/push Build is failing
2026-02-04 16:40:41 +01:00
361331b76e
fix linting errors
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is passing
2026-02-04 16:36:13 +01:00
3415faeb21
Merge branch 'main' into feature/337_polish_import
continuous-integration/drone/push Build is failing
2026-02-04 16:28:55 +01:00
d34ff57531
refactor
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is passing
2026-02-04 15:52:00 +01:00
083592489f
ARIA: set aria-sort on th for sortable columns
...
continuous-integration/drone/push Build was killed
continuous-integration/drone/promote/production Build is passing
- Table: optional col sort_field; th gets aria-sort when col is sorted.
- User index: pass sort_field/sort_order to table, sort_field: :email on email col.
2026-02-04 11:40:23 +01:00
24d130ffb5
OIDC: use UserHelpers.has_oidc? in index and show
...
- Index OIDC column and show OIDC item use has_oidc? instead of raw oidc_id.
- Avoids empty string showing as Linked.
2026-02-04 11:40:21 +01:00
d7c6d20483
User form: red warning for OIDC users when setting/changing password
...
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is passing
- Show alert when user has oidc_id and password section is visible.
- Explains that password here does not change SSO/identity provider password.
2026-02-04 11:07:01 +01:00
541c79e501
ARIA: remove aria-sort from sort button; Password column tests
...
- Sort button: aria-sort removed (button role does not support it).
- Index tests: remove aria-sort assertions; add Password column display tests.
2026-02-04 11:06:55 +01:00
c6082f2831
Users list and show: Role, Password, OIDC columns; UserHelpers
...
- Index: load :role; columns Role, Password (has_password?), OIDC; contrast fix.
- Show: Role, OIDC (Linked/Not linked); has_password? for Password Authentication.
- UserHelpers: has_password?/1, has_oidc?/1. Gettext: new strings and DE translations.
2026-02-04 11:06:52 +01:00
7eba21dc9c
Hide Regenerate Cycles button when no membership fee type assigned
...
continuous-integration/drone/push Build is passing
- Button only shown when @member.membership_fee_type is set (same as Create Cycle).
- Test: no-type view asserts Regenerate Cycles button is not present.
2026-02-04 09:38:26 +01:00
dbd0a57292
Secure regenerate_cycles: require can?(:create, MembershipFeeCycle) in handler
...
- Handler returns flash error when non-admin triggers event (e.g. DevTools).
- Test: read_only cannot create MembershipFeeCycle so handler rejects.
2026-02-04 09:19:37 +01:00
182d34fe58
MemberLive: confirm_delete_all_cycles via Ash.destroy, reduce current_actor
...
- Delete each cycle with Ash.destroy(actor:) so policies apply; add do_delete_all_cycles/5.
- Use positive can? check; remove duplicate current_actor(socket) in change_membership_fee_type.
2026-02-04 00:34:00 +01:00
101fd39f18
Fee settings and fee type form: pass actor for MembershipFeeType read
...
- membership_fee_settings_live: current_actor(socket), Ash.read! with actor
- membership_fee_type_live/form: Ash.get! with actor in mount
- check_page_permission_test: normal_user /groups/new and /groups/:slug/edit allowed
- membership_fee_type_live form_test: actor for Ash.read_one!/get!
2026-02-03 23:52:27 +01:00
e3bea17827
Member show & MembershipFees: permissions, delete all, regenerate, errors
...
- Show: handle_info :member_updated and :put_flash; Linked User only when can_access_page? /users
- MembershipFeesComponent: can_create_cycle/can_destroy_cycle/can_update_cycle; buttons gated
- Delete all cycles via Ash.destroy (policy enforced); format_error Forbidden
- Regenerate cycles for normal_user and admin (no admin-only check)
- Member form: format_error tuple for membership_fee_type_id; Select a membership fee type (no None)
- show_membership_fees_test: read_only UI and policy tests
2026-02-03 23:52:24 +01:00
8ec4a07103
User form: persist role, member linking, Forbidden handling
...
- User resource: update_user accepts role_id, manage_relationship :member
- user_live/form: touch role_id, params_with_member_if_unchanged to avoid unlink
- Handle Forbidden in form, extract error message for display
- user_policies_test and form_test coverage
2026-02-03 23:52:20 +01:00
ee6bfbacbb
User LiveViews: row_id and data-testid for actions
...
Table row_id for scoped selectors; data-testid on New/Edit/Delete.
2026-02-03 17:16:13 +01:00
a4b13cef49
Member LiveViews: row_id and data-testid for actions
...
Table row_id for scoped selectors; data-testid on New/Edit/Delete.
2026-02-03 17:16:11 +01:00
286972964d
CoreComponents: allow data-testid on button
...
Include data-testid in button rest for test selectors.
2026-02-03 17:16:10 +01:00
c36812bf3f
Authorization: document can_access_page? nil-safety
...
Doc and example for nil user returning false.
2026-02-03 17:16:09 +01:00
2ddd22078d
Sidebar: use PagePaths, add testid for Administration
...
Gate menu items via PagePaths; add data-testid=sidebar-administration
for stable tests. menu_group accepts optional testid attr.
2026-02-03 17:16:08 +01:00
9e8910344e
Add MvWeb.PagePaths for central sidebar/page paths
...
Single source for path strings used by Sidebar and can_access_page?.
Keep in sync with router when routes change.
2026-02-03 17:16:07 +01:00
f779fd61e0
Gate sidebar menu items by can_access_page?
...
Members, Fee Types and Administration subitems only shown when user
has page permission. Add admin_menu_visible? helper. Sidebar test
uses admin user so menu items render.
2026-02-03 16:56:52 +01:00
2f67c7099d
Apply UI authorization to User LiveViews (Index and Show)
...
Gate New User button, Edit and Delete links with can?/3.
Edit button on User Show visible only when user can update the user.
2026-02-03 16:56:51 +01:00
505e31653a
Apply UI authorization to Member LiveViews (Index and Show)
...
Gate New Member button, Edit and Delete links with can?/3.
Edit button on Member Show visible only when user can update the member.
2026-02-03 16:56:51 +01:00
03f27a5938
Merge remote-tracking branch 'origin/main' into feature/ui-for-adding-members-groups
2026-02-03 16:15:53 +01:00
7041aa320a
refactor
2026-02-03 15:23:35 +01:00
6aba54df68
feat: move import/export to own section
2026-02-03 14:19:36 +01:00
7f001c55c5
feat: add ui to add members to groups
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is passing
2026-02-03 11:44:08 +01:00
71db9cf3c1
formatting
continuous-integration/drone/push Build is failing
2026-02-02 13:54:27 +01:00
9e27de84cb
Merge branch 'main' into feature/338_import_custom_fields
continuous-integration/drone/push Build is failing
2026-02-02 13:46:05 +01:00