|
|
|
|
@ -1,7 +1,9 @@
|
|
|
|
|
import React from 'react';
|
|
|
|
|
import { Menu } from '@arco-design/web-react';
|
|
|
|
|
import { Menu, Tabs } from '@arco-design/web-react';
|
|
|
|
|
import { localNodeData } from '@/pages/flowEditor/sideBar/config/localNodeData';
|
|
|
|
|
|
|
|
|
|
const TabPane = Tabs.TabPane;
|
|
|
|
|
|
|
|
|
|
interface AddNodeMenuProps {
|
|
|
|
|
onAddNode: (nodeType: string) => void;
|
|
|
|
|
position?: { x: number; y: number }; // 用于画布上下文菜单
|
|
|
|
|
@ -9,8 +11,8 @@ interface AddNodeMenuProps {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const AddNodeMenu: React.FC<AddNodeMenuProps> = ({
|
|
|
|
|
onAddNode
|
|
|
|
|
}) => {
|
|
|
|
|
onAddNode
|
|
|
|
|
}) => {
|
|
|
|
|
// 按分组组织节点数据
|
|
|
|
|
const groupedNodes = localNodeData.reduce((acc, node) => {
|
|
|
|
|
if (!acc[node.nodeGroup]) {
|
|
|
|
|
@ -26,46 +28,55 @@ const AddNodeMenu: React.FC<AddNodeMenuProps> = ({
|
|
|
|
|
|
|
|
|
|
// 分组名称映射
|
|
|
|
|
const groupNames: Record<string, string> = {
|
|
|
|
|
'common': '系统组件'
|
|
|
|
|
// 可以根据需要添加更多分组
|
|
|
|
|
// 'application': '应用组件',
|
|
|
|
|
// 'composite': '复合组件'
|
|
|
|
|
'common': '系统组件',
|
|
|
|
|
'application': '应用组件',
|
|
|
|
|
'composite': '复合组件'
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<Menu
|
|
|
|
|
style={{
|
|
|
|
|
width: 200,
|
|
|
|
|
border: '1px solid #e4e7ed',
|
|
|
|
|
borderRadius: 4,
|
|
|
|
|
boxShadow: '0 2px 8px rgba(0, 0, 0, 0.15)'
|
|
|
|
|
<div
|
|
|
|
|
style={{
|
|
|
|
|
backgroundColor: '#ffffff',
|
|
|
|
|
padding: '10px',
|
|
|
|
|
borderRadius: '10px',
|
|
|
|
|
maxHeight: '400px',
|
|
|
|
|
display: 'flex',
|
|
|
|
|
flexDirection: 'column'
|
|
|
|
|
}}
|
|
|
|
|
mode="vertical"
|
|
|
|
|
hasCollapseButton={false}
|
|
|
|
|
>
|
|
|
|
|
{Object.entries(groupedNodes).map(([group, nodes]) => (
|
|
|
|
|
<Menu.SubMenu
|
|
|
|
|
key={group}
|
|
|
|
|
title={groupNames[group] || group}
|
|
|
|
|
popup
|
|
|
|
|
trigger="hover"
|
|
|
|
|
>
|
|
|
|
|
{nodes.map((node) => (
|
|
|
|
|
<Menu.Item
|
|
|
|
|
key={node.nodeType}
|
|
|
|
|
onClick={() => handleAddNode(node.nodeType)}
|
|
|
|
|
style={{
|
|
|
|
|
padding: '0 16px',
|
|
|
|
|
height: 36,
|
|
|
|
|
lineHeight: '36px'
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
{node.nodeName}
|
|
|
|
|
</Menu.Item>
|
|
|
|
|
))}
|
|
|
|
|
</Menu.SubMenu>
|
|
|
|
|
))}
|
|
|
|
|
</Menu>
|
|
|
|
|
<Tabs defaultActiveTab="common" style={{ flex: '0 0 auto' }}>
|
|
|
|
|
{Object.entries(groupedNodes).map(([group, nodes]) => (
|
|
|
|
|
<TabPane key={group} title={groupNames[group] || group}>
|
|
|
|
|
<div style={{ maxHeight: '300px', overflowY: 'auto' }}>
|
|
|
|
|
<Menu
|
|
|
|
|
style={{
|
|
|
|
|
width: 200,
|
|
|
|
|
border: '1px solid #e4e7ed',
|
|
|
|
|
borderRadius: 4,
|
|
|
|
|
boxShadow: '0 2px 8px rgba(0, 0, 0, 0.15)'
|
|
|
|
|
}}
|
|
|
|
|
mode="vertical"
|
|
|
|
|
hasCollapseButton={false}
|
|
|
|
|
>
|
|
|
|
|
{nodes.map((node) => (
|
|
|
|
|
<Menu.Item
|
|
|
|
|
key={node.nodeType}
|
|
|
|
|
onClick={() => handleAddNode(node.nodeType)}
|
|
|
|
|
style={{
|
|
|
|
|
padding: '0 16px',
|
|
|
|
|
height: 36,
|
|
|
|
|
lineHeight: '36px'
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
{node.nodeName}
|
|
|
|
|
</Menu.Item>
|
|
|
|
|
))}
|
|
|
|
|
</Menu>
|
|
|
|
|
</div>
|
|
|
|
|
</TabPane>
|
|
|
|
|
))}
|
|
|
|
|
</Tabs>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|