import React, { useEffect, useState } from "react"; import { Button, Dropdown, Input, Modal, Switch, InputNumber } from "antd"; import type { DropDownProps, MenuProps } from "antd"; import { useModel } from "umi"; import { useFullscreen } from "ahooks"; export default function Menu() { const { project, canRedo, canUndo, onRedo, onUndo, graph, setProject, onClean, onCut, onCopy, onPaste, onDelete, enterPlayMode, saveTime, } = useModel("erModel"); const [modal, contextHolder] = Modal.useModal(); const [isFullscreen, { toggleFullscreen }] = useFullscreen(document.body); const [openKey, setOpenKey] = useState(""); const [open, setOpen] = useState(false); const [name, setName] = useState(project?.name); useEffect(() => { setName(project.name); }, [project.name]); const handleClean = () => { modal.confirm({ title: "确认清除画布全部内容?", content: "清空后将无法恢复", cancelText: "取消", okText: "确定", onOk() { onClean(); }, }); }; const handleChangeSetting = (key: string, value: boolean | number | null) => { setProject({ ...project, setting: { ...project.setting, [key]: value } }); }; const handleChangeName = () => { name.trim() && setProject({ ...project, name }); } const handleZoom = (value: number) => { if (value < 0.2) { graph?.zoomTo(0.2); return; } else if (value > 2) { graph?.zoomTo(2); return; } graph?.zoomTo(value); }; const menuData: { key: string; label: string; type: "group"; children: MenuProps["items"]; }[] = [ { key: "1", label: "文件", type: "group", children: [ { key: "1-1", label: ( 新建 ctrl+n ), }, { key: "1-2", label: "新标签页打开" }, { key: "1-3", label: ( 保存 ctrl+s ), }, { key: "1-4", label: "保存为模版" }, { key: "1-5", label: "发布模版" }, { key: "1-6", label: "同步到数据表" }, { key: "1-7", label: "导出为图片", onClick: () => graph && graph?.exportPNG(), }, ], }, { key: "2", label: "编辑", type: "group", children: [ { key: "1-1", label: ( 撤销 ctrl+z ), onClick: () => canUndo && onUndo(), }, { key: "1-2", label: ( 恢复 ctrl+y ), onClick: () => canRedo && onRedo(), }, { key: "1-3", label: "清除", onClick: handleClean }, { key: "1-4", label: ( 剪切 ctrl+x ), onClick: onCut, }, { key: "1-5", label: ( 复制 ctrl+c ), onClick: onCopy, }, { key: "1-6", label: ( 粘贴 ctrl+v ), onClick: onPaste, }, { key: "1-7", label: ( 删除 delete ), onClick: onDelete, }, ], }, { key: "3", label: "视图", type: "group", children: [ { key: "1-1", label: ( 菜单栏隐藏 handleChangeSetting("showMenu", checked)} /> ), }, { key: "1-2", label: ( 侧边栏隐藏 handleChangeSetting("showSidebar", checked) } /> ), }, { key: "1-3", label: "演示模式", onClick: () => enterPlayMode() }, { key: "1-4", label: ( 字段详情 handleChangeSetting("showColumnDetail", checked) } /> ), }, { key: "1-5", label: ( 显示网格 handleChangeSetting("showGrid", checked)} /> ), }, { key: "1-6", label: ( 显示关系 handleChangeSetting("showRelation", checked) } /> ), }, { key: "1-7", label: "重置视图", onClick: () => graph?.zoomTo(1) }, { key: "1-8", label: ( 放大 ctrl+up ), onClick: () => handleZoom((graph?.zoom() || 1) + 0.2), }, { key: "1-9", label: ( 缩小 ctrl+down ), onClick: () => handleZoom((graph?.zoom() || 1) - 0.2), }, { key: "1-10", label: isFullscreen ? "退出全屏" : "全屏", onClick: () => toggleFullscreen(), }, ], }, { key: "4", label: "设置", type: "group", children: [ { key: "1-1", label: "修改记录" }, { key: "1-2", label: ( 自动保存 handleChangeSetting("autoUpdate", checked) } /> ), }, { key: "1-3", label: ( 自动同步 ), }, { key: "1-4", label: "表格宽度", onClick: () => setOpen(true), }, ], }, { key: "5", label: "帮助", type: "group", children: [ { key: "1-1", label: "快捷键" }, { key: "1-2", label: "操作说明" }, ], }, ]; const handleOpenChange = ( nextOpen: boolean, info: { source: "trigger" | "menu" }, key: string ) => { if (info.source === "trigger" || nextOpen) { setOpenKey(nextOpen ? key : ""); } }; return ( <>
{contextHolder}
setName(e.target.value)} onBlur={handleChangeName} onPressEnter={handleChangeName} /> { saveTime &&
上次保存时间:{saveTime}
}
{menuData.map((item) => { return ( handleOpenChange(nextOpen, info, item.key) } > ); })}
setOpen(false)} onCancel={() => setOpen(false)} footer={(_, { OkBtn }) => { return ; }} > handleChangeSetting("tableWidth", value)} /> ); }