feat(flowEditor): 重构节点编辑模态框,支持自定义节点编辑器
- 拆分 NodeEditModal 组件中的节点编辑逻辑 - 新增独立的节点编辑器组件:EndNodeEditor、StartNodeEditor、BasicNodeEditor、LocalNodeEditor - 实现节点编辑器的动态加载和注册机制 - 优化节点数据的管理和更新逻辑master
parent
c1f6448ad6
commit
9a4187a8c3
@ -0,0 +1,39 @@
|
||||
import React from 'react';
|
||||
import { NodeEditorProps } from './index';
|
||||
import { Form, Input, Select } from '@arco-design/web-react';
|
||||
|
||||
const BasicNodeEditor: React.FC<NodeEditorProps> = ({
|
||||
node,
|
||||
nodeData,
|
||||
updateNodeData
|
||||
}) => {
|
||||
return (
|
||||
<Form layout="vertical">
|
||||
<Form.Item label="节点标题">
|
||||
<Input
|
||||
value={nodeData.title || ''}
|
||||
onChange={(value) => updateNodeData('title', value)}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item label="描述">
|
||||
<Input.TextArea
|
||||
value={nodeData.description || ''}
|
||||
onChange={(value) => updateNodeData('description', value)}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item label="节点类型">
|
||||
<Select
|
||||
value={nodeData.category || ''}
|
||||
onChange={(value) => updateNodeData('category', value)}
|
||||
options={[
|
||||
{ label: '数据处理', value: 'data' },
|
||||
{ label: '逻辑判断', value: 'logic' },
|
||||
{ label: '外部接口', value: 'api' }
|
||||
]}
|
||||
/>
|
||||
</Form.Item>
|
||||
</Form>
|
||||
);
|
||||
};
|
||||
|
||||
export default BasicNodeEditor;
|
||||
@ -0,0 +1,112 @@
|
||||
import React from 'react';
|
||||
import { NodeEditorProps } from './index';
|
||||
import { Form, Input, Switch, Select } from '@arco-design/web-react';
|
||||
|
||||
const LocalNodeEditor: React.FC<NodeEditorProps> = ({
|
||||
node,
|
||||
nodeData,
|
||||
updateNodeData
|
||||
}) => {
|
||||
// 根据LocalNode的不同类型渲染不同的编辑界面
|
||||
const renderLocalNodeEditor = () => {
|
||||
const localNodeType = nodeData.type || '';
|
||||
|
||||
switch (localNodeType) {
|
||||
case 'CONDITION':
|
||||
return (
|
||||
<>
|
||||
<Form.Item label="节点标题">
|
||||
<Input
|
||||
value={nodeData.title || ''}
|
||||
onChange={(value) => updateNodeData('title', value)}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item label="条件表达式">
|
||||
<Input.TextArea
|
||||
value={nodeData.expression || ''}
|
||||
onChange={(value) => updateNodeData('expression', value)}
|
||||
placeholder="请输入条件表达式"
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item label="是否启用">
|
||||
<Switch
|
||||
checked={nodeData.enabled || false}
|
||||
onChange={(value) => updateNodeData('enabled', value)}
|
||||
/>
|
||||
</Form.Item>
|
||||
</>
|
||||
);
|
||||
|
||||
case 'WAIT':
|
||||
return (
|
||||
<>
|
||||
<Form.Item label="节点标题">
|
||||
<Input
|
||||
value={nodeData.title || ''}
|
||||
onChange={(value) => updateNodeData('title', value)}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item label="等待时间(秒)">
|
||||
<Input
|
||||
value={nodeData.waitTime || ''}
|
||||
onChange={(value) => updateNodeData('waitTime', value)}
|
||||
type="number"
|
||||
/>
|
||||
</Form.Item>
|
||||
</>
|
||||
);
|
||||
|
||||
case 'LOOP':
|
||||
return (
|
||||
<>
|
||||
<Form.Item label="节点标题">
|
||||
<Input
|
||||
value={nodeData.title || ''}
|
||||
onChange={(value) => updateNodeData('title', value)}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item label="循环次数">
|
||||
<Input
|
||||
value={nodeData.loopCount || ''}
|
||||
onChange={(value) => updateNodeData('loopCount', value)}
|
||||
type="number"
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item label="循环条件">
|
||||
<Input.TextArea
|
||||
value={nodeData.condition || ''}
|
||||
onChange={(value) => updateNodeData('condition', value)}
|
||||
placeholder="请输入循环条件"
|
||||
/>
|
||||
</Form.Item>
|
||||
</>
|
||||
);
|
||||
|
||||
default:
|
||||
return (
|
||||
<>
|
||||
<Form.Item label="节点标题">
|
||||
<Input
|
||||
value={nodeData.title || ''}
|
||||
onChange={(value) => updateNodeData('title', value)}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item label="描述">
|
||||
<Input.TextArea
|
||||
value={nodeData.description || ''}
|
||||
onChange={(value) => updateNodeData('description', value)}
|
||||
/>
|
||||
</Form.Item>
|
||||
</>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<Form layout="vertical">
|
||||
{renderLocalNodeEditor()}
|
||||
</Form>
|
||||
);
|
||||
};
|
||||
|
||||
export default LocalNodeEditor;
|
||||
@ -0,0 +1,28 @@
|
||||
import React from 'react';
|
||||
import { NodeEditorProps } from './index';
|
||||
import { Form, Input } from '@arco-design/web-react';
|
||||
|
||||
const StartNodeEditor: React.FC<NodeEditorProps> = ({
|
||||
node,
|
||||
nodeData,
|
||||
updateNodeData
|
||||
}) => {
|
||||
return (
|
||||
<Form layout="vertical">
|
||||
<Form.Item label="节点标题">
|
||||
<Input
|
||||
value={nodeData.title || ''}
|
||||
onChange={(value) => updateNodeData('title', value)}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item label="描述">
|
||||
<Input.TextArea
|
||||
value={nodeData.description || ''}
|
||||
onChange={(value) => updateNodeData('description', value)}
|
||||
/>
|
||||
</Form.Item>
|
||||
</Form>
|
||||
);
|
||||
};
|
||||
|
||||
export default StartNodeEditor;
|
||||
@ -0,0 +1,46 @@
|
||||
import React from 'react';
|
||||
import { Node } from '@xyflow/react';
|
||||
import BasicNodeEditor from './BasicNodeEditor';
|
||||
import StartNodeEditor from './StartNodeEditor';
|
||||
import EndNodeEditor from './EndNodeEditor';
|
||||
import LocalNodeEditor from './LocalNodeEditor';
|
||||
|
||||
// 定义节点编辑器的属性接口
|
||||
export interface NodeEditorProps {
|
||||
node: Node;
|
||||
nodeData: any;
|
||||
updateNodeData: (key: string, value: any) => void;
|
||||
}
|
||||
|
||||
// 节点编辑器映射
|
||||
export const nodeEditors: Record<string, React.FC<NodeEditorProps>> = {
|
||||
'basic': BasicNodeEditor,
|
||||
'start': StartNodeEditor,
|
||||
'end': EndNodeEditor,
|
||||
'local': LocalNodeEditor // 用于所有本地节点类型的编辑器
|
||||
};
|
||||
|
||||
// 注册新的节点编辑器
|
||||
export const registerNodeEditor = (
|
||||
type: string,
|
||||
component: React.FC<NodeEditorProps>
|
||||
) => {
|
||||
nodeEditors[type] = component;
|
||||
};
|
||||
|
||||
// 根据节点类型获取对应的编辑器
|
||||
export const getNodeEditorByType = (nodeType: string, localNodeType?: string) => {
|
||||
// 对于本地节点,使用专门的本地节点编辑器
|
||||
if (localNodeType) {
|
||||
return nodeEditors['local'] || nodeEditors['basic'];
|
||||
}
|
||||
|
||||
// 对于预定义节点类型,直接返回对应编辑器
|
||||
return nodeEditors[nodeType] || nodeEditors['basic'];
|
||||
};
|
||||
|
||||
export default {
|
||||
nodeEditors,
|
||||
registerNodeEditor,
|
||||
getNodeEditorByType
|
||||
};
|
||||
Loading…
Reference in New Issue