From 2ca5d203209cbd4b1912d763de99ddb933ff3841 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Sat, 7 Feb 2026 17:00:59 -0600 Subject: [PATCH] highlight label of changed fields --- .../CameraReviewClassification.tsx | 37 ++++- .../config-form/sections/BaseSection.tsx | 113 ++++++++++++--- .../theme/fields/LayoutGridField.tsx | 50 +++++-- .../theme/templates/FieldTemplate.tsx | 41 +++++- .../theme/templates/ObjectFieldTemplate.tsx | 137 +++++++++++++++++- .../config-form/theme/utils/index.ts | 7 + .../config-form/theme/utils/overrides.ts | 128 ++++++++++++++++ web/src/lib/config-schema/transformer.ts | 29 +++- web/src/types/configForm.ts | 3 + 9 files changed, 494 insertions(+), 51 deletions(-) create mode 100644 web/src/components/config-form/theme/utils/overrides.ts diff --git a/web/src/components/config-form/sectionExtras/CameraReviewClassification.tsx b/web/src/components/config-form/sectionExtras/CameraReviewClassification.tsx index f716ef39c..ffe9b19b2 100644 --- a/web/src/components/config-form/sectionExtras/CameraReviewClassification.tsx +++ b/web/src/components/config-form/sectionExtras/CameraReviewClassification.tsx @@ -3,6 +3,7 @@ import { Link } from "react-router-dom"; import { Trans, useTranslation } from "react-i18next"; import cloneDeep from "lodash/cloneDeep"; import get from "lodash/get"; +import isEqual from "lodash/isEqual"; import set from "lodash/set"; import { LuExternalLink } from "react-icons/lu"; import { MdCircle } from "react-icons/md"; @@ -36,6 +37,9 @@ export default function CameraReviewClassification({ const { getLocaleDocUrl } = useDocDomain(); const cameraName = formContext?.cameraName ?? selectedCamera; const fullFormData = formContext?.formData as JsonObject | undefined; + const baselineFormData = formContext?.baselineFormData as + | JsonObject + | undefined; const cameraConfig = formContext?.fullCameraConfig; const alertsZones = useMemo( @@ -47,6 +51,25 @@ export default function CameraReviewClassification({ [fullFormData], ); + // Track whether zones have been modified from baseline for label coloring + const alertsZonesModified = useMemo(() => { + if (!baselineFormData) return false; + const baseline = getRequiredZones( + baselineFormData, + "alerts.required_zones", + ); + return !isEqual(alertsZones, baseline); + }, [alertsZones, baselineFormData]); + + const detectionsZonesModified = useMemo(() => { + if (!baselineFormData) return false; + const baseline = getRequiredZones( + baselineFormData, + "detections.required_zones", + ); + return !isEqual(detectionsZones, baseline); + }, [detectionsZones, baselineFormData]); + const [selectDetections, setSelectDetections] = useState( detectionsZones.length > 0, ); @@ -192,7 +215,12 @@ export default function CameraReviewClassification({ {zones && zones.length > 0 ? ( <>
-