Persist local database write permissions
This commit is contained in:
+41
-5
@@ -63,6 +63,12 @@ const mainWorkspaceToggle = document.querySelector("#mainWorkspaceToggle");
|
||||
let sidebarUserClosed = false;
|
||||
let mappingLoadToken = 0;
|
||||
const mappingCacheKey = "catalog-maker:mapping-cache";
|
||||
const legacyPermissionStorageKey = "catalog-maker:db-permissions";
|
||||
const permissionStorageKeys = {
|
||||
local: "catalog-maker:db-permissions:local-9bplus",
|
||||
live: "catalog-maker:db-permissions:live-9bplus",
|
||||
scrape: "catalog-maker:db-permissions:local-scrape",
|
||||
};
|
||||
|
||||
const nativeFetch = window.fetch.bind(window);
|
||||
window.fetch = (input, init = {}) => {
|
||||
@@ -71,7 +77,7 @@ window.fetch = (input, init = {}) => {
|
||||
|
||||
const headers = new Headers(init.headers || (typeof input !== "string" ? input.headers : undefined));
|
||||
const selectedMode = localStorage.getItem("catalog-maker:database-mode") || "local";
|
||||
const permissions = JSON.parse(localStorage.getItem("catalog-maker:db-permissions") || "{}");
|
||||
const permissions = readDatabasePermissions(selectedMode);
|
||||
const localWritesEnabled = selectedMode === "local" && [
|
||||
permissions.allowInsertToggle,
|
||||
permissions.allowUpdateToggle,
|
||||
@@ -1140,8 +1146,7 @@ function loadDatabaseMode() {
|
||||
const mode = localStorage.getItem("catalog-maker:database-mode") || "local";
|
||||
const input = document.querySelector(`input[name="databaseMode"][value="${mode}"]`);
|
||||
if (input) input.checked = true;
|
||||
const permissions = JSON.parse(localStorage.getItem("catalog-maker:db-permissions") || "{}");
|
||||
for (const input of permissionInputs) input.checked = permissions[input.id] === true;
|
||||
applyPermissionInputs(readDatabasePermissions(mode));
|
||||
const transactionMode = localStorage.getItem("catalog-maker:transaction-mode") || "transaction";
|
||||
const transactionInput = document.querySelector(`input[name="transactionMode"][value="${transactionMode}"]`);
|
||||
if (transactionInput) transactionInput.checked = true;
|
||||
@@ -1159,6 +1164,7 @@ function loadDatabaseMode() {
|
||||
function saveDatabaseMode(event) {
|
||||
const mode = ["local", "live", "scrape"].includes(event.target.value) ? event.target.value : "local";
|
||||
localStorage.setItem("catalog-maker:database-mode", mode);
|
||||
applyPermissionInputs(readDatabasePermissions(mode));
|
||||
syncDatabasePermissions(mode);
|
||||
syncLocalDbFields(mode);
|
||||
saveSettings();
|
||||
@@ -1272,9 +1278,13 @@ function syncDatabasePermissions(mode) {
|
||||
}
|
||||
|
||||
function saveSettings() {
|
||||
const mode = localStorage.getItem("catalog-maker:database-mode") || "local";
|
||||
const permissions = {};
|
||||
for (const input of permissionInputs) permissions[input.id] = input.checked;
|
||||
localStorage.setItem("catalog-maker:db-permissions", JSON.stringify(permissions));
|
||||
localStorage.setItem(permissionStorageKeys[mode] || permissionStorageKeys.local, JSON.stringify(permissions));
|
||||
if (mode === "local") {
|
||||
localStorage.setItem(legacyPermissionStorageKey, JSON.stringify(permissions));
|
||||
}
|
||||
const transactionMode = [...transactionModeInputs].find((input) => input.checked)?.value || "transaction";
|
||||
localStorage.setItem("catalog-maker:transaction-mode", transactionMode);
|
||||
refreshDatabaseStatusLabel();
|
||||
@@ -1283,7 +1293,7 @@ function saveSettings() {
|
||||
function refreshDatabaseStatusLabel() {
|
||||
const mode = localStorage.getItem("catalog-maker:database-mode") || "local";
|
||||
const transactionMode = localStorage.getItem("catalog-maker:transaction-mode") || "transaction";
|
||||
const permissions = JSON.parse(localStorage.getItem("catalog-maker:db-permissions") || "{}");
|
||||
const permissions = readDatabasePermissions(mode);
|
||||
const writesEnabled = mode === "local" && (
|
||||
permissions.allowInsertToggle || permissions.allowUpdateToggle || permissions.allowDeleteToggle
|
||||
);
|
||||
@@ -1302,6 +1312,32 @@ function refreshDatabaseStatusLabel() {
|
||||
databaseStateDot.setAttribute("aria-label", connectionError ? "Database disconnected" : databaseConnectionState === "unknown" ? "Database connection pending" : "Database connected");
|
||||
}
|
||||
|
||||
function readDatabasePermissions(mode = "local") {
|
||||
const storageKey = permissionStorageKeys[mode] || permissionStorageKeys.local;
|
||||
const stored = readJsonStorage(storageKey);
|
||||
if (stored) return stored;
|
||||
|
||||
if (mode === "local") {
|
||||
const legacy = readJsonStorage(legacyPermissionStorageKey);
|
||||
if (legacy) return legacy;
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
function applyPermissionInputs(permissions) {
|
||||
for (const input of permissionInputs) input.checked = permissions[input.id] === true;
|
||||
}
|
||||
|
||||
function readJsonStorage(key) {
|
||||
try {
|
||||
const value = localStorage.getItem(key);
|
||||
return value ? JSON.parse(value) : null;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function renderDatabaseModeNote(mode) {
|
||||
databaseModeNote.textContent = mode === "live"
|
||||
? "Live 9bplus DB selected for read-only data."
|
||||
|
||||
Reference in New Issue
Block a user