From 2cd9bc1c899afa86c203710a2b0d44baf4045a3f Mon Sep 17 00:00:00 2001 From: mrhid6 Date: Mon, 20 Jul 2026 11:50:00 +0100 Subject: [PATCH] feat(web): three-pane workflow builder --- web/app/workflows/[id]/page.tsx | 470 ++++++++++++++++++++++++++++++++ 1 file changed, 470 insertions(+) create mode 100644 web/app/workflows/[id]/page.tsx diff --git a/web/app/workflows/[id]/page.tsx b/web/app/workflows/[id]/page.tsx new file mode 100644 index 0000000..de5c2f6 --- /dev/null +++ b/web/app/workflows/[id]/page.tsx @@ -0,0 +1,470 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { useParams, useRouter } from "next/navigation"; +import { useQuery, useQueryClient } from "@tanstack/react-query"; +import { + api, + Workflow, + WorkflowStep, + WorkflowStepRef, + SecretGroupSummary, +} from "@/lib/api"; +import { Button, Card } from "@/components/ui"; + +const inputClass = + "w-full rounded-lg border border-border bg-surface-2 px-3 py-2 text-sm text-text-primary placeholder-text-secondary/50 focus:border-accent focus:outline-none focus:ring-1 focus:ring-accent"; + +function NewStepForm({ onClose }: { onClose: () => void }) { + const queryClient = useQueryClient(); + const [name, setName] = useState(""); + const [interpreter, setInterpreter] = useState<"bash" | "powershell">("bash"); + const [script, setScript] = useState(""); + const [saving, setSaving] = useState(false); + const [error, setError] = useState(null); + + const create = async () => { + setSaving(true); + setError(null); + try { + await api.createStep({ + name: name.trim(), + description: "", + interpreter, + script, + declared_outputs: [], + secret_refs: [], + }); + queryClient.invalidateQueries({ queryKey: ["steps"] }); + onClose(); + } catch (e) { + setError((e as Error).message); + } finally { + setSaving(false); + } + }; + + return ( +
+ {error &&
{error}
} + setName(e.target.value)} + /> + +