From 5b972b3633b1b62b26ae2fc1561c9197b683dee7 Mon Sep 17 00:00:00 2001 From: fs Date: Sat, 25 Apr 2026 09:29:01 +0200 Subject: [PATCH] refactor(settings): declutter account-access, group registration with user defaults Three related cleanups in the same area: - Account-access loses 4 info blockquotes that paraphrased their cards, 4 redundant "allowed range" hints (the input min/max + DB descriptions already convey the bounds), and the fieldset wrappers around single checkboxes. - The registration toggle moves out of account-access into general's user-creation card (renamed to "User onboarding"), so all "new user" settings live together while account-access stays focused on existing user sessions. - Both feature toggles (allow registration, Microsoft auto-remember) switch to role="switch" with the description sitting outside the label as , matching the tenant form pattern. Co-Authored-By: Claude Opus 4.7 (1M context) --- i18n/default_de.json | 5 ++ i18n/default_en.json | 5 ++ pages/admin/settings/account-access().php | 1 - .../settings/account-access(default).phtml | 72 ++++--------------- pages/admin/settings/general().php | 1 + pages/admin/settings/general(default).phtml | 12 +++- pages/admin/settings/index(default).phtml | 4 +- 7 files changed, 39 insertions(+), 61 deletions(-) diff --git a/i18n/default_de.json b/i18n/default_de.json index cb8201d..651c3ac 100644 --- a/i18n/default_de.json +++ b/i18n/default_de.json @@ -107,6 +107,7 @@ "App logo": "App-Logo", "App logo and favicon": "App-Logo und Favicon", "App title": "App-Titel", + "App title, language, registration and new-user defaults": "App-Titel, Sprache, Registrierung und Standardwerte für neue Benutzer", "App title, language, user creation defaults": "App-Titel, Sprache, Standardwerte für neue Benutzer", "APP_CRYPTO_KEY is missing or invalid": "APP_CRYPTO_KEY fehlt oder ist ungültig", "Appearance": "Darstellung", @@ -870,6 +871,8 @@ "Register": "Registrieren", "Registration controls whether new users can create an account.": "Hier wird gesteuert, ob neue Benutzer ein Konto erstellen dürfen.", "Registration is currently disabled": "Registrierung ist derzeit deaktiviert.", + "Registration off": "Registrierung aus", + "Registration on": "Registrierung an", "Registration successful! Please check your email for the verification code.": "Registrierung erfolgreich! Bitte prüfe deine E-Mails für den Bestätigungscode.", "Registration, sessions, login persistence": "Registrierung, Sitzungen, Login-Persistenz", "Remember login after Microsoft sign-in": "Angemeldet bleiben nach Microsoft-Login", @@ -1033,6 +1036,7 @@ "Session idle timeout is invalid": "Sitzungs-Inaktivitäts-Timeout ist ungültig", "Session limits define how long logged-in users stay signed in.": "Hier werden Inaktivitäts- und Absolute-Timeout für aktive Sitzungen festgelegt.", "Session policy": "Sitzungsrichtlinie", + "Sessions, login persistence, login tokens": "Sitzungen, Login-Persistenz, Login-Tokens", "Sessions, registration, lifecycle, audit, telemetry": "Sitzungen, Registrierung, Lebenszyklus, Audit, Telemetrie", "setting.api_cors_allowed_origins": "Erlaubte Browser-Origins für API-CORS (eine Origin pro Zeile)", "setting.api_token_default_ttl_days": "Standard-Laufzeit für neue API-Tokens in Tagen (Default: 90)", @@ -1298,6 +1302,7 @@ "User lifecycle policy": "Benutzer-Lifecycle-Regel", "User lifecycle settings": "Benutzer-Lebenszyklus-Einstellungen", "User not found": "Benutzer nicht gefunden", + "User onboarding": "Benutzeranlage", "User override disabled": "Benutzer-Override deaktiviert", "User override enabled": "Benutzer-Override aktiviert", "User profile fields are global and affect all tenants of this user": "Benutzer-Profildaten sind global und wirken auf alle Mandanten dieses Benutzers.", diff --git a/i18n/default_en.json b/i18n/default_en.json index c4ac273..93f9b9d 100644 --- a/i18n/default_en.json +++ b/i18n/default_en.json @@ -107,6 +107,7 @@ "App logo": "App logo", "App logo and favicon": "App logo and favicon", "App title": "App title", + "App title, language, registration and new-user defaults": "App title, language, registration and new-user defaults", "App title, language, user creation defaults": "App title, language, user creation defaults", "APP_CRYPTO_KEY is missing or invalid": "APP_CRYPTO_KEY is missing or invalid", "Appearance": "Appearance", @@ -870,6 +871,8 @@ "Register": "Register", "Registration controls whether new users can create an account.": "Registration controls whether new users can create an account.", "Registration is currently disabled": "Registration is currently disabled.", + "Registration off": "Registration off", + "Registration on": "Registration on", "Registration successful! Please check your email for the verification code.": "Registration successful! Please check your email for the verification code.", "Registration, sessions, login persistence": "Registration, sessions, login persistence", "Remember login after Microsoft sign-in": "Remember login after Microsoft sign-in", @@ -1033,6 +1036,7 @@ "Session idle timeout is invalid": "Session idle timeout is invalid", "Session limits define how long logged-in users stay signed in.": "Set idle and absolute limits for active sessions.", "Session policy": "Session policy", + "Sessions, login persistence, login tokens": "Sessions, login persistence, login tokens", "Sessions, registration, lifecycle, audit, telemetry": "Sessions, registration, lifecycle, audit, telemetry", "setting.api_cors_allowed_origins": "Allowed browser origins for API CORS (one origin per line)", "setting.api_token_default_ttl_days": "Default lifetime for newly created API tokens in days (default: 90)", @@ -1298,6 +1302,7 @@ "User lifecycle policy": "User lifecycle policy", "User lifecycle settings": "User lifecycle settings", "User not found": "User not found", + "User onboarding": "User onboarding", "User override disabled": "User override disabled", "User override enabled": "User override enabled", "User profile fields are global and affect all tenants of this user": "User profile fields are global and affect all tenants of this user", diff --git a/pages/admin/settings/account-access().php b/pages/admin/settings/account-access().php index ce1829b..989fdd9 100644 --- a/pages/admin/settings/account-access().php +++ b/pages/admin/settings/account-access().php @@ -42,7 +42,6 @@ if ($request->isMethod('POST')) { } $sectionKeys = [ - 'app_registration', 'session_idle_timeout_minutes', 'session_absolute_timeout_hours', 'remember_token_lifetime_days', diff --git a/pages/admin/settings/account-access(default).phtml b/pages/admin/settings/account-access(default).phtml index 45c1133..8dccc37 100644 --- a/pages/admin/settings/account-access(default).phtml +++ b/pages/admin/settings/account-access(default).phtml @@ -11,16 +11,13 @@ use MintyPHP\Session; $values = $values ?? []; $settings = $settings ?? []; -$appRegistration = !empty($values['app_registration']); $sessionIdleTimeoutMinutes = (int) ($values['session_idle_timeout_minutes'] ?? 30); $sessionAbsoluteTimeoutHours = (int) ($values['session_absolute_timeout_hours'] ?? 8); $rememberTokenLifetimeDays = (int) ($values['remember_token_lifetime_days'] ?? 30); $microsoftAutoRememberDefault = !empty($values['microsoft_auto_remember_default']); -$appRegistrationDesc = $settings['app_registration']['description'] ?? 'setting.app_registration'; $sessionIdleTimeoutMinutesDesc = $settings['session_idle_timeout_minutes']['description'] ?? 'setting.session_idle_timeout_minutes'; $sessionAbsoluteTimeoutHoursDesc = $settings['session_absolute_timeout_hours']['description'] ?? 'setting.session_absolute_timeout_hours'; $rememberTokenLifetimeDaysDesc = $settings['remember_token_lifetime_days']['description'] ?? 'setting.remember_token_lifetime_days'; -$microsoftAutoRememberDefaultDesc = $settings['microsoft_auto_remember_default']['description'] ?? 'setting.microsoft_auto_remember_default'; $activeLoginTokens = (int) ($activeLoginTokens ?? 0); $canUpdateSettings = (bool) ($canUpdateSettings ?? false); $isReadOnly = !$canUpdateSettings; @@ -56,30 +53,6 @@ $disabledAttr = $isReadOnly ? 'disabled' : ''; ?>
-
- - - - - - -
-
- -
-
- - - - -
-
-
-
@@ -89,9 +62,6 @@ $disabledAttr = $isReadOnly ? 'disabled' : '';
-
- -
@@ -121,31 +89,21 @@ $disabledAttr = $isReadOnly ? 'disabled' : '';
-
- -
-
- -
- - - - - -
-
+ +
+ +
diff --git a/pages/admin/settings/general().php b/pages/admin/settings/general().php index c8110c4..fc48846 100644 --- a/pages/admin/settings/general().php +++ b/pages/admin/settings/general().php @@ -49,6 +49,7 @@ if ($request->isMethod('POST')) { 'default_department_id', 'app_title', 'app_locale', + 'app_registration', ]; $mergedPost = settingsSectionMergePost($values, $request->bodyAll(), $sectionKeys); diff --git a/pages/admin/settings/general(default).phtml b/pages/admin/settings/general(default).phtml index baeb762..6283751 100644 --- a/pages/admin/settings/general(default).phtml +++ b/pages/admin/settings/general(default).phtml @@ -18,8 +18,10 @@ $defaultRoleId = (int) ($values['default_role_id'] ?? 0); $defaultDepartmentId = (int) ($values['default_department_id'] ?? 0); $appTitle = (string) ($values['app_title'] ?? ''); $appLocale = (string) ($values['app_locale'] ?? ''); +$appRegistration = !empty($values['app_registration']); $appTitleDesc = $settings['app_title']['description'] ?? 'setting.app_title'; $appLocaleDesc = $settings['app_locale']['description'] ?? 'setting.app_locale'; +$appRegistrationDesc = $settings['app_registration']['description'] ?? 'setting.app_registration'; $locales = defined('APP_LOCALES') ? APP_LOCALES : []; $canUpdateSettings = (bool) ($canUpdateSettings ?? false); $isReadOnly = !$canUpdateSettings; @@ -97,12 +99,20 @@ $disabledAttr = $isReadOnly ? 'disabled' : ''; 0) + (int) ($defaultDepartmentId > 0) + (int) ($defaultRoleId > 0); ?>
- + +
+ + +
diff --git a/pages/admin/settings/index(default).phtml b/pages/admin/settings/index(default).phtml index 88aba60..af3e3c2 100644 --- a/pages/admin/settings/index(default).phtml +++ b/pages/admin/settings/index(default).phtml @@ -20,14 +20,14 @@ 'label' => t('General'), 'icon' => 'bi bi-sliders', 'iconTone' => 'blue', - 'tooltip' => t('App title, language, user creation defaults'), + 'tooltip' => t('App title, language, registration and new-user defaults'), ]); appTile([ 'href' => 'admin/settings/account-access', 'label' => t('Account access'), 'icon' => 'bi bi-shield-lock', 'iconTone' => 'violet', - 'tooltip' => t('Registration, sessions, login persistence'), + 'tooltip' => t('Sessions, login persistence, login tokens'), ]); appTile([ 'href' => 'admin/settings/user-lifecycle',