import { useMemo, useState } from "react"; import { Tab, ObjectType, tableFieldHeight, tableHeaderHeight, tableColorStripHeight, } from "../../data/constants"; import { IconEdit, IconMore, IconMinus, IconDeleteStroked, IconKeyStroked, } from "@douyinfe/semi-icons"; import { Popover, Tag, Button, SideSheet } from "@douyinfe/semi-ui"; import { useLayout, useSettings, useDiagram, useSelect } from "../../hooks"; import TableInfo from "../EditorSidePanel/TablesTab/TableInfo"; import { useTranslation } from "react-i18next"; import { dbToTypes } from "../../data/datatypes"; import { isRtl } from "../../i18n/utils/rtl"; import i18n from "../../i18n/i18n"; export default function Table(props) { const [hoveredField, setHoveredField] = useState(null); const { database } = useDiagram(); const { tableData, onPointerDown, setHoveredTable, handleGripField, setLinkingLine, } = props; const { layout } = useLayout(); const { deleteTable, deleteField } = useDiagram(); const { settings } = useSettings(); const { t } = useTranslation(); const { selectedElement, setSelectedElement, bulkSelectedElements } = useSelect(); const borderColor = useMemo( () => (settings.mode === "light" ? "border-zinc-300" : "border-zinc-600"), [settings.mode], ); const height = tableData.fields.length * tableFieldHeight + tableHeaderHeight + 7; const isSelected = useMemo(() => { return ( (selectedElement.id == tableData.id && selectedElement.element === ObjectType.TABLE) || bulkSelectedElements.some( (e) => e.type === ObjectType.TABLE && e.id === tableData.id, ) ); }, [selectedElement, tableData, bulkSelectedElements]); const openEditor = () => { if (!layout.sidebar) { setSelectedElement((prev) => ({ ...prev, element: ObjectType.TABLE, id: tableData.id, open: true, })); } else { setSelectedElement((prev) => ({ ...prev, currentTab: Tab.TABLES, element: ObjectType.TABLE, id: tableData.id, open: true, })); if (selectedElement.currentTab !== Tab.TABLES) return; document .getElementById(`scroll_table_${tableData.id}`) .scrollIntoView({ behavior: "smooth" }); } }; return ( <>
{tableData.name}
} position="rightTop" showArrow trigger="click" style={{ width: "200px", wordBreak: "break-word" }} >
{tableData.fields.map((e, i) => { return settings.showFieldSummary ? (

{e.name}

{e.type + ((dbToTypes[database][e.type].isSized || dbToTypes[database][e.type].hasPrecision) && e.size && e.size !== "" ? "(" + e.size + ")" : "")}


{e.primary && ( {t("primary")} )} {e.unique && ( {t("unique")} )} {e.notNull && ( {t("not_null")} )} {e.increment && ( {t("autoincrement")} )}

{t("default_value")}: {e.default === "" ? t("not_set") : e.default}

{t("comment")}: {e.comment === "" ? t("not_set") : e.comment}

} position="right" showArrow style={ isRtl(i18n.language) ? { direction: "rtl" } : { direction: "ltr" } } > {field(e, i)} ) : ( field(e, i) ); })}
setSelectedElement((prev) => ({ ...prev, open: !prev.open, })) } style={{ paddingBottom: "16px" }} >
); function field(fieldData, index) { return (
{ if (!e.isPrimary) return; setHoveredField(index); setHoveredTable({ tableId: tableData.id, fieldId: fieldData.id, }); }} onPointerLeave={(e) => { if (!e.isPrimary) return; setHoveredField(null); setHoveredTable({ tableId: null, fieldId: null, }); }} onPointerDown={(e) => { // Required for onPointerLeave to trigger when a touch pointer leaves // https://stackoverflow.com/a/70976017/1137077 e.target.releasePointerCapture(e.pointerId); }} >
{hoveredField === index ? (
); } }