mirror of
https://github.com/drawdb-io/drawdb.git
synced 2025-05-24 18:39:12 +00:00
update ui and fix ddb files loading logic
This commit is contained in:
parent
8d9939e4de
commit
c34d475029
@ -5,7 +5,6 @@ import Survey from "./pages/Survey";
|
|||||||
import BugReport from "./pages/BugReport";
|
import BugReport from "./pages/BugReport";
|
||||||
import Shortcuts from "./pages/Shortcuts";
|
import Shortcuts from "./pages/Shortcuts";
|
||||||
import Templates from "./pages/Templates";
|
import Templates from "./pages/Templates";
|
||||||
import LandingPage from "./pages/LandingPage";
|
|
||||||
import SettingsContextProvider from "./context/SettingsContext";
|
import SettingsContextProvider from "./context/SettingsContext";
|
||||||
import { useSettings } from "./hooks";
|
import { useSettings } from "./hooks";
|
||||||
import NotFound from "./pages/NotFound";
|
import NotFound from "./pages/NotFound";
|
||||||
@ -16,9 +15,8 @@ export default function App() {
|
|||||||
<BrowserRouter>
|
<BrowserRouter>
|
||||||
<RestoreScroll />
|
<RestoreScroll />
|
||||||
<Routes>
|
<Routes>
|
||||||
<Route path="/" element={<LandingPage />} />
|
|
||||||
<Route
|
<Route
|
||||||
path="/editor"
|
path="/"
|
||||||
element={
|
element={
|
||||||
<ThemedPage>
|
<ThemedPage>
|
||||||
<Editor />
|
<Editor />
|
||||||
|
@ -3,8 +3,6 @@ import {
|
|||||||
IconCaretdown,
|
IconCaretdown,
|
||||||
IconChevronRight,
|
IconChevronRight,
|
||||||
IconChevronLeft,
|
IconChevronLeft,
|
||||||
IconChevronUp,
|
|
||||||
IconChevronDown,
|
|
||||||
IconSaveStroked,
|
IconSaveStroked,
|
||||||
IconUndo,
|
IconUndo,
|
||||||
IconRedo,
|
IconRedo,
|
||||||
@ -118,8 +116,6 @@ export default function ControlPanel({
|
|||||||
const { setGistId } = useContext(IdContext);
|
const { setGistId } = useContext(IdContext);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const invertLayout = (component) =>
|
|
||||||
setLayout((prev) => ({ ...prev, [component]: !prev[component] }));
|
|
||||||
|
|
||||||
const undo = () => {
|
const undo = () => {
|
||||||
if (undoStack.length === 0) return;
|
if (undoStack.length === 0) return;
|
||||||
@ -776,7 +772,7 @@ export default function ControlPanel({
|
|||||||
.delete(diagramId)
|
.delete(diagramId)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
setDiagramId(0);
|
setDiagramId(0);
|
||||||
setTitle("Untitled diagram");
|
setTitle("user-diagram");
|
||||||
setTables([]);
|
setTables([]);
|
||||||
setRelationships([]);
|
setRelationships([]);
|
||||||
setAreas([]);
|
setAreas([]);
|
||||||
@ -1563,31 +1559,18 @@ export default function ControlPanel({
|
|||||||
<i className="fa-regular fa-calendar-check" />
|
<i className="fa-regular fa-calendar-check" />
|
||||||
</button>
|
</button>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Divider layout="vertical" margin="8px" />
|
|
||||||
<Tooltip content={t("theme")} position="bottom">
|
|
||||||
<button
|
|
||||||
className="py-1 px-2 hover-2 rounded text-xl -mt-0.5"
|
|
||||||
onClick={() => {
|
|
||||||
const body = document.body;
|
|
||||||
if (body.hasAttribute("theme-mode")) {
|
|
||||||
if (body.getAttribute("theme-mode") === "light") {
|
|
||||||
menu["view"]["theme"].children[1]["dark"]();
|
|
||||||
} else {
|
|
||||||
menu["view"]["theme"].children[0]["light"]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<i className="fa-solid fa-circle-half-stroke" />
|
|
||||||
</button>
|
|
||||||
</Tooltip>
|
|
||||||
</div>
|
</div>
|
||||||
<button
|
<Button
|
||||||
onClick={() => invertLayout("header")}
|
size="small"
|
||||||
className="flex items-center"
|
type="tertiary"
|
||||||
|
icon={
|
||||||
|
saveState === State.LOADING || saveState === State.SAVING ? (
|
||||||
|
<Spin size="small" />
|
||||||
|
) : null
|
||||||
|
}
|
||||||
>
|
>
|
||||||
{layout.header ? <IconChevronUp /> : <IconChevronDown />}
|
{getState()}
|
||||||
</button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -27,14 +27,6 @@ export default function LayoutDropdown() {
|
|||||||
}}
|
}}
|
||||||
render={
|
render={
|
||||||
<Dropdown.Menu>
|
<Dropdown.Menu>
|
||||||
<Dropdown.Item
|
|
||||||
icon={
|
|
||||||
layout.header ? <IconCheckboxTick /> : <div className="px-2" />
|
|
||||||
}
|
|
||||||
onClick={() => invertLayout("header")}
|
|
||||||
>
|
|
||||||
{t("header")}
|
|
||||||
</Dropdown.Item>
|
|
||||||
<Dropdown.Item
|
<Dropdown.Item
|
||||||
icon={
|
icon={
|
||||||
layout.sidebar ? <IconCheckboxTick /> : <div className="px-2" />
|
layout.sidebar ? <IconCheckboxTick /> : <div className="px-2" />
|
||||||
|
@ -32,7 +32,7 @@ export default function WorkSpace() {
|
|||||||
const [id, setId] = useState(0);
|
const [id, setId] = useState(0);
|
||||||
const [gistId, setGistId] = useState("");
|
const [gistId, setGistId] = useState("");
|
||||||
const [loadedFromGistId, setLoadedFromGistId] = useState("");
|
const [loadedFromGistId, setLoadedFromGistId] = useState("");
|
||||||
const [title, setTitle] = useState("Untitled Diagram");
|
const [title, setTitle] = useState("user-diagram");
|
||||||
const [resize, setResize] = useState(false);
|
const [resize, setResize] = useState(false);
|
||||||
const [width, setWidth] = useState(340);
|
const [width, setWidth] = useState(340);
|
||||||
const [lastSaved, setLastSaved] = useState("");
|
const [lastSaved, setLastSaved] = useState("");
|
||||||
@ -203,121 +203,8 @@ export default function WorkSpace() {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const loadDiagram = async (id) => {
|
|
||||||
await db.diagrams
|
|
||||||
.get(id)
|
|
||||||
.then((diagram) => {
|
|
||||||
if (diagram) {
|
|
||||||
if (diagram.database) {
|
|
||||||
setDatabase(diagram.database);
|
|
||||||
} else {
|
|
||||||
setDatabase(DB.GENERIC);
|
|
||||||
}
|
|
||||||
setId(diagram.id);
|
|
||||||
setGistId(diagram.gistId);
|
|
||||||
setLoadedFromGistId(diagram.loadedFromGistId);
|
|
||||||
setTitle(diagram.name);
|
|
||||||
setTables(diagram.tables);
|
|
||||||
setRelationships(diagram.references);
|
|
||||||
setAreas(diagram.areas);
|
|
||||||
setNotes(diagram.notes);
|
|
||||||
setTasks(diagram.todos ?? []);
|
|
||||||
setTransform({
|
|
||||||
pan: diagram.pan,
|
|
||||||
zoom: diagram.zoom,
|
|
||||||
});
|
|
||||||
setUndoStack([]);
|
|
||||||
setRedoStack([]);
|
|
||||||
if (databases[database].hasTypes) {
|
|
||||||
setTypes(diagram.types ?? []);
|
|
||||||
}
|
|
||||||
if (databases[database].hasEnums) {
|
|
||||||
setEnums(diagram.enums ?? []);
|
|
||||||
}
|
|
||||||
window.name = `d ${diagram.id}`;
|
|
||||||
} else {
|
|
||||||
window.name = "";
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch((error) => {
|
|
||||||
console.log(error);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const loadTemplate = async (id) => {
|
|
||||||
await db.templates
|
|
||||||
.get(id)
|
|
||||||
.then((diagram) => {
|
|
||||||
if (diagram) {
|
|
||||||
if (diagram.database) {
|
|
||||||
setDatabase(diagram.database);
|
|
||||||
} else {
|
|
||||||
setDatabase(DB.GENERIC);
|
|
||||||
}
|
|
||||||
setId(diagram.id);
|
|
||||||
setTitle(diagram.title);
|
|
||||||
setTables(diagram.tables);
|
|
||||||
setRelationships(diagram.relationships);
|
|
||||||
setAreas(diagram.subjectAreas);
|
|
||||||
setTasks(diagram.todos ?? []);
|
|
||||||
setNotes(diagram.notes);
|
|
||||||
setTransform({
|
|
||||||
zoom: 1,
|
|
||||||
pan: { x: 0, y: 0 },
|
|
||||||
});
|
|
||||||
setUndoStack([]);
|
|
||||||
setRedoStack([]);
|
|
||||||
if (databases[database].hasTypes) {
|
|
||||||
setTypes(diagram.types ?? []);
|
|
||||||
}
|
|
||||||
if (databases[database].hasEnums) {
|
|
||||||
setEnums(diagram.enums ?? []);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (selectedDb === "") setShowSelectDbModal(true);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch((error) => {
|
|
||||||
console.log(error);
|
|
||||||
if (selectedDb === "") setShowSelectDbModal(true);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
if (window.name === "") {
|
|
||||||
loadLatestDiagram();
|
loadLatestDiagram();
|
||||||
} else {
|
}, [setTransform, setRelationships, setTables, setAreas, setNotes, setTypes, setTasks, setDatabase, database, setEnums, selectedDb]);
|
||||||
const name = window.name.split(" ");
|
|
||||||
const op = name[0];
|
|
||||||
const id = parseInt(name[1]);
|
|
||||||
switch (op) {
|
|
||||||
case "d": {
|
|
||||||
loadDiagram(id);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "t":
|
|
||||||
case "lt": {
|
|
||||||
loadTemplate(id);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, [
|
|
||||||
setTransform,
|
|
||||||
setRedoStack,
|
|
||||||
setUndoStack,
|
|
||||||
setRelationships,
|
|
||||||
setTables,
|
|
||||||
setAreas,
|
|
||||||
setNotes,
|
|
||||||
setTypes,
|
|
||||||
setTasks,
|
|
||||||
setDatabase,
|
|
||||||
database,
|
|
||||||
setEnums,
|
|
||||||
selectedDb,
|
|
||||||
]);
|
|
||||||
|
|
||||||
const loadFromGist = useCallback(
|
const loadFromGist = useCallback(
|
||||||
async (shareId) => {
|
async (shareId) => {
|
||||||
|
@ -4,7 +4,7 @@ export const LayoutContext = createContext(null);
|
|||||||
|
|
||||||
export default function LayoutContextProvider({ children }) {
|
export default function LayoutContextProvider({ children }) {
|
||||||
const [layout, setLayout] = useState({
|
const [layout, setLayout] = useState({
|
||||||
header: true,
|
header: false,
|
||||||
sidebar: true,
|
sidebar: true,
|
||||||
issues: true,
|
issues: true,
|
||||||
toolbar: true,
|
toolbar: true,
|
||||||
|
@ -47,31 +47,32 @@ const debouncedChangesHandler = debounce(async (changes) => {
|
|||||||
handleDiagramChanges(changes.filter(c => c.table === "diagrams"))
|
handleDiagramChanges(changes.filter(c => c.table === "diagrams"))
|
||||||
}, 1500);
|
}, 1500);
|
||||||
|
|
||||||
const handleDiagramChanges = (diagramChanges) => {
|
const handleDiagramChanges = async (diagramChanges) => {
|
||||||
diagramChanges.forEach(({ type, obj, oldObj }) => {
|
for (let index = 0; index < diagramChanges.length; index++) {
|
||||||
const ddbFile = diagramToDdbFile(obj);
|
const { type, obj, oldObj } = diagramChanges[index];
|
||||||
|
const ddbFile = obj ? diagramToDdbFile(obj) : null;
|
||||||
|
const oldDdbFile = oldObj ? diagramToDdbFile(oldObj) : null;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 1:
|
case 1:
|
||||||
writeDdbFiles([ddbFile]);
|
await writeDdbFiles([ddbFile]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
if (oldObj && obj.id === oldObj.id && obj.name !== oldObj.name) {
|
if (oldObj && obj.id === oldObj.id && obj.name !== oldObj.name) {
|
||||||
const oldDdbFile = diagramToDdbFile(oldObj);
|
await deleteDdbFiles([oldDdbFile]);
|
||||||
deleteDdbFiles([oldDdbFile]);
|
|
||||||
}
|
}
|
||||||
writeDdbFiles([ddbFile]);
|
await writeDdbFiles([ddbFile]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
deleteDdbFiles([ddbFile]);
|
await deleteDdbFiles([oldDdbFile]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
db.on('changes', debouncedChangesHandler)
|
db.on('changes', debouncedChangesHandler)
|
||||||
|
@ -36,7 +36,7 @@ export function diagramToDdbFile(diagram) {
|
|||||||
export function ddbFileToDiagram(ddb) {
|
export function ddbFileToDiagram(ddb) {
|
||||||
const {
|
const {
|
||||||
database = DB.GENERIC,
|
database = DB.GENERIC,
|
||||||
title = "Untitled Diagram",
|
title = "user-diagram",
|
||||||
tables,
|
tables,
|
||||||
date,
|
date,
|
||||||
relationships,
|
relationships,
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import ReactDOM from "react-dom/client";
|
import ReactDOM from "react-dom/client";
|
||||||
import { LocaleProvider } from "@douyinfe/semi-ui";
|
import { LocaleProvider } from "@douyinfe/semi-ui";
|
||||||
import { Analytics } from "@vercel/analytics/react";
|
|
||||||
import App from "./App.jsx";
|
import App from "./App.jsx";
|
||||||
import en_US from "@douyinfe/semi-ui/lib/es/locale/source/en_US";
|
import en_US from "@douyinfe/semi-ui/lib/es/locale/source/en_US";
|
||||||
import "./index.css";
|
import "./index.css";
|
||||||
@ -10,6 +9,5 @@ const root = ReactDOM.createRoot(document.getElementById("root"));
|
|||||||
root.render(
|
root.render(
|
||||||
<LocaleProvider locale={en_US}>
|
<LocaleProvider locale={en_US}>
|
||||||
<App />
|
<App />
|
||||||
<Analytics />
|
|
||||||
</LocaleProvider>,
|
</LocaleProvider>,
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user