123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391 |
- import React, { useEffect, useState } from "react";
- import { Tooltip, Dropdown, DropDownProps } from "antd";
- import { CheckOutlined, DownOutlined } from "@ant-design/icons";
- import { useModel } from "umi";
- import TodoDrawer from "./TodoDrawer";
- import AICreator from "./AICreator";
- import { useFullscreen, useLocalStorageState } from "ahooks";
- export default function Toolbar() {
- const {
- addTable,
- addTopicArea,
- addRemark,
- graph,
- canRedo,
- canUndo,
- onRedo,
- onUndo,
- project,
- setProject,
- onSave,
- } = useModel("erModel");
- const todoRef = React.useRef<{ open: () => void }>();
- const [isFullscreen, { toggleFullscreen }] = useFullscreen(document.body);
- const scaleMenu = {
- style: {
- width: 200,
- },
- items: [
- {
- key: "1",
- label: "25%",
- onClick: () => {
- handleZoom(25);
- },
- },
- {
- key: "2",
- label: "50%",
- onClick: () => {
- handleZoom(50);
- },
- },
- {
- key: "3",
- label: "75%",
- onClick: () => {
- handleZoom(75);
- },
- },
- {
- key: "4",
- label: "100%",
- onClick: () => {
- handleZoom(100);
- },
- },
- {
- key: "5",
- label: "150%",
- onClick: () => {
- handleZoom(150);
- },
- },
- {
- key: "6",
- label: "200%",
- onClick: () => {
- handleZoom(200);
- },
- },
- ],
- };
- // 隐藏默认字段
- const [hideDefaultColumn, setHideDefaultColumn] = useLocalStorageState(
- "er-hideDefaultColumn",
- {
- defaultValue: false,
- listenStorageChange: true
- }
- );
- const layoutMenu: DropDownProps["menu"] = {
- style: {
- width: 120,
- },
- items: [
- {
- key: "1",
- label: (
- <span className="flex items-center">
- <span className="inlineblock w-25px">
- {project.setting.showMenu ? (
- <CheckOutlined className="text-12px" />
- ) : (
- ""
- )}
- </span>
- <span>菜单栏</span>
- </span>
- ),
- onClick: () => {
- setProject({
- ...project,
- setting: {
- ...project.setting,
- showMenu: !project.setting.showMenu,
- },
- });
- },
- },
- {
- key: "2",
- label: (
- <span className="flex items-center">
- <span className="inlineblock w-25px">
- {project.setting.showSidebar ? (
- <CheckOutlined className="text-12px" />
- ) : (
- ""
- )}
- </span>
- <span>侧边栏</span>
- </span>
- ),
- onClick: () => {
- setProject({
- ...project,
- setting: {
- ...project.setting,
- showSidebar: !project.setting.showSidebar,
- },
- });
- },
- },
- {
- key: "3",
- type: "divider",
- },
- {
- key: "4",
- label: (
- <span className="flex items-center">
- <span className="inlineblock w-25px">
- {isFullscreen && <CheckOutlined className="text-12px" />}
- </span>
- <span>全屏</span>
- </span>
- ),
- onClick: () => {
- toggleFullscreen();
- },
- },
- ],
- };
- const [scale, setScale] = useState(100);
- useEffect(() => {
- graph?.on("scale", (scaleInfo) => {
- setScale(parseInt(scaleInfo.sx * 100 + ""));
- });
- }, [graph]);
- const handleZoom = (value: number) => {
- if (value > 200) {
- graph?.zoomTo(2);
- return;
- }
- if (value < 20) {
- graph?.zoomTo(0.2);
- return;
- }
- graph?.zoomTo(value / 100);
- };
- const handleChangeShowMenu = () => {
- setProject({
- ...project,
- setting: { ...project.setting, showMenu: !project.setting.showMenu },
- });
- };
- return (
- <div className="flex justify-between bg-#fafafa">
- <div>
- <TodoDrawer ref={todoRef} />
- </div>
- <div className="flex items-center py-0px justify-center h-32px">
- <div className="group">
- <div className="btn flex flex-col items-center cursor-pointer py-4px px-10px hover:bg-gray-200">
- <Dropdown menu={layoutMenu} placement="bottomLeft">
- <span className="text-14px leading-18px">
- <i className="iconfont icon-layout-5-line text-20px text-#666" />
- <DownOutlined className="text-10px ml-4px" />
- </span>
- </Dropdown>
- </div>
- </div>
- <div className="group">
- <div className="btn flex flex-col items-center cursor-pointer py-4px px-10px hover:bg-gray-200">
- <Tooltip
- title={`${hideDefaultColumn ? "隐藏" : "显示"}默认字段`}
- >
- <i
- className={`iconfont text-20px leading-24px ${!hideDefaultColumn ? "icon-view" : "icon-hide"}`}
- onClick={() => {
- setHideDefaultColumn(!hideDefaultColumn);
- }}
- />
- </Tooltip>
- </div>
- </div>
- <div className="group">
- <div className="flex items-center">
- <Tooltip title="撤销上一步操作">
- <div
- className="btn flex flex-col items-center cursor-pointer py-4px px-10px hover:bg-gray-200"
- style={{
- opacity: canUndo ? 1 : 0.5,
- }}
- onClick={() => canUndo && onUndo()}
- >
- <svg className="icon h-24px w-24px" aria-hidden="true">
- <use xlinkHref="#icon-undo"></use>
- </svg>
- </div>
- </Tooltip>
- <Tooltip title="恢复上一步操作">
- <div
- className="btn flex flex-col items-center cursor-pointer py-4px px-10px hover:bg-gray-200"
- style={{
- opacity: canRedo ? 1 : 0.5,
- }}
- onClick={() => canRedo && onRedo()}
- >
- <svg className="icon h-24px w-24px" aria-hidden="true">
- <use xlinkHref="#icon-redo"></use>
- </svg>
- </div>
- </Tooltip>
- </div>
- </div>
- <div className="h-30px border-transparent border-r-1px border-solid border-r-#eee m-x-8px"></div>
- <div className="group">
- <div className="flex items-center">
- <Tooltip title="创建表">
- <div
- className="btn flex flex-col items-center cursor-pointer py-4px px-10px hover:bg-gray-200"
- onClick={() => addTable()}
- >
- <svg className="icon h-24px w-24px" aria-hidden="true">
- <use xlinkHref="#icon-biaoge"></use>
- </svg>
- </div>
- </Tooltip>
- <Tooltip title="创建主题域">
- <div
- className="btn flex flex-col items-center cursor-pointer py-4px px-10px hover:bg-gray-200"
- onClick={addTopicArea}
- >
- <svg className="icon h-24px w-24px" aria-hidden="true">
- <use xlinkHref="#icon-ditukuangxuan"></use>
- </svg>
- </div>
- </Tooltip>
- <Tooltip title="创建备注">
- <div
- className="btn flex flex-col items-center cursor-pointer py-4px px-10px hover:bg-gray-200"
- onClick={addRemark}
- >
- <svg className="icon h-24px w-24px" aria-hidden="true">
- <use xlinkHref="#icon-beizhu"></use>
- </svg>
- </div>
- </Tooltip>
- </div>
- </div>
- <div className="h-30px border-transparent border-r-1px border-solid border-r-#eee m-x-8px"></div>
- <div className="group">
- <div className="flex items-center">
- <Tooltip title="保存模型">
- <div
- className="btn flex flex-col items-center cursor-pointer py-4px px-10px hover:bg-gray-200"
- onClick={onSave}
- >
- <svg
- className="icon h-24px w-24px color-#666"
- aria-hidden="true"
- >
- <use xlinkHref="#icon-baocun"></use>
- </svg>
- </div>
- </Tooltip>
- <Tooltip title="待办项">
- <div
- className="btn flex flex-col items-center cursor-pointer py-4px px-10px hover:bg-gray-200"
- onClick={() => todoRef.current?.open()}
- >
- <svg
- className="icon h-24px w-24px color-#666"
- aria-hidden="true"
- >
- <use xlinkHref="#icon-daiban"></use>
- </svg>
- </div>
- </Tooltip>
- </div>
- </div>
- <div className="h-30px border-transparent border-r-1px border-solid border-r-#eee m-x-8px"></div>
- <div className="group">
- <div className="flex items-center">
- <Tooltip title="AI助手">
- <AICreator
- trigger={
- <div className="btn flex flex-col items-center cursor-pointer py-4px px-10px hover:bg-gray-200">
- <svg
- className="icon h-24px w-24px color-#666"
- aria-hidden="true"
- >
- <use xlinkHref="#icon-AI1"></use>
- </svg>
- </div>
- }
- />
- </Tooltip>
- </div>
- </div>
- <div className="h-30px border-transparent border-r-1px border-solid border-r-#eee m-x-8px"></div>
- <div className="group">
- <div className="flex items-center">
- <Tooltip title="放大">
- <div
- className="btn flex flex-col items-center cursor-pointer py-4px px-10px hover:bg-gray-200"
- style={{ opacity: scale >= 200 ? 0.5 : 1 }}
- onClick={() => handleZoom(scale + 25)}
- >
- <svg className="icon h-24px w-24px" aria-hidden="true">
- <use xlinkHref="#icon-suofangda"></use>
- </svg>
- </div>
- </Tooltip>
- <Tooltip title="缩小">
- <div
- className="btn flex flex-col items-center cursor-pointer py-4px px-10px hover:bg-gray-200"
- style={{ opacity: scale <= 20 ? 0.5 : 1 }}
- onClick={() => handleZoom(scale - 25)}
- >
- <svg className="icon h-24px w-24px" aria-hidden="true">
- <use xlinkHref="#icon-suofangxiao"></use>
- </svg>
- </div>
- </Tooltip>
- <Dropdown menu={scaleMenu}>
- <span className="text-14px leading-18px w-120px">
- <span>{scale}%</span>
- <DownOutlined className="text-10px ml-4px" />
- </span>
- </Dropdown>
- </div>
- </div>
- </div>
- <div>
- <div
- className="btn py-4px px-10px hover:bg-gray-200 opacity-50 flex items-center justify-center cursor-pointer"
- onClick={handleChangeShowMenu}
- >
- <i
- className="iconfont icon-open leading-24px inline-block"
- style={{
- transition: "all 0.3s",
- transform: project.setting.showMenu
- ? "rotate(180deg)"
- : "rotate(0deg)",
- }}
- ></i>
- </div>
- </div>
- </div>
- );
- }
|