123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- import React, { useEffect, useState } from "react";
- import { Button, Modal, Input, Dropdown } from "antd";
- import {
- DownOutlined,
- ImportOutlined,
- PlusOutlined,
- SearchOutlined,
- } from "@ant-design/icons";
- import TableItem from "./TableItem";
- import { useModel } from "umi";
- import noData from "@/assets/no-data.png";
- import TableEdit from "@/components/TableEdit";
- import { ColumnItem, TableItemType } from "@/type";
- import AddTable from "@/pages/detail/components/AddTable";
- export default function TablePanel() {
- const {
- project,
- setProject,
- updateTable,
- addTable,
- tableActive,
- setTableActive,
- graph,
- } = useModel("erModel");
- const contentRef = React.useRef<HTMLDivElement>(null);
- const [contentStyle, setContentStyle] = React.useState<React.CSSProperties>(
- {}
- );
- const [tableData, setTableData] = React.useState<TableItemType>();
- const [open, setOpen] = useState(false);
- const addTableRef = React.useRef<{ openImportMode: () => void }>(null);
- useEffect(() => {
- graph?.on("node:dblclick", (args) => {
- const data = args.node.getData();
- if (data?.isTable) {
- setOpen(true);
- setTableData(data);
- }
- });
- }, [graph]);
- useEffect(() => {
- // 计算高度
- setContentStyle({
- height: `calc(100vh - ${contentRef.current?.getBoundingClientRect().top}px)`,
- });
- }, []);
- const handleChangeTableColumns = (columnList: readonly ColumnItem[]) => {
- if (tableData) {
- updateTable({
- ...tableData,
- tableColumnList: columnList as ColumnItem[],
- });
- }
- };
- // 引入表
- const handleImport = (tables: TableItemType[]) => {
- setProject({
- ...project,
- tables: [...tables, ...project.tables],
- });
- setTableActive(tables[0].table.id);
- graph?.select(tables[0].table.id);
- };
- return (
- <div
- className="px-12px overflow-y-auto"
- ref={contentRef}
- style={contentStyle}
- >
- <div className="search-box flex gap-4px mb-12px">
- <Input placeholder="输入关键字搜索" suffix={<SearchOutlined />} />
- <Dropdown
- menu={{
- items: [
- {
- key: "add",
- label: "新建表",
- icon: <PlusOutlined />,
- onClick: () => addTable(),
- },
- {
- key: "import",
- label: "引入表",
- icon: <ImportOutlined />,
- onClick: () => addTableRef.current?.openImportMode(),
- },
- ],
- }}
- >
- <Button type="primary">
- 添加表
- <DownOutlined />
- </Button>
- </Dropdown>
- </div>
- {project.tables.map((item) => {
- return (
- <TableItem
- data={item}
- onChange={updateTable}
- key={item.table.id}
- active={tableActive}
- setActive={setTableActive}
- />
- );
- })}
- {project.tables.length === 0 && (
- <div className="flex flex-col items-center justify-center h-[300px]">
- <img src={noData} alt="暂无数据" className="w-[200px] h-[200px]" />
- <div className="text-gray-400">暂无数据表,快来创建!</div>
- </div>
- )}
- <Modal
- title="字段详情"
- width={"80%"}
- open={open}
- footer={(_, { CancelBtn }) => {
- return <CancelBtn />;
- }}
- onCancel={() => {
- setOpen(false);
- setTableData(undefined);
- }}
- >
- <TableEdit
- tableId={tableData?.table?.id}
- data={tableData?.tableColumnList || []}
- modelId={project.id}
- onChange={handleChangeTableColumns}
- />
- </Modal>
- <AddTable ref={addTableRef} onChange={handleImport} />
- </div>
- );
- }
|