Style fixes and cart import/export.

This commit is contained in:
Mario Zechner 2023-05-27 20:56:26 +02:00
parent 296d131877
commit 9a75561929
4 changed files with 96 additions and 6 deletions

View File

@ -17,10 +17,14 @@
<a href="changes.html">Tagespreisänderungen</a> <a href="changes.html">Tagespreisänderungen</a>
<a href="carts.html"><strong>Warenkörbe</strong></a> <a href="carts.html"><strong>Warenkörbe</strong></a>
</div> </div>
<button id="newcart">Neuer Warenkorb</button> <div class="filters">
<table id="carts"></table> <button id="newcart">Neuer Warenkorb</button>
<table id="result"></table> <button id="export">Exportieren</button>
<button id="import">Importieren</button>
</div>
<table id="carts" class="carts"></table>
</div> </div>
<input type="file" id="fileInput" style="display: none;">
<script src="utils.js"></script> <script src="utils.js"></script>
<script src="carts.js"></script> <script src="carts.js"></script>
</body> </body>

View File

@ -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() { async function load() {
const items = await loadItems(); const items = await loadItems();
lookup = {}; lookup = {};
@ -5,6 +17,18 @@ async function load() {
lookup[item.id] = item; 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) { if (carts.findIndex(cart => cart.name == "Momentum Eigenmarken Vergleich") == -1) {
response = await fetch("momentum-cart.json"); response = await fetch("momentum-cart.json");
momentumCart = await response.json(); momentumCart = await response.json();
@ -26,6 +50,47 @@ async function load() {
location.href = "/cart.html?name=" + name; 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); showCarts(lookup);
} }
@ -68,6 +133,7 @@ function showCarts(lookup) {
deleteButton.setAttribute("value", "Löschen"); deleteButton.setAttribute("value", "Löschen");
const deleteDom = dom("td", ``); const deleteDom = dom("td", ``);
deleteDom.appendChild(deleteButton); deleteDom.appendChild(deleteButton);
priceDom.setAttribute("data-label", "Delete");
row.appendChild(deleteDom); row.appendChild(deleteDom);
deleteButton.addEventListener("click", () => { deleteButton.addEventListener("click", () => {

View File

@ -124,10 +124,26 @@ td:nth-child(4) {
padding-left: 0.5em; padding-left: 0.5em;
} }
td:nth-child(4):before { .searchresults td:nth-child(4):before {
content: "€ " 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 { .itemname {
word-wrap: break-word; word-wrap: break-word;
word-break: break-all; word-break: break-all;

View File

@ -245,7 +245,7 @@ function newSearchComponent(parentElement, items, searched, filter, headerModifi
<label><input id="exact-${id}" type="checkbox"> Exaktes Wort</label> <label><input id="exact-${id}" type="checkbox"> Exaktes Wort</label>
</div> </div>
<div id="numresults-${id}"></div> <div id="numresults-${id}"></div>
<table id="result-${id}"></table> <table id="result-${id}" class="searchresults"></table>
`; `;
const searchInput = parentElement.querySelector(`#search-${id}`); const searchInput = parentElement.querySelector(`#search-${id}`);
@ -266,6 +266,7 @@ function newSearchComponent(parentElement, items, searched, filter, headerModifi
let search = (query) => { let search = (query) => {
let hits = []; let hits = [];
let now = performance.now();
try { try {
hits = searchItems(items, query, hits = searchItems(items, query,
billa.checked, spar.checked, hofer.checked, dm.checked, lidl.checked, mpreis.checked, 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) { } catch (e) {
console.log("Query: " + query + "\n" + e.message); console.log("Query: " + query + "\n" + e.message);
} }
console.log("Search took " + (performance.now() - now) / 1000.0 + " secs");
if (searched) hits = searched(hits); if (searched) hits = searched(hits);
if (filter) hits = hits.filter(filter); if (filter) hits = hits.filter(filter);
table.innerHTML = ""; table.innerHTML = "";
@ -289,14 +291,16 @@ function newSearchComponent(parentElement, items, searched, filter, headerModifi
thead.appendChild(header); thead.appendChild(header);
table.appendChild(thead); table.appendChild(thead);
now = performance.now();
let num = 0; let num = 0;
hits.every(hit => { hits.every(hit => {
let itemDom = itemToDOM(hit); let itemDom = itemToDOM(hit);
if (itemDomModifier) itemDom = itemDomModifier(hit, itemDom, hits); if (itemDomModifier) itemDom = itemDomModifier(hit, itemDom, hits);
table.appendChild(itemDom); table.appendChild(itemDom);
num++; 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" : ""); numResults.innerHTML = "Resultate: " + hits.length + (num < hits.length ? ", " + num + " angezeigt" : "");
} }