diff --git a/src/components/EditorCanvas/Canvas.jsx b/src/components/EditorCanvas/Canvas.jsx
index 2a675167..78433e1f 100644
--- a/src/components/EditorCanvas/Canvas.jsx
+++ b/src/components/EditorCanvas/Canvas.jsx
@@ -284,7 +284,7 @@ export default function Canvas() {
};
const didPan = () =>
- !(transform.pan.x === panning.x && transform.pan.y === panning.y);
+ !(transform.pan.x === panning.panStart.x && transform.pan.y === panning.panStart.y);
const getMovedElementDetails = () => {
switch (dragging.element) {
@@ -345,7 +345,7 @@ export default function Canvas() {
...prev,
{
action: Action.PAN,
- undo: { x: panning.x, y: panning.y },
+ undo: { x: panning.panStart.x, y: panning.panStart.y },
redo: transform.pan,
message: t("move_element", {
coords: `(${transform?.pan.x}, ${transform?.pan.y})`,
diff --git a/src/components/EditorSidePanel/TablesTab/FieldDetails.jsx b/src/components/EditorSidePanel/TablesTab/FieldDetails.jsx
index f8445136..ef332f73 100644
--- a/src/components/EditorSidePanel/TablesTab/FieldDetails.jsx
+++ b/src/components/EditorSidePanel/TablesTab/FieldDetails.jsx
@@ -302,7 +302,7 @@ export default function FieldDetails({ data, tid, index }) {
{databases[database].hasUnsignedTypes &&
dbToTypes[database][data.type].signed && (
-
{t("Unsigned")}
+
{t("unsigned")}
{
+ setSelectedDb(selectedDb);
+ onOk(selectedDb);
+ }}
+ okButtonProps={{ disabled: selectedDb === "" }}
+ >
+
+ {Object.values(databases).map((x) => (
+
setSelectedDb(x.label)}
+ className={`space-y-3 py-3 px-4 rounded-md border-2 select-none ${
+ settings.mode === "dark"
+ ? "bg-zinc-700 hover:bg-zinc-600"
+ : "bg-zinc-100 hover:bg-zinc-200"
+ } ${selectedDb === x.label ? "border-zinc-400" : "border-transparent"}`}
+ >
+
{x.name}
+ {x.image && (
+

+ )}
+
{x.description}
+
+ ))}
+
+
+ );
+});
diff --git a/src/components/Workspace.jsx b/src/components/Workspace.jsx
index 1797851b..bc4711f8 100644
--- a/src/components/Workspace.jsx
+++ b/src/components/Workspace.jsx
@@ -19,7 +19,7 @@ import {
useEnums,
} from "../hooks";
import FloatingControls from "./FloatingControls";
-import { Modal } from "@douyinfe/semi-ui";
+import SelectDbModal from "./Modal/SelectDbModal";
import { useTranslation } from "react-i18next";
import { databases } from "../data/databases";
import { isRtl } from "../i18n/utils/rtl";
@@ -37,7 +37,6 @@ export default function WorkSpace() {
const [width, setWidth] = useState(340);
const [lastSaved, setLastSaved] = useState("");
const [showSelectDbModal, setShowSelectDbModal] = useState(false);
- const [selectedDb, setSelectedDb] = useState("");
const { layout } = useLayout();
const { settings } = useSettings();
const { types, setTypes } = useTypes();
@@ -56,7 +55,7 @@ export default function WorkSpace() {
setDatabase,
} = useDiagram();
const { undoStack, redoStack, setUndoStack, setRedoStack } = useUndoRedo();
- const { t, i18n } = useTranslation();
+ const { i18n } = useTranslation();
let [searchParams, setSearchParams] = useSearchParams();
const handleResize = (e) => {
if (!resize) return;
@@ -161,10 +160,10 @@ export default function WorkSpace() {
enums,
gistId,
loadedFromGistId,
- saveState
+ saveState,
]);
-
const load = useCallback(async () => {
+ let initDatabase = database;
const loadLatestDiagram = async () => {
await db.diagrams
.orderBy("lastModified")
@@ -195,24 +194,20 @@ export default function WorkSpace() {
window.name = `d ${d.id}`;
} else {
window.name = "";
- if (selectedDb === "") setShowSelectDbModal(true);
+ if (initDatabase === "") setShowSelectDbModal(true);
}
})
.catch((error) => {
console.log(error);
});
};
-
const loadDiagram = async (id) => {
await db.diagrams
.get(id)
.then((diagram) => {
if (diagram) {
- if (diagram.database) {
- setDatabase(diagram.database);
- } else {
- setDatabase(DB.GENERIC);
- }
+ initDatabase = diagram.database || DB.GENERIC;
+ setDatabase(initDatabase);
setId(diagram.id);
setGistId(diagram.gistId);
setLoadedFromGistId(diagram.loadedFromGistId);
@@ -228,10 +223,10 @@ export default function WorkSpace() {
});
setUndoStack([]);
setRedoStack([]);
- if (databases[database].hasTypes) {
+ if (databases[initDatabase].hasTypes) {
setTypes(diagram.types ?? []);
}
- if (databases[database].hasEnums) {
+ if (databases[initDatabase].hasEnums) {
setEnums(diagram.enums ?? []);
}
window.name = `d ${diagram.id}`;
@@ -267,19 +262,19 @@ export default function WorkSpace() {
});
setUndoStack([]);
setRedoStack([]);
- if (databases[database].hasTypes) {
+ if (databases[initDatabase].hasTypes) {
setTypes(diagram.types ?? []);
}
- if (databases[database].hasEnums) {
+ if (databases[initDatabase].hasEnums) {
setEnums(diagram.enums ?? []);
}
} else {
- if (selectedDb === "") setShowSelectDbModal(true);
+ if (initDatabase === "") setShowSelectDbModal(true);
}
})
.catch((error) => {
console.log(error);
- if (selectedDb === "") setShowSelectDbModal(true);
+ if (initDatabase === "") setShowSelectDbModal(true);
});
};
@@ -365,7 +360,6 @@ export default function WorkSpace() {
setDatabase,
database,
setEnums,
- selectedDb,
setSaveState,
searchParams,
]);
@@ -409,6 +403,14 @@ export default function WorkSpace() {
load();
}, [load]);
+ const handleSelectedDb = useCallback(
+ (selectedDb) => {
+ if (selectedDb === "") return;
+ setDatabase(selectedDb);
+ setShowSelectDbModal(false);
+ },
+ [setDatabase, setShowSelectDbModal],
+ );
return (
@@ -447,48 +449,10 @@ export default function WorkSpace() {
)}
- {
- if (selectedDb === "") return;
- setDatabase(selectedDb);
- setShowSelectDbModal(false);
- }}
- okButtonProps={{ disabled: selectedDb === "" }}
- >
-
- {Object.values(databases).map((x) => (
-
setSelectedDb(x.label)}
- className={`space-y-3 py-3 px-4 rounded-md border-2 select-none ${
- settings.mode === "dark"
- ? "bg-zinc-700 hover:bg-zinc-600"
- : "bg-zinc-100 hover:bg-zinc-200"
- } ${selectedDb === x.label ? "border-zinc-400" : "border-transparent"}`}
- >
-
{x.name}
- {x.image && (
-

- )}
-
{x.description}
-
- ))}
-
-
+
);
}
diff --git a/src/context/DiagramContext.jsx b/src/context/DiagramContext.jsx
index ffa49970..d37702c5 100644
--- a/src/context/DiagramContext.jsx
+++ b/src/context/DiagramContext.jsx
@@ -8,7 +8,7 @@ export const DiagramContext = createContext(null);
export default function DiagramContextProvider({ children }) {
const { t } = useTranslation();
- const [database, setDatabase] = useState(DB.GENERIC);
+ const [database, setDatabase] = useState("");
const [tables, setTables] = useState([]);
const [relationships, setRelationships] = useState([]);
const { transform } = useTransform();
diff --git a/src/i18n/locales/zh-tw.js b/src/i18n/locales/zh-tw.js
index f9cae242..259c1d10 100644
--- a/src/i18n/locales/zh-tw.js
+++ b/src/i18n/locales/zh-tw.js
@@ -235,6 +235,7 @@ const zh_tw = {
declare_array: "宣告陣列",
empty_index_name: "在表格 '{{tableName}}' 中宣告了一個沒有名稱的索引",
didnt_find_diagram: "糟糕!找不到圖表。",
+ unsigned: "無符號",
},
};
diff --git a/src/i18n/locales/zh.js b/src/i18n/locales/zh.js
index 9c8fb810..4323585c 100644
--- a/src/i18n/locales/zh.js
+++ b/src/i18n/locales/zh.js
@@ -207,6 +207,10 @@ const zh = {
edit_relationship: "{{extra}} 编辑关系 {{refName}}",
delete_relationship: "删除关系 {{refName}}",
not_found: "未找到",
+ pick_db: "选择数据库",
+ generic: "通用的",
+ generic_description: "通用的图表可以导出为任何SQL风格,但支持的数据类型较少。",
+ unsigned: "无符号",
},
};