From aaa568f9a5a92b71ecde142e6d0e0c96d379760d Mon Sep 17 00:00:00 2001 From: ZLY Date: Tue, 28 Oct 2025 16:18:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(flow):=20=E8=BF=90=E8=A1=8C=E6=97=B6?= =?UTF-8?q?=E7=A6=81=E7=94=A8=E7=BC=96=E8=BE=91=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useFlowCallbacks.ts | 1 + src/pages/flowEditor/FlowEditorMain.tsx | 57 ++++++++++++++----------- src/pages/ideContainer/index.tsx | 16 +++---- src/store/ideContainer.ts | 10 ++++- 4 files changed, 48 insertions(+), 36 deletions(-) diff --git a/src/hooks/useFlowCallbacks.ts b/src/hooks/useFlowCallbacks.ts index 94a3379..e32167f 100644 --- a/src/hooks/useFlowCallbacks.ts +++ b/src/hooks/useFlowCallbacks.ts @@ -94,6 +94,7 @@ export const useFlowCallbacks = ( }, 100); } }, [nodes, edges]); + // 边变更处理 const onEdgesChange = useCallback((changes: any) => { const newEdges = applyEdgeChanges(changes, edges); diff --git a/src/pages/flowEditor/FlowEditorMain.tsx b/src/pages/flowEditor/FlowEditorMain.tsx index 8f178cf..9a705ed 100644 --- a/src/pages/flowEditor/FlowEditorMain.tsx +++ b/src/pages/flowEditor/FlowEditorMain.tsx @@ -178,12 +178,17 @@ const FlowEditorMain: React.FC = (props) => { onContextMenu={(e) => e.preventDefault()}> ({...node, draggable: !isRunning}))} // 运行时禁用节点拖拽 edges={edges} nodeTypes={nodeTypes} edgeTypes={edgeTypes} snapToGrid={true} snapGrid={[2, 2]} + nodesConnectable={!isRunning} // 运行时禁用节点连接 + nodesDraggable={!isRunning} // 运行时禁用节点拖拽 + elementsSelectable={!isRunning} // 运行时禁用元素选择 + connectOnClick={!isRunning} // 运行时禁用点击连接 + disableKeyboardA11y={isRunning} // 运行时禁用键盘交互 onBeforeDelete={async ({ nodes }) => { // 检查是否有开始或结束节点 const hasStartOrEndNode = nodes.some(node => node.type === 'start' || node.type === 'end'); @@ -198,7 +203,7 @@ const FlowEditorMain: React.FC = (props) => { ); // 允许删除操作继续进行 - return true; + return !isRunning; // 运行时禁止删除节点 }} onNodesDelete={(deleted) => { console.log('deleted:', deleted); @@ -259,21 +264,21 @@ const FlowEditorMain: React.FC = (props) => { setIsEditModalOpen(false); }} - onNodesChange={onNodesChange} - onEdgesChange={onEdgesChange} - onConnect={onConnect} - onReconnect={onReconnect} - onDrop={onDrop} - onDragOver={onDragOver} - onNodeDrag={onNodeDrag} + onNodesChange={!isRunning ? onNodesChange : undefined} // 运行时禁用节点变更 + onEdgesChange={!isRunning ? onEdgesChange : undefined} // 运行时禁用边变更 + onConnect={!isRunning ? onConnect : undefined} // 运行时禁用连接 + onReconnect={!isRunning ? onReconnect : undefined} // 运行时禁用重新连接 + onDragOver={!isRunning ? onDragOver : undefined} // 运行时禁用拖拽 + onDrop={!isRunning ? onDrop : undefined} // 运行时禁用放置 + onNodeDrag={!isRunning ? onNodeDrag : undefined} // 运行时禁用节点拖拽 connectionLineType={ConnectionLineType.SmoothStep} connectionLineComponent={CustomConnectionLine} - onNodeDragStop={onNodeDragStop} - onNodeContextMenu={onNodeContextMenu} - onEdgeContextMenu={onEdgeContextMenu} - onNodeClick={onNodeDoubleClick} - onPaneClick={onPaneClick} - onPaneContextMenu={onPaneContextMenu} + onNodeDragStop={!isRunning ? onNodeDragStop : undefined} // 运行时禁用节点拖拽停止 + onNodeContextMenu={!isRunning ? onNodeContextMenu : undefined} // 运行时禁用节点上下文菜单 + onNodeDoubleClick={!isRunning ? onNodeDoubleClick : undefined} // 运行时禁用节点双击 + onEdgeContextMenu={!isRunning ? onEdgeContextMenu : undefined} // 运行时禁用边上下文菜单 + onPaneClick={!isRunning ? onPaneClick : undefined} // 运行时禁用面板点击 + onPaneContextMenu={!isRunning ? onPaneContextMenu : undefined} // 运行时禁用面板上下文菜单 onEdgeMouseEnter={(_event, edge) => { setEdges((eds) => eds.map(e => { if (e.id === edge.id) { @@ -291,12 +296,12 @@ const FlowEditorMain: React.FC = (props) => { })); }} fitView - selectionKeyCode={['Meta', 'Control']} - selectionMode={SelectionMode.Partial} - panOnDrag={[0, 1, 2]} // 支持多点触控平移 - zoomOnScroll={true} - zoomOnPinch={true} - panOnScrollSpeed={0.5} + selectionOnDrag={!isRunning} // 运行时禁用拖拽选择 + selectionMode={!isRunning ? SelectionMode.Partial : undefined} // 运行时禁用选择模式 + panOnDrag={!isRunning ? [0, 1, 2] : []} // 运行时禁用拖拽平移 + zoomOnScroll={!isRunning} // 运行时禁用滚轮缩放 + zoomOnPinch={!isRunning} // 运行时禁用捏合缩放 + panOnScrollSpeed={!isRunning ? 0.5 : 0} // 运行时禁用滚动平移 > @@ -315,7 +320,7 @@ const FlowEditorMain: React.FC = (props) => { {/*节点右键上下文*/} - {menu && menu.type === 'node' && ( + {!isRunning && menu && menu.type === 'node' && (
= (props) => { )} {/*边右键上下文*/} - {menu && menu.type === 'edge' && ( + {!isRunning && menu && menu.type === 'edge' && (
= (props) => { )} {/*画布右键上下文*/} - {menu && menu.type === 'pane' && ( + {!isRunning && menu && menu.type === 'pane' && (
= (props) => { {/*统一的添加节点菜单*/} - {(edgeForNodeAdd || positionForNodeAdd) && ( + {!isRunning && (edgeForNodeAdd || positionForNodeAdd) && (
{ - const { nodeId, status } = payload; - state.nodeStatusMap[nodeId] = status; + const { nodeId, status, actionType } = payload; + // 如果是运行时更新,不记录到历史记录中 + if (actionType !== 'RUNTIME_UPDATE') { + state.nodeStatusMap[nodeId] = status; + } else { + // 对于运行时更新,我们仍然更新状态但标记为运行时状态 + state.nodeStatusMap[nodeId] = status; + } }, // 重置节点状态 resetNodeStatus: (state) => {