From 6a98e3db7acd01968d92a2844853a8d6687a4ea3 Mon Sep 17 00:00:00 2001 From: ZacharyZcR Date: Wed, 13 May 2026 16:19:59 +0800 Subject: [PATCH] feat: implement clone host functionality --- src/ui/sidebar/HostManager.tsx | 45 +++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/src/ui/sidebar/HostManager.tsx b/src/ui/sidebar/HostManager.tsx index a50d2925..1ced04e5 100644 --- a/src/ui/sidebar/HostManager.tsx +++ b/src/ui/sidebar/HostManager.tsx @@ -336,6 +336,7 @@ function HostRow({ onToggleSelect, onEdit, onDelete, + onClone, onDragStart, onDragEnd, depth = 0, @@ -349,6 +350,7 @@ function HostRow({ onToggleSelect: () => void; onEdit: () => void; onDelete: () => void; + onClone: () => void; onDragStart?: () => void; onDragEnd?: () => void; depth?: number; @@ -649,9 +651,7 @@ function HostRow({ - toast.success(t("hosts.hostCloned"))} - > + onClone()}> {t("hosts.cloneHostAction")} @@ -5442,6 +5442,19 @@ export function HostManager({ }, }); }} + onClone={async () => { + try { + const cloned = await createSSHHost({ + ...host, + name: `${host.name || host.ip} (Copy)`, + pin: false, + } as any); + setHosts((prev) => [...prev, cloned]); + toast.success(`Cloned ${host.name}`); + } catch { + toast.error("Failed to clone host"); + } + }} onDragStart={() => setDraggedHost(host)} onDragEnd={() => setDraggedHost(null)} /> @@ -5892,6 +5905,19 @@ export function HostManager({ }, }); }} + onClone={async () => { + try { + const cloned = await createSSHHost({ + ...host, + name: `${host.name || host.ip} (Copy)`, + pin: false, + } as any); + setHosts((prev) => [...prev, cloned]); + toast.success(`Cloned ${host.name}`); + } catch { + toast.error("Failed to clone host"); + } + }} /> ))} @@ -5943,6 +5969,19 @@ export function HostManager({ }, }); }} + onClone={async () => { + try { + const cloned = await createSSHHost({ + ...host, + name: `${host.name || host.ip} (Copy)`, + pin: false, + } as any); + setHosts((prev) => [...prev, cloned]); + toast.success(`Cloned ${host.name}`); + } catch { + toast.error("Failed to clone host"); + } + }} onDragStart={() => setDraggedHost(host)} onDragEnd={() => setDraggedHost(null)} />