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 ? ( <>
-