mirror of
https://github.com/badlogic/heissepreise.git
synced 2024-06-28 11:25:50 +02:00
Style fixes and cart import/export.
This commit is contained in:
parent
296d131877
commit
9a75561929
|
@ -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>
|
||||||
|
|
|
@ -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", () => {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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" : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user