diff --git a/src/components/CodeEditor/index.jsx b/src/components/CodeEditor/index.jsx index 2bed7942..df34824e 100644 --- a/src/components/CodeEditor/index.jsx +++ b/src/components/CodeEditor/index.jsx @@ -6,7 +6,11 @@ import { IconCopy } from "@douyinfe/semi-icons"; import { setUpDBML } from "./setUpDBML"; import "./styles.css"; -export default function CodeEditor({ showCopyButton, ...props }) { +export default function CodeEditor({ + showCopyButton, + extraControls, + ...props +}) { const { settings } = useSettings(); const { database } = useDiagram(); const { t } = useTranslation(); @@ -29,18 +33,21 @@ export default function CodeEditor({ showCopyButton, ...props }) { }; return ( -
+
{showCopyButton && ( -
)}
); diff --git a/src/components/EditorHeader/ControlPanel.jsx b/src/components/EditorHeader/ControlPanel.jsx index e485806d..de02a830 100644 --- a/src/components/EditorHeader/ControlPanel.jsx +++ b/src/components/EditorHeader/ControlPanel.jsx @@ -494,6 +494,9 @@ export default function ControlPanel({ const viewStrictMode = () => { setSettings((prev) => ({ ...prev, strictMode: !prev.strictMode })); }; + const toggleDBMLEditor = () => { + setLayout((prev) => ({ ...prev, dbmlEditor: !prev.dbmlEditor })); + }; const viewFieldSummary = () => { setSettings((prev) => ({ ...prev, @@ -1218,6 +1221,15 @@ export default function ControlPanel({ function: () => setLayout((prev) => ({ ...prev, issues: !prev.issues })), }, + dbml_view: { + state: layout.dbmlEditor ? ( + + ) : ( + + ), + function: toggleDBMLEditor, + shortcut: "Alt+E", + }, strict_mode: { state: settings.strictMode ? ( @@ -1446,6 +1458,7 @@ export default function ControlPanel({ preventDefault: true, }); useHotkeys("mod+alt+w", fitWindow, { preventDefault: true }); + useHotkeys("alt+e", toggleDBMLEditor, { preventDefault: true }); return ( <> @@ -1492,7 +1505,7 @@ export default function ControlPanel({ function toolbar() { return (
diff --git a/src/components/EditorSidePanel/DBMLEditor/DBMLEditor.jsx b/src/components/EditorSidePanel/DBMLEditor/DBMLEditor.jsx new file mode 100644 index 00000000..30745f03 --- /dev/null +++ b/src/components/EditorSidePanel/DBMLEditor/DBMLEditor.jsx @@ -0,0 +1,43 @@ +import { useEffect, useState } from "react"; +import { useDiagram, useEnums, useLayout } from "../../../hooks"; +import { toDBML } from "../../../utils/exportAs/dbml"; +import CodeEditor from "../../CodeEditor"; +import { Button, Tooltip } from "@douyinfe/semi-ui"; +import { IconTemplate } from "@douyinfe/semi-icons"; +import { useTranslation } from "react-i18next"; + +export default function DBMLEditor() { + const { tables: currentTables, relationships } = useDiagram(); + const diagram = useDiagram(); + const { enums } = useEnums(); + const [value, setValue] = useState(() => toDBML({ ...diagram, enums })); + const { setLayout } = useLayout(); + const { t } = useTranslation(); + + const toggleDBMLEditor = () => { + setLayout((prev) => ({ ...prev, dbmlEditor: !prev.dbmlEditor })); + }; + + useEffect(() => { + setValue(toDBML({ tables: currentTables, enums, relationships })); + }, [currentTables, enums, relationships]); + + return ( + +
{layout.issues && (
- +
)}
diff --git a/src/context/LayoutContext.jsx b/src/context/LayoutContext.jsx index cfb48360..5349b044 100644 --- a/src/context/LayoutContext.jsx +++ b/src/context/LayoutContext.jsx @@ -8,6 +8,7 @@ export default function LayoutContextProvider({ children }) { sidebar: true, issues: true, toolbar: true, + dbmlEditor: false, }); return ( diff --git a/src/data/constants.js b/src/data/constants.js index 6020db45..39738ee3 100644 --- a/src/data/constants.js +++ b/src/data/constants.js @@ -106,6 +106,11 @@ export const DB = { GENERIC: "generic", }; +export const ErrorType = { + DIAGRAM: "diagram", + DBML: "dbml", +}; + export const IMPORT_FROM = { JSON: 0, DBML: 1, diff --git a/src/i18n/locales/en.js b/src/i18n/locales/en.js index 5dc8ed4c..96ecf99a 100644 --- a/src/i18n/locales/en.js +++ b/src/i18n/locales/en.js @@ -251,6 +251,8 @@ const en = { bulk_update: "Bulk update", multiselect: "Multiselect", export_saved_data: "Export saved data", + dbml_view: "DBML view", + tab_view: "Tab view", }, }; diff --git a/src/index.css b/src/index.css index 976ecf3e..330fe1a2 100644 --- a/src/index.css +++ b/src/index.css @@ -67,7 +67,7 @@ background-color: rgba(var(--semi-blue-6), 1); } -.semi-spin-wrapper{ +.semi-spin-wrapper { color: inherit; } @@ -119,7 +119,7 @@ } .toolbar-theme { - background-color: rgba(var(--semi-grey-1), 1); + background-color: rgba(var(--semi-grey-1), 0.7); } .hover-1:hover { diff --git a/src/utils/exportAs/dbml.js b/src/utils/exportAs/dbml.js index 736df391..2e150a8f 100644 --- a/src/utils/exportAs/dbml.js +++ b/src/utils/exportAs/dbml.js @@ -3,7 +3,10 @@ import i18n from "../../i18n/i18n"; import { escapeQuotes, parseDefault } from "../exportSQL/shared"; function columnDefault(field, database) { - if (!field.default || field.default.trim() === "") { + if ( + !field.default || + (typeof field.default === "string" && field.default.trim() === "") + ) { return ""; } diff --git a/src/utils/importFrom/dbml.js b/src/utils/importFrom/dbml.js index 3157f104..51459b60 100644 --- a/src/utils/importFrom/dbml.js +++ b/src/utils/importFrom/dbml.js @@ -28,7 +28,7 @@ export function fromDBML(src) { field.id = nanoid(); field.name = column.name; field.type = column.type.type_name.toUpperCase(); - field.default = column.dbdefault ?? ""; + field.default = column.dbdefault?.value ?? ""; field.check = ""; field.primary = !!column.pk; field.unique = !!column.pk; diff --git a/src/utils/issues.js b/src/utils/issues.js index ceb25c72..d5f54c0f 100644 --- a/src/utils/issues.js +++ b/src/utils/issues.js @@ -7,7 +7,12 @@ function checkDefault(field, database) { if (isFunction(field.default)) return true; - if (!field.notNull && field.default.toLowerCase() === "null") return true; + if ( + !field.notNull && + typeof field.default === "string" && + field.default.toLowerCase() === "null" + ) + return true; if (!dbToTypes[database][field.type].checkDefault) return true; diff --git a/src/utils/utils.js b/src/utils/utils.js index 553c3401..1d93e7a1 100644 --- a/src/utils/utils.js +++ b/src/utils/utils.js @@ -30,7 +30,8 @@ export function strHasQuotes(str) { const keywords = ["CURRENT_TIMESTAMP", "NULL"]; export function isKeyword(str) { - return keywords.includes(str.toUpperCase()); + if (typeof str === "string") return keywords.includes(str.toUpperCase()); + return false; } export function isFunction(str) {