From 0d568ebf87324d8743a65d702295f4b30489b4d2 Mon Sep 17 00:00:00 2001 From: mlogclub Date: Sat, 27 Jun 2026 22:40:27 +0800 Subject: [PATCH] feat: refactor workflow configuration components for improved structure and usability --- .../_components/config-workbench.tsx | 6 +- .../_components/node-config-panel.tsx | 42 +++++----- .../_components/workflow-config-sidebar.tsx | 79 ++++++++++--------- .../_components/workflow-editor.tsx | 34 ++++---- 4 files changed, 87 insertions(+), 74 deletions(-) diff --git a/web/app/dashboard/ai-agents/_components/config-workbench.tsx b/web/app/dashboard/ai-agents/_components/config-workbench.tsx index 0de1190..08dc8a1 100644 --- a/web/app/dashboard/ai-agents/_components/config-workbench.tsx +++ b/web/app/dashboard/ai-agents/_components/config-workbench.tsx @@ -591,7 +591,11 @@ export function AIAgentConfigWorkbench({ -
+
{loading ? (
加载中... diff --git a/web/app/dashboard/ai-workflows/_components/node-config-panel.tsx b/web/app/dashboard/ai-workflows/_components/node-config-panel.tsx index 523f7c1..d67346c 100644 --- a/web/app/dashboard/ai-workflows/_components/node-config-panel.tsx +++ b/web/app/dashboard/ai-workflows/_components/node-config-panel.tsx @@ -31,6 +31,7 @@ export function NodeConfigPanel({ nodeSpec, nodes, availableVariables, + showHeader = true, onChange, onDelete, }: { @@ -39,6 +40,7 @@ export function NodeConfigPanel({ nodes: AIWorkflowDefinition["nodes"] availableVariables?: WorkflowVariableRef[] branchSummaries?: WorkflowBranchSummary[] + showHeader?: boolean onChange: (nodeId: string, data: AIWorkflowDefinition["nodes"][number]["data"]) => void onDelete?: (nodeId: string) => void }) { @@ -104,26 +106,30 @@ export function NodeConfigPanel({ return (
-
-
-
-
{node.data?.title || nodeSpec?.title || node.type}
-
{node.id}
+ {showHeader ? ( +
+
+
+
+ {node.data?.title || nodeSpec?.title || node.type} +
+
{node.id}
+
+ {canDelete ? ( + + ) : null}
- {canDelete ? ( - - ) : null}
-
+ ) : null}
diff --git a/web/app/dashboard/ai-workflows/_components/workflow-config-sidebar.tsx b/web/app/dashboard/ai-workflows/_components/workflow-config-sidebar.tsx index 9994b9a..56be20d 100644 --- a/web/app/dashboard/ai-workflows/_components/workflow-config-sidebar.tsx +++ b/web/app/dashboard/ai-workflows/_components/workflow-config-sidebar.tsx @@ -1,27 +1,28 @@ "use client" +import { XIcon } from "lucide-react" + +import { Button } from "@/components/ui/button" import type { AIWorkflowDefinition, AIWorkflowNodeSpec } from "@/lib/api/admin" -import { cn } from "@/lib/utils" import { NodeConfigPanel } from "./node-config-panel" import { getAvailableVariables, - getNodeTitle, type WorkflowNodeData, } from "./workflow-utils" -export function WorkflowConfigSidebar({ +export function WorkflowConfigPanel({ definition, nodeSpecs, selectedNodeId, - onSelectNode, + onClose, onChangeNodeData, onDeleteNode, }: { definition: AIWorkflowDefinition nodeSpecs: AIWorkflowNodeSpec[] selectedNodeId: string - onSelectNode: (nodeId: string) => void + onClose: () => void onChangeNodeData: (nodeId: string, data: WorkflowNodeData) => void onDeleteNode: (nodeId: string) => void }) { @@ -33,39 +34,43 @@ export function WorkflowConfigSidebar({ ? getAvailableVariables(definition, selectedNode.id, nodeSpecs) : [] + if (!selectedNode) { + return null + } + return ( - +
+ +
+ +
) } diff --git a/web/app/dashboard/ai-workflows/_components/workflow-editor.tsx b/web/app/dashboard/ai-workflows/_components/workflow-editor.tsx index b946982..fa6eb55 100644 --- a/web/app/dashboard/ai-workflows/_components/workflow-editor.tsx +++ b/web/app/dashboard/ai-workflows/_components/workflow-editor.tsx @@ -16,7 +16,7 @@ import { import type { AIWorkflowDefinition, AIWorkflowNodeSpec } from "@/lib/api/admin" import { useFlowgramEditorProps } from "./flowgram-editor-provider" -import { WorkflowConfigSidebar } from "./workflow-config-sidebar" +import { WorkflowConfigPanel } from "./workflow-config-sidebar" import { WorkflowEditorToolbar } from "./workflow-editor-toolbar" import { WorkflowNodePalette } from "./workflow-node-palette" import { @@ -63,7 +63,7 @@ export function WorkflowEditor({ toolbarExtra?: ReactNode }) { const [localDefinition, setLocalDefinition] = useState(definition) - const [selectedNodeId, setSelectedNodeId] = useState(definition.nodes[0]?.id ?? "") + const [selectedNodeId, setSelectedNodeId] = useState("") const validation = useMemo( () => validateWorkflowDefinition(localDefinition, nodeSpecs), @@ -157,9 +157,7 @@ function WorkflowEditorInner({ useEffect(() => { const disposable = selectService.onSelectionChanged(() => { const selectedNode = selectService.selectedNodes[0] - if (selectedNode) { - onSelectNode(selectedNode.id) - } + onSelectNode(selectedNode?.id ?? "") }) return () => disposable.dispose() }, [onSelectNode, selectService]) @@ -180,14 +178,6 @@ function WorkflowEditorInner({ emitCurrentDefinition() } - const selectNode = (nodeId: string) => { - const node = workflowDocument.getAllNodes().find((item) => item.id === nodeId) - if (node) { - selectService.selectNodeAndFocus(node) - } - onSelectNode(nodeId) - } - const updateNodeData = (nodeId: string, data: WorkflowNodeData) => { const next = updateWorkflowNodeData(definition, nodeId, data) context.operation.fromJSON(next as WorkflowJSON) @@ -202,11 +192,19 @@ function WorkflowEditorInner({ onDefinitionChange(context.document.toJSON() as AIWorkflowDefinition) } + const closeConfigPanel = () => { + selectService.clear() + onSelectNode("") + } + return ( -
+
-
+
-
+
-