Skip to content

Commit 47ef0df

Browse files
committed
Merge branch 'main' into share
2 parents 877ec72 + c03202f commit 47ef0df

File tree

7 files changed

+97
-3
lines changed

7 files changed

+97
-3
lines changed

src/components/EditorHeader/ControlPanel.jsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ import { exportSQL } from "../../utils/exportSQL";
7171
import { databases } from "../../data/databases";
7272
import { jsonToMermaid } from "../../utils/exportAs/mermaid";
7373
import { isRtl } from "../../i18n/utils/rtl";
74+
import { jsonToDocumentation } from "../../utils/exportAs/documentation";
7475
import { IdContext } from "../Workspace";
7576

7677
export default function ControlPanel({
@@ -1065,6 +1066,26 @@ export default function ControlPanel({
10651066
}));
10661067
},
10671068
},
1069+
{
1070+
readme: () => {
1071+
setModal(MODAL.CODE);
1072+
const result = jsonToDocumentation({
1073+
tables: tables,
1074+
relationships: relationships,
1075+
notes: notes,
1076+
subjectAreas: areas,
1077+
database: database,
1078+
title: title,
1079+
...(databases[database].hasTypes && { types: types }),
1080+
...(databases[database].hasEnums && { enums: enums }),
1081+
});
1082+
setExportData((prev) => ({
1083+
...prev,
1084+
data: result,
1085+
extension: "md",
1086+
}));
1087+
}
1088+
},
10681089
],
10691090
function: () => {},
10701091
},

src/i18n/locales/en.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ const en = {
238238
unsigned: "Unsigned",
239239
share: "Share",
240240
copy_link: "Copy link",
241+
readme: "README",
241242
},
242243
};
243244

src/i18n/locales/es.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ const es = {
212212
edit_relationship: "{{extra}} Editar relación {{refName}}",
213213
delete_relationship: "Eliminar relación {{refName}}",
214214
not_found: "No encontrado",
215+
readme: "README",
215216
},
216217
};
217218

src/i18n/locales/fr.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ const fr = {
217217
edit_relationship: "{{extra}} Modifier la relation {{refName}}",
218218
delete_relationship: "Supprimer la relation {{refName}}",
219219
not_found: "Non trouvé",
220+
readme: "README",
220221
},
221222
};
222223

src/utils/exportAs/documentation.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { dbToTypes } from "../../data/datatypes";
2+
import { jsonToMermaid } from "./mermaid";
3+
import { databases } from "../../data/databases";
4+
5+
export function jsonToDocumentation(obj) {
6+
7+
const documentationSummary = obj.tables
8+
.map((table) => {
9+
return `\t- [${table.name}](#${table.name})`;
10+
}).join("\n");
11+
12+
const documentationEntities = obj.tables
13+
.map((table) => {
14+
let enums = "";
15+
let indexes = table.indices.length > 0 ? table.indices.map((index) => {
16+
return `| ${index.name} | ${index.unique ? "✅" : ""} | ${index.fields.join(", ")} |`;
17+
}).join("\n") : "";
18+
const fields = table.fields
19+
.map((field) => {
20+
const fieldType =
21+
field.type +
22+
((dbToTypes[obj.database][field.type].isSized ||
23+
dbToTypes[obj.database][field.type].hasPrecision) &&
24+
field.size &&
25+
field.size !== ""
26+
? "(" + field.size + ")"
27+
: "");
28+
enums += (field.type === "ENUM" && field.values && field.values.length > 0) ?
29+
`##### ${field.name}\n\n${field.values.map((index) => `- ${index}`).join("\n")}\n` : "";
30+
return `| **${field.name}** | ${fieldType} | ${field.primary ? "🔑 PK, " : ""}` +
31+
`${field.nullable ? "null " : "not null "}${field.unique ? ", unique" : ""}${field.increment?", autoincrement":""}` +
32+
`${field.default ? `, default: ${field.default}` : ""} | ` +
33+
`${relationshipByField(table.id, obj.relationships, field.id)}` +
34+
` |${field.comment ? field.comment : ""} |`;
35+
}).join("\n");
36+
return `### ${table.name}\n${table.comment ? table.comment : ""}\n` +
37+
`| Name | Type | Settings | References | Note |\n` +
38+
`|-------------|---------------|-------------------------------|-------------------------------|--------------------------------|\n` +
39+
`${fields} \n${enums.length > 0 ? "\n#### Enums\n" + enums : ""}\n` +
40+
`${indexes.length > 0 ? "\n#### Indexes\n| Name | Unique | Fields |\n|------|--------|--------|\n" + indexes : ""}`;
41+
}).join("\n");
42+
43+
function relationshipByField(table, relationships, fieldId) {
44+
return relationships.filter(r => r.startTableId === table && r.startFieldId === fieldId)
45+
.map((rel) => rel.name);
46+
47+
}
48+
49+
const documentationRelationships = obj.relationships?.length
50+
? obj.relationships
51+
.map((r) => {
52+
const startTable = obj.tables[r.startTableId].name;
53+
const endTable = obj.tables[r.endTableId].name;
54+
return `- **${startTable} to ${endTable}**: ${r.cardinality}\n`;
55+
}).join("") : "";
56+
57+
const documentationTypes = databases[obj.database].hasTypes && obj.types.length > 0 ? obj.types.map((type) => {
58+
return `| Name | fields | Note |\n` +
59+
`|-------------|---------------|--------------------------------|\n` +
60+
`| ${type.name} | ${type.fields.map((field) => field.name).join(", ")} | ${type.comment ? type.comment : ""} |`;
61+
}).join("\n") : "";
62+
63+
return `# ${obj.title} documentation\n## Summary\n\n- [Introduction](#introduction)\n- [Database Type](#database-type)\n`+
64+
`- [Table Structure](#table-structure)\n${documentationSummary}\n- [Relationships](#relationships)\n- [Database Diagram](#database-Diagram)\n\n`+
65+
`## Introduction\n\n## Database type\n\n- **Database system:** `+
66+
`${databases[obj.database].name}\n## Table structure\n\n${documentationEntities}`+
67+
`\n## Relationships\n\n${documentationRelationships}\n` +
68+
`${databases[obj.database].hasTypes && obj.types.length > 0 ? `## Types\n\n` + documentationTypes + `\n\n` : "" }` +
69+
`## Database Diagram\n\n\`\`\`mermaid\n${jsonToMermaid(obj)}\n\`\`\``;
70+
}

src/utils/exportSQL/mariadb.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { exportFieldComment, parseDefault } from "./shared";
1+
import { parseDefault } from "./shared";
22

33
import { dbToTypes } from "../../data/datatypes";
44

@@ -9,7 +9,7 @@ export function toMariaDB(diagram) {
99
`CREATE OR REPLACE TABLE \`${table.name}\` (\n${table.fields
1010
.map(
1111
(field) =>
12-
`${exportFieldComment(field.comment)}\t\`${
12+
`\t\`${
1313
field.name
1414
}\` ${field.type}${field.unsigned ? " UNSIGNED" : ""}${field.notNull ? " NOT NULL" : ""}${
1515
field.increment ? " AUTO_INCREMENT" : ""

src/utils/exportSQL/mysql.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export function toMySQL(diagram) {
99
`CREATE TABLE \`${table.name}\` (\n${table.fields
1010
.map(
1111
(field) =>
12-
`\` ${field.type}${field.unsigned ? " UNSIGNED" : ""}${field.size !== undefined && field.size !== "" ? "(" + field.size + ")" : ""}${
12+
`\t\`${field.name}\` ${field.type}${field.unsigned ? " UNSIGNED" : ""}${field.size !== undefined && field.size !== "" ? "(" + field.size + ")" : ""}${
1313
field.notNull ? " NOT NULL" : ""
1414
}${
1515
field.increment ? " AUTO_INCREMENT" : ""

0 commit comments

Comments
 (0)