Commit graph

1622 commits

Author SHA1 Message Date
00e1624ee4 feat(import): assign groups and fee types to imported members, creating missing groups 2026-06-03 02:15:54 +02:00
a4a34cab3a feat(import): resolve import group and fee-type names against existing records 2026-06-03 02:10:33 +02:00
95c7bf7a15 feat(import): recognize group and fee-type columns and always ignore fee-status 2026-06-03 02:01:09 +02:00
5c5fd56749 fix(export): emit date custom-field values as ISO-8601 for re-import 2026-06-03 01:54:49 +02:00
d51dcb1ac3 chore(ci): make test workflow faster with test --stale
All checks were successful
continuous-integration/drone/push Build is passing
2026-06-02 23:35:39 +02:00
1ef6ea502e Merge pull request 'Add dialyzer and resolve all findings closes #503 #504 #514' (#516) from issue/mitgliederverwaltung-514 into main
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #516
2026-06-02 13:15:00 +02:00
9a14cedc14 fix(repo): define all_tenants/0 as empty for non-multitenant schema
Some checks reported errors
continuous-integration/drone/push Build was killed
continuous-integration/drone/promote/production Build is passing
2026-06-02 12:26:35 +02:00
b5756d8e00 refactor(vereinfacht): gate retry skipping on runtime sandbox flag
The compile-time Mix.env() comparison folded to an always-false literal under analysis. sql_sandbox?/0 reads runtime config (true only in test) and works in releases where Mix is unavailable, preserving the fast-fail-no-retry behavior in tests.
2026-06-02 12:23:04 +02:00
a7ad608051 fix(auth): redirect a live-view socket in the user-required guard
LiveSession.assign_new_resources/2 is typed to return a Phoenix.Socket, which made the on_mount redirect type-incompatible. The authenticated-routes live_session already assigns current_user, so the guard reads it from socket.assigns directly. Also assign the locale into the socket actually used by the no-user redirect instead of discarding it.
2026-06-02 12:19:21 +02:00
6a4a99f638 refactor(types): drop guards and clauses that can never succeed 2026-06-02 12:11:59 +02:00
ec6422d450 fix(membership-fees): show error for unparseable cycle date instead of crashing
Date.from_iso8601/1 returns {:error, reason}, so the with else clause matching a bare :error never fired and an invalid date raised a WithClauseError. Match the real date/calendar error reasons so the user sees the validation message.
2026-06-02 12:08:19 +02:00
2db467d5d1 fix(pdf-export): match DateTime.from_iso8601 three-tuple when formatting cells
DateTime.from_iso8601/1 returns {:ok, datetime, offset}, so the two-tuple clauses never matched and datetime cells fell through to the naive-parse fallback. Matching the real shape routes them through the intended DateTime path; UTC values render identically.
2026-06-02 12:04:37 +02:00
c41d24113f fix(import): return readable string for unreadable upload errors
File.read/1 only yields posix atoms, so the File.Error and bare-reason branches were unreachable, and :file.format_error/1 returns a charlist rather than a String. Normalize the error to a binary so it interpolates correctly in flash messages.
2026-06-02 12:00:38 +02:00
05f66ccf74 refactor(types): remove dead catch-all clauses unreachable per success typing 2026-06-02 11:56:44 +02:00
d9a5a081df refactor(import): drop unreachable CSV error-formatting path
consume_and_read_csv/2 and MemberCSV.prepare/2 only ever return {:error, binary()}, so the non-binary error branch and the format_error_message/* helpers it called were unreachable. Removed them and bound the remaining discarded locale/dispatch results.
2026-06-02 11:50:43 +02:00
c0395f16e8 fix(types): resolve unknown type references in member and authorization specs 2026-06-02 11:46:54 +02:00
848f0cd013 refactor(types): bind intentionally discarded side-effecting results 2026-06-02 11:42:57 +02:00
04ab05f556 fix(member-export): forbid request without actor instead of falling through
The nil-actor guard used a one-armed if and continued into the export path regardless. The CheckPagePermission plug already halts unauthenticated requests before this controller runs, so the corrected early return preserves observable behavior while removing the dead fall-through. The export action is split into per-payload clauses so the guard reads as a flat early return.
2026-06-02 11:39:04 +02:00
5352a635c6 refactor(release): bind discarded results of side-effecting release tasks 2026-06-02 11:33:14 +02:00
fd8e6ac178 refactor(types): reconcile @specs with their success typings 2026-06-02 11:25:03 +02:00
263857ee26 feat(dialyzer): add typecheck stage to full CI pipelines
Some checks failed
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is failing
2026-06-01 23:45:07 +02:00
ce57d046b9 ci(drone): run full test suite on main, tags and promote
Some checks reported errors
continuous-integration/drone/push Build encountered an error
2026-06-01 22:59:05 +02:00
35b884e6e1 Merge pull request 'Fix OIDC Loop and seed rauthy dev setup closes #510' (#513) from rauthy_setup into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #513
2026-06-01 20:39:07 +02:00
a27425b5fb fix(auth): replace sign-out page with accessible custom LiveView
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is passing
2026-06-01 20:06:32 +02:00
ba66bc15db fix(auth): trigger RP-initiated logout at OIDC provider 2026-06-01 19:59:52 +02:00
22955bdd9e feat(rauthy): auto-seed mv OIDC client via bootstrap dir 2026-06-01 19:06:14 +02:00
c6578662d8 Merge pull request 'Add filter for date fields closes #340' (#497) from issue/mitgliederverwaltung-340 into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #497
2026-06-01 14:42:13 +02:00
d36703450a
chore(ci): suppress cowlib advisory
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is passing
2026-06-01 14:05:46 +02:00
d6671daf1a feat(member-filter): add date filter sections with active-count badge and reset support
Some checks failed
continuous-integration/drone/push Build is failing
2026-05-20 16:32:29 +02:00
e3295ab4b5 feat(member-live): wire date filters into LiveView lifecycle 2026-05-20 16:28:17 +02:00
ddd4a9a878 feat(date-filter): introduce DateFilter module with URL codec and Ash query expressions 2026-05-20 16:24:08 +02:00
143c0c5c24 chore(deps): suppress cowlib advisory and bump bandit, cowboy, plug 2026-05-20 16:16:27 +02:00
264a585d44 chore(justfile): set PATH user agnostic
Some checks failed
continuous-integration/drone/push Build is failing
2026-05-19 22:12:45 +02:00
85e9d40f79 chore(deps): cowlib, db_connection, postgrex
Some checks failed
continuous-integration/drone/push Build is failing
2026-05-19 19:42:24 +02:00
1e639f7e77 chore(justfile): set PATH literally so recipes work without per-shell asdf sourcing 2026-05-19 19:41:10 +02:00
fa9cd0a35b Merge pull request 'Remove the join_date future-date validation closes #482' (#495) from issue/mitgliederverwaltung-482 into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #495
2026-05-13 00:45:03 +02:00
ca1600d019 chore(deps): update decimal
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is passing
2026-05-13 00:25:25 +02:00
8062b2fd27 Remove stale documentation of removed join_date future-date restriction
Some checks failed
continuous-integration/drone/push Build is failing
2026-05-12 23:16:31 +02:00
fb59ef99c1 Accept future join dates: remove past-only validation and update tests 2026-05-12 23:14:44 +02:00
d549e6878c Merge pull request 'update changelog' (#494) from simon-patch-1 into main
All checks were successful
continuous-integration/drone/tag Build is passing
continuous-integration/drone/promote/production Build is passing
continuous-integration/drone/push Build is passing
Reviewed-on: #494
2026-05-08 15:20:42 +02:00
efb9faf537 CHANGELOG.md aktualisiert
Some checks failed
continuous-integration/drone/push Build is failing
2026-05-08 15:20:18 +02:00
a12888de2f Improve member view table behavior+style, fix config settings (#493)
All checks were successful
continuous-integration/drone/push Build is passing
## Description of the implemented changes
The changes were:
- [x] Bugfixing
- [x] New Feature
- [ ] Breaking Change
- [x] Refactoring

This PR standardizes interactive table behavior and improves settings robustness.
It makes the new hover/focus-visible row highlight the default for clickable tables, keeps sticky first-column behavior configurable (and optimized for member selection UX), and tightens SMTP source-of-truth handling so ENV-based and UI-based configuration do not conflict.

## What has been changed?
- Refactored `CoreComponents.table` to expose interaction state via `data-row-interactive` and moved default row hover/focus styling to CSS.
- Made the new row highlight behavior (`hover` + `:has(:focus-visible)`) the default for clickable zebra tables.
- Kept sticky-first-column as an explicit table option and preserved sticky-specific selection accent behavior.
- Updated member overview table usage to the sticky-first-column mode and refined scrolling behavior (table scrollbar within container, not page-coupled).
- Adjusted table-related tests to validate the new interaction contract (attribute/CSS-driven behavior instead of legacy ring classes).
- Improved SMTP config handling:
  - clearer ENV-vs-Settings behavior (ENV-only mode when host env is set),
  - read-only and warning behavior in global settings UI when required env keys are missing,
  - updated related config/tests/docs.
- Updated docs and changelog (`CHANGELOG.md`, `DESIGN_GUIDELINES.md`, `CODE_GUIDELINES.md`, SMTP concept docs).
- Updated gettext catalogs (`default.pot`, `en`, `de`) for new/changed UI strings.

## 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
- [ ] axe-core dev tools show no critical or major issues

## Additional Notes
- Branch includes 4 commits:
  - `fix: make sure smtp can be set either via env or ui`
  - `fix: make horizontal scrollbars sticky to bottom`
  - `docs: update changelog`
  - `feat: make checkbox column in member view sticky`
- Full fast suite passed (`mix test --exclude slow --exclude ui`): 2017 tests, 0 failures (plus expected non-failing warning logs in test output).
- Reviewer focus areas:
  1. **Cross-table UX consistency** after moving row interaction styling to component/CSS contract.
  2. **Sticky table behavior** (selection accent stripe, zebra background, keyboard focus visibility).
  3. **SMTP precedence and UI constraints** in global settings when ENV mode is active.
  4. **Regression risk in tests** that previously asserted ring-based row classes.
- No breaking API changes expected; behavior change is primarily visual/interaction-level and intentional.

Reviewed-on: #493
Co-authored-by: Simon <s.thiessen@local-it.org>
Co-committed-by: Simon <s.thiessen@local-it.org>
2026-05-08 15:04:53 +02:00
2bb01bd201 Improve UX of join requests and fix minor bugs (#492)
All checks were successful
continuous-integration/drone/push Build is passing
## Description of the implemented changes
The changes were:
- [x] Bugfixing
- [x] New Feature
- [ ] Breaking Change
- [ ] Refactoring

This PR improves the join-request flow and presentation quality, fixes several data-display issues in join/join-request screens, and adds a usability improvement in global settings (directly opening the join link). It also includes dependency updates and changelog maintenance.

## What has been changed?
- Join form (`JoinLive`) now renders inputs based on actual field types (including checkbox/date/number/email behavior instead of generic text-only handling).
- Join form custom-field labels are resolved from configured custom fields (fallback remains safe if lookup fails).
- Join-request details page (`JoinRequestLive.Show`) now:
  - resolves and shows custom field names instead of raw IDs,
  - formats boolean-like values (`on/true/1`, `off/false/0`) as localized `Yes/No`,
  - formats ISO date strings for better readability,
  - keeps legacy field handling while improving output consistency.
- Join-request detail layout was improved semantically and visually (`dl/dt/dd` structure for label/value rows).
- Global settings page now includes an **Open** button for the join URL (`target="_blank"`, `rel="noopener noreferrer"`, ARIA label).
- Added/updated tests around:
  - join field type rendering,
  - custom field labels in join-request views,
  - related auth/global-settings behavior.
- Updated translations (`default.pot`, `en`, `de`) for new UI strings.
- Updated dependencies/tooling (`mix.lock`, `mix.exs`, CI/renovate-related updates).
- Updated `CHANGELOG.md` entries for unreleased changes.

## 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
- [ ] All tests pass
- [ ] axe-core dev tools show no critical or major issues

## Additional Notes
- Reviewer focus areas:
  - `lib/mv_web/live/join_live.ex`: input type derivation and custom field lookup strategy (`authorize?: false` read path used intentionally for field metadata).
  - `lib/mv_web/live/join_request_live/show.ex`: value-formatting logic (especially backward compatibility for legacy `form_data` payloads).
  - `lib/mv_web/live/global_settings_live.ex`: external-link behavior and accessibility attributes.
- The branch also contains dependency update commits; please review lockfile and CI-related changes separately from functional join/join-request changes.

Reviewed-on: #492
Co-authored-by: Simon <s.thiessen@local-it.org>
Co-committed-by: Simon <s.thiessen@local-it.org>
2026-05-06 14:34:42 +02:00
bfa33dcae2 Merge pull request 'chore(deps): update renovate/renovate docker tag to v43.165' (#491) from renovate/renovate-renovate-43.x into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #491
2026-05-06 12:09:10 +02:00
5f35b64928 Merge pull request 'chore(deps): update mix dependencies' (#490) from renovate/mix-dependencies into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #490
2026-05-06 12:08:40 +02:00
Renovate Bot
92afa60387 chore(deps): update renovate/renovate docker tag to v43.165
All checks were successful
continuous-integration/drone/push Build is passing
2026-05-06 00:07:12 +00:00
Renovate Bot
4042ecc9b5 chore(deps): update mix dependencies
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/promote/production Build is passing
2026-05-06 00:06:58 +00:00
86cbf33041 Merge pull request 'chore(deps): update renovate/renovate docker tag to v43.163' (#489) from renovate/renovate-renovate-43.x into main
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #489
2026-05-05 21:33:00 +02:00
bf8e2b9303 Merge pull request 'chore(deps): update mix dependencies' (#486) from renovate/mix-dependencies into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #486
2026-05-05 21:32:07 +02:00
Renovate Bot
13e6a4374c chore(deps): update renovate/renovate docker tag to v43.163
All checks were successful
continuous-integration/drone/push Build is passing
2026-05-05 00:06:42 +00:00