mirror of
https://github.com/drawdb-io/drawdb.git
synced 2026-01-13 07:02:37 +08:00
Add ids to enums (#713)
* Add ids to enums * Add enum deleted translation
This commit is contained in:
@@ -167,7 +167,7 @@ export default function ControlPanel({
|
|||||||
} else if (a.element === ObjectType.TYPE) {
|
} else if (a.element === ObjectType.TYPE) {
|
||||||
deleteType(a.data.type.id, false);
|
deleteType(a.data.type.id, false);
|
||||||
} else if (a.element === ObjectType.ENUM) {
|
} else if (a.element === ObjectType.ENUM) {
|
||||||
deleteEnum(enums.length - 1, false);
|
deleteEnum(a.data.enum.id, false);
|
||||||
}
|
}
|
||||||
setRedoStack((prev) => [...prev, a]);
|
setRedoStack((prev) => [...prev, a]);
|
||||||
} else if (a.action === Action.MOVE) {
|
} else if (a.action === Action.MOVE) {
|
||||||
@@ -201,7 +201,7 @@ export default function ControlPanel({
|
|||||||
} else if (a.element === ObjectType.TYPE) {
|
} else if (a.element === ObjectType.TYPE) {
|
||||||
addType(a.data, false);
|
addType(a.data, false);
|
||||||
} else if (a.element === ObjectType.ENUM) {
|
} else if (a.element === ObjectType.ENUM) {
|
||||||
addEnum({ id: a.id, ...a.data }, false);
|
addEnum(a.data, false);
|
||||||
}
|
}
|
||||||
setRedoStack((prev) => [...prev, a]);
|
setRedoStack((prev) => [...prev, a]);
|
||||||
} else if (a.action === Action.EDIT) {
|
} else if (a.action === Action.EDIT) {
|
||||||
@@ -339,7 +339,7 @@ export default function ControlPanel({
|
|||||||
} else if (a.element === ObjectType.TYPE) {
|
} else if (a.element === ObjectType.TYPE) {
|
||||||
addType(a.data, false);
|
addType(a.data, false);
|
||||||
} else if (a.element === ObjectType.ENUM) {
|
} else if (a.element === ObjectType.ENUM) {
|
||||||
addEnum(null, false);
|
addEnum(a.data, false);
|
||||||
}
|
}
|
||||||
setUndoStack((prev) => [...prev, a]);
|
setUndoStack((prev) => [...prev, a]);
|
||||||
} else if (a.action === Action.MOVE) {
|
} else if (a.action === Action.MOVE) {
|
||||||
@@ -372,7 +372,7 @@ export default function ControlPanel({
|
|||||||
} else if (a.element === ObjectType.TYPE) {
|
} else if (a.element === ObjectType.TYPE) {
|
||||||
deleteType(a.data.type.id, false);
|
deleteType(a.data.type.id, false);
|
||||||
} else if (a.element === ObjectType.ENUM) {
|
} else if (a.element === ObjectType.ENUM) {
|
||||||
deleteEnum(a.id, false);
|
deleteEnum(a.data.enum.id, false);
|
||||||
}
|
}
|
||||||
setUndoStack((prev) => [...prev, a]);
|
setUndoStack((prev) => [...prev, a]);
|
||||||
} else if (a.action === Action.EDIT) {
|
} else if (a.action === Action.EDIT) {
|
||||||
@@ -781,11 +781,24 @@ export default function ControlPanel({
|
|||||||
setUndoStack([]);
|
setUndoStack([]);
|
||||||
setRedoStack([]);
|
setRedoStack([]);
|
||||||
if (databases[database].hasTypes) {
|
if (databases[database].hasTypes) {
|
||||||
setTypes(diagram.types ?? []);
|
setTypes(
|
||||||
}
|
diagram.types.map((t) =>
|
||||||
if (databases[database].hasEnums) {
|
t.id
|
||||||
setEnums(diagram.enums ?? []);
|
? 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}`;
|
window.name = `d ${diagram.id}`;
|
||||||
} else {
|
} else {
|
||||||
window.name = "";
|
window.name = "";
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ import Rename from "./Rename";
|
|||||||
import SetTableWidth from "./SetTableWidth";
|
import SetTableWidth from "./SetTableWidth";
|
||||||
import Share from "./Share";
|
import Share from "./Share";
|
||||||
import { IdContext } from "../../Workspace";
|
import { IdContext } from "../../Workspace";
|
||||||
|
import { nanoid } from "nanoid";
|
||||||
|
|
||||||
const extensionToLanguage = {
|
const extensionToLanguage = {
|
||||||
md: "markdown",
|
md: "markdown",
|
||||||
@@ -129,11 +130,24 @@ export default function Modal({
|
|||||||
setUndoStack([]);
|
setUndoStack([]);
|
||||||
setRedoStack([]);
|
setRedoStack([]);
|
||||||
if (databases[database].hasTypes) {
|
if (databases[database].hasTypes) {
|
||||||
setTypes(diagram.types ?? []);
|
setTypes(
|
||||||
}
|
diagram.types.map((t) =>
|
||||||
if (databases[database].hasEnums) {
|
t.id
|
||||||
setEnums(diagram.enums ?? []);
|
? 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}`;
|
window.name = `d ${diagram.id}`;
|
||||||
setSaveState(State.SAVING);
|
setSaveState(State.SAVING);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { useDiagram, useEnums, useLayout, useUndoRedo } from "../../../hooks";
|
|||||||
import { Action, ObjectType } from "../../../data/constants";
|
import { Action, ObjectType } from "../../../data/constants";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
export default function EnumDetails({ data, i }) {
|
export default function EnumDetails({ data }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const { layout } = useLayout();
|
const { layout } = useLayout();
|
||||||
const { deleteEnum, updateEnum } = useEnums();
|
const { deleteEnum, updateEnum } = useEnums();
|
||||||
@@ -23,7 +23,7 @@ export default function EnumDetails({ data, i }) {
|
|||||||
placeholder={t("name")}
|
placeholder={t("name")}
|
||||||
validateStatus={data.name.trim() === "" ? "error" : "default"}
|
validateStatus={data.name.trim() === "" ? "error" : "default"}
|
||||||
onChange={(value) => {
|
onChange={(value) => {
|
||||||
updateEnum(i, { name: value });
|
updateEnum(data.id, { name: value });
|
||||||
tables.forEach((table) => {
|
tables.forEach((table) => {
|
||||||
table.fields.forEach((field) => {
|
table.fields.forEach((field) => {
|
||||||
if (field.type.toLowerCase() === data.name.toLowerCase()) {
|
if (field.type.toLowerCase() === data.name.toLowerCase()) {
|
||||||
@@ -52,7 +52,7 @@ export default function EnumDetails({ data, i }) {
|
|||||||
{
|
{
|
||||||
action: Action.EDIT,
|
action: Action.EDIT,
|
||||||
element: ObjectType.ENUM,
|
element: ObjectType.ENUM,
|
||||||
id: i,
|
id: data.id,
|
||||||
undo: editField,
|
undo: editField,
|
||||||
redo: { name: e.target.value },
|
redo: { name: e.target.value },
|
||||||
updatedFields,
|
updatedFields,
|
||||||
@@ -75,8 +75,7 @@ export default function EnumDetails({ data, i }) {
|
|||||||
validateStatus={data.values.length === 0 ? "error" : "default"}
|
validateStatus={data.values.length === 0 ? "error" : "default"}
|
||||||
onChange={(v) => {
|
onChange={(v) => {
|
||||||
if (layout.readOnly) return;
|
if (layout.readOnly) return;
|
||||||
|
updateEnum(data.id, { values: v });
|
||||||
updateEnum(i, { values: v });
|
|
||||||
}}
|
}}
|
||||||
onFocus={() => setEditField({ values: data.values })}
|
onFocus={() => setEditField({ values: data.values })}
|
||||||
onBlur={() => {
|
onBlur={() => {
|
||||||
@@ -87,7 +86,7 @@ export default function EnumDetails({ data, i }) {
|
|||||||
{
|
{
|
||||||
action: Action.EDIT,
|
action: Action.EDIT,
|
||||||
element: ObjectType.ENUM,
|
element: ObjectType.ENUM,
|
||||||
id: i,
|
id: data.id,
|
||||||
undo: editField,
|
undo: editField,
|
||||||
redo: { values: data.values },
|
redo: { values: data.values },
|
||||||
message: t("edit_enum", {
|
message: t("edit_enum", {
|
||||||
@@ -104,7 +103,7 @@ export default function EnumDetails({ data, i }) {
|
|||||||
type="danger"
|
type="danger"
|
||||||
icon={<IconDeleteStroked />}
|
icon={<IconDeleteStroked />}
|
||||||
disabled={layout.readOnly}
|
disabled={layout.readOnly}
|
||||||
onClick={() => deleteEnum(i, true)}
|
onClick={() => deleteEnum(data.id, true)}
|
||||||
>
|
>
|
||||||
{t("delete")}
|
{t("delete")}
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -30,18 +30,18 @@ export default function EnumsTab() {
|
|||||||
<Empty title={t("no_enums")} text={t("no_enums_text")} />
|
<Empty title={t("no_enums")} text={t("no_enums_text")} />
|
||||||
) : (
|
) : (
|
||||||
<Collapse accordion>
|
<Collapse accordion>
|
||||||
{enums.map((e, i) => (
|
{enums.map((e) => (
|
||||||
<Collapse.Panel
|
<Collapse.Panel
|
||||||
key={`enum_${i}`}
|
key={`enum_${e.id}`}
|
||||||
id={`scroll_enum_${i}`}
|
id={`scroll_enum_${e.id}`}
|
||||||
header={
|
header={
|
||||||
<div className="overflow-hidden text-ellipsis whitespace-nowrap">
|
<div className="overflow-hidden text-ellipsis whitespace-nowrap">
|
||||||
{e.name}
|
{e.name}
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
itemKey={`${i}`}
|
itemKey={e.id}
|
||||||
>
|
>
|
||||||
<EnumDetails data={e} i={i} />
|
<EnumDetails data={e} />
|
||||||
</Collapse.Panel>
|
</Collapse.Panel>
|
||||||
))}
|
))}
|
||||||
</Collapse>
|
</Collapse>
|
||||||
|
|||||||
@@ -30,9 +30,9 @@ export default function SearchBar() {
|
|||||||
emptyContent={<div className="p-3 popover-theme">{t("not_found")}</div>}
|
emptyContent={<div className="p-3 popover-theme">{t("not_found")}</div>}
|
||||||
onChange={(v) => setValue(v)}
|
onChange={(v) => setValue(v)}
|
||||||
onSelect={(v) => {
|
onSelect={(v) => {
|
||||||
const i = enums.findIndex((t) => t.name === v);
|
const e = enums.find((t) => t.name === v);
|
||||||
document
|
document
|
||||||
.getElementById(`scroll_enum_${i}`)
|
.getElementById(`scroll_enum_${e.id}`)
|
||||||
.scrollIntoView({ behavior: "smooth" });
|
.scrollIntoView({ behavior: "smooth" });
|
||||||
}}
|
}}
|
||||||
className="w-full"
|
className="w-full"
|
||||||
|
|||||||
@@ -216,7 +216,9 @@ export default function WorkSpace() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (databases[database].hasEnums) {
|
if (databases[database].hasEnums) {
|
||||||
setEnums(d.enums ?? []);
|
setEnums(
|
||||||
|
d.enums.map((e) => (!e.id ? { ...e, id: nanoid() } : e)) ?? [],
|
||||||
|
);
|
||||||
}
|
}
|
||||||
window.name = `d ${d.id}`;
|
window.name = `d ${d.id}`;
|
||||||
} else {
|
} else {
|
||||||
@@ -274,7 +276,11 @@ export default function WorkSpace() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (databases[database].hasEnums) {
|
if (databases[database].hasEnums) {
|
||||||
setEnums(diagram.enums ?? []);
|
setEnums(
|
||||||
|
diagram.enums.map((e) =>
|
||||||
|
!e.id ? { ...e, id: nanoid() } : e,
|
||||||
|
) ?? [],
|
||||||
|
);
|
||||||
}
|
}
|
||||||
window.name = `d ${diagram.id}`;
|
window.name = `d ${diagram.id}`;
|
||||||
} else {
|
} else {
|
||||||
@@ -329,7 +335,11 @@ export default function WorkSpace() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (databases[database].hasEnums) {
|
if (databases[database].hasEnums) {
|
||||||
setEnums(diagram.enums ?? []);
|
setEnums(
|
||||||
|
diagram.enums.map((e) =>
|
||||||
|
!e.id ? { ...e, id: nanoid() } : e,
|
||||||
|
) ?? [],
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (selectedDb === "") setShowSelectDbModal(true);
|
if (selectedDb === "") setShowSelectDbModal(true);
|
||||||
@@ -376,7 +386,11 @@ export default function WorkSpace() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (databases[parsedDiagram.database].hasEnums) {
|
if (databases[parsedDiagram.database].hasEnums) {
|
||||||
setEnums(parsedDiagram.enums ?? []);
|
setEnums(
|
||||||
|
parsedDiagram.enums.map((e) =>
|
||||||
|
!e.id ? { ...e, id: nanoid() } : e,
|
||||||
|
) ?? [],
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { Action, ObjectType } from "../data/constants";
|
|||||||
import { Toast } from "@douyinfe/semi-ui";
|
import { Toast } from "@douyinfe/semi-ui";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { useUndoRedo } from "../hooks";
|
import { useUndoRedo } from "../hooks";
|
||||||
|
import { nanoid } from "nanoid";
|
||||||
|
|
||||||
export const EnumsContext = createContext(null);
|
export const EnumsContext = createContext(null);
|
||||||
|
|
||||||
@@ -12,26 +13,29 @@ export default function EnumsContextProvider({ children }) {
|
|||||||
const { setUndoStack, setRedoStack } = useUndoRedo();
|
const { setUndoStack, setRedoStack } = useUndoRedo();
|
||||||
|
|
||||||
const addEnum = (data, addToHistory = true) => {
|
const addEnum = (data, addToHistory = true) => {
|
||||||
|
const newEnum = {
|
||||||
|
id: nanoid(),
|
||||||
|
name: `enum_${enums.length}`,
|
||||||
|
values: [],
|
||||||
|
};
|
||||||
if (data) {
|
if (data) {
|
||||||
setEnums((prev) => {
|
setEnums((prev) => {
|
||||||
const temp = prev.slice();
|
const temp = prev.slice();
|
||||||
temp.splice(data.id, 0, data);
|
temp.splice(data.index, 0, data.enum);
|
||||||
return temp;
|
return temp;
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
setEnums((prev) => [
|
setEnums((prev) => [...prev, newEnum]);
|
||||||
...prev,
|
|
||||||
{
|
|
||||||
name: `enum_${prev.length}`,
|
|
||||||
values: [],
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
if (addToHistory) {
|
if (addToHistory) {
|
||||||
setUndoStack((prev) => [
|
setUndoStack((prev) => [
|
||||||
...prev,
|
...prev,
|
||||||
{
|
{
|
||||||
action: Action.ADD,
|
action: Action.ADD,
|
||||||
|
data: {
|
||||||
|
index: enums.length,
|
||||||
|
enum: data?.enum ?? newEnum,
|
||||||
|
},
|
||||||
element: ObjectType.ENUM,
|
element: ObjectType.ENUM,
|
||||||
message: t("add_enum"),
|
message: t("add_enum"),
|
||||||
},
|
},
|
||||||
@@ -41,6 +45,7 @@ export default function EnumsContextProvider({ children }) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const deleteEnum = (id, addToHistory = true) => {
|
const deleteEnum = (id, addToHistory = true) => {
|
||||||
|
const enumIndex = enums.findIndex((e) => e.id === id);
|
||||||
if (addToHistory) {
|
if (addToHistory) {
|
||||||
Toast.success(t("enum_deleted"));
|
Toast.success(t("enum_deleted"));
|
||||||
setUndoStack((prev) => [
|
setUndoStack((prev) => [
|
||||||
@@ -48,21 +53,23 @@ export default function EnumsContextProvider({ children }) {
|
|||||||
{
|
{
|
||||||
action: Action.DELETE,
|
action: Action.DELETE,
|
||||||
element: ObjectType.ENUM,
|
element: ObjectType.ENUM,
|
||||||
id: id,
|
data: {
|
||||||
data: enums[id],
|
index: enumIndex,
|
||||||
|
enum: enums[enumIndex],
|
||||||
|
},
|
||||||
message: t("delete_enum", {
|
message: t("delete_enum", {
|
||||||
enumName: enums[id].name,
|
enumName: enums[enumIndex].name,
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
setRedoStack([]);
|
setRedoStack([]);
|
||||||
}
|
}
|
||||||
setEnums((prev) => prev.filter((_, i) => i !== id));
|
setEnums((prev) => prev.filter((e) => e.id !== id));
|
||||||
};
|
};
|
||||||
|
|
||||||
const updateEnum = (id, values) => {
|
const updateEnum = (id, values) => {
|
||||||
setEnums((prev) =>
|
setEnums((prev) =>
|
||||||
prev.map((e, i) => (i === id ? { ...e, ...values } : e)),
|
prev.map((e) => (e.id === id ? { ...e, ...values } : e)),
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -238,6 +238,7 @@ const en = {
|
|||||||
enum_w_no_name: "Found enum with no name",
|
enum_w_no_name: "Found enum with no name",
|
||||||
enum_w_no_values: "Found enum '{{enumName}}' with no values",
|
enum_w_no_values: "Found enum '{{enumName}}' with no values",
|
||||||
duplicate_enums: "Duplicate enums with the name '{{enumName}}'",
|
duplicate_enums: "Duplicate enums with the name '{{enumName}}'",
|
||||||
|
enum_deleted: "Enum deleted",
|
||||||
no_enums: "No enums",
|
no_enums: "No enums",
|
||||||
no_enums_text: "Define enums here",
|
no_enums_text: "Define enums here",
|
||||||
declare_array: "Declare array",
|
declare_array: "Declare array",
|
||||||
|
|||||||
Reference in New Issue
Block a user