import { React, useState, useContext } from "react"; import { sqlDataTypes, tableThemes, defaultTableTheme, Tab, Action, ObjectType, } from "../data/data"; import { IconEdit, IconMore, IconMinus, IconDeleteStroked, IconKeyStroked, IconCheckboxTick, IconColorPalette, } from "@douyinfe/semi-icons"; import { Popconfirm, Select, Input, TextArea, Card, Checkbox, TagInput, Row, Col, Popover, Tag, Button, SideSheet, Toast, } from "@douyinfe/semi-ui"; import { LayoutContext, SelectContext, SettingsContext, TabContext, TableContext, UndoRedoContext, } from "../pages/editor"; export default function Table(props) { const [isHovered, setIsHovered] = useState(false); const [hoveredField, setHoveredField] = useState(-1); // const [visible, setVisible] = useState(false); const [editField, setEditField] = useState({}); const { layout } = useContext(LayoutContext); const { deleteTable, updateTable, updateField } = useContext(TableContext); const { tab, setTab } = useContext(TabContext); const { settings } = useContext(SettingsContext); const { setUndoStack, setRedoStack } = useContext(UndoRedoContext); const { selectedElement, setSelectedElement } = useContext(SelectContext); const height = props.tableData.fields.length * 36 + 50 + 7; return ( <> { setIsHovered(true); }} onMouseLeave={() => { setIsHovered(false); props.setOnRect({ tableId: -1, field: -2, }); }} >
{props.tableData.name}
{isHovered && (
Comment :{" "} {props.tableData.comment === "" ? ( "No comment" ) : (
{props.tableData.comment}
)}
Indices : {" "} {props.tableData.indices.length === 0 ? ( "No indices" ) : (
{props.tableData.indices.map((index, k) => (
{index.fields.map((f) => ( {f} ))}
))}
)}
} position="rightTop" showArrow trigger="click" style={{ width: "200px" }} >
)}
{props.tableData.fields.map((e, i) => { return settings.showFieldSummary ? (

{e.name}

{e.type}


{e.primary && ( Primary )} {e.unique && ( Unique )} {e.notNull && ( Not null )} {e.increment && ( Increment )}

Default :{" "} {e.default === "" ? "Not set" : e.default}

} position="right" showArrow > {field(e, i)}
) : ( field(e, i) ); })}
setSelectedElement((prev) => ({ ...prev, openDialogue: !prev.openDialogue, })) } style={{ paddingBottom: "16px" }} >
Name:
updateTable(props.tableData.id, { name: value }) } onFocus={(e) => setEditField({ name: e.target.value })} onBlur={(e) => { if (e.target.value === editField.name) return; setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.TABLE, component: "self", tid: props.tableData.id, undo: editField, redo: { name: e.target.value }, }, ]); setRedoStack([]); }} />
{props.tableData.fields.map((f, j) => ( updateField(props.tableData.id, j, { name: value }) } onFocus={(e) => setEditField({ name: e.target.value })} onBlur={(e) => { if (e.target.value === editField.name) return; setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.TABLE, component: "field", tid: props.tableData.id, fid: j, undo: editField, redo: { name: e.target.value }, }, ]); setRedoStack([]); }} />
Default value
updateField(props.tableData.id, j, { default: value }) } onFocus={(e) => setEditField({ default: e.target.value }) } onBlur={(e) => { if (e.target.value === editField.default) return; setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.TABLE, component: "field", tid: props.tableData.id, fid: j, undo: editField, redo: { default: e.target.value }, }, ]); setRedoStack([]); }} /> {(f.type === "ENUM" || f.type === "SET") && ( <>
{f.type} values
updateField(props.tableData.id, j, { values: v, }) } onFocus={(e) => setEditField({ values: f.values })} onBlur={(e) => { if ( JSON.stringify(editField.values) === JSON.stringify(f.values) ) return; setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.TABLE, component: "field", tid: props.tableData.id, fid: j, undo: editField, redo: { values: f.values }, }, ]); setRedoStack([]); }} /> )} {f.type === "VARCHAR" && ( <>
Length
updateField(props.tableData.id, j, { length: value, }) } onFocus={(e) => setEditField({ length: e.target.value }) } onBlur={(e) => { if (e.target.value === editField.length) return; setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.TABLE, component: "field", tid: props.tableData.id, fid: j, undo: editField, redo: { length: e.target.value }, }, ]); setRedoStack([]); }} /> )}
Check Expression
updateField(props.tableData.id, j, { check: value }) } onFocus={(e) => setEditField({ check: e.target.value })} onBlur={(e) => { if (e.target.value === editField.check) return; setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.TABLE, component: "field", tid: props.tableData.id, fid: j, undo: editField, redo: { check: e.target.value }, }, ]); setRedoStack([]); }} />
Unique
{ setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.TABLE, component: "field", tid: props.tableData.id, fid: j, undo: { [checkedValues.target.value]: !checkedValues.target.checked, }, redo: { [checkedValues.target.value]: checkedValues.target.checked, }, }, ]); setRedoStack([]); updateField(props.tableData.id, j, { [checkedValues.target.value]: checkedValues.target.checked, }); }} >
Autoincrement
{ setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.TABLE, component: "field", tid: props.tableData.id, fid: j, undo: { [checkedValues.target.value]: !checkedValues.target.checked, }, redo: { [checkedValues.target.value]: checkedValues.target.checked, }, }, ]); setRedoStack([]); updateField(props.tableData.id, j, { [checkedValues.target.value]: checkedValues.target.checked, }); }} >
Comment