2024-06-30 18:19:21 +08:00
|
|
|
import { useState } from "react";
|
|
|
|
import { Button, Input, TagInput } from "@douyinfe/semi-ui";
|
|
|
|
import { IconDeleteStroked } from "@douyinfe/semi-icons";
|
2024-08-01 00:12:28 +08:00
|
|
|
import { useDiagram, useEnums, useUndoRedo } from "../../../hooks";
|
2024-06-30 18:19:21 +08:00
|
|
|
import { Action, ObjectType } from "../../../data/constants";
|
|
|
|
import { useTranslation } from "react-i18next";
|
|
|
|
|
|
|
|
export default function EnumDetails({ data, i }) {
|
|
|
|
const { t } = useTranslation();
|
|
|
|
const { deleteEnum, updateEnum } = useEnums();
|
2024-08-01 00:12:28 +08:00
|
|
|
const { tables, updateField } = useDiagram();
|
2024-06-30 18:19:21 +08:00
|
|
|
const { setUndoStack, setRedoStack } = useUndoRedo();
|
|
|
|
const [editField, setEditField] = useState({});
|
|
|
|
|
|
|
|
return (
|
2024-07-04 02:21:44 +08:00
|
|
|
<>
|
|
|
|
<div className="flex justify-center items-center gap-2">
|
2024-06-30 18:19:21 +08:00
|
|
|
<div className="font-semibold">{t("Name")}: </div>
|
|
|
|
<Input
|
|
|
|
value={data.name}
|
|
|
|
placeholder={t("name")}
|
2024-07-04 07:10:24 +08:00
|
|
|
validateStatus={data.name.trim() === "" ? "error" : "default"}
|
2024-08-01 00:12:28 +08:00
|
|
|
onChange={(value) => {
|
|
|
|
updateEnum(i, { name: value });
|
|
|
|
tables.forEach((table, i) => {
|
|
|
|
table.fields.forEach((field, j) => {
|
|
|
|
if (field.type.toLowerCase() === data.name.toLowerCase()) {
|
|
|
|
updateField(i, j, { type: value.toUpperCase() });
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}}
|
2024-06-30 18:19:21 +08:00
|
|
|
onFocus={(e) => setEditField({ name: e.target.value })}
|
|
|
|
onBlur={(e) => {
|
|
|
|
if (e.target.value === editField.name) return;
|
2024-08-01 00:12:28 +08:00
|
|
|
|
|
|
|
const updatedFields = tables.reduce((acc, table) => {
|
|
|
|
table.fields.forEach((field, i) => {
|
|
|
|
if (field.type.toLowerCase() === data.name.toLowerCase()) {
|
|
|
|
acc.push({ tid: table.id, fid: i });
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return acc;
|
|
|
|
}, []);
|
|
|
|
|
2024-06-30 18:19:21 +08:00
|
|
|
setUndoStack((prev) => [
|
|
|
|
...prev,
|
|
|
|
{
|
|
|
|
action: Action.EDIT,
|
|
|
|
element: ObjectType.ENUM,
|
2024-07-04 02:21:44 +08:00
|
|
|
id: i,
|
2024-06-30 18:19:21 +08:00
|
|
|
undo: editField,
|
|
|
|
redo: { name: e.target.value },
|
2024-08-01 00:12:28 +08:00
|
|
|
updatedFields,
|
2024-06-30 18:19:21 +08:00
|
|
|
message: t("edit_enum", {
|
|
|
|
enumName: e.target.value,
|
|
|
|
extra: "[name]",
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
]);
|
|
|
|
setRedoStack([]);
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<TagInput
|
|
|
|
separator={[",", ", ", " ,"]}
|
|
|
|
value={data.values}
|
|
|
|
addOnBlur
|
|
|
|
className="my-2"
|
|
|
|
placeholder={t("values")}
|
2024-07-04 07:10:24 +08:00
|
|
|
validateStatus={data.values.length === 0 ? "error" : "default"}
|
2024-06-30 18:19:21 +08:00
|
|
|
onChange={(v) => updateEnum(i, { values: v })}
|
|
|
|
onFocus={() => setEditField({ values: data.values })}
|
|
|
|
onBlur={() => {
|
|
|
|
if (JSON.stringify(editField.values) === JSON.stringify(data.values))
|
|
|
|
return;
|
|
|
|
setUndoStack((prev) => [
|
|
|
|
...prev,
|
|
|
|
{
|
|
|
|
action: Action.EDIT,
|
2024-07-04 02:21:44 +08:00
|
|
|
element: ObjectType.ENUM,
|
|
|
|
id: i,
|
2024-06-30 18:19:21 +08:00
|
|
|
undo: editField,
|
|
|
|
redo: { values: data.values },
|
|
|
|
message: t("edit_enum", {
|
|
|
|
enumName: data.name,
|
|
|
|
extra: "[values]",
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
]);
|
|
|
|
setRedoStack([]);
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
<Button
|
|
|
|
block
|
|
|
|
icon={<IconDeleteStroked />}
|
|
|
|
type="danger"
|
|
|
|
onClick={() => deleteEnum(i, true)}
|
|
|
|
>
|
|
|
|
{t("delete")}
|
|
|
|
</Button>
|
2024-07-04 02:21:44 +08:00
|
|
|
</>
|
2024-06-30 18:19:21 +08:00
|
|
|
);
|
|
|
|
}
|