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

90 lines
3.2 KiB
TypeScript
Raw Normal View History

2024-03-12 18:53:51 +08:00
import './menu-tree.css';
2024-03-13 00:14:51 +08:00
import {useContext} from "react";
import {Axios} from "../../context/Context.ts";
2024-03-12 18:53:51 +08:00
import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'
2024-03-13 00:14:51 +08:00
import {faCheck, faCaretRight, faCaretDown, faEdit, faPlus, faRemove} from '@fortawesome/free-solid-svg-icons';
2024-03-12 18:53:51 +08:00
import {IMenuTree, IMenuTreeItem} from "../../interfaces/menu/IMenuTree.ts";
export default function MenuTree(props: IMenuTree) {
2024-03-13 00:14:51 +08:00
const axios = useContext(Axios);
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();
}
const renderBtnGroup = (item: IMenuTreeItem) => {
if(item.isEdit) {
return (
<>
<FontAwesomeIcon className="icon" icon={faCheck} onClick={() => {
props.handleEditSaveClick(item);
}}/>
<FontAwesomeIcon className="icon" icon={faRemove} onClick={() => {
props.handleEditCancelClick(item);
}}/>
</>
)
}
return (
<>
<FontAwesomeIcon className="icon" icon={faEdit} onClick={() => {
props.handleEditClick(item);
}}/>
<FontAwesomeIcon className="icon" icon={faPlus} onClick={() => {
props.handleAddClick(item);
}}/>
<FontAwesomeIcon className="icon" icon={faRemove} onClick={() => {
props.handleRemoveClick(item);
}}/>
</>
);
}
const renderLabel = (item: IMenuTreeItem) => {
if(item.isEdit) {
return <input className="menu-name-input" value={item.name} onChange={(e) => {
item.name = e.target.value;
props.handleNameChange(item);
}}/>
}
const icon = item.isOpen ? faCaretDown : faCaretRight;
return (
<>
{item.isParent ? <FontAwesomeIcon className="icon" icon={icon} onClick={() => {
triggerChildren(item)
}}/> : <></>}
<span onDoubleClick={() => {
triggerChildren(item)
}}>{item.name}</span>
</>
)
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 (
<li key={item.id}>
<div className="menu-title">
2024-03-13 00:14:51 +08:00
<div className="label">{renderLabel(item)}</div>
<div className="icon-group">{renderBtnGroup(item)}</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
}