From 92ad6a92e393f5066c13ec1d22a2f78bffe624c3 Mon Sep 17 00:00:00 2001 From: "Randy.Fischer" Date: Wed, 15 Apr 2026 15:47:15 +0200 Subject: [PATCH] Persist uploaded order CSVs across app restarts Uploaded CSVs previously lived only in memory; reloading the app reset the order list to the embedded SEED_ORDERS_CSV. Now every upload is written to a new IndexedDB store so inspectors keep their order list after closing/reopening the PWA. - db.js: bump DB_VERSION to 4, add object store `ordersCsv` (keyPath 'id'), saveOrdersCsv(csvText) and loadOrdersCsv(). - csvLoader.js: loadOrdersFromUpload returns { text, orders } so the handler can persist the raw text alongside the parsed result. - main.js: init() prefers the stored CSV, falls back to SEED_ORDERS_CSV. The upload handler persists the CSV before re-rendering. --- public/js/main.js | 7 +++++-- src/Infrastructure/csvLoader.js | 2 +- src/Infrastructure/db.js | 24 +++++++++++++++++++++++- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/public/js/main.js b/public/js/main.js index 6fa8978..43dd061 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -33,7 +33,9 @@ document.getElementById('csvFileInput').addEventListener('change', async (e) => { const file = e.target.files[0]; if (!file) return; - A.state.orders = await I.loadOrdersFromUpload(file); + const { text, orders } = await I.loadOrdersFromUpload(file); + await I.saveOrdersCsv(text); + A.state.orders = orders; A.renderOverviewScreen(openOrder); e.target.value = ''; }); @@ -91,7 +93,8 @@ async function init() { await I.openDB(); - A.state.orders = D.parseCSV(I.SEED_ORDERS_CSV); + const stored = await I.loadOrdersCsv(); + A.state.orders = D.parseCSV(stored ? stored.csv : I.SEED_ORDERS_CSV); A.state.orderStatuses = await I.loadAllOrderStatuses(); wireOverviewToolbar(); diff --git a/src/Infrastructure/csvLoader.js b/src/Infrastructure/csvLoader.js index e9f4970..e4ad421 100644 --- a/src/Infrastructure/csvLoader.js +++ b/src/Infrastructure/csvLoader.js @@ -1,6 +1,6 @@ (function (I, D) { I.loadOrdersFromUpload = async function (file) { const text = await file.text(); - return D.parseCSV(text); + return { text, orders: D.parseCSV(text) }; }; })(window.App.Infrastructure, window.App.Domain); diff --git a/src/Infrastructure/db.js b/src/Infrastructure/db.js index 6408a23..561e156 100644 --- a/src/Infrastructure/db.js +++ b/src/Infrastructure/db.js @@ -1,6 +1,6 @@ (function (I) { const DB_NAME = 'DuimstokInspecties'; - const DB_VERSION = 3; + const DB_VERSION = 4; let db = null; I.openDB = function () { @@ -12,6 +12,8 @@ d.createObjectStore('inspections', { keyPath: 'orderNr' }); if (!d.objectStoreNames.contains('orderStatuses')) d.createObjectStore('orderStatuses', { keyPath: 'orderKey' }); + if (!d.objectStoreNames.contains('ordersCsv')) + d.createObjectStore('ordersCsv', { keyPath: 'id' }); }; req.onsuccess = (e) => { db = e.target.result; resolve(db); }; req.onerror = (e) => reject(e); @@ -53,6 +55,26 @@ }); }; + I.saveOrdersCsv = async function (csvText) { + const d = await ensureDb(); + return new Promise((resolve, reject) => { + const tx = d.transaction('ordersCsv', 'readwrite'); + tx.objectStore('ordersCsv').put({ id: 'current', csv: csvText, uploadedAt: new Date().toISOString() }); + tx.oncomplete = resolve; + tx.onerror = reject; + }); + }; + + I.loadOrdersCsv = async function () { + const d = await ensureDb(); + return new Promise((resolve, reject) => { + const tx = d.transaction('ordersCsv', 'readonly'); + const req = tx.objectStore('ordersCsv').get('current'); + req.onsuccess = () => resolve(req.result || null); + req.onerror = reject; + }); + }; + I.loadAllOrderStatuses = async function () { const d = await ensureDb(); return new Promise((resolve, reject) => {