From 619ccd28cba2513726c8b44d0691956e400caa10 Mon Sep 17 00:00:00 2001 From: mrhid6 Date: Mon, 20 Jul 2026 14:44:59 +0100 Subject: [PATCH] feat(web): edit-workflow modal (name/targets/delete) --- .../workflows/EditWorkflowModal.tsx | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 web/components/workflows/EditWorkflowModal.tsx diff --git a/web/components/workflows/EditWorkflowModal.tsx b/web/components/workflows/EditWorkflowModal.tsx new file mode 100644 index 0000000..cf26b53 --- /dev/null +++ b/web/components/workflows/EditWorkflowModal.tsx @@ -0,0 +1,70 @@ +"use client"; + +import { useState } from "react"; +import { useRouter } from "next/navigation"; +import { useQuery } from "@tanstack/react-query"; +import { api, Workflow } from "@/lib/api"; +import { Button, Modal } from "@/components/ui"; + +const inputClass = + "w-full rounded-lg border border-border bg-surface-2 px-3 py-2 text-sm text-text-primary focus:border-signal focus:outline-none focus:ring-1 focus:ring-signal"; + +export function EditWorkflowModal({ open, workflow, onSaved, onClose }: { open: boolean; workflow: Workflow; onSaved: (w: Workflow) => void; onClose: () => void }) { + const router = useRouter(); + const [name, setName] = useState(workflow.name); + const [targets, setTargets] = useState(workflow.target_server_ids); + const [busy, setBusy] = useState(false); + const [error, setError] = useState(null); + const { data: servers } = useQuery({ queryKey: ["servers"], queryFn: api.listServers }); + + const toggle = (id: string) => setTargets((t) => (t.includes(id) ? t.filter((x) => x !== id) : [...t, id])); + + const save = async () => { + setBusy(true); setError(null); + try { + const updated = await api.updateWorkflow(workflow.workflow_id, { ...workflow, name, target_server_ids: targets }); + onSaved(updated); onClose(); + } catch (e) { setError((e as Error).message); } finally { setBusy(false); } + }; + + const del = async () => { + if (!window.confirm("Delete this workflow? This cannot be undone.")) return; + setBusy(true); setError(null); + try { await api.deleteWorkflow(workflow.workflow_id); router.push("/workflows"); } + catch (e) { setError((e as Error).message); setBusy(false); } + }; + + return ( + +
+ {error &&
{error}
} +
+ + setName(e.target.value)} /> +
+
+ +
+ {servers?.map((s) => { + const on = targets.includes(s.server_id); + return ( + + ); + })} + {servers && servers.length === 0 &&

No servers registered.

} +
+
+
+ +
+ + +
+
+
+
+ ); +}