From 1a73705d4d9d634b681856545fe0bc21af75587e Mon Sep 17 00:00:00 2001
From: 1ilit <1ilit@proton.me>
Date: Sat, 22 Nov 2025 23:21:38 +0400
Subject: [PATCH 1/2] Add ids to enums
---
src/components/EditorHeader/ControlPanel.jsx | 29 +++++++++++-----
src/components/EditorHeader/Modal/Modal.jsx | 22 ++++++++++---
.../EditorSidePanel/EnumsTab/EnumDetails.jsx | 13 ++++----
.../EditorSidePanel/EnumsTab/EnumsTab.jsx | 10 +++---
.../EditorSidePanel/EnumsTab/SearchBar.jsx | 4 +--
src/components/Workspace.jsx | 22 ++++++++++---
src/context/EnumsContext.jsx | 33 +++++++++++--------
7 files changed, 90 insertions(+), 43 deletions(-)
diff --git a/src/components/EditorHeader/ControlPanel.jsx b/src/components/EditorHeader/ControlPanel.jsx
index d02916955..a8d33d33c 100644
--- a/src/components/EditorHeader/ControlPanel.jsx
+++ b/src/components/EditorHeader/ControlPanel.jsx
@@ -167,7 +167,7 @@ export default function ControlPanel({
} else if (a.element === ObjectType.TYPE) {
deleteType(a.data.type.id, false);
} else if (a.element === ObjectType.ENUM) {
- deleteEnum(enums.length - 1, false);
+ deleteEnum(a.data.enum.id, false);
}
setRedoStack((prev) => [...prev, a]);
} else if (a.action === Action.MOVE) {
@@ -201,7 +201,7 @@ export default function ControlPanel({
} else if (a.element === ObjectType.TYPE) {
addType(a.data, false);
} else if (a.element === ObjectType.ENUM) {
- addEnum({ id: a.id, ...a.data }, false);
+ addEnum(a.data, false);
}
setRedoStack((prev) => [...prev, a]);
} else if (a.action === Action.EDIT) {
@@ -339,7 +339,7 @@ export default function ControlPanel({
} else if (a.element === ObjectType.TYPE) {
addType(a.data, false);
} else if (a.element === ObjectType.ENUM) {
- addEnum(null, false);
+ addEnum(a.data, false);
}
setUndoStack((prev) => [...prev, a]);
} else if (a.action === Action.MOVE) {
@@ -372,7 +372,7 @@ export default function ControlPanel({
} else if (a.element === ObjectType.TYPE) {
deleteType(a.data.type.id, false);
} else if (a.element === ObjectType.ENUM) {
- deleteEnum(a.id, false);
+ deleteEnum(a.data.enum.id, false);
}
setUndoStack((prev) => [...prev, a]);
} else if (a.action === Action.EDIT) {
@@ -781,11 +781,24 @@ export default function ControlPanel({
setUndoStack([]);
setRedoStack([]);
if (databases[database].hasTypes) {
- setTypes(diagram.types ?? []);
- }
- if (databases[database].hasEnums) {
- setEnums(diagram.enums ?? []);
+ setTypes(
+ diagram.types.map((t) =>
+ t.id
+ ? t
+ : {
+ ...t,
+ id: nanoid(),
+ fields: t.fields.map((f) =>
+ f.id ? f : { ...f, id: nanoid() },
+ ),
+ },
+ ),
+ );
}
+ setEnums(
+ diagram.enums.map((e) => (!e.id ? { ...e, id: nanoid() } : e)) ??
+ [],
+ );
window.name = `d ${diagram.id}`;
} else {
window.name = "";
diff --git a/src/components/EditorHeader/Modal/Modal.jsx b/src/components/EditorHeader/Modal/Modal.jsx
index c31e52adf..502fc1b58 100644
--- a/src/components/EditorHeader/Modal/Modal.jsx
+++ b/src/components/EditorHeader/Modal/Modal.jsx
@@ -41,6 +41,7 @@ import Rename from "./Rename";
import SetTableWidth from "./SetTableWidth";
import Share from "./Share";
import { IdContext } from "../../Workspace";
+import { nanoid } from "nanoid";
const extensionToLanguage = {
md: "markdown",
@@ -129,11 +130,24 @@ export default function Modal({
setUndoStack([]);
setRedoStack([]);
if (databases[database].hasTypes) {
- setTypes(diagram.types ?? []);
- }
- if (databases[database].hasEnums) {
- setEnums(diagram.enums ?? []);
+ setTypes(
+ diagram.types.map((t) =>
+ t.id
+ ? t
+ : {
+ ...t,
+ id: nanoid(),
+ fields: t.fields.map((f) =>
+ f.id ? f : { ...f, id: nanoid() },
+ ),
+ },
+ ),
+ );
}
+ setEnums(
+ diagram.enums.map((e) => (!e.id ? { ...e, id: nanoid() } : e)) ??
+ [],
+ );
window.name = `d ${diagram.id}`;
setSaveState(State.SAVING);
} else {
diff --git a/src/components/EditorSidePanel/EnumsTab/EnumDetails.jsx b/src/components/EditorSidePanel/EnumsTab/EnumDetails.jsx
index 4500275d3..9d4aa61c5 100644
--- a/src/components/EditorSidePanel/EnumsTab/EnumDetails.jsx
+++ b/src/components/EditorSidePanel/EnumsTab/EnumDetails.jsx
@@ -5,7 +5,7 @@ import { useDiagram, useEnums, useLayout, useUndoRedo } from "../../../hooks";
import { Action, ObjectType } from "../../../data/constants";
import { useTranslation } from "react-i18next";
-export default function EnumDetails({ data, i }) {
+export default function EnumDetails({ data }) {
const { t } = useTranslation();
const { layout } = useLayout();
const { deleteEnum, updateEnum } = useEnums();
@@ -23,7 +23,7 @@ export default function EnumDetails({ data, i }) {
placeholder={t("name")}
validateStatus={data.name.trim() === "" ? "error" : "default"}
onChange={(value) => {
- updateEnum(i, { name: value });
+ updateEnum(data.id, { name: value });
tables.forEach((table) => {
table.fields.forEach((field) => {
if (field.type.toLowerCase() === data.name.toLowerCase()) {
@@ -52,7 +52,7 @@ export default function EnumDetails({ data, i }) {
{
action: Action.EDIT,
element: ObjectType.ENUM,
- id: i,
+ id: data.id,
undo: editField,
redo: { name: e.target.value },
updatedFields,
@@ -75,8 +75,7 @@ export default function EnumDetails({ data, i }) {
validateStatus={data.values.length === 0 ? "error" : "default"}
onChange={(v) => {
if (layout.readOnly) return;
-
- updateEnum(i, { values: v });
+ updateEnum(data.id, { values: v });
}}
onFocus={() => setEditField({ values: data.values })}
onBlur={() => {
@@ -87,7 +86,7 @@ export default function EnumDetails({ data, i }) {
{
action: Action.EDIT,
element: ObjectType.ENUM,
- id: i,
+ id: data.id,
undo: editField,
redo: { values: data.values },
message: t("edit_enum", {
@@ -104,7 +103,7 @@ export default function EnumDetails({ data, i }) {
type="danger"
icon={