import { useState } from "react";
import {
Collapse,
Input,
TextArea,
Button,
Card,
Popover,
} from "@douyinfe/semi-ui";
import { IconDeleteStroked } from "@douyinfe/semi-icons";
import { useTables, useUndoRedo } from "../../../hooks";
import { Action, ObjectType, defaultBlue } from "../../../data/constants";
import ColorPalette from "../../ColorPicker";
import TableField from "./TableField";
import IndexDetails from "./IndexDetails";
import { useTranslation } from "react-i18next";
export default function TableInfo({ data }) {
const { t } = useTranslation();
const [indexActiveKey, setIndexActiveKey] = useState("");
const { deleteTable, updateTable, updateField, setRelationships } =
useTables();
const { setUndoStack, setRedoStack } = useUndoRedo();
const [editField, setEditField] = useState({});
const [drag, setDrag] = useState({
draggingElementIndex: null,
draggingOverIndexList: [],
});
return (
{t("name")}:
updateTable(data.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: data.id,
undo: editField,
redo: { name: e.target.value },
message: t("edit_table", {
tableName: e.target.value,
extra: "[name]",
}),
},
]);
setRedoStack([]);
}}
/>
{data.fields.map((f, j) => (
{
setDrag((prev) => ({ ...prev, draggingElementIndex: j }));
}}
onDragLeave={() => {
setDrag((prev) => ({
...prev,
draggingOverIndexList: prev.draggingOverIndexList.filter(
(index) => index !== j,
),
}));
}}
onDragOver={(e) => {
e.preventDefault();
if (drag.draggingElementIndex != null) {
if (j !== drag.draggingElementIndex) {
setDrag((prev) => {
if (prev.draggingOverIndexList.includes(j)) {
return prev;
}
return {
...prev,
draggingOverIndexList: prev.draggingOverIndexList.concat(j),
};
});
}
return;
}
}}
onDrop={(e) => {
e.preventDefault();
const index = drag.draggingElementIndex;
setDrag({ draggingElementIndex: null, draggingOverIndexList: [] });
if (index == null || index === j) {
return;
}
const a = data.fields[index];
const b = data.fields[j];
updateField(data.id, index, { ...b, id: index });
updateField(data.id, j, { ...a, id: j });
setRelationships((prev) =>
prev.map((e) => {
if (e.startTableId === data.id) {
if (e.startFieldId === index) {
return { ...e, startFieldId: j };
}
if (e.startFieldId === j) {
return { ...e, startFieldId: index };
}
}
if (e.endTableId === data.id) {
if (e.endFieldId === index) {
return { ...e, endFieldId: j };
}
if (e.endFieldId === j) {
return { ...e, endFieldId: index };
}
}
return e;
}),
);
}}
onDragEnd={(e) => {
e.preventDefault();
setDrag({ draggingElementIndex: null, draggingOverIndexList: [] });
}}
>
))}
{data.indices.length > 0 && (
setIndexActiveKey(itemKey)}
accordion
>
{data.indices.map((idx, k) => (
({
value: e.name,
label: e.name,
}))}
/>
))}
)}
{
setUndoStack((prev) => [
...prev,
{
action: Action.EDIT,
element: ObjectType.TABLE,
component: "self",
tid: data.id,
undo: { color: data.color },
redo: { color: defaultBlue },
message: t("edit_table", {
tableName: data.name,
extra: "[color]",
}),
},
]);
setRedoStack([]);
updateTable(data.id, { color: defaultBlue });
}}
onPickColor={(c) => {
setUndoStack((prev) => [
...prev,
{
action: Action.EDIT,
element: ObjectType.TABLE,
component: "self",
tid: data.id,
undo: { color: data.color },
redo: { color: c },
message: t("edit_table", {
tableName: data.name,
extra: "[color]",
}),
},
]);
setRedoStack([]);
updateTable(data.id, { color: c });
}}
/>
}
trigger="click"
position="bottomLeft"
showArrow
>
}
type="danger"
onClick={() => deleteTable(data.id)}
/>
);
}