feat(tenancy): add tenant navigation overrides

This commit is contained in:
2026-08-20 01:47:04 +02:00
parent c51ea3f66c
commit 56f0661a10
5 changed files with 56 additions and 8 deletions
+4
View File
@@ -1,6 +1,7 @@
import type {
ApiSettings,
DeltaDeletedItem,
NavigationPreferences,
PrivacyRetentionPolicy,
TenantAdminItem
} from "@govoplan/core-webui";
@@ -41,6 +42,7 @@ export type TenantSettingsItem = {
available_languages: LanguagePackage[];
system_enabled_language_codes: string[];
enabled_language_codes: string[];
navigation?: NavigationPreferences | null;
settings: Record<string, unknown>;
};
@@ -51,6 +53,7 @@ export type TenantSettingsDeltaSections = Partial<{
TenantSettingsItem,
"available_languages" | "system_enabled_language_codes" | "enabled_language_codes"
>;
navigation: TenantSettingsItem["navigation"];
settings: TenantSettingsItem["settings"];
}>;
@@ -147,6 +150,7 @@ export function updateTenantSettings(
payload: {
default_locale: string;
enabled_language_codes?: string[] | null;
navigation?: NavigationPreferences | null;
}
): Promise<TenantSettingsItem> {
return apiFetch(settings, "/api/v1/admin/tenant/settings", {
@@ -1,4 +1,10 @@
import { DescriptionList } from "@govoplan/core-webui";
import {
DescriptionList,
NavigationPreferenceEditor,
configurableNavigationItemsForModules,
dispatchPlatformModulesChanged,
usePlatformModules
} from "@govoplan/core-webui";
import { useEffect, useState } from "react";
import {
ActionBlockerHint,
@@ -35,6 +41,7 @@ const fallback: TenantSettingsItem = {
],
system_enabled_language_codes: ["de", "en"],
enabled_language_codes: ["de", "en"],
navigation: null,
settings: {}
};
@@ -48,6 +55,8 @@ export default function TenantSettingsPanel({
}: {settings: ApiSettings;canWrite: boolean;onAuthRefresh: () => Promise<void>;}) {
const { requestDiscard } = useUnsavedChanges();
const { modules } = usePlatformModules();
const navigationItems = configurableNavigationItemsForModules(modules);
const [draft, setDraft] = useState<TenantSettingsItem>(fallback);
const [savedDraft, setSavedDraft] = useState<TenantSettingsItem>(fallback);
const [loading, setLoading] = useState(true);
@@ -103,10 +112,15 @@ export default function TenantSettingsPanel({
setError("");
setSuccess("");
try {
const saved = await updateTenantSettings(settings, { default_locale: draft.default_locale, enabled_language_codes: draft.enabled_language_codes });
const saved = await updateTenantSettings(settings, {
default_locale: draft.default_locale,
enabled_language_codes: draft.enabled_language_codes,
navigation: draft.navigation
});
setDraft(saved);
setSavedDraft(saved);
resetDeltaWatermark(DELTA_KEY);
dispatchPlatformModulesChanged();
setSuccess("i18n:govoplan-tenancy.tenant_general_settings_saved.485e7681");
await onAuthRefresh();
return true;
@@ -174,6 +188,15 @@ export default function TenantSettingsPanel({
<div><dt>i18n:govoplan-tenancy.available.7c62a142</dt><dd>{draft.available_languages.map((item) => item.code.toUpperCase()).join(", ") || "-"}</dd></div>
</DescriptionList>
</Card>
<Card title="Tenant navigation order">
<NavigationPreferenceEditor
items={navigationItems}
value={draft.navigation}
scope="tenant"
disabled={!canWrite || busy}
onChange={(navigation) => setDraft({ ...draft, navigation })}
/>
</Card>
</div>
</AdminPageLayout>);
@@ -190,7 +213,8 @@ function localeOptions(current: string, enabled: string[]): string[] {
function tenantSettingsDraftKey(item: TenantSettingsItem): string {
return JSON.stringify({
default_locale: item.default_locale,
enabled_language_codes: item.enabled_language_codes
enabled_language_codes: item.enabled_language_codes,
navigation: item.navigation
});
}
@@ -200,6 +224,7 @@ function applyTenantSettingsSections(item: TenantSettingsItem, sections: TenantS
...(sections.identity ?? {}),
...(sections.locale ?? {}),
...(sections.languages ?? {}),
...(sections.navigation !== undefined ? { navigation: sections.navigation } : {}),
...(sections.settings ? { settings: sections.settings } : {})
};
}