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.
-[](https://drone.dev.local-it.cloud/local-it/mitgliederverwaltung)
+[](https://drone.cicd.local-it.cloud/local-it/mitgliederverwaltung)

## đźš§ 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
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.
---
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."
)}
<%= 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 ""
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
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
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
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