diff --git a/web/public/locales/en/views/settings.json b/web/public/locales/en/views/settings.json index 38662e261e..812b3432f7 100644 --- a/web/public/locales/en/views/settings.json +++ b/web/public/locales/en/views/settings.json @@ -566,6 +566,7 @@ "categories": { "legend": "What to copy", "selectAll": "Select all", + "selectNone": "Select none", "resetDefaults": "Reset to defaults", "general": "General", "spatial": "Spatial settings", @@ -576,9 +577,9 @@ "items": { "record": "Recording", "snapshots": "Snapshots", - "review": "Review (alerts & detections)", + "review": "Review (alerts and detections)", "motion": "Motion sensitivity", - "objects": "Detection objects & filters", + "objects": "Detected objects and filters", "audio": "Audio detection", "audio_transcription": "Audio transcription", "notifications": "Notifications", @@ -594,7 +595,7 @@ "profiles": "Profiles", "detect": "Detect dimensions", "zones": "Zones", - "motion_mask": "Motion mask", + "motion_mask": "Motion masks", "object_masks": "Object masks", "ffmpeg_live": "Stream URLs and roles" } diff --git a/web/src/components/settings/CloneCameraDialog.tsx b/web/src/components/settings/CloneCameraDialog.tsx index 8c981f39a0..b9e5c6ebc8 100644 --- a/web/src/components/settings/CloneCameraDialog.tsx +++ b/web/src/components/settings/CloneCameraDialog.tsx @@ -188,6 +188,32 @@ export default function CloneCameraDialog({ }); }, []); + const selectAllCategories = useCallback(() => { + setSelectedCategories((prev) => { + const next = new Set(prev); + const includeSpatial = targetIsNew || resMatch; + for (const cat of CLONE_CATEGORIES) { + if (cat.newCameraOnly && !targetIsNew) continue; + if (cat.group === "spatial" && !includeSpatial) continue; + if (cat.group === "streams") continue; + next.add(cat.key); + } + return next; + }); + }, [targetIsNew, resMatch]); + + const selectNoneCategories = useCallback(() => { + setSelectedCategories((prev) => { + const next = new Set(); + for (const cat of CLONE_CATEGORIES) { + if (cat.group === "streams" && prev.has(cat.key)) { + next.add(cat.key); + } + } + return next; + }); + }, []); + const visibleCategories = useMemo( () => CLONE_CATEGORIES.filter((c) => targetIsNew || !c.newCameraOnly), [targetIsNew], @@ -533,9 +559,26 @@ export default function CloneCameraDialog({
- +
+ +
+ + {t("cameraManagement.clone.categories.selectAll")} + + + + {t("cameraManagement.clone.categories.selectNone")} + +
+