openOutpaint/js/initalize/workspace.populate.js
Victor Seiji Hariki c4ef6ccce4 Workspaces now fully functional (using indexedDB)
Signed-off-by: Victor Seiji Hariki <victorseijih@gmail.com>
2023-01-27 01:40:27 -03:00

179 lines
4.8 KiB
JavaScript

(() => {
const saveWorkspaceBtn = document.getElementById("save-workspace-btn");
const renameWorkspaceBtn = document.getElementById("rename-workspace-btn");
const moreWorkspaceBtn = document.getElementById("more-workspace-btn");
const expandedWorkspaceMenu = document.getElementById("more-workspace-menu");
const exportWorkspaceBtn = document.getElementById("export-workspace-btn");
const importWorkspaceBtn = document.getElementById("import-workspace-btn");
const deleteWorkspaceBtn = document.getElementById("delete-workspace-btn");
moreWorkspaceBtn.addEventListener("click", () => {
expandedWorkspaceMenu.classList.toggle("collapsed");
});
const workspaceAutocomplete = createAutoComplete(
"Workspace",
document.getElementById("workspace-select")
);
workspaceAutocomplete.options = [{name: "Default", value: "default"}];
workspaceAutocomplete.value = "default";
renameWorkspaceBtn.disabled = true;
deleteWorkspaceBtn.disabled = true;
workspaceAutocomplete.onchange.on(async ({name, value}) => {
if (value === "default") {
renameWorkspaceBtn.disabled = true;
deleteWorkspaceBtn.disabled = true;
await commands.clear();
return;
}
renameWorkspaceBtn.disabled = false;
deleteWorkspaceBtn.disabled = false;
const workspaces = db
.transaction("workspaces", "readonly")
.objectStore("workspaces");
workspaces.get(value).onsuccess = (e) => {
console.debug("[workspace.populate] Loading workspace");
const res = e.target.result;
const {workspace} = res;
importWorkspaceState(workspace);
};
});
/**
* Updates Workspace selection list
*/
const listWorkspaces = async (value = undefined) => {
const options = [{name: "Default", value: "default"}];
const workspaces = db
.transaction("workspaces", "readonly")
.objectStore("workspaces");
workspaces.openCursor().onsuccess = (e) => {
/** @type {IDBCursor} */
const c = e.target.result;
if (c) {
options.push({name: c.value.name, value: c.key});
c.continue();
} else {
const previousValue = workspaceAutocomplete.value;
workspaceAutocomplete.options = options;
workspaceAutocomplete.value = value ?? previousValue;
}
};
};
const saveWorkspaceToDB = async (value) => {
const workspace = await exportWorkspaceState();
const workspaces = db
.transaction("workspaces", "readwrite")
.objectStore("workspaces");
let id = value;
if (value === "default" && commands._history.length > 0) {
// If Workspace is the Default
const name = (prompt("Please enter the workspace name") ?? "").trim();
if (name) {
id = guid();
workspaces.add({id, name, workspace}).onsuccess = () => {
listWorkspaces(id);
alert(`Workspace saved as '${name}'`);
};
}
} else {
workspaces.get(id).onsuccess = (e) => {
const ws = e.target.result;
if (ws) {
workspaces.put({id, workspace}).onsuccess = () => {
alert(`Workspace saved as '${ws.value.name}'`);
listWorkspaces();
};
}
};
}
};
// Normal Workspace Export/Import
exportWorkspaceBtn.addEventListener("click", () => saveWorkspaceToFile());
importWorkspaceBtn.addEventListener("click", () => {
const input = document.createElement("input");
input.type = "file";
input.accept = "application/json";
input.addEventListener("change", async (evn) => {
let files = Array.from(input.files);
const json = await files[0].text();
await importWorkspaceState(JSON.parse(json));
saveWorkspaceToDB("default");
});
input.click();
});
const onDatabaseLoad = async () => {
// Get workspaces from database
listWorkspaces();
// Save Workspace Button
saveWorkspaceBtn.addEventListener(
"click",
saveWorkspaceToDB(workspaceAutocomplete.value)
);
// Rename Workspace
renameWorkspaceBtn.addEventListener("click", () => {
const workspaces = db
.transaction("workspaces", "readwrite")
.objectStore("workspaces");
let id = workspaceAutocomplete.value;
workspaces.get(id).onsuccess = (e) => {
const workspace = e.target.result;
const name = prompt(
`Please enter the new workspace name.\nOriginal is '${workspace.name}'`
).trim();
if (!name) return;
workspace.name = name;
workspaces.put(workspace).onsuccess = () => {
listWorkspaces();
};
};
});
// Delete Workspace
deleteWorkspaceBtn.addEventListener("click", () => {
const workspaces = db
.transaction("workspaces", "readwrite")
.objectStore("workspaces");
let id = workspaceAutocomplete.value;
workspaces.get(id).onsuccess = (e) => {
const workspace = e.target.result;
if (
confirm(
`Do you really want to delete the workspace '${workspace.name}'?`
)
) {
workspaces.delete(id).onsuccess = (e) => {
listWorkspaces("default");
};
}
};
});
};
if (db) onDatabaseLoad();
else ondatabaseload.on(onDatabaseLoad);
})();