From a4ad1f7b27cb808e8a49bcf9a58a59d82c9d6c55 Mon Sep 17 00:00:00 2001 From: carla Date: Wed, 11 Mar 2026 11:12:49 +0100 Subject: [PATCH 1/7] docs: Update readme --- README.md | 56 +++++++++++++++---------------------------------------- 1 file changed, 15 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index c0072aa..92b15d9 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,12 @@ **Mila** — simple, usable, self-hostable membership management for small to mid-sized clubs. -[![Build Status](https://drone.dev.local-it.cloud/api/badges/local-it/mitgliederverwaltung/status.svg)](https://drone.dev.local-it.cloud/local-it/mitgliederverwaltung) +[![Build Status](https://drone.cicd.local-it.cloud/api/badges/local-it/mitgliederverwaltung/status.svg)](https://drone.cicd.local-it.cloud/local-it/mitgliederverwaltung) ![License](https://img.shields.io/badge/license-AGPL--v3-blue) ## 🚧 Project Status -⚠️ **Early development** — not production-ready. Expect breaking changes. +⚠️ **First Version** — Expect breaking changes. Contributions and feedback are welcome! ## ✨ Overview @@ -48,9 +48,10 @@ You can find our documentation for users here: https://wiki.local-it.org/s/mila- - ✅ SSO via OIDC (works with Authentik, Rauthy, Keycloak, etc.) - ✅ Sidebar navigation (standard-compliant, accessible) - ✅ Global settings management -- 🚧 Self-service & online application +- ✅ Self-service & online application - ✅ Accessibility improvements (WCAG 2.1 AA compliant keyboard navigation) -- 🚧 Email sending +- ✅ Email sending +- ✅ Integration of Accounting-Software ([Vereinfacht](https://github.com/vereinfacht/vereinfacht)) ## 🚀 Quick Start (Development) @@ -172,13 +173,7 @@ The `OIDC_REDIRECT_URI` is auto-generated as `https://{DOMAIN}/auth/user/oidc/ca ## ⚙️ Configuration -- **Env vars:** see `.env.example` - - `OIDC_CLIENT_SECRET` — secret for your OIDC client -- Database defaults (Docker Compose): - - Host: `localhost` - - Port: `5000` - - User/pass: `postgres` / `postgres` - - DB: `mila_dev` +- **Env vars:** see `.env.example` ## 🏗️ Architecture @@ -193,6 +188,8 @@ The `OIDC_REDIRECT_URI` is auto-generated as `https://{DOMAIN}/auth/user/oidc/ca - `lib/mv_web/` — Phoenix controllers, LiveViews, components - `lib/mv/` — Shared helpers and business logic - `assets/` — Tailwind, JavaScript, static files +- `test/` — All tests + 📚 **Full tech stack details:** See [`CODE_GUIDELINES.md`](CODE_GUIDELINES.md) 📖 **Implementation history:** See [`docs/development-progress-log.md`](docs/development-progress-log.md) @@ -228,42 +225,19 @@ For testing the production Docker build locally: # Copy template and edit cp .env.example .env nano .env - - # Required variables: - SECRET_KEY_BASE= - TOKEN_SIGNING_SECRET= - DOMAIN=localhost # or PHX_HOST=localhost - - # Optional OIDC configuration: - # OIDC_CLIENT_ID=mv - # OIDC_BASE_URL=http://localhost:8080/auth/v1 - # OIDC_CLIENT_SECRET= - # OIDC_REDIRECT_URI is auto-generated as https://{DOMAIN}/auth/user/oidc/callback - - # Alternative: Use _FILE variables for Docker secrets (takes priority over regular vars): - # SECRET_KEY_BASE_FILE=/run/secrets/secret_key_base - # TOKEN_SIGNING_SECRET_FILE=/run/secrets/token_signing_secret - # OIDC_CLIENT_SECRET_FILE=/run/secrets/oidc_client_secret - # DATABASE_URL_FILE=/run/secrets/database_url - # DATABASE_PASSWORD_FILE=/run/secrets/database_password ``` -3. **Start development environment** (for Rauthy): - ```bash - docker compose up -d - ``` - -4. **Start production environment:** +3. **Start production environment:** ```bash docker compose -f docker-compose.prod.yml up ``` -5. **Database migrations run automatically** on app start. For manual migration: +4. **Database migrations run automatically** on app start. For manual migration: ```bash docker compose -f docker-compose.prod.yml exec app /app/bin/mv eval "Mv.Release.migrate" ``` -6. **Access the production app:** +5. **Access the production app:** - Production App: http://localhost:4001 - Uses same Rauthy instance as dev (localhost:8080) @@ -286,9 +260,9 @@ For actual production deployment: ## 🤝 Contributing We welcome contributions! -- Open issues and PRs in this repo. -- Please follow existing code style and conventions. -- Expect breaking changes while the project is in early development. +- Open issues and PRs in this repo +- Please follow existing code style and conventions +- Expect breaking changes while the project is in early development ## 📄 License @@ -298,4 +272,4 @@ See the [LICENSE](LICENSE) file for details. ## 📬 Contact - Issues: [GitLab Issues](https://git.local-it.org/local-it/mitgliederverwaltung/-/issues) -- Community links: coming soon. +- E-Mail: info@local-it.org -- 2.47.2 From b9ff02b959ec383c5c1e0d6f6df1abc5d4883774 Mon Sep 17 00:00:00 2001 From: carla Date: Wed, 11 Mar 2026 11:13:09 +0100 Subject: [PATCH 2/7] fix typo --- CODE_GUIDELINES.md | 2 +- DESIGN_DUIDELINES.md => DESIGN_GUIDELINES.md | 0 docs/feature-roadmap.md | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename DESIGN_DUIDELINES.md => DESIGN_GUIDELINES.md (100%) diff --git a/CODE_GUIDELINES.md b/CODE_GUIDELINES.md index 6f8deb5..4aa7566 100644 --- a/CODE_GUIDELINES.md +++ b/CODE_GUIDELINES.md @@ -61,7 +61,7 @@ We are building a membership management system (Mila) using the following techno 8. [Accessibility Guidelines](#8-accessibility-guidelines) **Related documents:** -- **UI / UX:** [`DESIGN_DUIDELINES.md`](../DESIGN_DUIDELINES.md) defines visual and interaction consistency: use of CoreComponents (no raw DaisyUI in views), page skeleton (`<.header>`, `mt-6 space-y-6`), **Back button left in header for edit/new forms** (§2.2), typography, buttons, forms, tables, flash/toast, and microcopy (e.g. German "du" and glossary). Follow "components first" and semantic variants instead of hard-coded colors. +- **UI / UX:** [`DESIGN_GUIDELINES.md`](../DESIGN_GUIDELINES.md) defines visual and interaction consistency: use of CoreComponents (no raw DaisyUI in views), page skeleton (`<.header>`, `mt-6 space-y-6`), **Back button left in header for edit/new forms** (§2.2), typography, buttons, forms, tables, flash/toast, and microcopy (e.g. German "du" and glossary). Follow "components first" and semantic variants instead of hard-coded colors. - **Vereinfacht API:** [`docs/vereinfacht-api.md`](docs/vereinfacht-api.md) describes the finance-contact sync (find by email filter, minimal create payload, no extra required member fields). --- diff --git a/DESIGN_DUIDELINES.md b/DESIGN_GUIDELINES.md similarity index 100% rename from DESIGN_DUIDELINES.md rename to DESIGN_GUIDELINES.md diff --git a/docs/feature-roadmap.md b/docs/feature-roadmap.md index 89c2f39..9c8c835 100644 --- a/docs/feature-roadmap.md +++ b/docs/feature-roadmap.md @@ -195,7 +195,7 @@ - Auto-dismiss: info/success 4–6s, warning 6–8s, error 8–12s; dismiss button kept for accessibility. - Implement via JS hook (e.g. `FlashAutoDismiss`) + `data-dismiss-ms` (or `data-kind`) on flash component; on timeout push `lv:clear-flash` and hide element. - LiveView: add shared `handle_event("lv:clear-flash", %{"key" => key}, socket)` (e.g. in `MvWeb` live_view quote) calling `clear_flash(socket, key)`. - - All flashes (including “Email copied”) use the same variants (info, success, warning, error); no special tone. See `DESIGN_DUIDELINES.md` §9. + - All flashes (including “Email copied”) use the same variants (info, success, warning, error); no special tone. See `DESIGN_GUIDELINES.md` §9. --- -- 2.47.2 From 45c2f3e2b3c54b08b0550fbf1356bfdac585a920 Mon Sep 17 00:00:00 2001 From: carla Date: Wed, 11 Mar 2026 11:13:21 +0100 Subject: [PATCH 3/7] i18n: fix translations --- lib/mv_web/live/global_settings_live.ex | 6 +-- lib/mv_web/live/import_live/components.ex | 9 ---- lib/mv_web/live/member_live/show.ex | 2 +- lib/mv_web/live/role_live/index.html.heex | 2 +- lib/mv_web/live/user_live/form.ex | 8 +-- priv/gettext/de/LC_MESSAGES/default.po | 63 +++++++++++++---------- priv/gettext/default.pot | 53 ++++++++++--------- priv/gettext/en/LC_MESSAGES/default.po | 63 +++++++++++++---------- 8 files changed, 107 insertions(+), 99 deletions(-) diff --git a/lib/mv_web/live/global_settings_live.ex b/lib/mv_web/live/global_settings_live.ex index 3c75fa8..7daa39a 100644 --- a/lib/mv_web/live/global_settings_live.ex +++ b/lib/mv_web/live/global_settings_live.ex @@ -270,7 +270,7 @@ defmodule MvWeb.GlobalSettingsLive do <%!-- Vereinfacht Integration Section --%> - <.form_section title={gettext("Vereinfacht Integration")}> + <.form_section title={gettext("Accounting-Software (Vereinfacht) Integration")}> <%= if @vereinfacht_env_configured do %>

{gettext("Some values are set via environment variables. Those fields are read-only.")} @@ -378,7 +378,7 @@ defmodule MvWeb.GlobalSettingsLive do <%!-- OIDC Section --%> - <.form_section title={gettext("OIDC")}> + <.form_section title={gettext("OIDC (Single Sign On)")}> <%= if @oidc_env_configured do %>

{gettext("Some values are set via environment variables. Those fields are read-only.")} @@ -486,7 +486,7 @@ defmodule MvWeb.GlobalSettingsLive do />

{gettext( - "When enabled and OIDC is configured, the sign-in page shows only the Single Sign-On button." + "When enabled and OIDC is configured, the sign-in page shows only the Single Sign On button." )}

diff --git a/lib/mv_web/live/import_live/components.ex b/lib/mv_web/live/import_live/components.ex index 5cbcba8..3bf10cb 100644 --- a/lib/mv_web/live/import_live/components.ex +++ b/lib/mv_web/live/import_live/components.ex @@ -28,15 +28,6 @@ defmodule MvWeb.ImportLive.Components do "Use the data field name as the CSV column header in your file. Data fields must exist in Mila before importing, because unknown data field columns will be ignored. Groups and membership fees are not supported for import." )}

-

- <.link - href={~p"/settings#custom_fields"} - class="link" - data-testid="custom-fields-link" - > - {gettext("Manage Member Data")} - -

""" diff --git a/lib/mv_web/live/member_live/show.ex b/lib/mv_web/live/member_live/show.ex index d47ee4c..e5fa207 100644 --- a/lib/mv_web/live/member_live/show.ex +++ b/lib/mv_web/live/member_live/show.ex @@ -230,7 +230,7 @@ defmodule MvWeb.MemberLive.Show do <%!-- Custom Fields Section --%> <%= if Enum.any?(@custom_fields) do %>
- <.section_box title={gettext("Custom Fields")}> + <.section_box title={gettext("Individual datafields")}>
<%= for custom_field <- @custom_fields do %> <% cfv = find_custom_field_value(@member.custom_field_values, custom_field.id) %> diff --git a/lib/mv_web/live/role_live/index.html.heex b/lib/mv_web/live/role_live/index.html.heex index bb61bb1..c5fd599 100644 --- a/lib/mv_web/live/role_live/index.html.heex +++ b/lib/mv_web/live/role_live/index.html.heex @@ -2,7 +2,7 @@ <.header> {gettext("Listing Roles")} <:subtitle> - {gettext("Manage user roles and their permission sets.")} + {gettext("Manage roles and their permission sets.")} <:actions> <%= if can?(@current_user, :create, Mv.Authorization.Role) do %> diff --git a/lib/mv_web/live/user_live/form.ex b/lib/mv_web/live/user_live/form.ex index 5232ec7..4f82405 100644 --- a/lib/mv_web/live/user_live/form.ex +++ b/lib/mv_web/live/user_live/form.ex @@ -91,7 +91,7 @@ defmodule MvWeb.UserLive.Form do />
<% end %> - +
@@ -128,7 +128,7 @@ defmodule MvWeb.UserLive.Form do required autocomplete="new-password" /> - + <%= if !@user do %> <.input @@ -179,7 +179,7 @@ defmodule MvWeb.UserLive.Form do <% end %> <% end %>
- + <%= if @can_manage_member_linking do %>
diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index 055f36a..5a2f5fc 100644 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ b/priv/gettext/de/LC_MESSAGES/default.po @@ -592,7 +592,6 @@ msgid "This email is already linked to a different OIDC account. Cannot link mul msgstr "Diese E-Mail-Adresse ist bereits mit einem anderen OIDC-Konto verknüpft. Es können nicht mehrere OIDC-Provider mit demselben Konto verknüpft werden." #: lib/mv_web/live/member_live/form.ex -#: lib/mv_web/live/member_live/show.ex #, elixir-autogen, elixir-format msgid "Custom Fields" msgstr "Benutzerdefinierte Felder" @@ -1551,11 +1550,6 @@ msgstr "Rolle konnte nicht gelöscht werden: %{error}" msgid "Listing Roles" msgstr "Rollen auflisten" -#: lib/mv_web/live/role_live/index.html.heex -#, elixir-autogen, elixir-format -msgid "Manage user roles and their permission sets." -msgstr "Verwalte Benutzer*innen-Rollen und ihre Berechtigungssätze." - #: lib/mv_web/live/role_live/show.ex #, elixir-autogen, elixir-format msgid "Cannot delete role. %{count} user(s) are still assigned to this role. Please assign them to another role first." @@ -2242,11 +2236,6 @@ msgstr "Fehler beim Lesen der hochgeladenen Datei" msgid "You do not have permission to access this page." msgstr "Du hast keine Berechtigung, auf diese Seite zuzugreifen." -#: lib/mv_web/live/import_live/components.ex -#, elixir-autogen, elixir-format, fuzzy -msgid "Manage Member Data" -msgstr "Mitgliederdaten verwalten" - #: lib/mv_web/components/export_dropdown.ex #, elixir-autogen, elixir-format, fuzzy msgid "Export members to CSV" @@ -2283,7 +2272,6 @@ msgstr "Beitragsart auswählen" msgid "Linked" msgstr "Verknüpft" -#: lib/mv_web/live/global_settings_live.ex #: lib/mv_web/live/user_live/index.html.heex #: lib/mv_web/live/user_live/show.ex #, elixir-autogen, elixir-format @@ -2300,11 +2288,6 @@ msgstr "Nicht verknüpft" msgid "SSO / OIDC user" msgstr "SSO / OIDC Benutzer*in" -#: lib/mv_web/live/user_live/form.ex -#, elixir-autogen, elixir-format -msgid "This user is linked via SSO (Single Sign-On). A password set or changed here only affects login with email and password in this application. It does not change the password in your identity provider (e.g. Authentik). To change the SSO password, use the identity provider or your organization's IT." -msgstr "Diese*r Benutzer*in ist über SSO (Single Sign-On) verbunden. Ein hier festgelegtes oder geändertes Passwort wirkt sich nur auf die Anmeldung mit E-Mail-Adresse und Passwort in dieser Anwendung aus. Es ändert nicht das Passwort in deinem Identitätsanbieter (z. B. Authentik). Um das SSO-Passwort zu ändern, wende dich an den Identitätsanbieter oder die IT deiner Organisation." - #: lib/mv_web/live/import_live/components.ex #, elixir-autogen, elixir-format msgid "Import aborted" @@ -2535,11 +2518,6 @@ msgstr "%{count} Mitglied(er) mit Vereinfacht synchronisiert." msgid "Syncing..." msgstr "Synchronisiere..." -#: lib/mv_web/live/global_settings_live.ex -#, elixir-autogen, elixir-format -msgid "Vereinfacht Integration" -msgstr "Vereinfacht-Integration" - #: lib/mv_web/live/global_settings_live.ex #, elixir-autogen, elixir-format msgid "Vereinfacht is not configured. Set API URL, API Key, and Club ID." @@ -2945,11 +2923,6 @@ msgstr "Aus OIDC_ONLY" msgid "Only OIDC sign-in (hide password login)" msgstr "Nur OIDC-Anmeldung (Passwort-Login ausblenden)" -#: lib/mv_web/live/global_settings_live.ex -#, elixir-autogen, elixir-format -msgid "When enabled and OIDC is configured, the sign-in page shows only the Single Sign-On button." -msgstr "Wenn aktiviert und OIDC konfiguriert ist, zeigt die Anmeldeseite nur den Single-Sign-On-Button." - #: lib/mv_web/live/components/member_filter_component.ex #, elixir-autogen, elixir-format msgid "Clear filters" @@ -3135,6 +3108,7 @@ msgid "Deleting this data field cannot be undone. All datafield values for this msgstr "Das Löschen dieses Datenfeldes kann nicht rückgängig gemacht werden. Alle Datenfeldwerte für dieses Feld werden dauerhaft gelöscht." #: lib/mv_web/live/components/member_filter_component.ex +#: lib/mv_web/live/member_live/show.ex #, elixir-autogen, elixir-format msgid "Individual datafields" msgstr "Individuelle Datenfelder" @@ -3623,3 +3597,38 @@ msgstr "Offene Anträge" #, elixir-autogen, elixir-format msgid "Review by" msgstr "Geprüft von" + +#: lib/mv_web/live/global_settings_live.ex +#, elixir-autogen, elixir-format +msgid "Accounting-Software (Vereinfacht) Integration" +msgstr "Buchhaltungs-Software (Vereinfacht) Integration" + +#: lib/mv_web/live/role_live/index.html.heex +#, elixir-autogen, elixir-format, fuzzy +msgid "Manage roles and their permission sets." +msgstr "Verwalte Rollen und ihre Berechtigungssätze." + +#: lib/mv_web/live/global_settings_live.ex +#, elixir-autogen, elixir-format +msgid "OIDC (Single Sign On)" +msgstr "OIDC (Single Sign On)" + +#: lib/mv_web/live/user_live/form.ex +#, elixir-autogen, elixir-format, fuzzy +msgid "This user is linked via SSO (Single Sign On). A password set or changed here only affects login with email and password in this application. It does not change the password in your identity provider (e.g. Authentik). To change the SSO password, use the identity provider or your organization's IT." +msgstr "Diese*r Benutzer*in ist über SSO (Single Sign On) verbunden. Ein hier festgelegtes oder geändertes Passwort wirkt sich nur auf die Anmeldung mit E-Mail-Adresse und Passwort in dieser Anwendung aus. Es ändert nicht das Passwort in deinem Identitätsanbieter (z. B. Authentik). Um das SSO-Passwort zu ändern, wende dich an den Identitätsanbieter oder die IT deiner Organisation." + +#: lib/mv_web/live/global_settings_live.ex +#, elixir-autogen, elixir-format, fuzzy +msgid "When enabled and OIDC is configured, the sign-in page shows only the Single Sign On button." +msgstr "Wenn aktiviert und OIDC konfiguriert ist, zeigt die Anmeldeseite nur den Single Sign On Button." + +#~ #: lib/mv_web/live/import_live/components.ex +#~ #, elixir-autogen, elixir-format, fuzzy +#~ msgid "Manage Member Data" +#~ msgstr "Mitgliederdaten verwalten" + +#~ #: lib/mv_web/live/global_settings_live.ex +#~ #, elixir-autogen, elixir-format +#~ msgid "Vereinfacht Integration" +#~ msgstr "Vereinfacht-Integration" diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index a1e0909..b5b80d7 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -593,7 +593,6 @@ msgid "This email is already linked to a different OIDC account. Cannot link mul msgstr "" #: lib/mv_web/live/member_live/form.ex -#: lib/mv_web/live/member_live/show.ex #, elixir-autogen, elixir-format msgid "Custom Fields" msgstr "" @@ -1552,11 +1551,6 @@ msgstr "" msgid "Listing Roles" msgstr "" -#: lib/mv_web/live/role_live/index.html.heex -#, elixir-autogen, elixir-format -msgid "Manage user roles and their permission sets." -msgstr "" - #: lib/mv_web/live/role_live/show.ex #, elixir-autogen, elixir-format msgid "Cannot delete role. %{count} user(s) are still assigned to this role. Please assign them to another role first." @@ -2243,11 +2237,6 @@ msgstr "" msgid "You do not have permission to access this page." msgstr "" -#: lib/mv_web/live/import_live/components.ex -#, elixir-autogen, elixir-format -msgid "Manage Member Data" -msgstr "" - #: lib/mv_web/components/export_dropdown.ex #, elixir-autogen, elixir-format msgid "Export members to CSV" @@ -2284,7 +2273,6 @@ msgstr "" msgid "Linked" msgstr "" -#: lib/mv_web/live/global_settings_live.ex #: lib/mv_web/live/user_live/index.html.heex #: lib/mv_web/live/user_live/show.ex #, elixir-autogen, elixir-format @@ -2301,11 +2289,6 @@ msgstr "" msgid "SSO / OIDC user" msgstr "" -#: lib/mv_web/live/user_live/form.ex -#, elixir-autogen, elixir-format -msgid "This user is linked via SSO (Single Sign-On). A password set or changed here only affects login with email and password in this application. It does not change the password in your identity provider (e.g. Authentik). To change the SSO password, use the identity provider or your organization's IT." -msgstr "" - #: lib/mv_web/live/import_live/components.ex #, elixir-autogen, elixir-format msgid "Import aborted" @@ -2536,11 +2519,6 @@ msgstr "" msgid "Syncing..." msgstr "" -#: lib/mv_web/live/global_settings_live.ex -#, elixir-autogen, elixir-format -msgid "Vereinfacht Integration" -msgstr "" - #: lib/mv_web/live/global_settings_live.ex #, elixir-autogen, elixir-format msgid "Vereinfacht is not configured. Set API URL, API Key, and Club ID." @@ -2945,11 +2923,6 @@ msgstr "" msgid "Only OIDC sign-in (hide password login)" msgstr "" -#: lib/mv_web/live/global_settings_live.ex -#, elixir-autogen, elixir-format -msgid "When enabled and OIDC is configured, the sign-in page shows only the Single Sign-On button." -msgstr "" - #: lib/mv_web/live/components/member_filter_component.ex #, elixir-autogen, elixir-format msgid "Clear filters" @@ -3135,6 +3108,7 @@ msgid "Deleting this data field cannot be undone. All datafield values for this msgstr "" #: lib/mv_web/live/components/member_filter_component.ex +#: lib/mv_web/live/member_live/show.ex #, elixir-autogen, elixir-format msgid "Individual datafields" msgstr "" @@ -3623,3 +3597,28 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Review by" msgstr "" + +#: lib/mv_web/live/global_settings_live.ex +#, elixir-autogen, elixir-format +msgid "Accounting-Software (Vereinfacht) Integration" +msgstr "" + +#: lib/mv_web/live/role_live/index.html.heex +#, elixir-autogen, elixir-format +msgid "Manage roles and their permission sets." +msgstr "" + +#: lib/mv_web/live/global_settings_live.ex +#, elixir-autogen, elixir-format +msgid "OIDC (Single Sign On)" +msgstr "" + +#: lib/mv_web/live/user_live/form.ex +#, elixir-autogen, elixir-format +msgid "This user is linked via SSO (Single Sign On). A password set or changed here only affects login with email and password in this application. It does not change the password in your identity provider (e.g. Authentik). To change the SSO password, use the identity provider or your organization's IT." +msgstr "" + +#: lib/mv_web/live/global_settings_live.ex +#, elixir-autogen, elixir-format +msgid "When enabled and OIDC is configured, the sign-in page shows only the Single Sign On button." +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index eccae34..6b1bca6 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -593,7 +593,6 @@ msgid "This email is already linked to a different OIDC account. Cannot link mul msgstr "" #: lib/mv_web/live/member_live/form.ex -#: lib/mv_web/live/member_live/show.ex #, elixir-autogen, elixir-format, fuzzy msgid "Custom Fields" msgstr "" @@ -1552,11 +1551,6 @@ msgstr "" msgid "Listing Roles" msgstr "" -#: lib/mv_web/live/role_live/index.html.heex -#, elixir-autogen, elixir-format -msgid "Manage user roles and their permission sets." -msgstr "" - #: lib/mv_web/live/role_live/show.ex #, elixir-autogen, elixir-format msgid "Cannot delete role. %{count} user(s) are still assigned to this role. Please assign them to another role first." @@ -2243,11 +2237,6 @@ msgstr "" msgid "You do not have permission to access this page." msgstr "" -#: lib/mv_web/live/import_live/components.ex -#, elixir-autogen, elixir-format, fuzzy -msgid "Manage Member Data" -msgstr "" - #: lib/mv_web/components/export_dropdown.ex #, elixir-autogen, elixir-format, fuzzy msgid "Export members to CSV" @@ -2284,7 +2273,6 @@ msgstr "" msgid "Linked" msgstr "" -#: lib/mv_web/live/global_settings_live.ex #: lib/mv_web/live/user_live/index.html.heex #: lib/mv_web/live/user_live/show.ex #, elixir-autogen, elixir-format @@ -2301,11 +2289,6 @@ msgstr "" msgid "SSO / OIDC user" msgstr "" -#: lib/mv_web/live/user_live/form.ex -#, elixir-autogen, elixir-format -msgid "This user is linked via SSO (Single Sign-On). A password set or changed here only affects login with email and password in this application. It does not change the password in your identity provider (e.g. Authentik). To change the SSO password, use the identity provider or your organization's IT." -msgstr "" - #: lib/mv_web/live/import_live/components.ex #, elixir-autogen, elixir-format msgid "Import aborted" @@ -2536,11 +2519,6 @@ msgstr "" msgid "Syncing..." msgstr "" -#: lib/mv_web/live/global_settings_live.ex -#, elixir-autogen, elixir-format -msgid "Vereinfacht Integration" -msgstr "" - #: lib/mv_web/live/global_settings_live.ex #, elixir-autogen, elixir-format msgid "Vereinfacht is not configured. Set API URL, API Key, and Club ID." @@ -2945,11 +2923,6 @@ msgstr "" msgid "Only OIDC sign-in (hide password login)" msgstr "" -#: lib/mv_web/live/global_settings_live.ex -#, elixir-autogen, elixir-format -msgid "When enabled and OIDC is configured, the sign-in page shows only the Single Sign-On button." -msgstr "" - #: lib/mv_web/live/components/member_filter_component.ex #, elixir-autogen, elixir-format msgid "Clear filters" @@ -3135,6 +3108,7 @@ msgid "Deleting this data field cannot be undone. All datafield values for this msgstr "" #: lib/mv_web/live/components/member_filter_component.ex +#: lib/mv_web/live/member_live/show.ex #, elixir-autogen, elixir-format msgid "Individual datafields" msgstr "" @@ -3623,3 +3597,38 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Review by" msgstr "Review by" + +#: lib/mv_web/live/global_settings_live.ex +#, elixir-autogen, elixir-format +msgid "Accounting-Software (Vereinfacht) Integration" +msgstr "" + +#: lib/mv_web/live/role_live/index.html.heex +#, elixir-autogen, elixir-format, fuzzy +msgid "Manage roles and their permission sets." +msgstr "" + +#: lib/mv_web/live/global_settings_live.ex +#, elixir-autogen, elixir-format +msgid "OIDC (Single Sign On)" +msgstr "" + +#: lib/mv_web/live/user_live/form.ex +#, elixir-autogen, elixir-format, fuzzy +msgid "This user is linked via SSO (Single Sign On). A password set or changed here only affects login with email and password in this application. It does not change the password in your identity provider (e.g. Authentik). To change the SSO password, use the identity provider or your organization's IT." +msgstr "" + +#: lib/mv_web/live/global_settings_live.ex +#, elixir-autogen, elixir-format, fuzzy +msgid "When enabled and OIDC is configured, the sign-in page shows only the Single Sign On button." +msgstr "" + +#~ #: lib/mv_web/live/import_live/components.ex +#~ #, elixir-autogen, elixir-format, fuzzy +#~ msgid "Manage Member Data" +#~ msgstr "" + +#~ #: lib/mv_web/live/global_settings_live.ex +#~ #, elixir-autogen, elixir-format +#~ msgid "Vereinfacht Integration" +#~ msgstr "" -- 2.47.2 From ca9e4accc8093a0214b6dea4638157a582373b27 Mon Sep 17 00:00:00 2001 From: carla Date: Wed, 11 Mar 2026 11:25:16 +0100 Subject: [PATCH 4/7] fix formatting --- lib/mv_web/live/user_live/form.ex | 6 +++--- priv/gettext/de/LC_MESSAGES/default.po | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/mv_web/live/user_live/form.ex b/lib/mv_web/live/user_live/form.ex index 4f82405..27912af 100644 --- a/lib/mv_web/live/user_live/form.ex +++ b/lib/mv_web/live/user_live/form.ex @@ -91,7 +91,7 @@ defmodule MvWeb.UserLive.Form do />
<% end %> - +
- + <%= if @can_manage_member_linking do %>
diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index 5a2f5fc..b92b6b7 100644 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ b/priv/gettext/de/LC_MESSAGES/default.po @@ -3611,17 +3611,17 @@ msgstr "Verwalte Rollen und ihre Berechtigungssätze." #: lib/mv_web/live/global_settings_live.ex #, elixir-autogen, elixir-format msgid "OIDC (Single Sign On)" -msgstr "OIDC (Single Sign On)" +msgstr "OIDC (Single Sign-On)" #: lib/mv_web/live/user_live/form.ex #, elixir-autogen, elixir-format, fuzzy msgid "This user is linked via SSO (Single Sign On). A password set or changed here only affects login with email and password in this application. It does not change the password in your identity provider (e.g. Authentik). To change the SSO password, use the identity provider or your organization's IT." -msgstr "Diese*r Benutzer*in ist über SSO (Single Sign On) verbunden. Ein hier festgelegtes oder geändertes Passwort wirkt sich nur auf die Anmeldung mit E-Mail-Adresse und Passwort in dieser Anwendung aus. Es ändert nicht das Passwort in deinem Identitätsanbieter (z. B. Authentik). Um das SSO-Passwort zu ändern, wende dich an den Identitätsanbieter oder die IT deiner Organisation." +msgstr "Diese*r Benutzer*in ist über SSO (Single Sign-On) verbunden. Ein hier festgelegtes oder geändertes Passwort wirkt sich nur auf die Anmeldung mit E-Mail-Adresse und Passwort in dieser Anwendung aus. Es ändert nicht das Passwort in deinem Identitätsanbieter (z. B. Authentik). Um das SSO-Passwort zu ändern, wende dich an den Identitätsanbieter oder die IT deiner Organisation." #: lib/mv_web/live/global_settings_live.ex #, elixir-autogen, elixir-format, fuzzy msgid "When enabled and OIDC is configured, the sign-in page shows only the Single Sign On button." -msgstr "Wenn aktiviert und OIDC konfiguriert ist, zeigt die Anmeldeseite nur den Single Sign On Button." +msgstr "Wenn aktiviert und OIDC konfiguriert ist, zeigt die Anmeldeseite nur den Single Sign-On-Button." #~ #: lib/mv_web/live/import_live/components.ex #~ #, elixir-autogen, elixir-format, fuzzy -- 2.47.2 From 762402adf9da7bba825e36499ed2aaa965a21059 Mon Sep 17 00:00:00 2001 From: carla Date: Wed, 11 Mar 2026 11:30:26 +0100 Subject: [PATCH 5/7] fix translations --- lib/mv_web/live/global_settings_live.ex | 4 ++-- lib/mv_web/live/user_live/form.ex | 8 ++++---- priv/gettext/de/LC_MESSAGES/default.po | 8 ++++---- priv/gettext/default.pot | 6 +++--- priv/gettext/en/LC_MESSAGES/default.po | 8 ++++---- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/mv_web/live/global_settings_live.ex b/lib/mv_web/live/global_settings_live.ex index 7daa39a..c123f14 100644 --- a/lib/mv_web/live/global_settings_live.ex +++ b/lib/mv_web/live/global_settings_live.ex @@ -378,7 +378,7 @@ defmodule MvWeb.GlobalSettingsLive do <%!-- OIDC Section --%> - <.form_section title={gettext("OIDC (Single Sign On)")}> + <.form_section title={gettext("OIDC (Single Sign-On)")}> <%= if @oidc_env_configured do %>

{gettext("Some values are set via environment variables. Those fields are read-only.")} @@ -486,7 +486,7 @@ defmodule MvWeb.GlobalSettingsLive do />

{gettext( - "When enabled and OIDC is configured, the sign-in page shows only the Single Sign On button." + "When enabled and OIDC is configured, the sign-in page shows only the Single Sign-On button." )}

diff --git a/lib/mv_web/live/user_live/form.ex b/lib/mv_web/live/user_live/form.ex index 27912af..32ce493 100644 --- a/lib/mv_web/live/user_live/form.ex +++ b/lib/mv_web/live/user_live/form.ex @@ -91,7 +91,7 @@ defmodule MvWeb.UserLive.Form do /> <% end %> - +
@@ -128,7 +128,7 @@ defmodule MvWeb.UserLive.Form do required autocomplete="new-password" /> - + <%= if !@user do %> <.input @@ -179,7 +179,7 @@ defmodule MvWeb.UserLive.Form do <% end %> <% end %> - + <%= if @can_manage_member_linking do %>
diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index b92b6b7..419fbd3 100644 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ b/priv/gettext/de/LC_MESSAGES/default.po @@ -3609,18 +3609,18 @@ msgid "Manage roles and their permission sets." msgstr "Verwalte Rollen und ihre Berechtigungssätze." #: lib/mv_web/live/global_settings_live.ex -#, elixir-autogen, elixir-format -msgid "OIDC (Single Sign On)" +#, elixir-autogen, elixir-format, fuzzy +msgid "OIDC (Single Sign-On)" msgstr "OIDC (Single Sign-On)" #: lib/mv_web/live/user_live/form.ex #, elixir-autogen, elixir-format, fuzzy -msgid "This user is linked via SSO (Single Sign On). A password set or changed here only affects login with email and password in this application. It does not change the password in your identity provider (e.g. Authentik). To change the SSO password, use the identity provider or your organization's IT." +msgid "This user is linked via SSO (Single Sign-On). A password set or changed here only affects login with email and password in this application. It does not change the password in your identity provider (e.g. Authentik). To change the SSO password, use the identity provider or your organization's IT." msgstr "Diese*r Benutzer*in ist über SSO (Single Sign-On) verbunden. Ein hier festgelegtes oder geändertes Passwort wirkt sich nur auf die Anmeldung mit E-Mail-Adresse und Passwort in dieser Anwendung aus. Es ändert nicht das Passwort in deinem Identitätsanbieter (z. B. Authentik). Um das SSO-Passwort zu ändern, wende dich an den Identitätsanbieter oder die IT deiner Organisation." #: lib/mv_web/live/global_settings_live.ex #, elixir-autogen, elixir-format, fuzzy -msgid "When enabled and OIDC is configured, the sign-in page shows only the Single Sign On button." +msgid "When enabled and OIDC is configured, the sign-in page shows only the Single Sign-On button." msgstr "Wenn aktiviert und OIDC konfiguriert ist, zeigt die Anmeldeseite nur den Single Sign-On-Button." #~ #: lib/mv_web/live/import_live/components.ex diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index b5b80d7..c9c9e54 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -3610,15 +3610,15 @@ msgstr "" #: lib/mv_web/live/global_settings_live.ex #, elixir-autogen, elixir-format -msgid "OIDC (Single Sign On)" +msgid "OIDC (Single Sign-On)" msgstr "" #: lib/mv_web/live/user_live/form.ex #, elixir-autogen, elixir-format -msgid "This user is linked via SSO (Single Sign On). A password set or changed here only affects login with email and password in this application. It does not change the password in your identity provider (e.g. Authentik). To change the SSO password, use the identity provider or your organization's IT." +msgid "This user is linked via SSO (Single Sign-On). A password set or changed here only affects login with email and password in this application. It does not change the password in your identity provider (e.g. Authentik). To change the SSO password, use the identity provider or your organization's IT." msgstr "" #: lib/mv_web/live/global_settings_live.ex #, elixir-autogen, elixir-format -msgid "When enabled and OIDC is configured, the sign-in page shows only the Single Sign On button." +msgid "When enabled and OIDC is configured, the sign-in page shows only the Single Sign-On button." msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index 6b1bca6..e6f6e9e 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -3609,18 +3609,18 @@ msgid "Manage roles and their permission sets." msgstr "" #: lib/mv_web/live/global_settings_live.ex -#, elixir-autogen, elixir-format -msgid "OIDC (Single Sign On)" +#, elixir-autogen, elixir-format, fuzzy +msgid "OIDC (Single Sign-On)" msgstr "" #: lib/mv_web/live/user_live/form.ex #, elixir-autogen, elixir-format, fuzzy -msgid "This user is linked via SSO (Single Sign On). A password set or changed here only affects login with email and password in this application. It does not change the password in your identity provider (e.g. Authentik). To change the SSO password, use the identity provider or your organization's IT." +msgid "This user is linked via SSO (Single Sign-On). A password set or changed here only affects login with email and password in this application. It does not change the password in your identity provider (e.g. Authentik). To change the SSO password, use the identity provider or your organization's IT." msgstr "" #: lib/mv_web/live/global_settings_live.ex #, elixir-autogen, elixir-format, fuzzy -msgid "When enabled and OIDC is configured, the sign-in page shows only the Single Sign On button." +msgid "When enabled and OIDC is configured, the sign-in page shows only the Single Sign-On button." msgstr "" #~ #: lib/mv_web/live/import_live/components.ex -- 2.47.2 From 03d91d40298960b21ce88caffe0a9d0d10bf1f80 Mon Sep 17 00:00:00 2001 From: carla Date: Wed, 11 Mar 2026 11:40:32 +0100 Subject: [PATCH 6/7] fix tests --- lib/mv_web/live/user_live/form.ex | 6 +++--- test/mv_web/components/member_filter_component_test.exs | 2 +- test/mv_web/live/custom_field_live/deletion_test.exs | 2 +- test/mv_web/member_live/show_test.exs | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/mv_web/live/user_live/form.ex b/lib/mv_web/live/user_live/form.ex index 32ce493..5232ec7 100644 --- a/lib/mv_web/live/user_live/form.ex +++ b/lib/mv_web/live/user_live/form.ex @@ -91,7 +91,7 @@ defmodule MvWeb.UserLive.Form do />
<% end %> - +
- + <%= if @can_manage_member_linking do %>
diff --git a/test/mv_web/components/member_filter_component_test.exs b/test/mv_web/components/member_filter_component_test.exs index 485475a..d32993c 100644 --- a/test/mv_web/components/member_filter_component_test.exs +++ b/test/mv_web/components/member_filter_component_test.exs @@ -78,7 +78,7 @@ defmodule MvWeb.Components.MemberFilterComponentTest do html = render(view) # Should have both "Payments" and "Custom Fields" group labels assert html =~ gettext("Payments") || html =~ "Payment" - assert html =~ gettext("Custom Fields") + assert html =~ gettext("Individual datafields") end test "renders only payment filter when no boolean custom fields exist", %{conn: conn} do diff --git a/test/mv_web/live/custom_field_live/deletion_test.exs b/test/mv_web/live/custom_field_live/deletion_test.exs index 962ada1..7b0953a 100644 --- a/test/mv_web/live/custom_field_live/deletion_test.exs +++ b/test/mv_web/live/custom_field_live/deletion_test.exs @@ -77,7 +77,7 @@ defmodule MvWeb.CustomFieldLive.DeletionTest do # Edit mode: section titles must not reappear when modal opens (regression) refute has_element?(view, "h2", "Member fields") - refute has_element?(view, "h2", "Custom fields") + refute has_element?(view, "h2", "Individual datafields") # Should show correct member count (1 member) assert render(view) =~ "1 member has a value assigned for this datafield" diff --git a/test/mv_web/member_live/show_test.exs b/test/mv_web/member_live/show_test.exs index 54829de..c451be9 100644 --- a/test/mv_web/member_live/show_test.exs +++ b/test/mv_web/member_live/show_test.exs @@ -52,7 +52,7 @@ defmodule MvWeb.MemberLive.ShowTest do {:ok, _view, html} = live(conn, ~p"/members/#{member}") # Custom Fields section should be visible - assert html =~ gettext("Custom Fields") + assert html =~ gettext("Individual datafields") # Custom field label should be visible assert html =~ custom_field.name @@ -97,7 +97,7 @@ defmodule MvWeb.MemberLive.ShowTest do {:ok, _view, html} = live(conn, ~p"/members/#{member}") # Custom Fields section should be visible - assert html =~ gettext("Custom Fields") + assert html =~ gettext("Individual datafields") # Both field labels should be visible assert html =~ field1.name -- 2.47.2 From 15d4c7d97fc886c615962552ad8af400f8ebf4cb Mon Sep 17 00:00:00 2001 From: carla Date: Wed, 11 Mar 2026 11:50:24 +0100 Subject: [PATCH 7/7] fix import test --- test/mv_web/live/import_live_test.exs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/mv_web/live/import_live_test.exs b/test/mv_web/live/import_live_test.exs index bb907ce..09ec02c 100644 --- a/test/mv_web/live/import_live_test.exs +++ b/test/mv_web/live/import_live_test.exs @@ -238,7 +238,6 @@ defmodule MvWeb.ImportLiveTest do assert has_element?(view, "[data-testid='import-page']") assert has_element?(view, "[data-testid='csv-upload-form']") assert has_element?(view, "[data-testid='start-import-button']") - assert has_element?(view, "[data-testid='custom-fields-link']") end test "template links and file input are present", %{conn: conn} do -- 2.47.2