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