feat: manage system appearance defaults
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import type { ApiSettings, DeltaDeletedItem, NavigationPreferences, PrivacyRetentionPolicy } from "@govoplan/core-webui";
|
||||
import type { ApiSettings, DeltaDeletedItem, NavigationPreferences, PrivacyRetentionPolicy, UserUiPalette } from "@govoplan/core-webui";
|
||||
import { apiDownload, apiFetch, apiPath, apiQuery } from "@govoplan/core-webui";
|
||||
export { fetchAdminOverview, fetchPermissionCatalog, fetchTenants } from "@govoplan/core-webui";
|
||||
export type {
|
||||
@@ -34,6 +34,8 @@ export type SystemSettingsItem = {
|
||||
enabled_language_codes: string[];
|
||||
settings: Record<string, unknown>;
|
||||
navigation: NavigationPreferences | null;
|
||||
appearance_palette: UserUiPalette;
|
||||
appearance_palette_locked: boolean;
|
||||
};
|
||||
|
||||
export type SystemSettingsDeltaSections = Partial<{
|
||||
@@ -44,6 +46,7 @@ export type SystemSettingsDeltaSections = Partial<{
|
||||
maintenance_mode: SystemSettingsItem["maintenance_mode"];
|
||||
settings: SystemSettingsItem["settings"];
|
||||
navigation: SystemSettingsItem["navigation"];
|
||||
appearance: Pick<SystemSettingsItem, "appearance_palette" | "appearance_palette_locked">;
|
||||
}>;
|
||||
|
||||
export type SystemSettingsUpdatePayload = {
|
||||
@@ -56,6 +59,8 @@ export type SystemSettingsUpdatePayload = {
|
||||
available_languages?: LanguagePackage[] | null;
|
||||
enabled_language_codes?: string[] | null;
|
||||
navigation?: NavigationPreferences | null;
|
||||
appearance_palette?: UserUiPalette;
|
||||
appearance_palette_locked?: boolean;
|
||||
change_request_id?: string | null;
|
||||
};
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import { Button } from "@govoplan/core-webui";
|
||||
import { Card } from "@govoplan/core-webui";
|
||||
import { FormField } from "@govoplan/core-webui";
|
||||
import { ToggleSwitch } from "@govoplan/core-webui";
|
||||
import { AppearancePalettePreview, AppearancePaletteSelect } from "@govoplan/core-webui";
|
||||
import { fetchSystemSettingsDelta, updateSystemSettings, type SystemSettingsItem } from "../../api/admin";
|
||||
import { AdminPageLayout, DocumentationHelpLink, NavigationPreferenceEditor, adminErrorMessage, configurableNavigationItemsForModules, dispatchPlatformModulesChanged, useDeltaWatermarks, usePlatformModules, useUnsavedDraftGuard } from "@govoplan/core-webui";
|
||||
import { ADMIN_GOVERNANCE_DOCUMENTATION, ADMIN_INTERFACE_I18N, mutationDisabledReason } from "./interfacePatterns";
|
||||
@@ -11,7 +12,7 @@ import { SYSTEM_SETTINGS_FALLBACK, applySystemSettingsSections } from "./systemS
|
||||
|
||||
const DELTA_KEY = "admin:system-settings";
|
||||
|
||||
export default function SystemSettingsPanel({ settings, canWrite, canAccessMaintenance }: {settings: ApiSettings;canWrite: boolean;canAccessMaintenance: boolean;}) {
|
||||
export default function SystemSettingsPanel({ settings, canWrite, canAccessMaintenance, canWritePolicy }: {settings: ApiSettings;canWrite: boolean;canAccessMaintenance: boolean;canWritePolicy: boolean;}) {
|
||||
const modules = usePlatformModules();
|
||||
const navigationItems = configurableNavigationItemsForModules(modules);
|
||||
const [draft, setDraft] = useState<SystemSettingsItem>(SYSTEM_SETTINGS_FALLBACK);
|
||||
@@ -63,7 +64,9 @@ export default function SystemSettingsPanel({ settings, canWrite, canAccessMaint
|
||||
allow_tenant_custom_roles: draft.allow_tenant_custom_roles,
|
||||
allow_tenant_api_keys: draft.allow_tenant_api_keys,
|
||||
maintenance_mode: draft.maintenance_mode,
|
||||
navigation: draft.navigation
|
||||
navigation: draft.navigation,
|
||||
appearance_palette: draft.appearance_palette,
|
||||
appearance_palette_locked: draft.appearance_palette_locked
|
||||
});
|
||||
setDraft(saved);
|
||||
setSavedDraft(saved);
|
||||
@@ -102,6 +105,24 @@ export default function SystemSettingsPanel({ settings, canWrite, canAccessMaint
|
||||
disabled={!canWrite || busy}
|
||||
/>
|
||||
</Card>
|
||||
<Card title="i18n:govoplan-admin.appearance_defaults">
|
||||
<FormField label="i18n:govoplan-admin.system_palette_default" help="i18n:govoplan-admin.system_palette_default_help">
|
||||
<AppearancePaletteSelect
|
||||
value={draft.appearance_palette}
|
||||
onChange={(appearance_palette) => setDraft({ ...draft, appearance_palette: appearance_palette ?? "default" })}
|
||||
disabled={!canWrite || busy || (draft.appearance_palette_locked && !canWritePolicy)}
|
||||
/>
|
||||
</FormField>
|
||||
<ToggleSwitch
|
||||
checked={draft.appearance_palette_locked}
|
||||
onChange={(appearance_palette_locked) => setDraft({ ...draft, appearance_palette_locked })}
|
||||
disabled={!canWrite || !canWritePolicy || busy}
|
||||
help={!canWritePolicy ? "i18n:govoplan-admin.appearance_lock_policy_permission" : undefined}
|
||||
label="i18n:govoplan-admin.lock_system_palette"
|
||||
/>
|
||||
<AppearancePalettePreview palette={draft.appearance_palette} />
|
||||
<p className="muted small-note">i18n:govoplan-admin.system_palette_precedence_help</p>
|
||||
</Card>
|
||||
<Card title="i18n:govoplan-admin.maintenance_mode.98cca5c6">
|
||||
<div className="settings-list">
|
||||
<ToggleSwitch
|
||||
@@ -133,6 +154,8 @@ function systemSettingsDraftKey(item: SystemSettingsItem): string {
|
||||
allow_tenant_custom_roles: item.allow_tenant_custom_roles,
|
||||
allow_tenant_api_keys: item.allow_tenant_api_keys,
|
||||
maintenance_mode: item.maintenance_mode,
|
||||
navigation: item.navigation
|
||||
navigation: item.navigation,
|
||||
appearance_palette: item.appearance_palette,
|
||||
appearance_palette_locked: item.appearance_palette_locked
|
||||
});
|
||||
}
|
||||
|
||||
@@ -39,7 +39,9 @@ export const SYSTEM_SETTINGS_FALLBACK: SystemSettingsItem = {
|
||||
],
|
||||
enabled_language_codes: ["de", "en"],
|
||||
settings: {},
|
||||
navigation: null
|
||||
navigation: null,
|
||||
appearance_palette: "default",
|
||||
appearance_palette_locked: false
|
||||
};
|
||||
|
||||
export function applySystemSettingsSections(
|
||||
@@ -56,6 +58,7 @@ export function applySystemSettingsSections(
|
||||
: {}),
|
||||
...(sections.maintenance_mode ? { maintenance_mode: sections.maintenance_mode } : {}),
|
||||
...(sections.navigation !== undefined ? { navigation: sections.navigation } : {}),
|
||||
...(sections.appearance ?? {}),
|
||||
...(sections.settings ? { settings: sections.settings } : {})
|
||||
};
|
||||
}
|
||||
|
||||
@@ -2,6 +2,12 @@ import type { PlatformTranslations } from "@govoplan/core-webui";
|
||||
|
||||
export const generatedTranslations: PlatformTranslations = {
|
||||
"en": {
|
||||
"i18n:govoplan-admin.appearance_defaults": "Appearance defaults",
|
||||
"i18n:govoplan-admin.system_palette_default": "System palette default",
|
||||
"i18n:govoplan-admin.system_palette_default_help": "Validated default inherited by tenants and users without an explicit child choice.",
|
||||
"i18n:govoplan-admin.appearance_lock_policy_permission": "Policy-write permission is required to change this lock.",
|
||||
"i18n:govoplan-admin.lock_system_palette": "Lock the system palette",
|
||||
"i18n:govoplan-admin.system_palette_precedence_help": "A system lock suppresses tenant and personal palette choices. Without a lock, explicit child choices take precedence.",
|
||||
"i18n:govoplan-admin.data_subject_requests.ds001": "Data-subject requests",
|
||||
"i18n:govoplan-admin.data_subject_requests.ds002": "Search, export, and govern erasure requests with explicit provider coverage and retained evidence.",
|
||||
"i18n:govoplan-admin.data_subject_requests.ds003": "Create request",
|
||||
@@ -529,6 +535,12 @@ export const generatedTranslations: PlatformTranslations = {
|
||||
"i18n:govoplan-admin.working.049ac820": "Working..."
|
||||
},
|
||||
"de": {
|
||||
"i18n:govoplan-admin.appearance_defaults": "Darstellungsstandards",
|
||||
"i18n:govoplan-admin.system_palette_default": "Systemstandard für die Farbpalette",
|
||||
"i18n:govoplan-admin.system_palette_default_help": "Geprüfter Standard für Mandanten und Benutzer ohne eigene Auswahl.",
|
||||
"i18n:govoplan-admin.appearance_lock_policy_permission": "Zum Ändern dieser Sperre ist das Recht zum Bearbeiten von Richtlinien erforderlich.",
|
||||
"i18n:govoplan-admin.lock_system_palette": "Systempalette verbindlich festlegen",
|
||||
"i18n:govoplan-admin.system_palette_precedence_help": "Eine Systemsperre unterdrückt Mandanten- und Benutzerauswahlen. Ohne Sperre haben ausdrückliche untergeordnete Auswahlen Vorrang.",
|
||||
"i18n:govoplan-admin.data_subject_requests.ds001": "Betroffenenanfragen",
|
||||
"i18n:govoplan-admin.data_subject_requests.ds002": "Auskunfts- und Löschanfragen mit expliziter Anbieterabdeckung und Aufbewahrungsnachweisen suchen, exportieren und steuern.",
|
||||
"i18n:govoplan-admin.data_subject_requests.ds003": "Anfrage anlegen",
|
||||
|
||||
+2
-1
@@ -48,7 +48,8 @@ const adminSections: AdminSectionsUiCapability = {
|
||||
render: ({ settings, auth }) => createElement(SystemSettingsPanel, {
|
||||
settings,
|
||||
canWrite: hasScope(auth, "system:settings:write"),
|
||||
canAccessMaintenance: hasScope(auth, "system:maintenance:access")
|
||||
canAccessMaintenance: hasScope(auth, "system:maintenance:access"),
|
||||
canWritePolicy: hasScope(auth, "admin:policies:write")
|
||||
})
|
||||
},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user