Skip to content

Commit ed12e3b

Browse files
authored
Merge pull request #200 from tasnim0tantawi/mermaid-feature
Add export mermaid feature
2 parents 5565668 + 7dec05c commit ed12e3b

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

src/components/EditorHeader/ControlPanel.jsx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {
2929
jsonToSQLite,
3030
jsonToMariaDB,
3131
jsonToSQLServer,
32+
jsonToMermaid,
3233
} from "../../utils/exportSQL/generic";
3334
import {
3435
ObjectType,
@@ -1040,6 +1041,25 @@ export default function ControlPanel({
10401041
saveAs(blob, `${exportData.filename}.ddb`);
10411042
},
10421043
},
1044+
{
1045+
MERMAID: () => {
1046+
setModal(MODAL.CODE);
1047+
const result = jsonToMermaid({
1048+
tables: tables,
1049+
relationships: relationships,
1050+
notes: notes,
1051+
subjectAreas: areas,
1052+
database: database,
1053+
title: title,
1054+
});
1055+
// generate .md file
1056+
setExportData((prev) => ({
1057+
...prev,
1058+
data: result,
1059+
extension: "md",
1060+
}));
1061+
},
1062+
},
10431063
],
10441064
function: () => {},
10451065
},

src/utils/exportSQL/generic.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,3 +502,41 @@ export function jsonToSQLServer(obj) {
502502
)
503503
.join("\n")}`;
504504
}
505+
506+
export function jsonToMermaid(obj) {
507+
function getMermaidRelationship(relationship) {
508+
switch (relationship) {
509+
case "One to one":
510+
return "||--||";
511+
case "One to many":
512+
return "||--o{";
513+
case "Many to one":
514+
return "}o--||";
515+
default:
516+
return "--";
517+
}
518+
}
519+
const mermaidEntities = obj.tables
520+
.map((table) => {
521+
const fields = table.fields
522+
.map((field) => {
523+
const fieldType = getTypeString(field, obj.database, "mssql");
524+
return ` ${fieldType} ${field.name}`;
525+
})
526+
.join("\n");
527+
return ` ${table.name} {\n${fields}\n }`;
528+
})
529+
.join("\n\n");
530+
531+
const mermaidRelationships = obj.relationships?.length
532+
? obj.relationships
533+
.map((r) => {
534+
const startTable = obj.tables[r.startTableId].name;
535+
const endTable = obj.tables[r.endTableId].name;
536+
return ` ${startTable} ${getMermaidRelationship(r.cardinality)} ${endTable} : references`;
537+
})
538+
.join("\n")
539+
: "";
540+
541+
return `erDiagram\n${mermaidRelationships ? `${mermaidRelationships}\n\n` : ""}${mermaidEntities}`;
542+
}

0 commit comments

Comments
 (0)