From d81f215f59c5030218da09e9603fd38f73b8820e Mon Sep 17 00:00:00 2001 From: data Date: Sun, 1 Mar 2026 21:50:36 +0100 Subject: [PATCH] v6.8: Stopp-Button Fix, persistente Freitext-Lieferant-Speicherung, SW-Update - Stopp-Button: overflow:hidden auf Video-Container, z-index auf Controls, pointer-events:none auf Quagga-Canvas damit der Button klickbar bleibt - Freitext-Lieferant wird persistent in localStorage gespeichert (hbs_config) und bei Dropdown-Aenderung sofort aktualisiert - Service Worker: Network-first fuer eigene Assets (JS/CSS), Cache-first nur noch fuer CDN-Libraries - Letzte Bestell-ID (lastOrderId) ebenfalls persistent - Migration alter localStorage-Keys in neue zentrale Config Co-Authored-By: Claude Opus 4.6 --- core/modules/modHandyBarcodeScanner.class.php | 2 +- js/scanner.js | 61 +++++++++++++++++-- pwa.php | 33 +++++++--- sw.js | 32 +++++++--- 4 files changed, 107 insertions(+), 21 deletions(-) diff --git a/core/modules/modHandyBarcodeScanner.class.php b/core/modules/modHandyBarcodeScanner.class.php index 7eb8d93..1c207c1 100755 --- a/core/modules/modHandyBarcodeScanner.class.php +++ b/core/modules/modHandyBarcodeScanner.class.php @@ -76,7 +76,7 @@ class modHandyBarcodeScanner extends DolibarrModules $this->editor_squarred_logo = ''; // Must be image filename into the module/img directory followed with @modulename. Example: 'myimage.png@handybarcodescanner' // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated', 'experimental_deprecated' or a version string like 'x.y.z' - $this->version = '6.0'; + $this->version = '6.8'; // Url to the file with your last numberversion of this module //$this->url_last_version = 'http://www.example.com/versionmodule.txt'; diff --git a/js/scanner.js b/js/scanner.js index b81b7cf..0dc18b9 100755 --- a/js/scanner.js +++ b/js/scanner.js @@ -46,10 +46,40 @@ let allSuppliers = []; let quaggaInitialized = false; let openDialogCount = 0; // Zaehlt offene Dialoge - let lastFreetextSupplierId = null; // Zuletzt verwendeter Freitext-Lieferant - // Order overview state - let lastOrderId = null; + // Persistente Einstellungen - eine zentrale Config statt einzelner Keys + const STORAGE_KEY = 'hbs_config'; + function loadConfig() { + try { + return JSON.parse(localStorage.getItem(STORAGE_KEY)) || {}; + } catch (e) { + return {}; + } + } + function saveConfig(key, value) { + const cfg = loadConfig(); + cfg[key] = value; + localStorage.setItem(STORAGE_KEY, JSON.stringify(cfg)); + } + + // Migration: alte einzelne Keys -> neue zentrale Config + (function migrateOldKeys() { + const oldSupplier = localStorage.getItem('hbs_lastFreetextSupplierId'); + const oldOrder = localStorage.getItem('hbs_lastOrderId'); + if (oldSupplier) { + saveConfig('lastFreetextSupplierId', oldSupplier); + localStorage.removeItem('hbs_lastFreetextSupplierId'); + } + if (oldOrder) { + saveConfig('lastOrderId', parseInt(oldOrder)); + localStorage.removeItem('hbs_lastOrderId'); + } + })(); + + let lastFreetextSupplierId = loadConfig().lastFreetextSupplierId || null; + + // Order overview state (persistent über App-Neustarts) + let lastOrderId = loadConfig().lastOrderId || null; let cachedOrders = []; let currentOrderDetail = null; @@ -277,10 +307,15 @@ Quagga.start(); quaggaInitialized = true; isScanning = true; + elements.startBtn.disabled = false; elements.startBtn.classList.add('hidden'); elements.stopBtn.classList.remove('hidden'); elements.videoContainer.classList.add('scanning'); + // Quagga-Canvas darf keine Klicks abfangen + const canvases = elements.videoContainer.querySelectorAll('canvas'); + canvases.forEach(function(c) { c.style.pointerEvents = 'none'; }); + // Register detection handler Quagga.onDetected(onBarcodeDetected); @@ -728,6 +763,7 @@ showToast(`${CONFIG.lang.added}: ${productName} (${qty}x)`, 'success'); // Save last order ID for auto-open in order view lastOrderId = data.order_id; + saveConfig('lastOrderId', data.order_id); hideResult(); } else { showToast(data.error || CONFIG.lang.error, 'error'); @@ -856,6 +892,8 @@ pauseScanner(); + const savedSupplierId = loadConfig().lastFreetextSupplierId; + const modal = document.createElement('div'); modal.className = 'freetext-modal'; modal.id = 'freetext-modal'; @@ -866,7 +904,7 @@
@@ -892,6 +930,17 @@ `; document.body.appendChild(modal); + // Gespeicherten Lieferant per JS setzen + const supplierSelect = document.getElementById('freetext-supplier'); + if (savedSupplierId) { + supplierSelect.value = savedSupplierId; + } + + // Bei jeder Aenderung sofort speichern + supplierSelect.addEventListener('change', function() { + saveConfig('lastFreetextSupplierId', this.value); + }); + function closeModal() { modal.remove(); resumeScanner(); @@ -923,8 +972,9 @@ return; } - // Lieferant merken für nächstes Mal + // Lieferant merken für nächstes Mal (auch über Neustarts hinweg) lastFreetextSupplierId = supplierId; + saveConfig('lastFreetextSupplierId', supplierId); showLoading(); @@ -942,6 +992,7 @@ if (data.success) { showToast(`Hinzugefügt: ${description} (${qty}x)`, 'success'); lastOrderId = data.order_id; + saveConfig('lastOrderId', data.order_id); if (closeModalCallback) closeModalCallback(); } else { showToast(data.error || CONFIG.lang.error, 'error'); diff --git a/pwa.php b/pwa.php index 216053a..15dc976 100755 --- a/pwa.php +++ b/pwa.php @@ -53,7 +53,7 @@ $colormain = getDolGlobalString('THEME_ELDY_TOPMENU_BACK1', '#0077b3'); Barcode Scanner - +