import { useMemo, useState } from "react"; import { Input, TextArea, Button, TagInput, InputNumber, Checkbox, } from "@douyinfe/semi-ui"; import { Action, ObjectType } from "../../../data/constants"; import { IconDeleteStroked } from "@douyinfe/semi-icons"; import { useDiagram, useLayout, useUndoRedo } from "../../../hooks"; import { useTranslation } from "react-i18next"; import { dbToTypes } from "../../../data/datatypes"; import { databases } from "../../../data/databases"; export default function FieldDetails({ data, tid }) { const { t } = useTranslation(); const { layout } = useLayout(); const { tables, database } = useDiagram(); const { setUndoStack, setRedoStack } = useUndoRedo(); const { updateField, deleteField } = useDiagram(); const [editField, setEditField] = useState({}); const table = useMemo(() => tables.find((t) => t.id === tid), [tables, tid]); return (
{t("default_value")}
updateField(tid, data.id, { 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: tid, fid: data.id, undo: editField, redo: { default: e.target.value }, message: t("edit_table", { tableName: table.name, extra: "[field]", }), }, ]); setRedoStack([]); }} /> {(data.type === "ENUM" || data.type === "SET") && ( <>
{data.type} {t("values")}
{ if (layout.readOnly) return; updateField(tid, data.id, { values: v }); }} onFocus={() => setEditField({ values: data.values })} onBlur={() => { if ( JSON.stringify(editField.values) === JSON.stringify(data.values) ) return; setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.TABLE, component: "field", tid: tid, fid: data.id, undo: editField, redo: { values: data.values }, message: t("edit_table", { tableName: table.name, extra: "[field]", }), }, ]); setRedoStack([]); }} /> )} {dbToTypes[database][data.type].isSized && ( <>
{t("size")}
updateField(tid, data.id, { 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: tid, fid: data.id, undo: editField, redo: { size: e.target.value }, message: t("edit_table", { tableName: table.name, extra: "[field]", }), }, ]); setRedoStack([]); }} /> )} {dbToTypes[database][data.type].hasPrecision && ( <>
{t("precision")}
updateField(tid, data.id, { 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: tid, fid: data.id, undo: editField, redo: { size: e.target.value }, message: t("edit_table", { tableName: table.name, extra: "[field]", }), }, ]); setRedoStack([]); }} /> )} {dbToTypes[database][data.type].hasCheck && ( <>
{t("check")}
updateField(tid, data.id, { 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: tid, fid: data.id, undo: editField, redo: { check: e.target.value }, message: t("edit_table", { tableName: table.name, extra: "[field]", }), }, ]); setRedoStack([]); }} />
{t("this_will_appear_as_is")}
)}
{t("unique")}
{ setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.TABLE, component: "field", tid: tid, fid: data.id, undo: { [checkedValues.target.value]: !checkedValues.target.checked, }, redo: { [checkedValues.target.value]: checkedValues.target.checked, }, }, ]); setRedoStack([]); updateField(tid, data.id, { [checkedValues.target.value]: checkedValues.target.checked, }); }} />
{t("autoincrement")}
{ setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.TABLE, component: "field", tid: tid, fid: data.id, undo: { [checkedValues.target.value]: !checkedValues.target.checked, }, redo: { [checkedValues.target.value]: checkedValues.target.checked, }, message: t("edit_table", { tableName: table.name, extra: "[field]", }), }, ]); setRedoStack([]); updateField(tid, data.id, { increment: !data.increment, check: data.increment ? data.check : "", }); }} />
{databases[database].hasArrays && (
{t("declare_array")}
{ setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.TABLE, component: "field", tid: tid, fid: data.id, undo: { [checkedValues.target.value]: !checkedValues.target.checked, }, redo: { [checkedValues.target.value]: checkedValues.target.checked, }, message: t("edit_table", { tableName: table.name, extra: "[field]", }), }, ]); setRedoStack([]); updateField(tid, data.id, { isArray: checkedValues.target.checked, increment: data.isArray ? data.increment : false, }); }} />
)} {databases[database].hasUnsignedTypes && dbToTypes[database][data.type].signed && (
{t("Unsigned")}
{ setUndoStack((prev) => [ ...prev, { action: Action.EDIT, element: ObjectType.TABLE, component: "field", tid: tid, fid: data.id, undo: { [checkedValues.target.value]: !checkedValues.target.checked, }, redo: { [checkedValues.target.value]: checkedValues.target.checked, }, message: t("edit_table", { tableName: table.name, extra: "[field]", }), }, ]); setRedoStack([]); updateField(tid, data.id, { unsigned: checkedValues.target.checked, }); }} />
)}
{t("comment")}