From d92b72cfae0a254d4f7403c52f44c7b8041111c8 Mon Sep 17 00:00:00 2001 From: dadaloop82 Date: Fri, 13 Mar 2026 14:20:00 +0000 Subject: [PATCH] =?UTF-8?q?Fix:=20svuota=20ricerca,=20rimuovi=20autocomple?= =?UTF-8?q?te=20prodotto=20nuovo,=20camera=20pi=C3=B9=20grande,=20modalit?= =?UTF-8?q?=C3=A0=20spesa,=20fix=20duplicati=20chat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/css/style.css | 28 +++++++++++-- assets/js/app.js | 96 +++++++++++++++++++++++++++++++++++++++---- data/dispensa.db | Bin 126976 -> 143360 bytes index.html | 10 +++-- 4 files changed, 120 insertions(+), 14 deletions(-) diff --git a/assets/css/style.css b/assets/css/style.css index 27ae0ca..475f9f9 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -98,9 +98,9 @@ body { background: rgba(255,255,255,0.25); border: 2px solid rgba(255,255,255,0.5); color: white; - font-size: 1.8rem; - width: 52px; - height: 52px; + font-size: 2.1rem; + width: 58px; + height: 58px; border-radius: 50%; cursor: pointer; display: flex; @@ -142,6 +142,28 @@ body { background: rgba(255,255,255,0.4); } +/* Spesa mode banner */ +.spesa-mode-banner { + display: flex; + align-items: center; + justify-content: space-between; + background: linear-gradient(135deg, #f59e0b, #d97706); + color: #fff; + padding: 10px 16px; + border-radius: var(--radius-sm); + margin-bottom: 10px; + font-weight: 600; + font-size: 0.95rem; + box-shadow: var(--shadow); +} +.spesa-mode-banner .btn { + background: rgba(255,255,255,0.25); + color: #fff; + border: 1px solid rgba(255,255,255,0.5); + font-weight: 600; + padding: 6px 14px; +} + @keyframes pulse-scan { 0%, 100% { box-shadow: 0 2px 8px rgba(0,0,0,0.2); } 50% { box-shadow: 0 2px 16px rgba(255,255,255,0.4); } diff --git a/assets/js/app.js b/assets/js/app.js index 7ae41ff..4c45319 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -699,7 +699,7 @@ function showPage(pageId, param = null) { } loadInventory(); break; - case 'scan': initScanner(); clearQuickNameResults(); break; + case 'scan': initScanner(); clearQuickNameResults(); updateSpesaBanner(); break; case 'products': loadAllProducts(); break; case 'shopping': loadShoppingList(); break; case 'recipe': loadRecipeArchive(); break; @@ -1916,6 +1916,9 @@ function selectQuickProduct(product) { if (pesoMatch) currentProduct.weight_info = pesoMatch[1].trim(); } clearQuickNameResults(); + // Clear the search input + const qInput = document.getElementById('quick-product-name'); + if (qInput) qInput.value = ''; showProductAction(); } @@ -1983,6 +1986,10 @@ function startManualEntry(barcode = '') { document.getElementById('pf-image-preview').style.display = 'none'; document.getElementById('product-form-title').textContent = 'Nuovo Prodotto'; + // Remove datalist/autocomplete suggestions for new products (they cause confusion) + document.getElementById('pf-name').removeAttribute('list'); + document.getElementById('pf-brand').removeAttribute('list'); + // Reset conf-size-row visibility const pfConfRow = document.getElementById('pf-conf-size-row'); if (pfConfRow) pfConfRow.style.display = 'none'; @@ -2822,7 +2829,7 @@ async function submitAdd(e) { showLoading(false); if (result.success) { showToast(`✅ ${currentProduct.name} aggiunto!`, 'success'); - showPage('dashboard'); + if (!spesaModeAfterAdd()) showPage('dashboard'); } else { showToast(result.error || 'Errore', 'error'); } @@ -3245,6 +3252,11 @@ async function selectProductForAction(productId) { if (data.product) { currentProduct = data.product; showLoading(false); + // Clear search inputs after selecting a product + const psInput = document.getElementById('products-search'); + if (psInput) psInput.value = ''; + const invInput = document.getElementById('inventory-search'); + if (invInput) invInput.value = ''; showProductAction(); } else { showLoading(false); @@ -4480,16 +4492,20 @@ async function generateRecipe() { // ===== GEMINI CHAT ===== let chatHistory = []; let chatInventoryContext = null; +let _chatSavedCount = 0; // track how many messages already saved to DB function initChat() { // Load chat history from DB api('chat_list').then(res => { if (res.success && res.messages && res.messages.length > 0) { chatHistory = res.messages.map(m => ({ role: m.role, text: m.text })); + _chatSavedCount = chatHistory.length; renderChatHistory(); + } else { + _chatSavedCount = 0; } - }).catch(() => {}); - // Pre-load inventory context + }).catch(() => { _chatSavedCount = 0; }); + // Always reload fresh inventory context loadChatContext(); // Focus input setTimeout(() => { @@ -4643,10 +4659,17 @@ function clearChat() { function saveChatHistory() { // Keep last 50 messages max - if (chatHistory.length > 50) chatHistory = chatHistory.slice(-50); - // Save last 2 messages (the newest pair) to DB - const newMsgs = chatHistory.slice(-2); - api('chat_save', {}, 'POST', { messages: newMsgs }).catch(() => {}); + if (chatHistory.length > 50) { + const trimmed = chatHistory.length - 50; + chatHistory = chatHistory.slice(-50); + _chatSavedCount = Math.max(0, _chatSavedCount - trimmed); + } + // Only save messages that haven't been saved yet (prevent duplicates) + const unsaved = chatHistory.slice(_chatSavedCount); + if (unsaved.length === 0) return; + api('chat_save', {}, 'POST', { messages: unsaved }).then(() => { + _chatSavedCount = chatHistory.length; + }).catch(() => {}); } // ===== SCREENSAVER & INACTIVITY AUTO-REFRESH ===== @@ -5070,6 +5093,62 @@ function generateScreensaverFact() { return facts[Math.floor(Math.random() * facts.length)](); } +// ===== SPESA MODE (long-press camera for continuous scanning) ===== +let _spesaMode = false; +let _longPressTimer = null; + +function initSpesaMode() { + const btn = document.getElementById('btn-header-scan'); + if (!btn) return; + + btn.addEventListener('pointerdown', (e) => { + _longPressTimer = setTimeout(() => { + _longPressTimer = null; + startSpesaMode(); + }, 600); + }); + btn.addEventListener('pointerup', () => { + if (_longPressTimer) { + clearTimeout(_longPressTimer); + _longPressTimer = null; + // Short press — normal scan + showPage('scan'); + } + }); + btn.addEventListener('pointerleave', () => { + if (_longPressTimer) { + clearTimeout(_longPressTimer); + _longPressTimer = null; + } + }); +} + +function startSpesaMode() { + _spesaMode = true; + showToast('🛒 Modalità Spesa attivata!', 'success'); + showPage('scan'); + updateSpesaBanner(); +} + +function endSpesaMode() { + _spesaMode = false; + updateSpesaBanner(); + stopScanner(); + showPage('dashboard'); +} + +function updateSpesaBanner() { + const banner = document.getElementById('spesa-mode-banner'); + if (banner) banner.style.display = _spesaMode ? 'flex' : 'none'; +} + +// Called after successful add — returns true if spesa mode handled navigation +function spesaModeAfterAdd() { + if (!_spesaMode) return false; + showPage('scan'); + return true; +} + function initInactivityWatcher() { const events = ['pointerdown', 'pointermove', 'keydown', 'scroll', 'touchstart']; events.forEach(evt => { @@ -5089,6 +5168,7 @@ document.addEventListener('DOMContentLoaded', () => { syncSettingsFromDB(); showPage('dashboard'); initInactivityWatcher(); + initSpesaMode(); }); // ===== DUPLICLICK (SPESA ONLINE) ===== diff --git a/data/dispensa.db b/data/dispensa.db index 2bb131304ecb8e56b7d68d19a9f592a12a6bccd4..1dd7d1fc4fabd188f34118bee95be3bb32258efa 100644 GIT binary patch delta 15841 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 e;#ZibnoGAD-qrp9 delta 1492 zcmc&!jc*i16rZ=dx1TdRcYGXRTez!Q3QFm9?>IP0p;%%AscE#S5b&^;0X1ZLt%a!_yh>j4N!AN5S+43mpA3xtegHI>}mK0b}sy?FqsU6j`T9Gn97UEac z4rP#zl9%aaJ*v(lqol#w5GW1PpmLIUaGZWY4Sig{sHN}#zJv$q)8q$AbQ*uT726Zj%Xo2_jrGvgr~KLgs@x0vml zlIe~YSdN%cVfjRUCbYiTvT5x`Gm~jam>CHJUjnIga^2?EO_{_eO9U^!2QwUvL2Gtn zu~px=)jHE?!T<}|sqrF0&cK>D|NmfZdsY;`rPj_{a#vp&DJEVb;5+yRc5yRa zj%)A`?#E~Gar_SMz{z`?g*c&F?Yl2wja7Sn+BCPC=@nLUPi#6qiPU=)R`@AQ)s{#u zd%!Jrj`uY4{2uNrN9rp9r(5X;n3k=bZ0*ew=lgy0$<%wcg>xc1^E8Q(==hdgqx(T{ zgcIX)OPFK=I*jxS4Mt?_hw772HS&xD!$ z75+Vb6+f9f$MpzXxhHY89^tUsulBRjy$kkS9v0fa@~|uy7vOi0)q_Z8r9t+?0#xUg ziQtD^g$7OFM^8j#1SMS1Frw?)GAXk?(*nor0~pHw1v>W~h8Qp45EATR4(jZ`REXIJ zBzR-O(iP0UC~x0zzu)#;8Orml+A~X_6`3k-{k1 zPkF)OxH9`UFBAsnei?GRro#59%;`R)pVNKps$3v2n$13*^Tpv-Pz5@c_d1b|v5_93 zKE_Yt^H+wWLx|p>LrgqK?VEEJx#Zf u5gf+`mX-WtFsS6*yATjR{~CkDispensa Manager - + @@ -23,7 +23,7 @@ - @@ -103,6 +103,10 @@

Scansiona Prodotto

+
@@ -870,6 +874,6 @@
- +