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/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 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. --- diff --git a/lib/mv_web/live/global_settings_live.ex b/lib/mv_web/live/global_settings_live.ex index 3c75fa8..c123f14 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.")} 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/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index 055f36a..419fbd3 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, 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." +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..c9c9e54 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..e6f6e9e 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, 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." +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 "" 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/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 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