From d70d7bbfe39fc53c44fa4a8baf536911640081d2 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Tue, 13 Jun 2023 01:04:12 +0200 Subject: [PATCH] New cart page. --- bundle.js | 1 + site/cart-old.html | 44 +++++ site/cart-old.js | 277 +++++++++++++++++++++++++++++ site/cart.html | 46 +---- site/cart.js | 351 ++++++++++++------------------------- site/index.js | 3 +- site/views/index.js | 1 + site/views/items-filter.js | 7 +- site/views/items-list.js | 90 ++++++++-- site/views/view.js | 2 +- 10 files changed, 533 insertions(+), 289 deletions(-) create mode 100644 site/cart-old.html create mode 100644 site/cart-old.js diff --git a/bundle.js b/bundle.js index 14ba99c..ea10ac6 100755 --- a/bundle.js +++ b/bundle.js @@ -104,6 +104,7 @@ async function bundleJS(inputDir, outputDir, watch) { let buildContext = await esbuild.context({ entryPoints: { carts: `${inputDir}/carts.js`, + cart: `${inputDir}/cart.js`, changes: `${inputDir}/changes.js`, index: `${inputDir}/index.js`, }, diff --git a/site/cart-old.html b/site/cart-old.html new file mode 100644 index 0000000..0565892 --- /dev/null +++ b/site/cart-old.html @@ -0,0 +1,44 @@ +%%_templates/_header.html%% %%_templates/_menu.html%% + +
+
+

+ + +
+ +
+ + + + + + +%%_templates/_footer.html%% diff --git a/site/cart-old.js b/site/cart-old.js new file mode 100644 index 0000000..864c684 --- /dev/null +++ b/site/cart-old.js @@ -0,0 +1,277 @@ +const shoppingCarts = new ShoppingCarts(); +shoppingCarts.load(); + +async function load() { + const items = await loadItems(); + const lookup = {}; + for (item of items) { + lookup[item.store + item.id] = item; + } + + let cart = null; + const cartName = getQueryParameter("name"); + if (cartName) { + for (c of shoppingCarts.carts) { + if (c.name == cartName) { + cart = c; + break; + } + } + + // Update cart pricing info + const items = []; + for (cartItem of cart.items) { + const item = lookup[cartItem.store + cartItem.id]; + if (!item) items.push(cartItem); + else items.push(item); + } + cart.items = items; + shoppingCarts.save(); + } + + const cartDesc = getQueryParameter("cart"); + if (cartDesc) { + let tokens = cartDesc.split(";"); + cart = { + name: tokens[0], + items: [], + linked: true, + }; + for (let i = 1; i < tokens.length; i++) { + const item = lookup[tokens[i]]; + if (item) cart.items.push(item); + } + let saveButton = document.querySelector("#save"); + saveButton.classList.remove("hidden"); + saveButton.addEventListener("click", () => { + let index = shoppingCarts.carts.findIndex((c) => c.name === cart.name); + if (index != -1) { + if (confirm("Existierenden Warenkorb '" + cart.name + " überschreiben?")) { + shoppingCarts.carts[index] = cart; + } + } else { + shoppingCarts.carts.push(importedCart); + } + location.href = "/cart.html?name=" + encodeURIComponent(cart.name); + }); + } + + if (cart == null) { + alert("Warenkorb '" + cartName + "' existiert nicht."); + location.href = "carts.html"; + } + + if (cart.name != "Momentum Eigenmarken Vergleich" && !cart.linked) showSearch(cart, items); + + const canvasDom = document.querySelector("#chart"); + + document.querySelector("#sum-container").innerHTML = customCheckbox(`sum`, "Preissumme Gesamt", true, "gray"); + document.querySelector("#sumstores-container").innerHTML = customCheckbox(`sumstores`, "Preissumme pro Kette", true, "gray"); + document.querySelector("#todayonly-container").innerHTML = customCheckbox(`todayonly`, "Nur heutige Preise", false, "gray"); + + document.querySelector("#sum").addEventListener("change", () => updateCharts(canvasDom, filter(cart.items))); + document.querySelector("#sumstores").addEventListener("change", () => updateCharts(canvasDom, filter(cart.items))); + document.querySelector("#todayonly").addEventListener("change", () => updateCharts(canvasDom, filter(cart.items))); + document.querySelector("#start").addEventListener("change", () => updateCharts(canvasDom, filter(cart.items))); + document.querySelector("#end").addEventListener("change", () => updateCharts(canvasDom, filter(cart.items))); + + document.querySelector("#start").value = getOldestDate(cart.items); + document.querySelector("#end").value = currentDate(); + + const filtersStore = document.querySelector("#filters-store"); + filtersStore.innerHTML = ` + ${customCheckbox("all", "Alle", true, "gray")} + ${STORE_KEYS.map((store) => + customCheckbox(store, stores[store].name, stores[store].name.toLowerCase().endsWith("de") ? false : true, stores[store].color) + ).join(" ")} + `; + + filtersStore.querySelectorAll("input").forEach((input) => { + if (input.id == "all") return; + input.addEventListener("change", () => showCart(cart)); + }); + filtersStore.querySelector("#all").addEventListener("change", () => { + STORE_KEYS.forEach((store) => (filtersStore.querySelector(`#${store}`).checked = filtersStore.querySelector("#all").checked)); + showCart(cart); + }); + document.querySelector("#filter").addEventListener("input", () => showCart(cart)); + showCart(cart); +} + +function filter(cartItems) { + const query = document.querySelector("#filter").value.trim(); + const storeCheckboxes = STORE_KEYS.map((store) => document.querySelector(`#${store}`)); + const checkedStores = STORE_KEYS.filter((store, i) => storeCheckboxes[i].checked); + let items = []; + if (query.charAt(0) != "!") { + for (item of cartItems) { + if (!checkedStores.includes(item.store)) continue; + items.push(item); + } + } else { + items = cartItems; + } + if (query.length >= 3) items = searchItems(items, document.querySelector("#filter").value, checkedStores, false, 0, 10000, false, false); + return items; +} + +function showSearch(cart, items) { + const searchDom = document.querySelector("#search"); + searchDom.innerHTML = ""; + newSearchComponent( + searchDom, + items, + null, + null, + (header) => { + header.innerHTML += ""; + return header; + }, + (item, itemDom) => { + const cell = dom("td", ``); + cell.children[0].addEventListener("click", () => { + cart.items.push(item); + shoppingCarts.save(); + document.querySelector("#start").value = getOldestDate(cart.items); + document.querySelector("#end").value = currentDate(); + showCart(cart); + }); + cell.classList.add("order-6"); + itemDom.appendChild(cell); + return itemDom; + } + ); + searchDom.querySelector("input").setAttribute("placeholder", "Produkte suchen und hinzufügen..."); +} + +function updateCharts(canvasDom, items) { + let startDate = document.querySelector("#start").value; + let endDate = document.querySelector("#end").value; + if (start > endDate) { + let tmp = start; + start = endDate; + endDate = tmp; + } + showCharts( + canvasDom, + items, + document.querySelector("#sum").checked, + document.querySelector("#sumstores").checked, + document.querySelector("#todayonly").checked, + startDate, + endDate + ); +} + +function showCart(cart) { + if (cart.items.length == 0) { + document.querySelector("#noproducts").classList.remove("hidden"); + document.querySelector("#hasproducts").classList.add("hidden"); + } else { + document.querySelector("#noproducts").classList.add("hidden"); + document.querySelector("#hasproducts").classList.remove("hidden"); + } + + let link = encodeURIComponent(cart.name) + ";"; + for (cartItem of cart.items) { + link += cartItem.store + cartItem.id + ";"; + } + + document.querySelector("#cartname").innerHTML = ` + Warenkorb '${cart.name}' Teilen + `; + + const canvasDom = document.querySelector("#chart"); + let items = filter(cart.items); + if (items.length == cart.items.length) { + document.querySelector("#numitems").innerText = `${cart.items.length} Artikel`; + } else { + document.querySelector("#numitems").innerText = `${items.length} / ${cart.items.length} Artikel`; + } + document.querySelector("#json").addEventListener("click", (event) => { + event.preventDefault(); + downloadFile("items.json", JSON.stringify(items, null, 2)); + }); + updateCharts(canvasDom, items); + + const itemTable = document.querySelector("#cartitems"); + itemTable.innerHTML = ""; + header = dom( + "thead", + ` + Kette + Name + Preis + + + ` + ); + const showHideAll = header.querySelectorAll("th:nth-child(3)")[0]; + showHideAll.style["cursor"] = "pointer"; + showHideAll.showAll = true; + showHideAll.addEventListener("click", () => { + showHideAll.querySelector(".expander").innerText = showHideAll.querySelector(".expander").innerText == "+" ? "-" : "+"; + itemTable.querySelectorAll(".priceinfo").forEach((el) => (showHideAll.showAll ? el.classList.remove("hidden") : el.classList.add("hidden"))); + showHideAll.showAll = !showHideAll.showAll; + }); + itemTable.append(header); + + items.forEach((cartItem, idx) => { + const itemDom = itemToDOM(cartItem); + + const cell = dom( + "td", + ` + + + + + ` + ); + cell.classList.add("action"); + + if (cartItem.chart) cell.children[0].setAttribute("checked", true); + cell.children[0].addEventListener("change", () => { + cartItem.chart = cell.children[0].children[0].checked; + shoppingCarts.save(); + updateCharts(canvasDom, items); + }); + + if (cart.name != "Momentum Eigenmarken Vergleich" && !cart.linked) { + cell.children[1].addEventListener("click", () => { + cart.items.splice(idx, 1); + shoppingCarts.save(); + document.querySelector("#start").value = getOldestDate(cart.items); + document.querySelector("#end").value = currentDate(); + showCart(cart); + }); + + cell.children[2].addEventListener("click", () => { + if (idx == 0) return; + let otherItem = cart.items[idx - 1]; + cart.items[idx - 1] = cartItem; + cart.items[idx] = otherItem; + shoppingCarts.save(); + showCart(cart); + }); + + cell.children[3].addEventListener("click", () => { + if (idx == cart.items.length - 1) return; + let otherItem = cart.items[idx + 1]; + cart.items[idx + 1] = cartItem; + cart.items[idx] = otherItem; + shoppingCarts.save(); + showCart(cart); + }); + } else { + cell.querySelectorAll("input[type='button']").forEach((button) => button.classList.add("hidden")); + } + + itemDom.append(cell); + itemTable.append(itemDom); + }); +} + +load(); diff --git a/site/cart.html b/site/cart.html index 9729c61..f4e0f54 100644 --- a/site/cart.html +++ b/site/cart.html @@ -1,44 +1,16 @@ %%_templates/_header.html%% %%_templates/_menu.html%% -
-
-

- - -
- +
+ + + + + + + +
- - - %%_templates/_footer.html%% diff --git a/site/cart.js b/site/cart.js index 864c684..8b72283 100644 --- a/site/cart.js +++ b/site/cart.js @@ -1,32 +1,87 @@ -const shoppingCarts = new ShoppingCarts(); -shoppingCarts.load(); +const { getQueryParameter } = require("./misc"); +const models = require("./model"); +const { Model } = require("./model/model"); +const { View } = require("./views/view"); +const { STORE_KEYS, stores } = require("./model/stores"); +require("./views"); -async function load() { - const items = await loadItems(); - const lookup = {}; - for (item of items) { - lookup[item.store + item.id] = item; +let carts = null; + +class CartModel extends Model { + constructor(cart, linked) { + super(); + this.cart = cart; + this.items = cart.items; + this._filteredItems = [...this.items]; + this.linked = linked; } + get filteredItems() { + return this._filteredItems; + } + + set filteredItems(newItems) { + this._filteredItems = newItems; + this.notify(); + } +} + +class CartHeader extends View { + constructor() { + super(); + this.innerHTML = ` +

+ +

+ + + `; + + const elements = this.elements; + elements.save.addEventListener("click", () => { + const cart = this.model.cart; + let index = carts.findIndex((c) => c.name === cart.name); + if (index != -1) { + if (confirm("Existierenden Warenkorb '" + cart.name + " überschreiben?")) { + carts[index] = cart; + } + } else { + carts.push(cart); + } + // model.carts.save(); + location.href = "/cart-new.html?name=" + encodeURIComponent(cart.name); + }); + } + + render() { + const cart = this.model.cart; + const elements = this.elements; + elements.name.innerText = `Warenkorb '${cart.name}'`; + if (this.model.linked) { + elements.save.classList.remove("hidden"); + } else { + elements.share.classList.remove("hidden"); + let link = encodeURIComponent(cart.name) + ";"; + for (const cartItem of cart.items) { + link += cartItem.store + cartItem.id + ";"; + } + elements.share.href = "cart-new.html?cart=" + link; + } + } +} +customElements.define("cart-header", CartHeader); + +function loadCart() { let cart = null; + let linked = false; const cartName = getQueryParameter("name"); if (cartName) { - for (c of shoppingCarts.carts) { + for (const c of carts) { if (c.name == cartName) { cart = c; break; } } - - // Update cart pricing info - const items = []; - for (cartItem of cart.items) { - const item = lookup[cartItem.store + cartItem.id]; - if (!item) items.push(cartItem); - else items.push(item); - } - cart.items = items; - shoppingCarts.save(); } const cartDesc = getQueryParameter("cart"); @@ -35,25 +90,12 @@ async function load() { cart = { name: tokens[0], items: [], - linked: true, }; for (let i = 1; i < tokens.length; i++) { - const item = lookup[tokens[i]]; + const item = models.items.lookup[tokens[i]]; if (item) cart.items.push(item); } - let saveButton = document.querySelector("#save"); - saveButton.classList.remove("hidden"); - saveButton.addEventListener("click", () => { - let index = shoppingCarts.carts.findIndex((c) => c.name === cart.name); - if (index != -1) { - if (confirm("Existierenden Warenkorb '" + cart.name + " überschreiben?")) { - shoppingCarts.carts[index] = cart; - } - } else { - shoppingCarts.carts.push(importedCart); - } - location.href = "/cart.html?name=" + encodeURIComponent(cart.name); - }); + linked = true; } if (cart == null) { @@ -61,217 +103,54 @@ async function load() { location.href = "carts.html"; } - if (cart.name != "Momentum Eigenmarken Vergleich" && !cart.linked) showSearch(cart, items); + return new CartModel(cart, linked); +} - const canvasDom = document.querySelector("#chart"); +(async () => { + await models.load(); + carts = models.carts.carts; + const cart = loadCart(); - document.querySelector("#sum-container").innerHTML = customCheckbox(`sum`, "Preissumme Gesamt", true, "gray"); - document.querySelector("#sumstores-container").innerHTML = customCheckbox(`sumstores`, "Preissumme pro Kette", true, "gray"); - document.querySelector("#todayonly-container").innerHTML = customCheckbox(`todayonly`, "Nur heutige Preise", false, "gray"); + const elements = View.elements(document.body); + const cartHeader = elements.cartHeader; + cartHeader.model = cart; - document.querySelector("#sum").addEventListener("change", () => updateCharts(canvasDom, filter(cart.items))); - document.querySelector("#sumstores").addEventListener("change", () => updateCharts(canvasDom, filter(cart.items))); - document.querySelector("#todayonly").addEventListener("change", () => updateCharts(canvasDom, filter(cart.items))); - document.querySelector("#start").addEventListener("change", () => updateCharts(canvasDom, filter(cart.items))); - document.querySelector("#end").addEventListener("change", () => updateCharts(canvasDom, filter(cart.items))); - - document.querySelector("#start").value = getOldestDate(cart.items); - document.querySelector("#end").value = currentDate(); - - const filtersStore = document.querySelector("#filters-store"); - filtersStore.innerHTML = ` - ${customCheckbox("all", "Alle", true, "gray")} - ${STORE_KEYS.map((store) => - customCheckbox(store, stores[store].name, stores[store].name.toLowerCase().endsWith("de") ? false : true, stores[store].color) - ).join(" ")} - `; - - filtersStore.querySelectorAll("input").forEach((input) => { - if (input.id == "all") return; - input.addEventListener("change", () => showCart(cart)); + const cartFilter = elements.cartFilter; + const cartList = cart.linked ? elements.linkedCartList : elements.cartList; + STORE_KEYS.forEach((store) => { + cartFilter.elements[store].checked = true; }); - filtersStore.querySelector("#all").addEventListener("change", () => { - STORE_KEYS.forEach((store) => (filtersStore.querySelector(`#${store}`).checked = filtersStore.querySelector("#all").checked)); - showCart(cart); - }); - document.querySelector("#filter").addEventListener("input", () => showCart(cart)); - showCart(cart); -} + cartList.elements.numItemsLabel.innerHTML = "Artikel:"; + cartList.model = cartFilter.model = cart; + cartList.elements.enableChart.checked = true; + cartList.elements.chart.elements.sumStores.checked = true; + cartList.fireChangeEvent(); + cartList.elements.chart.fireChangeEvent(); -function filter(cartItems) { - const query = document.querySelector("#filter").value.trim(); - const storeCheckboxes = STORE_KEYS.map((store) => document.querySelector(`#${store}`)); - const checkedStores = STORE_KEYS.filter((store, i) => storeCheckboxes[i].checked); - let items = []; - if (query.charAt(0) != "!") { - for (item of cartItems) { - if (!checkedStores.includes(item.store)) continue; - items.push(item); - } - } else { - items = cartItems; - } - if (query.length >= 3) items = searchItems(items, document.querySelector("#filter").value, checkedStores, false, 0, 10000, false, false); - return items; -} - -function showSearch(cart, items) { - const searchDom = document.querySelector("#search"); - searchDom.innerHTML = ""; - newSearchComponent( - searchDom, - items, - null, - null, - (header) => { - header.innerHTML += ""; - return header; - }, - (item, itemDom) => { - const cell = dom("td", ``); - cell.children[0].addEventListener("click", () => { - cart.items.push(item); - shoppingCarts.save(); - document.querySelector("#start").value = getOldestDate(cart.items); - document.querySelector("#end").value = currentDate(); - showCart(cart); - }); - cell.classList.add("order-6"); - itemDom.appendChild(cell); - return itemDom; - } - ); - searchDom.querySelector("input").setAttribute("placeholder", "Produkte suchen und hinzufügen..."); -} - -function updateCharts(canvasDom, items) { - let startDate = document.querySelector("#start").value; - let endDate = document.querySelector("#end").value; - if (start > endDate) { - let tmp = start; - start = endDate; - endDate = tmp; - } - showCharts( - canvasDom, - items, - document.querySelector("#sum").checked, - document.querySelector("#sumstores").checked, - document.querySelector("#todayonly").checked, - startDate, - endDate - ); -} - -function showCart(cart) { if (cart.items.length == 0) { - document.querySelector("#noproducts").classList.remove("hidden"); - document.querySelector("#hasproducts").classList.add("hidden"); + elements.noItems.classList.remove("hidden"); } else { - document.querySelector("#noproducts").classList.add("hidden"); - document.querySelector("#hasproducts").classList.remove("hidden"); + cartFilter.classList.remove("hidden"); + cartList.classList.remove("hidden"); } - let link = encodeURIComponent(cart.name) + ";"; - for (cartItem of cart.items) { - link += cartItem.store + cartItem.id + ";"; + cartList.removeCallback = (item) => models.carts.save(); + cartList.upCallback = (item) => models.carts.save(); + cartList.downCallback = (item) => models.carts.save(); + + const productsFilter = elements.productsFilter; + const productsList = elements.productsList; + productsList.model = productsFilter.model = models.items; + if (!cart.linked) { + productsFilter.classList.remove("hidden"); + productsList.classList.remove("hidden"); } - document.querySelector("#cartname").innerHTML = ` - Warenkorb '${cart.name}' Teilen - `; - - const canvasDom = document.querySelector("#chart"); - let items = filter(cart.items); - if (items.length == cart.items.length) { - document.querySelector("#numitems").innerText = `${cart.items.length} Artikel`; - } else { - document.querySelector("#numitems").innerText = `${items.length} / ${cart.items.length} Artikel`; - } - document.querySelector("#json").addEventListener("click", (event) => { - event.preventDefault(); - downloadFile("items.json", JSON.stringify(items, null, 2)); - }); - updateCharts(canvasDom, items); - - const itemTable = document.querySelector("#cartitems"); - itemTable.innerHTML = ""; - header = dom( - "thead", - ` - Kette - Name - Preis + - - ` - ); - const showHideAll = header.querySelectorAll("th:nth-child(3)")[0]; - showHideAll.style["cursor"] = "pointer"; - showHideAll.showAll = true; - showHideAll.addEventListener("click", () => { - showHideAll.querySelector(".expander").innerText = showHideAll.querySelector(".expander").innerText == "+" ? "-" : "+"; - itemTable.querySelectorAll(".priceinfo").forEach((el) => (showHideAll.showAll ? el.classList.remove("hidden") : el.classList.add("hidden"))); - showHideAll.showAll = !showHideAll.showAll; - }); - itemTable.append(header); - - items.forEach((cartItem, idx) => { - const itemDom = itemToDOM(cartItem); - - const cell = dom( - "td", - ` - - - - - ` - ); - cell.classList.add("action"); - - if (cartItem.chart) cell.children[0].setAttribute("checked", true); - cell.children[0].addEventListener("change", () => { - cartItem.chart = cell.children[0].children[0].checked; - shoppingCarts.save(); - updateCharts(canvasDom, items); - }); - - if (cart.name != "Momentum Eigenmarken Vergleich" && !cart.linked) { - cell.children[1].addEventListener("click", () => { - cart.items.splice(idx, 1); - shoppingCarts.save(); - document.querySelector("#start").value = getOldestDate(cart.items); - document.querySelector("#end").value = currentDate(); - showCart(cart); - }); - - cell.children[2].addEventListener("click", () => { - if (idx == 0) return; - let otherItem = cart.items[idx - 1]; - cart.items[idx - 1] = cartItem; - cart.items[idx] = otherItem; - shoppingCarts.save(); - showCart(cart); - }); - - cell.children[3].addEventListener("click", () => { - if (idx == cart.items.length - 1) return; - let otherItem = cart.items[idx + 1]; - cart.items[idx + 1] = cartItem; - cart.items[idx] = otherItem; - shoppingCarts.save(); - showCart(cart); - }); - } else { - cell.querySelectorAll("input[type='button']").forEach((button) => button.classList.add("hidden")); - } - - itemDom.append(cell); - itemTable.append(itemDom); - }); -} - -load(); + productsList.addCallback = (item) => { + cart.items.push(item); + models.carts.save(); + cartFilter.filter(); + cartFilter.classList.remove("hidden"); + cartList.classList.remove("hidden"); + }; +})(); diff --git a/site/index.js b/site/index.js index b74411c..2320b25 100644 --- a/site/index.js +++ b/site/index.js @@ -17,7 +17,8 @@ require("./views"); .filter((item) => item.chart) .map((item) => item.store + item.id) .join(";"); - history.pushState({}, null, location.pathname + "?f=" + filterState + "&l=" + listState + "&c=" + chartState + "&d=" + chartedItems); + + history.replaceState({}, null, location.pathname + "?f=" + filterState + "&l=" + listState + "&c=" + chartState + "&d=" + chartedItems); }; itemsFilter.addEventListener("x-change", stateToUrl); diff --git a/site/views/index.js b/site/views/index.js index 37b6747..a9e7142 100644 --- a/site/views/index.js +++ b/site/views/index.js @@ -2,3 +2,4 @@ require("./custom-checkbox"); require("./carts-list"); require("./items-filter"); require("./items-list"); +require("./view"); diff --git a/site/views/items-filter.js b/site/views/items-filter.js index ea42975..8b66c20 100644 --- a/site/views/items-filter.js +++ b/site/views/items-filter.js @@ -11,6 +11,7 @@ class ItemsFilter extends View { this._filterByPriceDirection = getBooleanAttribute(this, "pricedirection"); this._filterByStores = getBooleanAttribute(this, "stores"); this._filterByMisc = getBooleanAttribute(this, "misc"); + this._noChartClear = getBooleanAttribute(this, "nochartclear"); const hidePriceChanges = this._filterByPriceChanges ? "" : "hidden"; const hidePriceDirection = this._filterByPriceDirection ? "" : "hidden"; @@ -76,8 +77,8 @@ class ItemsFilter extends View { elements.stores.classList.add("hidden"); elements.misc.classList.add("hidden"); } else { - elements.stores.classList.remove("hidden"); - elements.misc.classList.remove("hidden"); + if (!hideStores) elements.stores.classList.remove("hidden"); + if (!hideMisc) elements.misc.classList.remove("hidden"); } }); @@ -193,7 +194,7 @@ class ItemsFilter extends View { filteredItems = queryItems(query, filteredItems, elements.exact.checked); } - if (this.model.lastQuery != query) { + if (this.model.lastQuery != query && !this._noChartClear) { filteredItems.forEach((item) => (item.chart = false)); } this.model.lastQuery = query; diff --git a/site/views/items-list.js b/site/views/items-list.js index 1d1b55f..0951621 100644 --- a/site/views/items-list.js +++ b/site/views/items-list.js @@ -11,21 +11,25 @@ class ItemsList extends View { this._json = getBooleanAttribute(this, "json"); this._chart = getBooleanAttribute(this, "chart"); this._remove = getBooleanAttribute(this, "remove"); - this._remove = getBooleanAttribute(this, "add"); + this._add = getBooleanAttribute(this, "add"); this._updown = getBooleanAttribute(this, "updown"); + this._noSort = getBooleanAttribute(this, "nosort"); + const hideSort = this._noSort ? "hidden" : ""; this.innerHTML = /*html*/ `