Adds translations fixes and updates reame #469
15 changed files with 123 additions and 142 deletions
|
|
@ -61,7 +61,7 @@ We are building a membership management system (Mila) using the following techno
|
||||||
8. [Accessibility Guidelines](#8-accessibility-guidelines)
|
8. [Accessibility Guidelines](#8-accessibility-guidelines)
|
||||||
|
|
||||||
**Related documents:**
|
**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).
|
- **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).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
|
||||||
54
README.md
54
README.md
|
|
@ -2,12 +2,12 @@
|
||||||
|
|
||||||
**Mila** — simple, usable, self-hostable membership management for small to mid-sized clubs.
|
**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
|
## 🚧 Project Status
|
||||||
|
|
||||||
⚠️ **Early development** — not production-ready. Expect breaking changes.
|
⚠️ **First Version** — Expect breaking changes.
|
||||||
Contributions and feedback are welcome!
|
Contributions and feedback are welcome!
|
||||||
|
|
||||||
## ✨ Overview
|
## ✨ 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.)
|
- ✅ SSO via OIDC (works with Authentik, Rauthy, Keycloak, etc.)
|
||||||
- ✅ Sidebar navigation (standard-compliant, accessible)
|
- ✅ Sidebar navigation (standard-compliant, accessible)
|
||||||
- ✅ Global settings management
|
- ✅ Global settings management
|
||||||
- 🚧 Self-service & online application
|
- ✅ Self-service & online application
|
||||||
- ✅ Accessibility improvements (WCAG 2.1 AA compliant keyboard navigation)
|
- ✅ 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)
|
## 🚀 Quick Start (Development)
|
||||||
|
|
||||||
|
|
@ -173,12 +174,6 @@ The `OIDC_REDIRECT_URI` is auto-generated as `https://{DOMAIN}/auth/user/oidc/ca
|
||||||
## ⚙️ Configuration
|
## ⚙️ Configuration
|
||||||
|
|
||||||
- **Env vars:** see `.env.example`
|
- **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`
|
|
||||||
|
|
||||||
## 🏗️ Architecture
|
## 🏗️ 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_web/` — Phoenix controllers, LiveViews, components
|
||||||
- `lib/mv/` — Shared helpers and business logic
|
- `lib/mv/` — Shared helpers and business logic
|
||||||
- `assets/` — Tailwind, JavaScript, static files
|
- `assets/` — Tailwind, JavaScript, static files
|
||||||
|
- `test/` — All tests
|
||||||
|
|
||||||
|
|
||||||
📚 **Full tech stack details:** See [`CODE_GUIDELINES.md`](CODE_GUIDELINES.md)
|
📚 **Full tech stack details:** See [`CODE_GUIDELINES.md`](CODE_GUIDELINES.md)
|
||||||
📖 **Implementation history:** See [`docs/development-progress-log.md`](docs/development-progress-log.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
|
# Copy template and edit
|
||||||
cp .env.example .env
|
cp .env.example .env
|
||||||
nano .env
|
nano .env
|
||||||
|
|
||||||
# Required variables:
|
|
||||||
SECRET_KEY_BASE=<your-generated-secret>
|
|
||||||
TOKEN_SIGNING_SECRET=<your-generated-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=<from-your-oidc-provider>
|
|
||||||
# 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):
|
3. **Start production environment:**
|
||||||
```bash
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
4. **Start production environment:**
|
|
||||||
```bash
|
```bash
|
||||||
docker compose -f docker-compose.prod.yml up
|
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
|
```bash
|
||||||
docker compose -f docker-compose.prod.yml exec app /app/bin/mv eval "Mv.Release.migrate"
|
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
|
- Production App: http://localhost:4001
|
||||||
- Uses same Rauthy instance as dev (localhost:8080)
|
- Uses same Rauthy instance as dev (localhost:8080)
|
||||||
|
|
||||||
|
|
@ -286,9 +260,9 @@ For actual production deployment:
|
||||||
## 🤝 Contributing
|
## 🤝 Contributing
|
||||||
|
|
||||||
We welcome contributions!
|
We welcome contributions!
|
||||||
- Open issues and PRs in this repo.
|
- Open issues and PRs in this repo
|
||||||
- Please follow existing code style and conventions.
|
- Please follow existing code style and conventions
|
||||||
- Expect breaking changes while the project is in early development.
|
- Expect breaking changes while the project is in early development
|
||||||
|
|
||||||
## 📄 License
|
## 📄 License
|
||||||
|
|
||||||
|
|
@ -298,4 +272,4 @@ See the [LICENSE](LICENSE) file for details.
|
||||||
## 📬 Contact
|
## 📬 Contact
|
||||||
|
|
||||||
- Issues: [GitLab Issues](https://git.local-it.org/local-it/mitgliederverwaltung/-/issues)
|
- Issues: [GitLab Issues](https://git.local-it.org/local-it/mitgliederverwaltung/-/issues)
|
||||||
- Community links: coming soon.
|
- E-Mail: info@local-it.org
|
||||||
|
|
|
||||||
|
|
@ -195,7 +195,7 @@
|
||||||
- Auto-dismiss: info/success 4–6s, warning 6–8s, error 8–12s; dismiss button kept for accessibility.
|
- 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.
|
- 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)`.
|
- 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.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -270,7 +270,7 @@ defmodule MvWeb.GlobalSettingsLive do
|
||||||
</div>
|
</div>
|
||||||
</.form_section>
|
</.form_section>
|
||||||
<%!-- Vereinfacht Integration Section --%>
|
<%!-- Vereinfacht Integration Section --%>
|
||||||
<.form_section title={gettext("Vereinfacht Integration")}>
|
<.form_section title={gettext("Accounting-Software (Vereinfacht) Integration")}>
|
||||||
<%= if @vereinfacht_env_configured do %>
|
<%= if @vereinfacht_env_configured do %>
|
||||||
<p class="text-sm text-base-content/70 mb-4">
|
<p class="text-sm text-base-content/70 mb-4">
|
||||||
{gettext("Some values are set via environment variables. Those fields are read-only.")}
|
{gettext("Some values are set via environment variables. Those fields are read-only.")}
|
||||||
|
|
@ -378,7 +378,7 @@ defmodule MvWeb.GlobalSettingsLive do
|
||||||
</.form>
|
</.form>
|
||||||
</.form_section>
|
</.form_section>
|
||||||
<%!-- OIDC Section --%>
|
<%!-- OIDC Section --%>
|
||||||
<.form_section title={gettext("OIDC")}>
|
<.form_section title={gettext("OIDC (Single Sign-On)")}>
|
||||||
<%= if @oidc_env_configured do %>
|
<%= if @oidc_env_configured do %>
|
||||||
<p class="text-sm text-base-content/70 mb-4">
|
<p class="text-sm text-base-content/70 mb-4">
|
||||||
{gettext("Some values are set via environment variables. Those fields are read-only.")}
|
{gettext("Some values are set via environment variables. Those fields are read-only.")}
|
||||||
|
|
|
||||||
|
|
@ -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."
|
"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."
|
||||||
)}
|
)}
|
||||||
</p>
|
</p>
|
||||||
<p class="text-sm">
|
|
||||||
<.link
|
|
||||||
href={~p"/settings#custom_fields"}
|
|
||||||
class="link"
|
|
||||||
data-testid="custom-fields-link"
|
|
||||||
>
|
|
||||||
{gettext("Manage Member Data")}
|
|
||||||
</.link>
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -230,7 +230,7 @@ defmodule MvWeb.MemberLive.Show do
|
||||||
<%!-- Custom Fields Section --%>
|
<%!-- Custom Fields Section --%>
|
||||||
<%= if Enum.any?(@custom_fields) do %>
|
<%= if Enum.any?(@custom_fields) do %>
|
||||||
<div>
|
<div>
|
||||||
<.section_box title={gettext("Custom Fields")}>
|
<.section_box title={gettext("Individual datafields")}>
|
||||||
<div class="grid grid-cols-2 gap-4">
|
<div class="grid grid-cols-2 gap-4">
|
||||||
<%= for custom_field <- @custom_fields do %>
|
<%= for custom_field <- @custom_fields do %>
|
||||||
<% cfv = find_custom_field_value(@member.custom_field_values, custom_field.id) %>
|
<% cfv = find_custom_field_value(@member.custom_field_values, custom_field.id) %>
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
<.header>
|
<.header>
|
||||||
{gettext("Listing Roles")}
|
{gettext("Listing Roles")}
|
||||||
<:subtitle>
|
<:subtitle>
|
||||||
{gettext("Manage user roles and their permission sets.")}
|
{gettext("Manage roles and their permission sets.")}
|
||||||
</:subtitle>
|
</:subtitle>
|
||||||
<:actions>
|
<:actions>
|
||||||
<%= if can?(@current_user, :create, Mv.Authorization.Role) do %>
|
<%= if can?(@current_user, :create, Mv.Authorization.Role) do %>
|
||||||
|
|
|
||||||
|
|
@ -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."
|
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/form.ex
|
||||||
#: lib/mv_web/live/member_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Custom Fields"
|
msgid "Custom Fields"
|
||||||
msgstr "Benutzerdefinierte Felder"
|
msgstr "Benutzerdefinierte Felder"
|
||||||
|
|
@ -1551,11 +1550,6 @@ msgstr "Rolle konnte nicht gelöscht werden: %{error}"
|
||||||
msgid "Listing Roles"
|
msgid "Listing Roles"
|
||||||
msgstr "Rollen auflisten"
|
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
|
#: lib/mv_web/live/role_live/show.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Cannot delete role. %{count} user(s) are still assigned to this role. Please assign them to another role first."
|
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."
|
msgid "You do not have permission to access this page."
|
||||||
msgstr "Du hast keine Berechtigung, auf diese Seite zuzugreifen."
|
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
|
#: lib/mv_web/components/export_dropdown.ex
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Export members to CSV"
|
msgid "Export members to CSV"
|
||||||
|
|
@ -2283,7 +2272,6 @@ msgstr "Beitragsart auswählen"
|
||||||
msgid "Linked"
|
msgid "Linked"
|
||||||
msgstr "Verknüpft"
|
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/index.html.heex
|
||||||
#: lib/mv_web/live/user_live/show.ex
|
#: lib/mv_web/live/user_live/show.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
|
|
@ -2300,11 +2288,6 @@ msgstr "Nicht verknüpft"
|
||||||
msgid "SSO / OIDC user"
|
msgid "SSO / OIDC user"
|
||||||
msgstr "SSO / OIDC Benutzer*in"
|
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
|
#: lib/mv_web/live/import_live/components.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Import aborted"
|
msgid "Import aborted"
|
||||||
|
|
@ -2535,11 +2518,6 @@ msgstr "%{count} Mitglied(er) mit Vereinfacht synchronisiert."
|
||||||
msgid "Syncing..."
|
msgid "Syncing..."
|
||||||
msgstr "Synchronisiere..."
|
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
|
#: lib/mv_web/live/global_settings_live.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Vereinfacht is not configured. Set API URL, API Key, and Club ID."
|
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)"
|
msgid "Only OIDC sign-in (hide password login)"
|
||||||
msgstr "Nur OIDC-Anmeldung (Passwort-Login ausblenden)"
|
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
|
#: lib/mv_web/live/components/member_filter_component.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Clear filters"
|
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."
|
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/components/member_filter_component.ex
|
||||||
|
#: lib/mv_web/live/member_live/show.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Individual datafields"
|
msgid "Individual datafields"
|
||||||
msgstr "Individuelle Datenfelder"
|
msgstr "Individuelle Datenfelder"
|
||||||
|
|
@ -3623,3 +3597,38 @@ msgstr "Offene Anträge"
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Review by"
|
msgid "Review by"
|
||||||
msgstr "Geprüft von"
|
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"
|
||||||
|
|
|
||||||
|
|
@ -593,7 +593,6 @@ msgid "This email is already linked to a different OIDC account. Cannot link mul
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/form.ex
|
#: lib/mv_web/live/member_live/form.ex
|
||||||
#: lib/mv_web/live/member_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Custom Fields"
|
msgid "Custom Fields"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -1552,11 +1551,6 @@ msgstr ""
|
||||||
msgid "Listing Roles"
|
msgid "Listing Roles"
|
||||||
msgstr ""
|
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
|
#: lib/mv_web/live/role_live/show.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Cannot delete role. %{count} user(s) are still assigned to this role. Please assign them to another role first."
|
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."
|
msgid "You do not have permission to access this page."
|
||||||
msgstr ""
|
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
|
#: lib/mv_web/components/export_dropdown.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Export members to CSV"
|
msgid "Export members to CSV"
|
||||||
|
|
@ -2284,7 +2273,6 @@ msgstr ""
|
||||||
msgid "Linked"
|
msgid "Linked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/global_settings_live.ex
|
|
||||||
#: lib/mv_web/live/user_live/index.html.heex
|
#: lib/mv_web/live/user_live/index.html.heex
|
||||||
#: lib/mv_web/live/user_live/show.ex
|
#: lib/mv_web/live/user_live/show.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
|
|
@ -2301,11 +2289,6 @@ msgstr ""
|
||||||
msgid "SSO / OIDC user"
|
msgid "SSO / OIDC user"
|
||||||
msgstr ""
|
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
|
#: lib/mv_web/live/import_live/components.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Import aborted"
|
msgid "Import aborted"
|
||||||
|
|
@ -2536,11 +2519,6 @@ msgstr ""
|
||||||
msgid "Syncing..."
|
msgid "Syncing..."
|
||||||
msgstr ""
|
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
|
#: lib/mv_web/live/global_settings_live.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Vereinfacht is not configured. Set API URL, API Key, and Club ID."
|
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)"
|
msgid "Only OIDC sign-in (hide password login)"
|
||||||
msgstr ""
|
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
|
#: lib/mv_web/live/components/member_filter_component.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Clear filters"
|
msgid "Clear filters"
|
||||||
|
|
@ -3135,6 +3108,7 @@ msgid "Deleting this data field cannot be undone. All datafield values for this
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/components/member_filter_component.ex
|
#: lib/mv_web/live/components/member_filter_component.ex
|
||||||
|
#: lib/mv_web/live/member_live/show.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Individual datafields"
|
msgid "Individual datafields"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -3623,3 +3597,28 @@ msgstr ""
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Review by"
|
msgid "Review by"
|
||||||
msgstr ""
|
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 ""
|
||||||
|
|
|
||||||
|
|
@ -593,7 +593,6 @@ msgid "This email is already linked to a different OIDC account. Cannot link mul
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/form.ex
|
#: lib/mv_web/live/member_live/form.ex
|
||||||
#: lib/mv_web/live/member_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Custom Fields"
|
msgid "Custom Fields"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -1552,11 +1551,6 @@ msgstr ""
|
||||||
msgid "Listing Roles"
|
msgid "Listing Roles"
|
||||||
msgstr ""
|
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
|
#: lib/mv_web/live/role_live/show.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Cannot delete role. %{count} user(s) are still assigned to this role. Please assign them to another role first."
|
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."
|
msgid "You do not have permission to access this page."
|
||||||
msgstr ""
|
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
|
#: lib/mv_web/components/export_dropdown.ex
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Export members to CSV"
|
msgid "Export members to CSV"
|
||||||
|
|
@ -2284,7 +2273,6 @@ msgstr ""
|
||||||
msgid "Linked"
|
msgid "Linked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/global_settings_live.ex
|
|
||||||
#: lib/mv_web/live/user_live/index.html.heex
|
#: lib/mv_web/live/user_live/index.html.heex
|
||||||
#: lib/mv_web/live/user_live/show.ex
|
#: lib/mv_web/live/user_live/show.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
|
|
@ -2301,11 +2289,6 @@ msgstr ""
|
||||||
msgid "SSO / OIDC user"
|
msgid "SSO / OIDC user"
|
||||||
msgstr ""
|
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
|
#: lib/mv_web/live/import_live/components.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Import aborted"
|
msgid "Import aborted"
|
||||||
|
|
@ -2536,11 +2519,6 @@ msgstr ""
|
||||||
msgid "Syncing..."
|
msgid "Syncing..."
|
||||||
msgstr ""
|
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
|
#: lib/mv_web/live/global_settings_live.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Vereinfacht is not configured. Set API URL, API Key, and Club ID."
|
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)"
|
msgid "Only OIDC sign-in (hide password login)"
|
||||||
msgstr ""
|
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
|
#: lib/mv_web/live/components/member_filter_component.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Clear filters"
|
msgid "Clear filters"
|
||||||
|
|
@ -3135,6 +3108,7 @@ msgid "Deleting this data field cannot be undone. All datafield values for this
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/components/member_filter_component.ex
|
#: lib/mv_web/live/components/member_filter_component.ex
|
||||||
|
#: lib/mv_web/live/member_live/show.ex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Individual datafields"
|
msgid "Individual datafields"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -3623,3 +3597,38 @@ msgstr ""
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Review by"
|
msgid "Review by"
|
||||||
msgstr "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 ""
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ defmodule MvWeb.Components.MemberFilterComponentTest do
|
||||||
html = render(view)
|
html = render(view)
|
||||||
# Should have both "Payments" and "Custom Fields" group labels
|
# Should have both "Payments" and "Custom Fields" group labels
|
||||||
assert html =~ gettext("Payments") || html =~ "Payment"
|
assert html =~ gettext("Payments") || html =~ "Payment"
|
||||||
assert html =~ gettext("Custom Fields")
|
assert html =~ gettext("Individual datafields")
|
||||||
end
|
end
|
||||||
|
|
||||||
test "renders only payment filter when no boolean custom fields exist", %{conn: conn} do
|
test "renders only payment filter when no boolean custom fields exist", %{conn: conn} do
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@ defmodule MvWeb.CustomFieldLive.DeletionTest do
|
||||||
|
|
||||||
# Edit mode: section titles must not reappear when modal opens (regression)
|
# Edit mode: section titles must not reappear when modal opens (regression)
|
||||||
refute has_element?(view, "h2", "Member fields")
|
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)
|
# Should show correct member count (1 member)
|
||||||
assert render(view) =~ "1 member has a value assigned for this datafield"
|
assert render(view) =~ "1 member has a value assigned for this datafield"
|
||||||
|
|
|
||||||
|
|
@ -238,7 +238,6 @@ defmodule MvWeb.ImportLiveTest do
|
||||||
assert has_element?(view, "[data-testid='import-page']")
|
assert has_element?(view, "[data-testid='import-page']")
|
||||||
assert has_element?(view, "[data-testid='csv-upload-form']")
|
assert has_element?(view, "[data-testid='csv-upload-form']")
|
||||||
assert has_element?(view, "[data-testid='start-import-button']")
|
assert has_element?(view, "[data-testid='start-import-button']")
|
||||||
assert has_element?(view, "[data-testid='custom-fields-link']")
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "template links and file input are present", %{conn: conn} do
|
test "template links and file input are present", %{conn: conn} do
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ defmodule MvWeb.MemberLive.ShowTest do
|
||||||
{:ok, _view, html} = live(conn, ~p"/members/#{member}")
|
{:ok, _view, html} = live(conn, ~p"/members/#{member}")
|
||||||
|
|
||||||
# Custom Fields section should be visible
|
# Custom Fields section should be visible
|
||||||
assert html =~ gettext("Custom Fields")
|
assert html =~ gettext("Individual datafields")
|
||||||
|
|
||||||
# Custom field label should be visible
|
# Custom field label should be visible
|
||||||
assert html =~ custom_field.name
|
assert html =~ custom_field.name
|
||||||
|
|
@ -97,7 +97,7 @@ defmodule MvWeb.MemberLive.ShowTest do
|
||||||
{:ok, _view, html} = live(conn, ~p"/members/#{member}")
|
{:ok, _view, html} = live(conn, ~p"/members/#{member}")
|
||||||
|
|
||||||
# Custom Fields section should be visible
|
# Custom Fields section should be visible
|
||||||
assert html =~ gettext("Custom Fields")
|
assert html =~ gettext("Individual datafields")
|
||||||
|
|
||||||
# Both field labels should be visible
|
# Both field labels should be visible
|
||||||
assert html =~ field1.name
|
assert html =~ field1.name
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue