feat: lista spesa con tab Da comprare/In previsione, tag, frequenza, tap-to-scan

- Counter nei tab aggiornati dinamicamente
- Auto-aggiunta prodotti CRITICI a Bring! al caricamento (1x per sessione)
- Badge urgenza e frequenza sugli item in lista (cross-ref smart shopping)
- Tag locali per item (Urgente/Priorità/Verificare) con menu dropdown
- Ordinamento automatico per frequenza utilizzo (item più usati in cima)
- Tap su un item → scanner barcode, con banner 'Trovato! Rimuovi dalla lista'
- Fix pctLeft: usa max(1, qty) come fallback refQty per evitare falsi alert
- Fix daysLeft capped a 365gg per pulire stringhe di previsione
- Back button on action page → torna a shopping se aperto da lista
This commit is contained in:
dadaloop82
2026-03-29 14:12:37 +00:00
parent 5b11ab6493
commit a38a5d670f
6 changed files with 1571 additions and 51 deletions
+87 -30
View File
@@ -9,7 +9,7 @@
<title>Dispensa Manager</title>
<link rel="manifest" href="manifest.json">
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🏠</text></svg>">
<link rel="stylesheet" href="assets/css/style.css?v=20260319a">
<link rel="stylesheet" href="assets/css/style.css?v=20260329a">
<!-- QuaggaJS for barcode scanning -->
<script src="https://cdn.jsdelivr.net/npm/@ericblade/quagga2@1.8.4/dist/quagga.min.js"></script>
</head>
@@ -55,6 +55,7 @@
<span class="stat-icon">🛒</span>
<span class="stat-value" id="stat-spesa">-</span>
<span class="stat-label">Spesa</span>
<span class="stat-urgent" id="stat-urgent" style="display:none"></span>
</div>
</div>
@@ -168,9 +169,11 @@
<!-- ===== PRODUCT ACTION (IN/OUT after scan) ===== -->
<section class="page" id="page-action">
<div class="page-header">
<button class="back-btn" onclick="showPage('scan')">← Indietro</button>
<button class="back-btn" id="action-back-btn" onclick="showPage('scan')">← Indietro</button>
<h2>Cosa vuoi fare?</h2>
</div>
<!-- Banner: shopping list scan context -->
<div id="shopping-scan-target-banner" class="shopping-scan-target-banner" style="display:none"></div>
<div class="product-preview product-preview-large" id="action-product-preview"></div>
<div class="inventory-status-bar" id="action-inventory-status" style="display:none"></div>
<div class="action-buttons" id="action-buttons-container">
@@ -513,40 +516,86 @@
<div class="bring-status" id="bring-status">
<div class="bring-loading">Connessione a Bring!...</div>
</div>
<!-- Price total banner -->
<div class="spesa-total-banner" id="spesa-total-banner" style="display:none">
<div class="spesa-total-row">
<span class="spesa-total-label">💰 Totale stimato</span>
<span class="spesa-total-value" id="spesa-total-value">€ 0,00</span>
</div>
<div class="spesa-total-detail" id="spesa-total-detail"></div>
<!-- Tab navigation -->
<div class="shopping-tabs" id="shopping-tabs" style="display:none">
<button class="shopping-tab active" id="tab-acquisto" onclick="switchShoppingTab('acquisto')">
🛍️ Da comprare <span class="shopping-tab-count" id="tab-count-acquisto">0</span>
</button>
<button class="shopping-tab" id="tab-previsione" onclick="switchShoppingTab('previsione')">
🧠 In previsione <span class="shopping-tab-count" id="tab-count-previsione">0</span>
</button>
</div>
<div class="shopping-current" id="shopping-current" style="display:none">
<div class="shopping-section-header">
<h3>🛍️ Da comprare</h3>
<span class="shopping-count" id="shopping-count">0</span>
<!-- Tab panel: Da comprare -->
<div id="tab-panel-acquisto" class="tab-panel-shopping active">
<!-- Price total banner -->
<div class="spesa-total-banner" id="spesa-total-banner" style="display:none">
<div class="spesa-total-row">
<span class="spesa-total-label">💰 Totale stimato</span>
<span class="spesa-total-value" id="spesa-total-value">€ 0,00</span>
</div>
<div class="spesa-total-detail" id="spesa-total-detail"></div>
</div>
<div class="shopping-items" id="shopping-items"></div>
</div>
<div class="shopping-suggestions" id="shopping-suggestions" style="display:none">
<div class="shopping-section-header">
<h3>💡 Suggerimenti AI</h3>
<div class="shopping-current" id="shopping-current" style="display:none">
<div class="shopping-section-header">
<h3>🛍️ Da comprare</h3>
<span class="shopping-count" id="shopping-count">0</span>
</div>
<div class="shopping-items" id="shopping-items"></div>
</div>
<div class="seasonal-tip" id="seasonal-tip" style="display:none"></div>
<div class="suggestion-items" id="suggestion-items"></div>
<div class="suggestion-actions" id="suggestion-actions" style="display:none">
<button class="btn btn-success" onclick="addSelectedSuggestions()">
✅ Aggiungi selezionati a Bring!
<div class="shopping-suggestions" id="shopping-suggestions" style="display:none">
<div class="shopping-section-header">
<h3>💡 Suggerimenti AI</h3>
</div>
<div class="seasonal-tip" id="seasonal-tip" style="display:none"></div>
<div class="suggestion-items" id="suggestion-items"></div>
<div class="suggestion-actions" id="suggestion-actions" style="display:none">
<button class="btn btn-success" onclick="addSelectedSuggestions()">
✅ Aggiungi selezionati a Bring!
</button>
</div>
</div>
<div class="shopping-actions">
<button class="btn btn-large btn-accent" onclick="searchAllPrices()" id="btn-search-prices">
🔍 Cerca tutti i prezzi
</button>
<button class="btn btn-large btn-accent" onclick="generateSuggestions()" id="btn-suggest">
🤖 Suggerisci cosa comprare
</button>
</div>
</div>
<div class="shopping-actions">
<button class="btn btn-large btn-accent" onclick="searchAllPrices()" id="btn-search-prices">
🔍 Cerca tutti i prezzi
</button>
<button class="btn btn-large btn-accent" onclick="generateSuggestions()" id="btn-suggest">
🤖 Suggerisci cosa comprare
</button>
<!-- Tab panel: In previsione -->
<div id="tab-panel-previsione" class="tab-panel-shopping">
<!-- Smart shopping predictions -->
<div class="smart-shopping" id="smart-shopping">
<div class="smart-shopping-empty" id="smart-shopping-empty" style="display:none">
<div class="empty-state" style="padding:30px">
<div class="empty-state-icon">🧠</div>
<p>Nessuna previsione disponibile.<br>Aggiungi prodotti alla dispensa per ricevere previsioni intelligenti.</p>
</div>
</div>
<div id="smart-shopping-content">
<div class="shopping-section-header" style="margin-bottom:4px">
<h3>🧠 Previsioni intelligenti</h3>
<span class="shopping-count" id="smart-count">0</span>
</div>
<div class="smart-filter-row" id="smart-filter-row">
<button class="smart-filter active" data-filter="all" onclick="filterSmart('all')">Tutti</button>
<button class="smart-filter" data-filter="critical" onclick="filterSmart('critical')">🔴 Urgenti</button>
<button class="smart-filter" data-filter="high" onclick="filterSmart('high')">🟠 Presto</button>
<button class="smart-filter" data-filter="medium" onclick="filterSmart('medium')">🟡 Pianifica</button>
<button class="smart-filter" data-filter="low" onclick="filterSmart('low')">🟢 Previsione</button>
</div>
<div class="smart-items" id="smart-items"></div>
<div class="smart-actions" id="smart-actions" style="display:none">
<button class="btn btn-success full-width" onclick="addSmartToBring()">
🛒 Aggiungi selezionati a Bring!
</button>
</div>
</div>
</div>
</div>
</div>
</section>
@@ -909,6 +958,14 @@
<div class="screensaver-clock" id="screensaver-clock"></div>
<div class="screensaver-fact" id="screensaver-fact"></div>
</div>
<div class="screensaver-shortcuts">
<button class="screensaver-shortcut-btn" id="screensaver-recipe-btn" title="Ricette">
🍳
</button>
<button class="screensaver-shortcut-btn" id="screensaver-scan-btn" title="Scansiona prodotto (tieni premuto per modalità spesa)">
📷
</button>
</div>
</div>
<script src="assets/js/app.js?v=20260319a"></script>