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.
} - /> - ) : ( - <> - - - - - - - - - - {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); - }} - > - - - - - ); - })} - -
NameLast ModifiedSize
- - {d.name} - - {d.lastModified.toLocaleDateString() + - " " + - d.lastModified.toLocaleTimeString()} - {sizeStr}
- - )} - - ); - } - if (exportData.data !== "" || exportData.data) { - return ( - <> - {visible === MODAL.IMG ? ( - Diagram - ) : ( - - )} -
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.
} + /> + ) : ( + <> + + + + + + + + + + {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); + }} + > + + + + + ); + })} + +
NameLast ModifiedSize
+ + {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 ? ( + Diagram + ) : ( + + )} +
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) { }} >
- +