diff --git a/web/src/components/settings/CloneCameraDialog.tsx b/web/src/components/settings/CloneCameraDialog.tsx index a928f3d735..61458211b8 100644 --- a/web/src/components/settings/CloneCameraDialog.tsx +++ b/web/src/components/settings/CloneCameraDialog.tsx @@ -51,7 +51,7 @@ import { PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; -import { LuChevronDown, LuTriangleAlert } from "react-icons/lu"; +import { LuArrowRight, LuChevronDown, LuTriangleAlert } from "react-icons/lu"; import { CLONE_CATEGORIES, type CloneCategoryKey, @@ -578,255 +578,270 @@ export default function CloneCameraDialog({
-
- - ( - - - - - - - )} - /> -
- -
- - ( - - - -
-
- +
+ + ( + + + + + {sourceCameras.map((cam) => ( + + {config?.cameras?.[cam]?.friendly_name ?? cam} + + ))} + + + + + + )} + /> +
+ +
+ + ( + + + +
+
+ + +
+ {targetMode === "new" && ( + + + {t( + "cameraManagement.clone.target.newNameLabel", )} - disabled={isSubmitting} - autoFocus - /> - - {form.formState.errors.newName?.message && ( -

- {String( - form.formState.errors.newName.message, + + + + + {form.formState.errors.newName?.message && ( +

+ {String( + form.formState.errors.newName.message, + )} +

+ )} +

+ {t( + "cameraManagement.clone.target.newStreamsForced", )}

- )} -

- {t( - "cameraManagement.clone.target.newStreamsForced", - )} -

-
- )} -
-
-
- - + + )}
- {targetMode === "existing" && - otherCameras.length > 0 && ( - { - const selected = tgtField.value ?? []; - const allSelected = - otherCameras.length > 0 && - otherCameras.every((c) => - selected.includes(c), - ); - const selectedNames = otherCameras - .filter((c) => selected.includes(c)) - .map( - (c) => - config?.cameras?.[c]?.friendly_name ?? - c, - ); - const summary = allSelected - ? t( - "cameraManagement.clone.target.allCameras", - ) - : selectedNames.length > 0 - ? selectedNames.join(", ") - : t( - "cameraManagement.clone.target.existingPlaceholder", - ); - return ( - - - - - - - - -
- - tgtField.onChange( - checked - ? [...otherCameras] - : [], - ) - } - /> -
- {otherCameras.map((cam) => ( + + {summary} + + + + + + +
tgtField.onChange( checked - ? [...selected, cam] - : selected.filter( - (c) => c !== cam, - ), + ? [...otherCameras] + : [], ) } /> - ))} -
-
- - - - ); - }} - /> - )} -
- - - - )} - /> +
+ {otherCameras.map((cam) => ( + + tgtField.onChange( + checked + ? [...selected, cam] + : selected.filter( + (c) => c !== cam, + ), + ) + } + /> + ))} +
+
+
+
+ +
+ ); + }} + /> + )} +
+
+
+
+ )} + /> +
+ +
+ +
+ +
+
-
+
-
+
{t("cameraManagement.clone.categories.selectAll")} {t("cameraManagement.clone.categories.selectNone")} @@ -856,7 +871,7 @@ export default function CloneCameraDialog({ -
+
{groupedCategories.general.map((cat) => (