Autosave
This commit is contained in:
parent
045715cff9
commit
76ef62d13f
@ -54,7 +54,7 @@ import {
|
|||||||
UndoRedoContext,
|
UndoRedoContext,
|
||||||
} from "../pages/Editor";
|
} from "../pages/Editor";
|
||||||
import { IconAddTable, IconAddArea, IconAddNote } from "./CustomIcons";
|
import { IconAddTable, IconAddArea, IconAddNote } from "./CustomIcons";
|
||||||
import { ObjectType, Action, Tab } from "../data/data";
|
import { ObjectType, Action, Tab, State } from "../data/data";
|
||||||
import jsPDF from "jspdf";
|
import jsPDF from "jspdf";
|
||||||
import { useHotkeys } from "react-hotkeys-hook";
|
import { useHotkeys } from "react-hotkeys-hook";
|
||||||
import { Validator } from "jsonschema";
|
import { Validator } from "jsonschema";
|
||||||
@ -68,6 +68,10 @@ export default function ControlPanel({
|
|||||||
setDiagramId,
|
setDiagramId,
|
||||||
title,
|
title,
|
||||||
setTitle,
|
setTitle,
|
||||||
|
state,
|
||||||
|
setState,
|
||||||
|
lastSaved,
|
||||||
|
setLastSaved,
|
||||||
}) {
|
}) {
|
||||||
const MODAL = {
|
const MODAL = {
|
||||||
NONE: 0,
|
NONE: 0,
|
||||||
@ -672,31 +676,7 @@ export default function ControlPanel({
|
|||||||
copy();
|
copy();
|
||||||
del();
|
del();
|
||||||
};
|
};
|
||||||
const save = () => {
|
const save = () => setState(State.SAVING);
|
||||||
if (diagramId === 0) {
|
|
||||||
db.diagrams
|
|
||||||
.add({
|
|
||||||
name: title,
|
|
||||||
lastModified: new Date(),
|
|
||||||
tables: tables,
|
|
||||||
references: relationships,
|
|
||||||
types: types,
|
|
||||||
notes: notes,
|
|
||||||
areas: areas,
|
|
||||||
})
|
|
||||||
.then((id) => setDiagramId(id));
|
|
||||||
} else {
|
|
||||||
db.diagrams.update(diagramId, {
|
|
||||||
name: title,
|
|
||||||
lastModified: new Date(),
|
|
||||||
tables: tables,
|
|
||||||
references: relationships,
|
|
||||||
types: types,
|
|
||||||
notes: notes,
|
|
||||||
areas: areas,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const open = () => setVisible(MODAL.OPEN);
|
const open = () => setVisible(MODAL.OPEN);
|
||||||
const saveDiagramAs = () => setVisible(MODAL.SAVEAS);
|
const saveDiagramAs = () => setVisible(MODAL.SAVEAS);
|
||||||
const loadDiagram = async (id) => {
|
const loadDiagram = async (id) => {
|
||||||
@ -1682,6 +1662,21 @@ export default function ControlPanel({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getState() {
|
||||||
|
switch (state) {
|
||||||
|
case State.NONE:
|
||||||
|
return "No changes"
|
||||||
|
case State.LOADING:
|
||||||
|
return "Loading . . .";
|
||||||
|
case State.SAVED:
|
||||||
|
return `Last saved ${lastSaved}`;
|
||||||
|
case State.SAVING:
|
||||||
|
return "Saving . . .";
|
||||||
|
default:
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function header() {
|
function header() {
|
||||||
return (
|
return (
|
||||||
<nav className="flex justify-between pt-1 items-center whitespace-nowrap">
|
<nav className="flex justify-between pt-1 items-center whitespace-nowrap">
|
||||||
@ -1783,8 +1778,16 @@ export default function ControlPanel({
|
|||||||
</Dropdown>
|
</Dropdown>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<Button size="small" type="tertiary">
|
<Button
|
||||||
Last saved {new Date().toISOString()}
|
size="small"
|
||||||
|
type="tertiary"
|
||||||
|
icon={
|
||||||
|
state === State.LOADING || state === State.SAVING ? (
|
||||||
|
<Spin size="small" />
|
||||||
|
) : null
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{getState()}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -103,6 +103,13 @@ const Action = {
|
|||||||
PAN: 4,
|
PAN: 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const State = {
|
||||||
|
NONE: 0,
|
||||||
|
SAVING: 1,
|
||||||
|
SAVED: 2,
|
||||||
|
LOADING: 3,
|
||||||
|
};
|
||||||
|
|
||||||
export {
|
export {
|
||||||
bgBlue,
|
bgBlue,
|
||||||
sqlDataTypes,
|
sqlDataTypes,
|
||||||
@ -116,4 +123,5 @@ export {
|
|||||||
Tab,
|
Tab,
|
||||||
ObjectType,
|
ObjectType,
|
||||||
Action,
|
Action,
|
||||||
|
State,
|
||||||
};
|
};
|
||||||
|
@ -10,6 +10,7 @@ import {
|
|||||||
avatarThemes,
|
avatarThemes,
|
||||||
Action,
|
Action,
|
||||||
ObjectType,
|
ObjectType,
|
||||||
|
State,
|
||||||
} from "../data/data";
|
} from "../data/data";
|
||||||
import { socket } from "../data/socket";
|
import { socket } from "../data/socket";
|
||||||
import { db } from "../data/db";
|
import { db } from "../data/db";
|
||||||
@ -31,6 +32,8 @@ export const TypeContext = createContext();
|
|||||||
export default function Editor(props) {
|
export default function Editor(props) {
|
||||||
const [id, setId] = useState(0);
|
const [id, setId] = useState(0);
|
||||||
const [title, setTitle] = useState("Untitled Diagram");
|
const [title, setTitle] = useState("Untitled Diagram");
|
||||||
|
const [state, setState] = useState(State.NONE);
|
||||||
|
const [lastSaved, setLastSaved] = useState("");
|
||||||
const [tables, setTables] = useState([]);
|
const [tables, setTables] = useState([]);
|
||||||
const [relationships, setRelationships] = useState([]);
|
const [relationships, setRelationships] = useState([]);
|
||||||
const [areas, setAreas] = useState([]);
|
const [areas, setAreas] = useState([]);
|
||||||
@ -462,6 +465,70 @@ export default function Editor(props) {
|
|||||||
prev.map((task, i) => (id === i ? { ...task, ...values } : task))
|
prev.map((task, i) => (id === i ? { ...task, ...values } : task))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (
|
||||||
|
tables.length === 0 &&
|
||||||
|
areas.length === 0 &&
|
||||||
|
notes.length === 0 &&
|
||||||
|
types.length === 0
|
||||||
|
)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (settings.autosave) {
|
||||||
|
setState(State.SAVING);
|
||||||
|
}
|
||||||
|
}, [
|
||||||
|
undoStack,
|
||||||
|
redoStack,
|
||||||
|
settings.autosave,
|
||||||
|
tables.length,
|
||||||
|
areas.length,
|
||||||
|
notes.length,
|
||||||
|
types.length,
|
||||||
|
]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const save = async () => {
|
||||||
|
if (state !== State.SAVING) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (id === 0 && window.name === "") {
|
||||||
|
db.diagrams
|
||||||
|
.add({
|
||||||
|
name: title,
|
||||||
|
lastModified: new Date(),
|
||||||
|
tables: tables,
|
||||||
|
references: relationships,
|
||||||
|
types: types,
|
||||||
|
notes: notes,
|
||||||
|
areas: areas,
|
||||||
|
})
|
||||||
|
.then((id) => {
|
||||||
|
setId(id);
|
||||||
|
window.name = `d ${id}`;
|
||||||
|
setState(State.SAVED);
|
||||||
|
setLastSaved(new Date().toLocaleString());
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
db.diagrams
|
||||||
|
.update(id, {
|
||||||
|
name: title,
|
||||||
|
lastModified: new Date(),
|
||||||
|
tables: tables,
|
||||||
|
references: relationships,
|
||||||
|
types: types,
|
||||||
|
notes: notes,
|
||||||
|
areas: areas,
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
setState(State.SAVED);
|
||||||
|
setLastSaved(new Date().toLocaleString());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
save();
|
||||||
|
}, [tables, relationships, notes, areas, types, title, id, state]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
document.title = "Editor | drawDB";
|
document.title = "Editor | drawDB";
|
||||||
|
|
||||||
@ -477,8 +544,10 @@ export default function Editor(props) {
|
|||||||
setNotes(d.notes);
|
setNotes(d.notes);
|
||||||
setAreas(d.areas);
|
setAreas(d.areas);
|
||||||
setTypes(d.types);
|
setTypes(d.types);
|
||||||
|
window.name = `d ${d.id}`;
|
||||||
|
} else {
|
||||||
|
window.name = "";
|
||||||
}
|
}
|
||||||
window.name = `d ${d.id}`;
|
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
@ -500,6 +569,8 @@ export default function Editor(props) {
|
|||||||
setUndoStack([]);
|
setUndoStack([]);
|
||||||
setRedoStack([]);
|
setRedoStack([]);
|
||||||
window.name = `d ${diagram.id}`;
|
window.name = `d ${diagram.id}`;
|
||||||
|
} else {
|
||||||
|
window.name = "";
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
@ -627,6 +698,10 @@ export default function Editor(props) {
|
|||||||
setDiagramId={setId}
|
setDiagramId={setId}
|
||||||
title={title}
|
title={title}
|
||||||
setTitle={setTitle}
|
setTitle={setTitle}
|
||||||
|
state={state}
|
||||||
|
setState={setState}
|
||||||
|
lastSaved={lastSaved}
|
||||||
|
setLastSaved={setLastSaved}
|
||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
className={
|
className={
|
||||||
@ -644,7 +719,7 @@ export default function Editor(props) {
|
|||||||
width={width}
|
width={width}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<Canvas />
|
<Canvas state={state} setState={setState} />
|
||||||
{layout.services && (
|
{layout.services && (
|
||||||
<MessageContext.Provider
|
<MessageContext.Provider
|
||||||
value={{ messages, setMessages }}
|
value={{ messages, setMessages }}
|
||||||
|
Loading…
Reference in New Issue
Block a user