drawDB/src/components/control_panel.jsx

259 lines
9.2 KiB
React
Raw Normal View History

2023-09-19 20:47:16 +08:00
import { React, useState } from "react";
2023-09-19 20:48:20 +08:00
import { menu } from "../data/data";
2023-09-19 20:47:16 +08:00
import {
2023-09-19 20:48:20 +08:00
IconCaretdown,
IconChevronRight,
IconShareStroked,
IconChevronUp,
IconChevronDown,
IconPlus,
} from "@douyinfe/semi-icons";
import { Link } from "react-router-dom";
import icon from "../assets/icon_dark_64.png";
import {
Avatar,
AvatarGroup,
Button,
Divider,
Dropdown,
} from "@douyinfe/semi-ui";
2023-09-19 20:46:48 +08:00
export default function ControlPanel() {
2023-09-19 20:47:16 +08:00
const Tool = {
2023-09-19 20:48:20 +08:00
TOOLBAR: 0,
ZOOM: 1,
UNDO: 2,
REDO: 3,
ADD: 4,
COUNT: 5,
2023-09-19 20:47:16 +08:00
};
const [showToolBar, setShowToolBar] = useState(true);
const [openZoom, setOpenZoom] = useState(false);
const [openAdd, setOpenAdd] = useState(false);
const invert = (e, tool) => {
switch (tool) {
case Tool.TOOLBAR:
setShowToolBar((prev) => !prev);
break;
case Tool.ZOOM:
setOpenZoom((prev) => !prev);
2023-09-19 20:47:17 +08:00
setOpenAdd(false);
2023-09-19 20:47:16 +08:00
break;
case Tool.ADD:
setOpenAdd((prev) => !prev);
2023-09-19 20:47:17 +08:00
setOpenZoom(false);
2023-09-19 20:47:16 +08:00
break;
default:
break;
}
};
2023-09-19 20:48:21 +08:00
2023-09-19 20:46:48 +08:00
return (
2023-09-19 20:48:20 +08:00
<>
{showToolBar && (
<nav className="flex justify-between pt-1 items-center">
<div className="flex justify-start items-center text-slate-800">
<Link to="/">
<img width={54} src={icon} alt="logo" className="ms-8" />
</Link>
<div className="ms-1 mt-1">
<div className="text-xl ms-3">Project1 / Untitled</div>
<div className="flex justify-between items-center">
<div className="flex justify-start text-md select-none me-2">
{Object.keys(menu).map((category) => (
<Dropdown
key={category}
style={{ width: "200px" }}
render={
<Dropdown.Menu>
{Object.keys(menu[category]).map((item, index) => {
if (menu[category][item].length > 0) {
return (
<Dropdown
style={{ width: "120px" }}
key={item}
position={"rightTop"}
render={
<Dropdown.Menu>
{menu[category][item].map((e) => (
<Dropdown.Item key={e}>
<div>{e}</div>
</Dropdown.Item>
))}
</Dropdown.Menu>
}
>
<Dropdown.Item
style={{
display: "flex",
justifyContent: "space-between",
alignItems: "center"
}}
>
<div>{item}</div>
<IconChevronRight />
</Dropdown.Item>
</Dropdown>
);
}
return (
<Dropdown.Item key={index}>
{item}
</Dropdown.Item>
);
})}
</Dropdown.Menu>
}
2023-09-19 20:47:15 +08:00
>
2023-09-19 20:48:20 +08:00
<div className="px-3 py-1 hover:bg-gray-100">
{category}
</div>
</Dropdown>
))}
</div>
<Button size="small" type="tertiary">
Last saved {new Date().toISOString()}
</Button>
</div>
2023-09-19 20:47:15 +08:00
</div>
2023-09-19 20:48:20 +08:00
</div>
<div className="flex justify-around items-center text-md me-8">
<AvatarGroup maxCount={3} size="default">
<Avatar color="red" alt="Lisa LeBlanc">
LL
</Avatar>
<Avatar color="green" alt="Caroline Xiao">
CX
</Avatar>
<Avatar color="amber" alt="Rafal Matin">
RM
</Avatar>
<Avatar alt="Zank Lance">ZL</Avatar>
<Avatar alt="Youself Zhang">YZ</Avatar>
</AvatarGroup>
<Button
type="primary"
style={{
fontSize: "16px",
marginLeft: "12px",
marginRight: "12px",
border: "1px solid white",
}}
size="large"
icon={<IconShareStroked />}
>
Share
</Button>
<Avatar size="default" alt="Buni Zhang">
BZ
</Avatar>
</div>
</nav>
)}
2023-09-19 20:48:21 +08:00
2023-09-19 20:48:20 +08:00
<div className="p-1 flex justify-between items-center rounded-xl bg-slate-100 my-1 mx-6 text-slate-700">
<div className="flex justify-start items-center">
2023-09-19 20:47:16 +08:00
<div className="relative">
2023-09-19 20:48:20 +08:00
<button className="ms-2 py-2 px-3 hover:bg-gray-300 relative">
<i className="fa-solid fa-table-list"></i>
</button>
<Divider layout="vertical" margin="8px" />
2023-09-19 20:47:16 +08:00
<button
2023-09-19 20:48:20 +08:00
className="py-2 px-3 hover:bg-gray-300 relative"
2023-09-19 20:47:16 +08:00
onClick={(e) => invert(e, Tool.ZOOM)}
>
2023-09-19 20:48:20 +08:00
zoom <IconCaretdown />
2023-09-19 20:47:16 +08:00
</button>
<ul
className={`${
openZoom ? "" : "hidden"
} w-[200px] flex-col drop-shadow-lg bg-white py-1 ms-2 absolute z-20 top-full`}
>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
Fit window
</li>
<hr />
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">25%</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">50%</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">75%</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
100%
</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
125%
</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
150%
</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
175%
</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
200%
</li>
<hr />
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
Custom
</li>
</ul>
</div>
<button className="py-1 px-2 hover:bg-gray-300" title="Zoom in">
<i className="fa-solid fa-magnifying-glass-plus"></i>
</button>
<button className="py-1 px-2 hover:bg-gray-300" title="Zoom out">
<i className="fa-solid fa-magnifying-glass-minus"></i>
</button>
2023-09-19 20:47:17 +08:00
<button className="py-1 px-2 hover:bg-gray-300" title="Undo">
2023-09-19 20:47:16 +08:00
<i className="fa-solid fa-rotate-left "></i>
</button>
<button className="py-1 px-2 hover:bg-gray-300" title="Redo">
<i className="fa-solid fa-rotate-right"></i>
</button>
<button className="py-1 px-2 hover:bg-gray-300" title="Edit">
<i className="fa-solid fa-pen-to-square"></i>
</button>
<div className="relative">
<button
className="py-1 px-2 hover:bg-gray-300 relative"
title="Add"
onClick={(e) => invert(e, Tool.ADD)}
>
2023-09-19 20:48:20 +08:00
<IconPlus />
<IconCaretdown />
2023-09-19 20:47:16 +08:00
</button>
<ul
className={`${
openAdd ? "" : "hidden"
} w-[200px] flex-col drop-shadow-lg bg-white py-1 absolute z-20 top-full`}
>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
Table
</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
Relationship
</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
Note
</li>
</ul>
</div>
<button className="py-1 px-2 hover:bg-gray-300" title="Delete">
<i className="fa-solid fa-trash"></i>
</button>
<button className="py-1 px-2 hover:bg-gray-300" title="Move">
<i className="fa-regular fa-hand"></i>
</button>
<button className="py-1 px-2 hover:bg-gray-300" title="Commit">
<i className="fa-solid fa-code-commit"></i>
</button>
</div>
2023-09-19 20:48:20 +08:00
<button onClick={(e) => invert(e, Tool.TOOLBAR)} className="me-3">
{showToolBar ? <IconChevronUp /> : <IconChevronDown />}
</button>
</div>
</>
2023-09-19 20:46:48 +08:00
);
}