From dcc901b0d2095c0f2a67330dd8d239e4943144e1 Mon Sep 17 00:00:00 2001 From: mrhid6 Date: Mon, 20 Jul 2026 14:52:13 +0100 Subject: [PATCH] feat(web): workflow runs list page and navigation links --- web/app/workflows/[id]/runs/page.tsx | 78 ++++++++++++++++++++++++++++ web/app/workflows/page.tsx | 11 ++-- 2 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 web/app/workflows/[id]/runs/page.tsx diff --git a/web/app/workflows/[id]/runs/page.tsx b/web/app/workflows/[id]/runs/page.tsx new file mode 100644 index 0000000..ce32ed2 --- /dev/null +++ b/web/app/workflows/[id]/runs/page.tsx @@ -0,0 +1,78 @@ +"use client"; + +import Link from "next/link"; +import { useParams } from "next/navigation"; +import { useQuery } from "@tanstack/react-query"; +import { api, WorkflowRun } from "@/lib/api"; +import { Card, Table, Thead, Tbody, Tr, Th, Td, Badge } from "@/components/ui"; + +type BadgeVariant = "success" | "warning" | "danger" | "neutral" | "accent"; + +const statusVariant: Record = { + success: "success", + failed: "danger", + running: "warning", + cancelled: "neutral", + queued: "neutral", +}; + +export default function WorkflowRunsPage() { + const { id } = useParams<{ id: string }>(); + const { data: wf } = useQuery({ queryKey: ["workflow", id], queryFn: () => api.getWorkflow(id) }); + const { data: runs, isLoading, error } = useQuery({ queryKey: ["runs", id], queryFn: () => api.listRuns(id) }); + + return ( +
+
+ + โ† Back to builder + +

Runs ยท {wf?.name ?? ""}

+
+ + + {isLoading ? ( +
+
+
+ ) : error ? ( +
Failed to load runs. Is the backend running?
+ ) : runs && runs.length > 0 ? ( + + + + + + + + + + + + {runs.map((r: WorkflowRun) => ( + + + + + + + + ))} + +
RunStatusStartedByServers
+ + {r.run_id.slice(0, 8)} + + + {r.status} + {new Date(r.started_at).toLocaleString()}{r.triggered_by}{r.server_runs.length}
+ ) : ( +
No runs yet.
+ )} + +
+ ); +} diff --git a/web/app/workflows/page.tsx b/web/app/workflows/page.tsx index d93d55a..957f2c0 100644 --- a/web/app/workflows/page.tsx +++ b/web/app/workflows/page.tsx @@ -82,9 +82,14 @@ export default function WorkflowsPage() { {w.steps.length} - - - +
+ + + + + + +
))}