From 1430db881c5c950cb93629afa8e93acead1aca28 Mon Sep 17 00:00:00 2001 From: 1ilit Date: Wed, 3 Jul 2024 13:25:24 +0300 Subject: [PATCH] Export and import enums in diagrams --- src/components/EditorHeader/ControlPanel.jsx | 13 ++++++++----- .../EditorHeader/Modal/ImportDiagram.jsx | 14 ++++++++++++-- src/data/schemas.js | 19 +++++++++++++++++++ 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/components/EditorHeader/ControlPanel.jsx b/src/components/EditorHeader/ControlPanel.jsx index e064cf7..0d2de9c 100644 --- a/src/components/EditorHeader/ControlPanel.jsx +++ b/src/components/EditorHeader/ControlPanel.jsx @@ -65,6 +65,7 @@ import Sidesheet from "./SideSheet/Sidesheet"; import Modal from "./Modal/Modal"; import { useTranslation } from "react-i18next"; import { exportSQL } from "../../utils/exportSQL"; +import { databases } from "../../data/databases"; export default function ControlPanel({ diagramId, @@ -100,7 +101,7 @@ export default function ControlPanel({ deleteRelationship, database, } = useTables(); - const { enums } = useEnums(); + const { enums, setEnums } = useEnums(); const { types, addType, deleteType, updateType, setTypes } = useTypes(); const { notes, setNotes, updateNote, addNote, deleteNote } = useNotes(); const { areas, setAreas, updateArea, addArea, deleteArea } = useAreas(); @@ -116,7 +117,7 @@ export default function ControlPanel({ const undo = () => { if (undoStack.length === 0) return; const a = undoStack[undoStack.length - 1]; - setUndoStack((prev) => prev.filter((e, i) => i !== prev.length - 1)); + setUndoStack((prev) => prev.filter((_, i) => i !== prev.length - 1)); if (a.action === Action.ADD) { if (a.element === ObjectType.TABLE) { deleteTable(tables[tables.length - 1].id, false); @@ -732,6 +733,7 @@ export default function ControlPanel({ setAreas([]); setNotes([]); setTypes([]); + setEnums([]); setUndoStack([]); setRedoStack([]); }) @@ -919,7 +921,8 @@ export default function ControlPanel({ relationships: relationships, notes: notes, subjectAreas: areas, - types: types, + ...(databases[database].hasTypes && { types: types }), + ...(databases[database].hasEnums && { enums: enums }), title: title, }, null, @@ -978,8 +981,8 @@ export default function ControlPanel({ relationships: relationships, notes: notes, subjectAreas: areas, - types: types, - }, + ...(databases[database].hasTypes && { types: types }), + ...(databases[database].hasEnums && { enums: enums }), }, null, 2, ); diff --git a/src/components/EditorHeader/Modal/ImportDiagram.jsx b/src/components/EditorHeader/Modal/ImportDiagram.jsx index d4a8d27..6eaa53a 100644 --- a/src/components/EditorHeader/Modal/ImportDiagram.jsx +++ b/src/components/EditorHeader/Modal/ImportDiagram.jsx @@ -4,13 +4,21 @@ import { } from "../../../utils/validateSchema"; import { Upload, Banner } from "@douyinfe/semi-ui"; import { STATUS } from "../../../data/constants"; -import { useAreas, useNotes, useTables } from "../../../hooks"; +import { + useAreas, + useEnums, + useNotes, + useTables, + useTypes, +} from "../../../hooks"; import { useTranslation } from "react-i18next"; export default function ImportDiagram({ setImportData, error, setError }) { const { areas } = useAreas(); const { notes } = useNotes(); const { tables, relationships } = useTables(); + const { types } = useTypes(); + const { enums } = useEnums(); const { t } = useTranslation(); const diagramIsEmpty = () => { @@ -18,7 +26,9 @@ export default function ImportDiagram({ setImportData, error, setError }) { tables.length === 0 && relationships.length === 0 && notes.length === 0 && - areas.length === 0 + areas.length === 0 && + types.length === 0 && + enums.length === 0 ); }; diff --git a/src/data/schemas.js b/src/data/schemas.js index eab9578..bc81855 100644 --- a/src/data/schemas.js +++ b/src/data/schemas.js @@ -108,6 +108,17 @@ export const typeSchema = { required: ["name", "fields", "comment"], }; +export const enumSchema = { + type: "object", + properties: { + name: { type: "string" }, + values: { + type: "array", + items: { type: "string" }, + }, + }, +}; + export const jsonSchema = { type: "object", properties: { @@ -151,6 +162,14 @@ export const jsonSchema = { type: "array", items: { ...areaSchema }, }, + types: { + type: "array", + items: { ...typeSchema }, + }, + enums: { + type: "array", + items: { ...enumSchema }, + }, title: { type: "string" }, }, required: ["tables", "relationships", "notes", "subjectAreas"],