Add Save as template
This commit is contained in:
parent
c5f929ac55
commit
dec6362fa9
@ -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: {
|
||||||
|
@ -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) => {
|
||||||
|
@ -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>
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user