import { 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, useUndoRedo } from "../../../hooks";
import { useTranslation } from "react-i18next";
import { dbToTypes } from "../../../data/datatypes";
import { databases } from "../../../data/databases";
export default function FieldDetails({ data, tid, index }) {
const { t } = useTranslation();
const { tables, database } = useDiagram();
const { setUndoStack, setRedoStack } = useUndoRedo();
const { updateField, deleteField } = useDiagram();
const [editField, setEditField] = useState({});
return (
{t("default_value")}
updateField(tid, index, { 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: index,
undo: editField,
redo: { default: e.target.value },
message: t("edit_table", {
tableName: tables[tid].name,
extra: "[field]",
}),
},
]);
setRedoStack([]);
}}
/>
{(data.type === "ENUM" || data.type === "SET") && (
<>
{data.type} {t("values")}
updateField(tid, index, { 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: index,
undo: editField,
redo: { values: data.values },
message: t("edit_table", {
tableName: tables[tid].name,
extra: "[field]",
}),
},
]);
setRedoStack([]);
}}
/>
>
)}
{dbToTypes[database][data.type].isSized && (
<>
{t("size")}
updateField(tid, index, { 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: index,
undo: editField,
redo: { size: e.target.value },
message: t("edit_table", {
tableName: tables[tid].name,
extra: "[field]",
}),
},
]);
setRedoStack([]);
}}
/>
>
)}
{dbToTypes[database][data.type].hasPrecision && (
<>
{t("precision")}
updateField(tid, index, { 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: index,
undo: editField,
redo: { size: e.target.value },
message: t("edit_table", {
tableName: tables[tid].name,
extra: "[field]",
}),
},
]);
setRedoStack([]);
}}
/>
>
)}
{dbToTypes[database][data.type].hasCheck && (
<>
{t("check")}
updateField(tid, index, { 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: index,
undo: editField,
redo: { check: e.target.value },
message: t("edit_table", {
tableName: tables[tid].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: index,
undo: {
[checkedValues.target.value]: !checkedValues.target.checked,
},
redo: {
[checkedValues.target.value]: checkedValues.target.checked,
},
},
]);
setRedoStack([]);
updateField(tid, index, {
[checkedValues.target.value]: checkedValues.target.checked,
});
}}
/>
{t("autoincrement")}
{
setUndoStack((prev) => [
...prev,
{
action: Action.EDIT,
element: ObjectType.TABLE,
component: "field",
tid: tid,
fid: index,
undo: {
[checkedValues.target.value]: !checkedValues.target.checked,
},
redo: {
[checkedValues.target.value]: checkedValues.target.checked,
},
message: t("edit_table", {
tableName: tables[tid].name,
extra: "[field]",
}),
},
]);
setRedoStack([]);
updateField(tid, index, {
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: index,
undo: {
[checkedValues.target.value]: !checkedValues.target.checked,
},
redo: {
[checkedValues.target.value]: checkedValues.target.checked,
},
message: t("edit_table", {
tableName: tables[tid].name,
extra: "[field]",
}),
},
]);
setRedoStack([]);
updateField(tid, index, {
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: index,
undo: {
[checkedValues.target.value]:
!checkedValues.target.checked,
},
redo: {
[checkedValues.target.value]:
checkedValues.target.checked,
},
message: t("edit_table", {
tableName: tables[tid].name,
extra: "[field]",
}),
},
]);
setRedoStack([]);
updateField(tid, index, {
unsigned: checkedValues.target.checked,
});
}}
/>
)}
{t("comment")}
);
}