From 9a755619296897c8ed7b50bda264a8f113fb56a7 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Sat, 27 May 2023 20:56:26 +0200 Subject: [PATCH] Style fixes and cart import/export. --- site/carts.html | 10 +++++--- site/carts.js | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ site/style.css | 18 +++++++++++++- site/utils.js | 8 ++++-- 4 files changed, 96 insertions(+), 6 deletions(-) diff --git a/site/carts.html b/site/carts.html index 11476de..e9e44c5 100644 --- a/site/carts.html +++ b/site/carts.html @@ -17,10 +17,14 @@ Tagespreisänderungen Warenkörbe - -
-
+
+ + + +
+
+ diff --git a/site/carts.js b/site/carts.js index 8028800..f155c75 100644 --- a/site/carts.js +++ b/site/carts.js @@ -1,3 +1,15 @@ +function downloadFile(filename, content) { + const blob = new Blob([content], { type: 'text/plain' }); + const element = document.createElement('a'); + element.href = URL.createObjectURL(blob); + element.download = filename; + element.style.display = 'none'; + document.body.appendChild(element); + element.click(); + document.body.removeChild(element); + URL.revokeObjectURL(element.href); +} + async function load() { const items = await loadItems(); lookup = {}; @@ -5,6 +17,18 @@ async function load() { lookup[item.id] = item; } + // Update carts with latest price info + for (cart of carts) { + const items = []; + for (cartItem of cart.items) { + const item = lookup[cartItem.id]; + if (!item) continue; + items.push(item); + } + cart.items = items; + } + saveCarts(); + if (carts.findIndex(cart => cart.name == "Momentum Eigenmarken Vergleich") == -1) { response = await fetch("momentum-cart.json"); momentumCart = await response.json(); @@ -26,6 +50,47 @@ async function load() { location.href = "/cart.html?name=" + name; }); + const exportButton = document.querySelector("#export"); + exportButton.addEventListener("click", () => { + downloadFile("carts.json", JSON.stringify(carts, null, 2)); + }); + + const importButton = document.querySelector("#import"); + importButton.addEventListener("click", () => { + document.getElementById('fileInput').value = null + document.getElementById('fileInput').click(); + }); + + document.querySelector("#fileInput").addEventListener('change', function (event) { + const file = event.target.files[0]; + const reader = new FileReader(); + reader.onload = function (event) { + const contents = event.target.result; + const importedCarts = JSON.parse(contents); + for (importedCart of importedCarts) { + const items = []; + for (cartItem of cart.items) { + const item = lookup[cartItem.id]; + if (!item) continue; + items.push(item); + } + importedCart.items = items; + + let index = carts.findIndex(cart => cart.name == importedCart.name); + if (index != -1) { + if (confirm("Existierenden Warenkorb '" + importedCart.name + " überschreiben?")) { + carts[index] = importedCart; + } + } else { + carts.push(importedCart); + } + } + saveCarts(); + showCarts(lookup); + }; + reader.readAsText(file); + }); + showCarts(lookup); } @@ -68,6 +133,7 @@ function showCarts(lookup) { deleteButton.setAttribute("value", "Löschen"); const deleteDom = dom("td", ``); deleteDom.appendChild(deleteButton); + priceDom.setAttribute("data-label", "Delete"); row.appendChild(deleteDom); deleteButton.addEventListener("click", () => { diff --git a/site/style.css b/site/style.css index 71e01ee..9e4b737 100644 --- a/site/style.css +++ b/site/style.css @@ -124,10 +124,26 @@ td:nth-child(4) { padding-left: 0.5em; } -td:nth-child(4):before { +.searchresults td:nth-child(4):before { content: "€ " } +.carts td:nth-child(1) { + text-align: left; +} + +.carts td:nth-child(2) { + text-align: center; +} + +.carts td:nth-child(3):before { + content: "€ " +} + +.carts td:nth-child(3) { + text-align: left; +} + .itemname { word-wrap: break-word; word-break: break-all; diff --git a/site/utils.js b/site/utils.js index cf03b68..69f39f1 100644 --- a/site/utils.js +++ b/site/utils.js @@ -245,7 +245,7 @@ function newSearchComponent(parentElement, items, searched, filter, headerModifi
-
+
`; const searchInput = parentElement.querySelector(`#search-${id}`); @@ -266,6 +266,7 @@ function newSearchComponent(parentElement, items, searched, filter, headerModifi let search = (query) => { let hits = []; + let now = performance.now(); try { hits = searchItems(items, query, billa.checked, spar.checked, hofer.checked, dm.checked, lidl.checked, mpreis.checked, @@ -274,6 +275,7 @@ function newSearchComponent(parentElement, items, searched, filter, headerModifi } catch (e) { console.log("Query: " + query + "\n" + e.message); } + console.log("Search took " + (performance.now() - now) / 1000.0 + " secs"); if (searched) hits = searched(hits); if (filter) hits = hits.filter(filter); table.innerHTML = ""; @@ -289,14 +291,16 @@ function newSearchComponent(parentElement, items, searched, filter, headerModifi thead.appendChild(header); table.appendChild(thead); + now = performance.now(); let num = 0; hits.every(hit => { let itemDom = itemToDOM(hit); if (itemDomModifier) itemDom = itemDomModifier(hit, itemDom, hits); table.appendChild(itemDom); num++; - return num <= 1000; + return num < 500; }); + console.log("Building DOM took: " + (performance.now() - now) / 1000.0 + " secs"); numResults.innerHTML = "Resultate: " + hits.length + (num < hits.length ? ", " + num + " angezeigt" : ""); }