diff --git a/src/components/ControlPanel.jsx b/src/components/ControlPanel.jsx
index 80e99fe..431a9c4 100644
--- a/src/components/ControlPanel.jsx
+++ b/src/components/ControlPanel.jsx
@@ -11,6 +11,7 @@ import {
IconRedo,
IconRowsStroked,
IconEdit,
+ IconPlus,
} from "@douyinfe/semi-icons";
import { Link } from "react-router-dom";
import icon from "../assets/icon_dark_64.png";
@@ -71,6 +72,7 @@ export default function ControlPanel({ diagramId, setDiagramId }) {
RENAME: 4,
OPEN: 5,
SAVEAS: 6,
+ NEW: 7,
};
const STATUS = {
NONE: 0,
@@ -84,6 +86,7 @@ export default function ControlPanel({ diagramId, setDiagramId }) {
const [prevTitle, setPrevTitle] = useState(title);
const [saveAsTitle, setSaveAsTitle] = useState(title);
const [selectedDiagramId, setSelectedDiagramId] = useState(0);
+ const [selectedTemplateId, setSelectedTemplateId] = useState(-1);
const [showEditName, setShowEditName] = useState(false);
const [exportData, setExportData] = useState({
data: null,
@@ -713,11 +716,15 @@ export default function ControlPanel({ diagramId, setDiagramId }) {
Toast.error("Oops! Couldn't load diagram.");
});
};
+ const createNewDiagram = (id) => {
+ localStorage.setItem("args", `${id}`);
+ window.open("/editor", "_blank");
+ };
const menu = {
File: {
New: {
- function: () => {},
+ function: () => setVisible(MODAL.NEW),
},
"New window": {
function: () => {},
@@ -1114,6 +1121,8 @@ export default function ControlPanel({ diagramId, setDiagramId }) {
return "Open diagram";
case MODAL.SAVEAS:
return "Save as";
+ case MODAL.NEW:
+ return "New diagram";
default:
return "";
}
@@ -1132,6 +1141,8 @@ export default function ControlPanel({ diagramId, setDiagramId }) {
return "Open";
case MODAL.SAVEAS:
return "Save as";
+ case MODAL.NEW:
+ return "Create";
default:
return "Confirm";
}
@@ -1166,6 +1177,10 @@ export default function ControlPanel({ diagramId, setDiagramId }) {
loadDiagram(selectedDiagramId);
setVisible(MODAL.NONE);
return;
+ case MODAL.RENAME:
+ setPrevTitle(title);
+ setVisible(MODAL.NONE);
+ return;
case MODAL.SAVEAS:
db.diagrams.add({
name: saveAsTitle,
@@ -1178,6 +1193,10 @@ export default function ControlPanel({ diagramId, setDiagramId }) {
});
setVisible(MODAL.NONE);
return;
+ case MODAL.NEW:
+ setVisible(MODAL.NONE);
+ createNewDiagram(selectedTemplateId);
+ return;
default:
setVisible(MODAL.NONE);
return;
@@ -1291,127 +1310,164 @@ export default function ControlPanel({ diagramId, setDiagramId }) {
);
};
+ const newModalBody = () => (
+
+
+
setSelectedTemplateId(0)}
+ >
+
+
+
Blank
+
+ {[1, 2, 3, 4, 5, 6, 7, 8].map((i) => (
+
+
setSelectedTemplateId(i)}
+ >
+ +
+
+
Template {i}
+
+ ))}
+
+ );
+
const getModalBody = () => {
- if (visible === MODAL.IMPORT) {
- return importModalBody();
- }
- if (visible === MODAL.RENAME) {
- return (
- setTitle(v)}
- />
- );
- }
- if (visible === MODAL.SAVEAS) {
- return (
- setSaveAsTitle(v)}
- />
- );
- }
- if (visible === MODAL.OPEN) {
- return (
-
- {diagrams.length === 0 ? (
- You have no saved diagrams.
}
- />
- ) : (
- <>
-
-
-
- Name |
- Last Modified |
- Size |
-
-
-
- {diagrams?.map((d) => {
- const size = JSON.stringify(d).length;
- let sizeStr;
- if (size >= 1024 && size < 1024 * 1024)
- sizeStr = (size / 1024).toFixed(1) + "KB";
- else if (size >= 1024 * 1024)
- sizeStr = (size / (1024 * 1024)).toFixed(1) + "MB";
- else sizeStr = size + "B";
- return (
- {
- setSelectedDiagramId(d.id);
- }}
- onDoubleClick={() => {
- loadDiagram(d.id);
- setVisible(MODAL.NONE);
- }}
- >
-
-
- {d.name}
- |
-
- {d.lastModified.toLocaleDateString() +
- " " +
- d.lastModified.toLocaleTimeString()}
- |
- {sizeStr} |
-
- );
- })}
-
-
- >
- )}
-
- );
- }
- if (exportData.data !== "" || exportData.data) {
- return (
- <>
- {visible === MODAL.IMG ? (
-
- ) : (
-
- )}
- Filename:
+ switch (visible) {
+ case MODAL.IMPORT:
+ return importModalBody();
+ case MODAL.NEW:
+ return newModalBody();
+ case MODAL.RENAME:
+ return (
{`.${exportData.extension}`}}
- onChange={(value) =>
- setExportData((prev) => ({ ...prev, filename: value }))
- }
- field="filename"
+ placeholder="Diagram name"
+ value={title}
+ onChange={(v) => setTitle(v)}
/>
- >
- );
- } else {
- return (
-
-
-
- );
+ );
+ case MODAL.OPEN:
+ return (
+
+ {diagrams.length === 0 ? (
+ You have no saved diagrams.
}
+ />
+ ) : (
+ <>
+
+
+
+ Name |
+ Last Modified |
+ Size |
+
+
+
+ {diagrams?.map((d) => {
+ const size = JSON.stringify(d).length;
+ let sizeStr;
+ if (size >= 1024 && size < 1024 * 1024)
+ sizeStr = (size / 1024).toFixed(1) + "KB";
+ else if (size >= 1024 * 1024)
+ sizeStr = (size / (1024 * 1024)).toFixed(1) + "MB";
+ else sizeStr = size + "B";
+ return (
+ {
+ setSelectedDiagramId(d.id);
+ }}
+ onDoubleClick={() => {
+ loadDiagram(d.id);
+ setVisible(MODAL.NONE);
+ }}
+ >
+
+
+ {d.name}
+ |
+
+ {d.lastModified.toLocaleDateString() +
+ " " +
+ d.lastModified.toLocaleTimeString()}
+ |
+ {sizeStr} |
+
+ );
+ })}
+
+
+ >
+ )}
+
+ );
+ case MODAL.SAVEAS:
+ return (
+ setSaveAsTitle(v)}
+ />
+ );
+ case MODAL.CODE:
+ case MODAL.IMG:
+ if (exportData.data !== "" || exportData.data) {
+ return (
+ <>
+ {visible === MODAL.IMG ? (
+
+ ) : (
+
+ )}
+ Filename:
+ {`.${exportData.extension}`}}
+ onChange={(value) =>
+ setExportData((prev) => ({ ...prev, filename: value }))
+ }
+ field="filename"
+ />
+ >
+ );
+ } else {
+ return (
+
+
+
+ );
+ }
+ default:
+ return <>>;
}
};
diff --git a/src/index.js b/src/index.js
index eb2c18d..0dac66e 100644
--- a/src/index.js
+++ b/src/index.js
@@ -8,11 +8,11 @@ import en_US from "@douyinfe/semi-ui/lib/es/locale/source/en_US";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
-
+ //
-
+ //
);
// If you want to start measuring performance in your app, pass a function
diff --git a/src/pages/editor.jsx b/src/pages/editor.jsx
index 52c1495..d393d31 100644
--- a/src/pages/editor.jsx
+++ b/src/pages/editor.jsx
@@ -480,7 +480,13 @@ export default function Editor(props) {
});
};
- loadLatestDiagram();
+ const args = localStorage.getItem("args");
+ if (!args || args === "-1") {
+ loadLatestDiagram();
+ } else {
+ console.log("Loading template with id", args);
+ localStorage.setItem("args", "-1");
+ }
socket.connect();
@@ -583,7 +589,7 @@ export default function Editor(props) {
}}
>