diff --git a/web/src/components/config-form/sections/BaseSection.tsx b/web/src/components/config-form/sections/BaseSection.tsx index bc0eeffad..f0e7716ae 100644 --- a/web/src/components/config-form/sections/BaseSection.tsx +++ b/web/src/components/config-form/sections/BaseSection.tsx @@ -51,7 +51,7 @@ import { buildOverrides, sanitizeSectionData as sharedSanitizeSectionData, requiresRestartForOverrides as sharedRequiresRestartForOverrides, -} from "@/utils/configSaveUtil"; +} from "@/utils/configUtil"; import RestartDialog from "@/components/overlay/dialog/RestartDialog"; import { useRestart } from "@/api/ws"; diff --git a/web/src/components/config-form/sections/ConfigSectionTemplate.tsx b/web/src/components/config-form/sections/ConfigSectionTemplate.tsx index e4b560457..c3b4c1bd1 100644 --- a/web/src/components/config-form/sections/ConfigSectionTemplate.tsx +++ b/web/src/components/config-form/sections/ConfigSectionTemplate.tsx @@ -1,7 +1,7 @@ import { useMemo } from "react"; import { ConfigSection } from "./BaseSection"; import type { BaseSectionProps, SectionConfig } from "./BaseSection"; -import { getSectionConfig } from "@/utils/sectionConfigsUtils"; +import { getSectionConfig } from "@/utils/configUtil"; export type ConfigSectionTemplateProps = BaseSectionProps & { sectionKey: string; diff --git a/web/src/pages/Settings.tsx b/web/src/pages/Settings.tsx index 691c2f83d..5d2477f7b 100644 --- a/web/src/pages/Settings.tsx +++ b/web/src/pages/Settings.tsx @@ -84,7 +84,7 @@ import axios from "axios"; import { toast } from "sonner"; import { mutate } from "swr"; import { RJSFSchema } from "@rjsf/utils"; -import { prepareSectionSavePayload } from "@/utils/configSaveUtil"; +import { prepareSectionSavePayload } from "@/utils/configUtil"; import ActivityIndicator from "@/components/indicators/activity-indicator"; import RestartDialog from "@/components/overlay/dialog/RestartDialog"; import { useRestart } from "@/api/ws"; diff --git a/web/src/utils/configSaveUtil.ts b/web/src/utils/configUtil.ts similarity index 92% rename from web/src/utils/configSaveUtil.ts rename to web/src/utils/configUtil.ts index 8d9a1ffab..d7cdb85f3 100644 --- a/web/src/utils/configSaveUtil.ts +++ b/web/src/utils/configUtil.ts @@ -8,6 +8,7 @@ import get from "lodash/get"; import cloneDeep from "lodash/cloneDeep"; import unset from "lodash/unset"; import isEqual from "lodash/isEqual"; +import mergeWith from "lodash/mergeWith"; import { isJsonObject } from "@/lib/utils"; import { applySchemaDefaults } from "@/lib/config-schema"; import { normalizeConfigValue } from "@/hooks/use-config-override"; @@ -16,7 +17,6 @@ import { getEffectiveDefaultsForSection, sanitizeOverridesForSection, } from "@/components/config-form/sections/section-special-cases"; -import { getSectionConfig } from "@/utils/sectionConfigsUtils"; import type { RJSFSchema } from "@rjsf/utils"; import type { FrigateConfig } from "@/types/frigateConfig"; import type { @@ -24,6 +24,8 @@ import type { JsonObject, JsonValue, } from "@/types/configForm"; +import type { SectionConfig } from "../components/config-form/sections/BaseSection"; +import { sectionConfigs } from "../components/config-form/sectionConfigs"; // --------------------------------------------------------------------------- // cameraUpdateTopicMap — maps config section paths to MQTT/WS update topics @@ -397,3 +399,32 @@ export function prepareSectionSavePayload(opts: { pendingDataKey, }; } + +const mergeSectionConfig = ( + base: SectionConfig | undefined, + overrides: Partial | undefined, +): SectionConfig => + mergeWith({}, base ?? {}, overrides ?? {}, (objValue, srcValue, key) => { + if (Array.isArray(objValue) || Array.isArray(srcValue)) { + return srcValue ?? objValue; + } + + if (key === "uiSchema" && srcValue !== undefined) { + return srcValue; + } + + return undefined; + }); + +export function getSectionConfig( + sectionKey: string, + level: "global" | "camera", +): SectionConfig { + const entry = sectionConfigs[sectionKey]; + if (!entry) { + return {}; + } + + const overrides = level === "global" ? entry.global : entry.camera; + return mergeSectionConfig(entry.base, overrides); +} diff --git a/web/src/utils/sectionConfigsUtils.ts b/web/src/utils/sectionConfigsUtils.ts deleted file mode 100644 index 79471ca69..000000000 --- a/web/src/utils/sectionConfigsUtils.ts +++ /dev/null @@ -1,32 +0,0 @@ -import mergeWith from "lodash/mergeWith"; -import type { SectionConfig } from "../components/config-form/sections/BaseSection"; -import { sectionConfigs } from "../components/config-form/sectionConfigs"; - -const mergeSectionConfig = ( - base: SectionConfig | undefined, - overrides: Partial | undefined, -): SectionConfig => - mergeWith({}, base ?? {}, overrides ?? {}, (objValue, srcValue, key) => { - if (Array.isArray(objValue) || Array.isArray(srcValue)) { - return srcValue ?? objValue; - } - - if (key === "uiSchema" && srcValue !== undefined) { - return srcValue; - } - - return undefined; - }); - -export function getSectionConfig( - sectionKey: string, - level: "global" | "camera", -): SectionConfig { - const entry = sectionConfigs[sectionKey]; - if (!entry) { - return {}; - } - - const overrides = level === "global" ? entry.global : entry.camera; - return mergeSectionConfig(entry.base, overrides); -} diff --git a/web/src/views/settings/SingleSectionPage.tsx b/web/src/views/settings/SingleSectionPage.tsx index 5b6392fd2..2e88a9646 100644 --- a/web/src/views/settings/SingleSectionPage.tsx +++ b/web/src/views/settings/SingleSectionPage.tsx @@ -5,7 +5,7 @@ import { ConfigSectionTemplate } from "@/components/config-form/sections"; import type { PolygonType } from "@/types/canvas"; import { Badge } from "@/components/ui/badge"; import type { ConfigSectionData } from "@/types/configForm"; -import { getSectionConfig } from "@/utils/sectionConfigsUtils"; +import { getSectionConfig } from "@/utils/configUtil"; import { useDocDomain } from "@/hooks/use-doc-domain"; import { Link } from "react-router-dom"; import { LuExternalLink } from "react-icons/lu";