import { React, useContext, useState } from "react"; import { Action, ObjectType, defaultTableTheme, sqlDataTypes, tableThemes, } from "../data/data"; import { Collapse, Row, Col, Input, TextArea, Button, Card, TagInput, InputNumber, Popover, Checkbox, Select, AutoComplete, Toast, Empty, } from "@douyinfe/semi-ui"; import { IconMore, IconKeyStroked, IconDeleteStroked, IconCheckboxTick, IconPlus, IconSearch, } from "@douyinfe/semi-icons"; import { IllustrationNoContent, IllustrationNoContentDark, } from "@douyinfe/semi-illustrations"; import { SelectContext, TableContext, UndoRedoContext } from "../pages/editor"; export default function TableOverview(props) { const [indexActiveKey, setIndexActiveKey] = useState(""); const [value, setValue] = useState(""); const { tables, addTable, deleteTable, updateField, updateTable, setRelationships, } = useContext(TableContext); const { setUndoStack, setRedoStack } = useContext(UndoRedoContext); const { selectedElement, setSelectedElement } = useContext(SelectContext); const [editField, setEditField] = useState({}); const [filteredResult, setFilteredResult] = useState( tables.map((t) => { return t.name; }) ); const handleStringSearch = (value) => { setFilteredResult( tables .map((t) => { return t.name; }) .filter((i) => i.includes(value)) ); }; return ( <> } placeholder="Search..." onSearch={(v) => handleStringSearch(v)} emptyContent={
No tables found
} onChange={(v) => setValue(v)} onSelect={(v) => { const { id } = tables.find((t) => t.name === v); setSelectedElement({ element: ObjectType.TABLE, id: id, openDialogue: false, openCollapse: true, }); document .getElementById(`scroll_table_${id}`) .scrollIntoView({ behavior: "smooth" }); }} className="w-full" />
setSelectedElement({ element: ObjectType.TABLE, id: parseInt(k), openDialogue: false, openCollapse: true, }) } accordion > {tables.length <= 0 ? (
} darkModeImage={ } title="No tables" description="Start building your diagram!" />
) : ( tables.map((t, i) => (
{t.name}
} itemKey={`${t.id}`}>
Name:
updateTable(t.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: t.id, undo: editField, redo: { name: e.target.value }, message: `Edit table name to ${e.target.value}`, }, ]); setRedoStack([]); }} />
{t.fields.map((f, j) => ( updateField(i, 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: i, fid: j, undo: editField, redo: { name: e.target.value }, message: `Edit table field name to ${e.target.value}`, }, ]); setRedoStack([]); }} />
Default value
updateField(i, 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: i, 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(i, 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: i, fid: j, undo: editField, redo: { values: f.values }, message: `Edit table field values to "${JSON.stringify( f.values )}"`, }, ]); setRedoStack([]); }} /> )} {(f.type === "VARCHAR" || f.type === "CHAR") && ( <>
Length
updateField(i, 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: i, fid: j, undo: editField, redo: { length: e.target.value }, message: `Edit table field length to ${e.target.value}`, }, ]); setRedoStack([]); }} /> )}
Check Expression
updateField(i, 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: i, fid: j, undo: editField, redo: { check: e.target.value }, message: `Edit table field check expression to ${e.target.value}`, }, ]); setRedoStack([]); }} />
Unique
{ setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.TABLE, component: "field", tid: i, fid: j, undo: { [checkedValues.target.value]: !checkedValues.target.checked, }, redo: { [checkedValues.target.value]: checkedValues.target.checked, }, }, ]); setRedoStack([]); updateField(i, j, { [checkedValues.target.value]: checkedValues.target.checked, }); }} >
Autoincrement
{ setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.TABLE, component: "field", tid: i, fid: j, undo: { [checkedValues.target.value]: !checkedValues.target.checked, }, redo: { [checkedValues.target.value]: checkedValues.target.checked, }, message: `Edit table field to${ f.increment ? " not" : "" } auto increment`, }, ]); setRedoStack([]); updateField(i, j, { [checkedValues.target.value]: checkedValues.target.checked, }); }} >
Comment