Persist local database write permissions

This commit is contained in:
2026-08-05 23:20:49 +02:00
parent 1a49fa4e95
commit 67753fb025
4 changed files with 99 additions and 12 deletions
+41 -5
View File
@@ -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."