From 81dc5b3bf4048390d83d7573662433f9955caefc Mon Sep 17 00:00:00 2001 From: mlogclub Date: Thu, 25 Jun 2026 21:45:32 +0800 Subject: [PATCH] feat: enhance workflow run detail display with compact layout and improved styling --- .../_components/workflow-run-audit-graph.tsx | 46 ++++++++++++------- web/app/dashboard/ai-workflow-runs/page.tsx | 34 ++++++++------ 2 files changed, 50 insertions(+), 30 deletions(-) diff --git a/web/app/dashboard/ai-workflow-runs/_components/workflow-run-audit-graph.tsx b/web/app/dashboard/ai-workflow-runs/_components/workflow-run-audit-graph.tsx index 2a8d203..757cd94 100644 --- a/web/app/dashboard/ai-workflow-runs/_components/workflow-run-audit-graph.tsx +++ b/web/app/dashboard/ai-workflow-runs/_components/workflow-run-audit-graph.tsx @@ -80,8 +80,8 @@ const auditEdgeTypes = { } const fitViewOptions = { - padding: 0.18, - minZoom: 0.45, + padding: 0.12, + minZoom: 0.32, maxZoom: 1, } @@ -92,6 +92,11 @@ const defaultEdgeOptions = { }, } +const auditLayoutScale = { + x: 1.35, + y: 1.15, +} + export function WorkflowRunAuditGraph({ run }: { run: AIWorkflowRun }) { const nodeRuns = run.nodes ?? [] const nodeRunByNodeId = useMemo(() => { @@ -111,7 +116,7 @@ export function WorkflowRunAuditGraph({ run }: { run: AIWorkflowRun }) { return { id: node.id, type: "auditNode", - position: node.position ?? { x: 0, y: 0 }, + position: scaleAuditPosition(node.position), data: { nodeId: node.id, nodeType: node.type, @@ -150,8 +155,8 @@ export function WorkflowRunAuditGraph({ run }: { run: AIWorkflowRun }) { } return ( -
-
+
+
) { if (condition) { return ( -
+
-
- -
{data.name}
+
+ +
{data.name}
{data.statusName || "未执行"}
@@ -264,22 +269,22 @@ function AuditCanvasNode({ data }: NodeProps) { return (
-
-
- {failed ? : } +
+
+ {failed ? : }
-
{data.name}
+
{data.name}
{data.nodeType}
-
+
{data.statusName || "未执行"} {executed ? ( @@ -305,7 +310,7 @@ function AuditSidePanel({ const branchDecision = extractBranchDecision(outputValue) return ( - +
@@ -354,6 +359,13 @@ function AuditMeta({ label, value }: { label: string; value: string }) { ) } +function scaleAuditPosition(position: AIWorkflowDefinition["nodes"][number]["position"] | undefined) { + return { + x: Math.round((position?.x ?? 0) * auditLayoutScale.x), + y: Math.round((position?.y ?? 0) * auditLayoutScale.y), + } +} + function BranchDecisionBlock({ decision }: { decision: BranchDecision }) { return (
diff --git a/web/app/dashboard/ai-workflow-runs/page.tsx b/web/app/dashboard/ai-workflow-runs/page.tsx index 77bd30c..5a4418e 100644 --- a/web/app/dashboard/ai-workflow-runs/page.tsx +++ b/web/app/dashboard/ai-workflow-runs/page.tsx @@ -380,30 +380,29 @@ function WorkflowRunDetailDialog({ {loading ? (
{t("workflowRun.loadingDetail")}
) : run ? ( -
-
- - - - - +
+ + + + + void onOpenConversation(run.conversationId)} > #{run.conversationId} } /> - - - - - + + + + {run.interruptNodeId ? : null}
{run.errorMessage ? (
@@ -502,6 +501,15 @@ function DetailRow({ label, value }: { label: string; value: ReactNode }) { ) } +function CompactRunMeta({ label, value }: { label: string; value: ReactNode }) { + return ( + + {label} + {value || "-"} + + ) +} + function safeParseJSON(raw: string): unknown | null { const trimmed = raw.trim() if (!trimmed) {