pref(flowEditor): 优化节点添加弹窗的交互

production
钟良源 6 months ago
parent bc76be9f34
commit 11a0f992c0

@ -146,7 +146,7 @@ const FlowEditorMain: React.FC<FlowEditorMainProps> = (props) => {
useEffect(() => { useEffect(() => {
const handleToggleNodeVisibility = (event: CustomEvent) => { const handleToggleNodeVisibility = (event: CustomEvent) => {
const { appId, isVisible } = event.detail; const { appId, isVisible } = event.detail;
if (isVisible) { if (isVisible) {
// 显示节点 - 从隐藏节点集合中移除 // 显示节点 - 从隐藏节点集合中移除
setHiddenNodes(prev => { setHiddenNodes(prev => {
@ -154,14 +154,15 @@ const FlowEditorMain: React.FC<FlowEditorMainProps> = (props) => {
newSet.delete(appId); newSet.delete(appId);
return newSet; return newSet;
}); });
} else { }
else {
// 隐藏节点 - 添加到隐藏节点集合 // 隐藏节点 - 添加到隐藏节点集合
setHiddenNodes(prev => new Set(prev).add(appId)); setHiddenNodes(prev => new Set(prev).add(appId));
} }
}; };
document.addEventListener('toggleNodeVisibility', handleToggleNodeVisibility as EventListener); document.addEventListener('toggleNodeVisibility', handleToggleNodeVisibility as EventListener);
return () => { return () => {
document.removeEventListener('toggleNodeVisibility', handleToggleNodeVisibility as EventListener); document.removeEventListener('toggleNodeVisibility', handleToggleNodeVisibility as EventListener);
}; };
@ -180,7 +181,7 @@ const FlowEditorMain: React.FC<FlowEditorMainProps> = (props) => {
useEffect(() => { useEffect(() => {
const handleToggleNodeVisibility = (event: CustomEvent) => { const handleToggleNodeVisibility = (event: CustomEvent) => {
const { appId, isVisible } = event.detail; const { appId, isVisible } = event.detail;
if (isVisible) { if (isVisible) {
// 显示节点 - 从隐藏节点集合中移除 // 显示节点 - 从隐藏节点集合中移除
setHiddenNodes(prev => { setHiddenNodes(prev => {
@ -188,14 +189,15 @@ const FlowEditorMain: React.FC<FlowEditorMainProps> = (props) => {
newSet.delete(appId); newSet.delete(appId);
return newSet; return newSet;
}); });
} else { }
else {
// 隐藏节点 - 添加到隐藏节点集合 // 隐藏节点 - 添加到隐藏节点集合
setHiddenNodes(prev => new Set(prev).add(appId)); setHiddenNodes(prev => new Set(prev).add(appId));
} }
}; };
document.addEventListener('toggleNodeVisibility', handleToggleNodeVisibility as EventListener); document.addEventListener('toggleNodeVisibility', handleToggleNodeVisibility as EventListener);
return () => { return () => {
document.removeEventListener('toggleNodeVisibility', handleToggleNodeVisibility as EventListener); document.removeEventListener('toggleNodeVisibility', handleToggleNodeVisibility as EventListener);
}; };
@ -238,7 +240,14 @@ const FlowEditorMain: React.FC<FlowEditorMainProps> = (props) => {
return ( return (
<div ref={reactFlowWrapper} style={{ width: '100%', height: '100%', position: 'relative' }} <div ref={reactFlowWrapper} style={{ width: '100%', height: '100%', position: 'relative' }}
onContextMenu={(e) => e.preventDefault()}> onContextMenu={(e) => e.preventDefault()}
// 添加点击事件处理器,用于关闭添加节点菜单
onClick={() => {
if (edgeForNodeAdd || positionForNodeAdd) {
setEdgeForNodeAdd(null);
setPositionForNodeAdd(null);
}
}}>
<ReactFlow <ReactFlow
id={reactFlowId} id={reactFlowId}
nodes={nodes.map(node => { nodes={nodes.map(node => {
@ -246,7 +255,7 @@ const FlowEditorMain: React.FC<FlowEditorMainProps> = (props) => {
const isHidden = hiddenNodes.has(node.id); const isHidden = hiddenNodes.has(node.id);
// 应用透明度样式 // 应用透明度样式
const style = isHidden ? { opacity: 0.3 } : {}; const style = isHidden ? { opacity: 0.3 } : {};
return { return {
...node, ...node,
draggable: !currentAppIsRunning, draggable: !currentAppIsRunning,
@ -262,7 +271,7 @@ const FlowEditorMain: React.FC<FlowEditorMainProps> = (props) => {
const isTargetHidden = hiddenNodes.has(edge.target); const isTargetHidden = hiddenNodes.has(edge.target);
// 如果源节点或目标节点被隐藏,则边也应用透明度 // 如果源节点或目标节点被隐藏,则边也应用透明度
const style = (isSourceHidden || isTargetHidden) ? { opacity: 0.3 } : {}; const style = (isSourceHidden || isTargetHidden) ? { opacity: 0.3 } : {};
// 更新边的数据,确保选择框也应用透明度 // 更新边的数据,确保选择框也应用透明度
return { return {
...edge, ...edge,
@ -291,7 +300,7 @@ const FlowEditorMain: React.FC<FlowEditorMainProps> = (props) => {
console.warn('在应用编排模式下不允许删除节点'); console.warn('在应用编排模式下不允许删除节点');
return false; // 阻止删除节点操作 return false; // 阻止删除节点操作
} }
// 检查是否有开始或结束节点 // 检查是否有开始或结束节点
const hasStartOrEndNode = nodes.some(node => node.type === 'start' || node.type === 'end'); const hasStartOrEndNode = nodes.some(node => node.type === 'start' || node.type === 'end');
if (hasStartOrEndNode) { if (hasStartOrEndNode) {
@ -313,7 +322,7 @@ const FlowEditorMain: React.FC<FlowEditorMainProps> = (props) => {
console.warn('在应用编排模式下不允许删除节点'); console.warn('在应用编排模式下不允许删除节点');
return; return;
} }
// 如果在运行时,禁止删除 // 如果在运行时,禁止删除
if (currentAppIsRunning) { if (currentAppIsRunning) {
return; return;
@ -367,10 +376,10 @@ const FlowEditorMain: React.FC<FlowEditorMainProps> = (props) => {
// 删除所有相关节点和边 // 删除所有相关节点和边
setNodes((nds) => nds.filter((n) => !nodesToRemove.find((d) => d.id === n.id))); setNodes((nds) => nds.filter((n) => !nodesToRemove.find((d) => d.id === n.id)));
// 删除与这些节点相关的所有边 // 删除与这些节点相关的所有边
const nodeIdsToRemove = nodesToRemove.map(node => node.id); const nodeIdsToRemove = nodesToRemove.map(node => node.id);
setEdges((eds) => eds.filter((e) => setEdges((eds) => eds.filter((e) =>
!nodeIdsToRemove.includes(e.source) && !nodeIdsToRemove.includes(e.target) !nodeIdsToRemove.includes(e.source) && !nodeIdsToRemove.includes(e.target)
)); ));
} }
@ -517,6 +526,8 @@ const FlowEditorMain: React.FC<FlowEditorMainProps> = (props) => {
zIndex: 1000, zIndex: 1000,
transform: 'none' transform: 'none'
}} }}
// 点击事件冒泡到父级处理,这里阻止默认行为
onClick={(e) => e.stopPropagation()}
> >
<AddNodeMenu <AddNodeMenu
onAddNode={(nodeType, node) => { onAddNode={(nodeType, node) => {

Loading…
Cancel
Save