feat: Datafields page, merge fee types into membership_fee_settings, sidebar

- Add /admin/datafields (DatafieldsLive) for member and custom field config
- Remove Memberdata block from GlobalSettingsLive
- Router: drop /membership_fee_types, add new_fee_type and edit_fee_type under membership_fee_settings
- MembershipFeeSettingsLive: fee types table, collapsible examples; Index links updated
- PagePaths: admin_datafields, admin_import; remove membership_fee_types
- Sidebar: order and labels (Basic settings, Datafields, Membership fee settings, Import, Users, Roles)
- Gettext: German translations for sidebar and OIDC
- Tests: datafields and fee routes, permission and form tests updated
This commit is contained in:
Moritz 2026-02-24 13:55:33 +01:00
parent 8edbbac95f
commit 62b37b9aa2
Signed by: moritz
GPG key ID: 1020A035E5DD0824
18 changed files with 886 additions and 251 deletions

View file

@ -12,14 +12,14 @@ defmodule Mv.OidcRoleSyncTest do
setup do
ensure_roles_exist()
restore_config = put_oidc_config(admin_group_name: "mila-admin", groups_claim: "groups")
restore_config = put_oidc_env(admin_group_name: "mila-admin", groups_claim: "groups")
on_exit(restore_config)
:ok
end
describe "apply_admin_role_from_user_info/2" do
test "when OIDC_ADMIN_GROUP_NAME not configured: does not change user (Mitglied stays)" do
restore = put_oidc_config(admin_group_name: nil, groups_claim: "groups")
restore = put_oidc_env(admin_group_name: nil, groups_claim: "groups")
on_exit(restore)
email = "sync-no-config-#{System.unique_integer([:positive])}@test.example.com"
@ -58,7 +58,7 @@ defmodule Mv.OidcRoleSyncTest do
end
test "when OIDC_GROUPS_CLAIM is different: reads groups from that claim" do
restore = put_oidc_config(admin_group_name: "mila-admin", groups_claim: "ak_groups")
restore = put_oidc_env(admin_group_name: "mila-admin", groups_claim: "ak_groups")
on_exit(restore)
email = "sync-claim-#{System.unique_integer([:positive])}@test.example.com"
@ -131,13 +131,30 @@ defmodule Mv.OidcRoleSyncTest do
end
end
defp put_oidc_config(opts) do
current = Application.get_env(:mv, :oidc_role_sync, [])
merged = Keyword.merge(current, opts)
Application.put_env(:mv, :oidc_role_sync, merged)
defp put_oidc_env(opts) do
prev_admin = System.get_env("OIDC_ADMIN_GROUP_NAME")
prev_claim = System.get_env("OIDC_GROUPS_CLAIM")
if opts[:admin_group_name] != nil do
System.put_env("OIDC_ADMIN_GROUP_NAME", to_string(opts[:admin_group_name]))
else
System.delete_env("OIDC_ADMIN_GROUP_NAME")
end
if opts[:groups_claim] != nil do
System.put_env("OIDC_GROUPS_CLAIM", to_string(opts[:groups_claim]))
else
System.delete_env("OIDC_GROUPS_CLAIM")
end
fn ->
Application.put_env(:mv, :oidc_role_sync, current)
if prev_admin,
do: System.put_env("OIDC_ADMIN_GROUP_NAME", prev_admin),
else: System.delete_env("OIDC_ADMIN_GROUP_NAME")
if prev_claim,
do: System.put_env("OIDC_GROUPS_CLAIM", prev_claim),
else: System.delete_env("OIDC_GROUPS_CLAIM")
end
end