feat(tenancy): add tenant navigation overrides
This commit is contained in:
@@ -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 } : {})
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user