import { useState, useContext } from "react"; import { sqlDataTypes, tableThemes, defaultTableTheme, Tab, Action, ObjectType, } from "../data/data"; import { IconEdit, IconMore, IconMinus, IconDeleteStroked, IconKeyStroked, IconCheckboxTick, } from "@douyinfe/semi-icons"; import { Select, Input, TextArea, Card, Checkbox, InputNumber, TagInput, Row, Col, Popover, Tag, Button, SideSheet, Toast, } from "@douyinfe/semi-ui"; import { LayoutContext, SelectContext, SettingsContext, TabContext, TableContext, TypeContext, UndoRedoContext, } from "../pages/Editor"; import { getSize, hasCheck, hasPrecision, isSized } from "../utils"; export default function Table(props) { const [isHovered, setIsHovered] = useState(false); const [hoveredField, setHoveredField] = useState(-1); const [editField, setEditField] = useState({}); const { layout } = useContext(LayoutContext); const { deleteTable, updateTable, updateField, setRelationships } = useContext(TableContext); const { tab, setTab } = useContext(TabContext); const { settings } = useContext(SettingsContext); const { types } = useContext(TypeContext); 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)} >
{isHovered ? props.tableData.name.length <= 10 ? props.tableData.name : `${props.tableData.name.substring(0, 10)}...` : props.tableData.name.length <= 18 ? props.tableData.name : `${props.tableData.name.substring(0, 19)}...`}
{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 }, message: `Edit table name to ${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 }, message: `Edit table field name to "${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 }, message: `Edit table field default to ${e.target.value}`, }, ]); setRedoStack([]); }} /> {(f.type === "ENUM" || f.type === "SET") && ( <>
{f.type} values
updateField(props.tableData.id, j, { values: v, }) } onFocus={() => setEditField({ values: f.values })} onBlur={() => { 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 }, message: `Edit table field values to "${JSON.stringify( f.values )}"`, }, ]); setRedoStack([]); }} /> )} {isSized(f.type) && ( <>
Size
updateField(props.tableData.id, j, { size: value, }) } onFocus={(e) => setEditField({ size: e.target.value }) } onBlur={(e) => { if (e.target.value === editField.size) return; setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.TABLE, component: "field", tid: props.tableData.id, fid: j, undo: editField, redo: { size: e.target.value }, message: `Edit table field size to ${e.target.value}`, }, ]); setRedoStack([]); }} /> )} {hasPrecision(f.type) && ( <>
Precision
updateField(props.tableData.id, j, { size: value, }) } onFocus={(e) => setEditField({ size: e.target.value }) } onBlur={(e) => { if (e.target.value === editField.size) return; setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.TABLE, component: "field", tid: props.tableData.id, fid: j, undo: editField, redo: { size: e.target.value }, message: `Edit table field precision to ${e.target.value}`, }, ]); setRedoStack([]); }} /> )} {hasCheck(f.type) && ( <>
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 }, message: `Edit table field check expression to ${e.target.value}`, }, ]); setRedoStack([]); }} />
*This will be in the script as is.
)}
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, }, message: `Edit table field to${ f.unique ? " not" : "" } unique`, }, ]); 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, }, message: `Edit table field to${ f.primary ? " not" : "" } auto increment`, }, ]); setRedoStack([]); updateField(props.tableData.id, j, { increment: !f.increment, check: f.increment ? f.check : "", }); }} >
Comment