feat: manage system appearance defaults

This commit is contained in:
2026-08-20 07:03:28 +02:00
parent 89ba59fcea
commit 50c952565b
8 changed files with 88 additions and 7 deletions
@@ -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 } : {})
};
}