Add Save as template

This commit is contained in:
1ilit 2023-12-19 04:36:10 +02:00
parent c5f929ac55
commit dec6362fa9
11 changed files with 78 additions and 26 deletions

View File

@ -729,6 +729,23 @@ export default function ControlPanel({
function: saveDiagramAs, function: saveDiagramAs,
shortcut: "Ctrl+Shift+S", shortcut: "Ctrl+Shift+S",
}, },
"Save as template": {
function: () => {
db.templates
.add({
title: title,
tables: tables,
relationships: relationships,
types: types,
notes: notes,
subjectAreas: areas,
custom: 1,
})
.then(() => {
Toast.success("Template saved!");
});
},
},
Share: { Share: {
function: () => {}, function: () => {},
}, },
@ -756,18 +773,6 @@ export default function ControlPanel({
.catch(() => Toast.error("Oops! Something went wrong.")); .catch(() => Toast.error("Oops! Something went wrong."));
}, },
}, },
"Flush storage": {
function: async () => {
db.delete()
.then(() => {
Toast.success("Storage flushed");
window.location.reload(false);
})
.catch(() => {
Toast.error("Oops! Something went wrong.");
});
},
},
Import: { Import: {
function: fileImport, function: fileImport,
shortcut: "Ctrl+I", shortcut: "Ctrl+I",
@ -935,6 +940,18 @@ export default function ControlPanel({
return { ...prev, panning: !prev.panning }; return { ...prev, panning: !prev.panning };
}), }),
}, },
{
"Flush storage": async () => {
db.delete()
.then(() => {
Toast.success("Storage flushed");
window.location.reload(false);
})
.catch(() => {
Toast.error("Oops! Something went wrong.");
});
},
},
], ],
}, },
Exit: { Exit: {

View File

@ -5,7 +5,7 @@ const db = new Dexie("drawDB");
db.version(2).stores({ db.version(2).stores({
diagrams: "++id, lastModified", diagrams: "++id, lastModified",
templates: "++id", templates: "++id, custom",
}); });
db.on("populate", (transaction) => { db.on("populate", (transaction) => {

View File

@ -1,19 +1,18 @@
import { useEffect } from "react"; import { useEffect, useState } from "react";
import logo_light from "../assets/logo_light_46.png"; import logo_light from "../assets/logo_light_46.png";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import { Tabs, TabPane } from "@douyinfe/semi-ui"; import { Tabs, TabPane } from "@douyinfe/semi-ui";
import { useLiveQuery } from "dexie-react-hooks";
import { db } from "../data/db"; import { db } from "../data/db";
import { calcPath } from "../utils"; import { calcPath } from "../utils";
function Thumbnail({ diagram }) { function Thumbnail({ diagram, i }) {
const zoom = 0.3; const zoom = 0.3;
return ( return (
<div className="w-full select-none h-[190px]"> <div className="w-full select-none">
<svg className="bg-white w-full h-full rounded-t-md"> <svg className="bg-white w-full h-full rounded-t-md">
<defs> <defs>
<pattern <pattern
id="pattern-circles" id={"pattern-circles-" + i}
x="0" x="0"
y="0" y="0"
width="10" width="10"
@ -22,7 +21,7 @@ function Thumbnail({ diagram }) {
patternContentUnits="userSpaceOnUse" patternContentUnits="userSpaceOnUse"
> >
<circle <circle
id="pattern-circle" id={"pattern-circle-" + i}
cx="2" cx="2"
cy="2" cy="2"
r="0.4" r="0.4"
@ -35,9 +34,9 @@ function Thumbnail({ diagram }) {
y="0" y="0"
width="100%" width="100%"
height="100%" height="100%"
fill="url(#pattern-circles)" fill={"url(#pattern-circles-" + i + ")"}
></rect> ></rect>
<g id="diagram"> <g>
{diagram.subjectAreas?.map((a) => ( {diagram.subjectAreas?.map((a) => (
<foreignObject <foreignObject
key={a.id} key={a.id}
@ -159,10 +158,19 @@ function Thumbnail({ diagram }) {
} }
export default function Templates() { export default function Templates() {
const templates = useLiveQuery(() => db.templates.toArray()); const [defaultTemplates, setDefaultTemplates] = useState([]);
const [customTemplates, setCustomTemplates] = useState([]);
useEffect(() => { useEffect(() => {
document.title = "Templates | drawDB"; document.title = "Templates | drawDB";
const loadTemplates = async () => {
const def = await db.templates.where({ custom: 0 }).toArray();
setDefaultTemplates(def);
const custom = await db.templates.where({ custom: 1 }).toArray();
setCustomTemplates(custom);
};
loadTemplates();
}, []); }, []);
return ( return (
@ -198,13 +206,13 @@ export default function Templates() {
tab={<span className="mx-2">Default templates</span>} tab={<span className="mx-2">Default templates</span>}
itemKey="1" itemKey="1"
> >
<div className="grid xl:grid-cols-3 grid-cols-2 sm:grid-cols-1 gap-4 my-3"> <div className="grid xl:grid-cols-3 grid-cols-2 sm:grid-cols-1 gap-8 my-6">
{templates?.map((t, i) => ( {defaultTemplates?.map((t, i) => (
<div <div
key={i} key={i}
className="bg-gray-100 hover:translate-y-[-6px] transition-all duration-300 border rounded-md" className="bg-gray-100 hover:translate-y-[-6px] transition-all duration-300 border rounded-md"
> >
<Thumbnail diagram={t} /> <Thumbnail diagram={t} i={"1" + i} />
<div className="px-4 py-3"> <div className="px-4 py-3">
<div className="flex justify-between"> <div className="flex justify-between">
<div className="text-lg font-bold text-zinc-700"> <div className="text-lg font-bold text-zinc-700">
@ -224,7 +232,26 @@ export default function Templates() {
tab={<span className="mx-2">Your templates</span>} tab={<span className="mx-2">Your templates</span>}
itemKey="2" itemKey="2"
> >
<div className=" flex flex-col h-full">Your templates</div> <div className="grid xl:grid-cols-3 grid-cols-2 sm:grid-cols-1 gap-8 my-6">
{customTemplates?.map((c, i) => (
<div
key={i}
className="bg-gray-100 hover:translate-y-[-6px] transition-all duration-300 border rounded-md"
>
<Thumbnail diagram={c} i={"2" + i} />
<div className="px-4 py-3 w-full">
<div className="flex justify-between">
<div className="text-lg font-bold text-zinc-700">
{c.title}
</div>
<button className="border rounded px-2 py-1 bg-white hover:bg-gray-200 transition-all duration-300">
<i className="fa-solid fa-code-fork"></i>
</button>
</div>
</div>
</div>
))}
</div>
</TabPane> </TabPane>
</Tabs> </Tabs>
</div> </div>

View File

@ -151,4 +151,5 @@ export const template1 = {
title: "Template 1", title: "Template 1",
description: description:
"Lorem ipsum dolor sit amet consectetur adipisicing elit. Veniam nulla illo pariatur nostrum.", "Lorem ipsum dolor sit amet consectetur adipisicing elit. Veniam nulla illo pariatur nostrum.",
custom: 0,
}; };

View File

@ -160,4 +160,5 @@ export const template2 = {
title: "Template 2", title: "Template 2",
description: description:
"Lorem ipsum dolor sit amet consectetur adipisicing elit. Veniam nulla illo pariatur nostrum.", "Lorem ipsum dolor sit amet consectetur adipisicing elit. Veniam nulla illo pariatur nostrum.",
custom: 0,
}; };

View File

@ -227,4 +227,5 @@ export const template3 = {
title: "Template 3", title: "Template 3",
description: description:
"Lorem ipsum dolor sit amet consectetur adipisicing elit. Veniam nulla illo pariatur nostrum.", "Lorem ipsum dolor sit amet consectetur adipisicing elit. Veniam nulla illo pariatur nostrum.",
custom: 0,
}; };

View File

@ -307,4 +307,5 @@ export const template4 = {
title: "Template 4", title: "Template 4",
description: description:
"Lorem ipsum dolor sit amet consectetur adipisicing elit. Veniam nulla illo pariatur nostrum.", "Lorem ipsum dolor sit amet consectetur adipisicing elit. Veniam nulla illo pariatur nostrum.",
custom: 0,
}; };

View File

@ -265,4 +265,5 @@ export const template5 = {
title: "Template 5", title: "Template 5",
description: description:
"Lorem ipsum dolor sit amet consectetur adipisicing elit. Veniam nulla illo pariatur nostrum.", "Lorem ipsum dolor sit amet consectetur adipisicing elit. Veniam nulla illo pariatur nostrum.",
custom: 0,
}; };

View File

@ -301,4 +301,5 @@ export const template6 = {
title: "Template 6", title: "Template 6",
description: description:
"Lorem ipsum dolor sit amet consectetur adipisicing elit. Veniam nulla illo pariatur nostrum.", "Lorem ipsum dolor sit amet consectetur adipisicing elit. Veniam nulla illo pariatur nostrum.",
custom: 0,
}; };

View File

@ -311,4 +311,5 @@ export const template7 = {
title: "Template 7", title: "Template 7",
description: description:
"Lorem ipsum dolor sit amet consectetur adipisicing elit. Veniam nulla illo pariatur nostrum.", "Lorem ipsum dolor sit amet consectetur adipisicing elit. Veniam nulla illo pariatur nostrum.",
custom: 0,
}; };

View File

@ -366,4 +366,5 @@ export const template8 = {
title: "Template 8", title: "Template 8",
description: description:
"Lorem ipsum dolor sit amet consectetur adipisicing elit. Veniam nulla illo pariatur nostrum.", "Lorem ipsum dolor sit amet consectetur adipisicing elit. Veniam nulla illo pariatur nostrum.",
custom: 0,
}; };