diff --git a/src/components/EditorHeader/ControlPanel.jsx b/src/components/EditorHeader/ControlPanel.jsx index 98fa511..d4bcbee 100644 --- a/src/components/EditorHeader/ControlPanel.jsx +++ b/src/components/EditorHeader/ControlPanel.jsx @@ -29,6 +29,7 @@ import { jsonToSQLite, jsonToMariaDB, jsonToSQLServer, + jsonToMermaid, } from "../../utils/exportSQL/generic"; import { ObjectType, @@ -1040,6 +1041,25 @@ export default function ControlPanel({ saveAs(blob, `${exportData.filename}.ddb`); }, }, + { + MERMAID: () => { + setModal(MODAL.CODE); + const result = jsonToMermaid({ + tables: tables, + relationships: relationships, + notes: notes, + subjectAreas: areas, + database: database, + title: title, + }); + // generate .md file + setExportData((prev) => ({ + ...prev, + data: result, + extension: "md", + })); + }, + }, ], function: () => {}, }, diff --git a/src/utils/exportSQL/generic.js b/src/utils/exportSQL/generic.js index 8aa2a04..7a44b67 100644 --- a/src/utils/exportSQL/generic.js +++ b/src/utils/exportSQL/generic.js @@ -502,3 +502,41 @@ export function jsonToSQLServer(obj) { ) .join("\n")}`; } + +export function jsonToMermaid(obj) { + function getMermaidRelationship(relationship) { + switch (relationship) { + case "One to one": + return "||--||"; + case "One to many": + return "||--o{"; + case "Many to one": + return "}o--||"; + default: + return "--"; + } + } + const mermaidEntities = obj.tables + .map((table) => { + const fields = table.fields + .map((field) => { + const fieldType = getTypeString(field, obj.database, "mssql"); + return ` ${fieldType} ${field.name}`; + }) + .join("\n"); + return ` ${table.name} {\n${fields}\n }`; + }) + .join("\n\n"); + + const mermaidRelationships = obj.relationships?.length + ? obj.relationships + .map((r) => { + const startTable = obj.tables[r.startTableId].name; + const endTable = obj.tables[r.endTableId].name; + return ` ${startTable} ${getMermaidRelationship(r.cardinality)} ${endTable} : references`; + }) + .join("\n") + : ""; + + return `erDiagram\n${mermaidRelationships ? `${mermaidRelationships}\n\n` : ""}${mermaidEntities}`; +}