From 78b5440ca38023f3861f8aba4f193fc120cd6d63 Mon Sep 17 00:00:00 2001 From: mlogclub Date: Mon, 22 Jun 2026 23:02:19 +0800 Subject: [PATCH] Animate workflow editor side panels --- .../_components/workflow-editor.tsx | 68 +++++++++++++++---- 1 file changed, 55 insertions(+), 13 deletions(-) diff --git a/web/app/dashboard/ai-workflows/_components/workflow-editor.tsx b/web/app/dashboard/ai-workflows/_components/workflow-editor.tsx index 7797a5f..9ce9237 100644 --- a/web/app/dashboard/ai-workflows/_components/workflow-editor.tsx +++ b/web/app/dashboard/ai-workflows/_components/workflow-editor.tsx @@ -165,7 +165,11 @@ export function WorkflowEditor({ const [flowInstance, setFlowInstance] = useState | null>(null) const [selectedNodeId, setSelectedNodeId] = useState(null) const [nodeLibraryCollapsed, setNodeLibraryCollapsed] = useState(false) + const [nodeLibraryRendered, setNodeLibraryRendered] = useState(true) + const [nodeLibraryVisible, setNodeLibraryVisible] = useState(true) const [pendingNodeDrag, setPendingNodeDrag] = useState(null) + const [propertyPanelNode, setPropertyPanelNode] = useState(null) + const [propertyPanelVisible, setPropertyPanelVisible] = useState(false) const canvasRef = useRef(null) const pendingNodeDragRef = useRef(null) const suppressNextClickRef = useRef(false) @@ -182,13 +186,13 @@ export function WorkflowEditor({ () => enrichNodesForRender(nodes, nodeSpecs), [nodes, nodeSpecs] ) - const selectedNodeSpec = useMemo( - () => getNodeSpec(nodeSpecs, selectedNode?.data.nodeType ?? ""), - [nodeSpecs, selectedNode] + const propertyPanelNodeSpec = useMemo( + () => getNodeSpec(nodeSpecs, propertyPanelNode?.data.nodeType ?? ""), + [nodeSpecs, propertyPanelNode] ) - const availableVariables = useMemo( - () => (selectedNode ? getAvailableVariables(draft, selectedNode.id, nodeSpecs) : []), - [draft, nodeSpecs, selectedNode] + const propertyPanelAvailableVariables = useMemo( + () => (propertyPanelNode ? getAvailableVariables(draft, propertyPanelNode.id, nodeSpecs) : []), + [draft, nodeSpecs, propertyPanelNode] ) useEffect(() => { @@ -199,6 +203,30 @@ export function WorkflowEditor({ onDefinitionChange(toApiDefinition(draft) as AIWorkflowDefinition) }, [draft, onDefinitionChange]) + useEffect(() => { + if (!nodeLibraryCollapsed) { + setNodeLibraryRendered(true) + window.setTimeout(() => setNodeLibraryVisible(true), 0) + return + } + + setNodeLibraryVisible(false) + const timer = window.setTimeout(() => setNodeLibraryRendered(false), 220) + return () => window.clearTimeout(timer) + }, [nodeLibraryCollapsed]) + + useEffect(() => { + if (selectedNode) { + setPropertyPanelNode(selectedNode) + window.setTimeout(() => setPropertyPanelVisible(true), 0) + return + } + + setPropertyPanelVisible(false) + const timer = window.setTimeout(() => setPropertyPanelNode(null), 220) + return () => window.clearTimeout(timer) + }, [selectedNode]) + const onConnect = useCallback( (connection: Connection) => { if (!connection.source || !connection.target) { @@ -338,10 +366,17 @@ export function WorkflowEditor({ return ( - {!nodeLibraryCollapsed ? ( + {nodeLibraryRendered ? ( <> -