system-copyright-react/src/components/menu/MenuTree.tsx

107 lines
3.7 KiB
TypeScript
Raw Normal View History

2024-03-12 18:53:51 +08:00
import './menu-tree.css';
2024-03-13 16:11:28 +08:00
import {
CaretRightOutlined,
2024-04-29 17:22:26 +08:00
FolderOutlined,
2024-03-13 16:11:28 +08:00
CaretDownOutlined,
PlusOutlined,
CloseOutlined,
EditOutlined,
} from '@ant-design/icons';
2024-03-12 18:53:51 +08:00
import {IMenuTree, IMenuTreeItem} from "../../interfaces/menu/IMenuTree.ts";
2024-04-12 14:12:38 +08:00
import {Popconfirm} from "antd";
2024-03-12 18:53:51 +08:00
export default function MenuTree(props: IMenuTree) {
2024-03-13 00:14:51 +08:00
const triggerChildren = (item: IMenuTreeItem) => {
2024-03-12 18:53:51 +08:00
2024-03-13 00:14:51 +08:00
const trigger = () => {
item.isOpen = !item.isOpen;
props.setMenuTreeArray(item);
2024-03-12 18:53:51 +08:00
}
2024-03-13 00:14:51 +08:00
trigger();
}
2024-03-13 16:11:28 +08:00
const renderBtnGroup = (item: IMenuTreeItem, index: number, parent?: IMenuTreeItem) => {
2024-03-13 00:14:51 +08:00
return (
<>
2024-04-02 18:45:46 +08:00
<EditOutlined className="icon" onClick={(e) => {
e.stopPropagation();
2024-03-13 00:14:51 +08:00
props.handleEditClick(item);
}}/>
2024-04-02 18:45:46 +08:00
<PlusOutlined className="icon" onClick={(e) => {
e.stopPropagation();
2024-03-13 00:14:51 +08:00
props.handleAddClick(item);
}}/>
2024-04-12 14:12:38 +08:00
<Popconfirm title={false}
description="确认删除吗?"
okText="确认"
cancelText="取消"
okButtonProps={{
style: {
backgroundColor: 'var(--color-primary)'
}
}}
onConfirm={(e) => {
e?.stopPropagation();
props.handleRemoveClick(item, index, parent);
}}
onCancel={(e) => {
e?.stopPropagation();
}}
>
<CloseOutlined className="icon" onClick={(e) => {
e.stopPropagation();
}}/>
</Popconfirm>
2024-03-13 00:14:51 +08:00
</>
);
}
const renderLabel = (item: IMenuTreeItem) => {
2024-03-13 16:11:28 +08:00
const icon = item.isOpen ? <CaretDownOutlined onClick={() => {
triggerChildren(item)
}}/> : <CaretRightOutlined onClick={() => {
triggerChildren(item)
}}/>;
const width = 180 - 50 - (item.level * 10) - (5 + (item.isParent ? 8.75 : 0));
2024-03-13 00:14:51 +08:00
return (
<>
2024-04-29 17:22:26 +08:00
{item.isParent ? icon : <></>}<FolderOutlined />
2024-03-13 16:11:28 +08:00
<span
2024-04-12 14:12:38 +08:00
className={item.active ? 'active' : ''}
2024-03-13 16:11:28 +08:00
style={{width: width}}
2024-04-12 14:12:38 +08:00
onClick={(e) => {
e.stopPropagation();
props.handleClick(item);
}}
2024-03-13 16:11:28 +08:00
onDoubleClick={() => {
triggerChildren(item)
}}>{item.name}</span>
2024-03-13 00:14:51 +08:00
</>
)
2024-03-12 18:53:51 +08:00
}
2024-03-13 00:14:51 +08:00
const renderMenu = (children: Array<IMenuTreeItem> | null, parent?: IMenuTreeItem) => {
if (!children) {
2024-03-12 18:53:51 +08:00
return <></>
}
const lis = children.map((item, index) => {
const renderChildrenMenu = renderMenu(item.children, item);
return (
2024-04-12 14:12:38 +08:00
<li key={item.id}>
2024-03-12 18:53:51 +08:00
<div className="menu-title">
2024-03-13 00:14:51 +08:00
<div className="label">{renderLabel(item)}</div>
2024-03-13 16:11:28 +08:00
<div className="icon-group">{renderBtnGroup(item, index, parent)}</div>
2024-03-12 18:53:51 +08:00
</div>
{renderChildrenMenu}
</li>
)
})
2024-03-13 00:14:51 +08:00
const isOpen = parent ? parent.isOpen : true;
return <ul style={{display: isOpen ? 'block' : 'none'}}>{lis}</ul>
2024-03-12 18:53:51 +08:00
}
2024-03-13 00:14:51 +08:00
return <div className="menu-tree">{renderMenu(props.menus)}</div>
2024-03-12 18:53:51 +08:00
}