From b6502fedfc45912cb50a9f48c33c09eb5efe1ed0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Sat, 16 Aug 2025 13:10:21 +0200 Subject: [PATCH] poprawki --- app.py | 20 +++++--------------- static/js/mass_add.js | 12 +++++++----- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/app.py b/app.py index c7d3582..18d8ff9 100644 --- a/app.py +++ b/app.py @@ -1951,42 +1951,32 @@ def suggest_products(): @app.route("/all_products") def all_products(): - # Parametry sort = request.args.get("sort", "popularity") limit = request.args.get("limit", type=int) or 100 offset = request.args.get("offset", type=int) or 0 - # Wyciągnięcie wszystkich użyć produktów z Item + agregacja (uniwersalność z polskimi znakami i wielkością liter!) + normalized_name = func.lower(func.trim(func.replace(Item.name, ' ', ' '))) item_usage = db.session.query( - func.lower(Item.name).label("name"), + normalized_name.label("name"), func.sum(Item.quantity).label("count") - ).group_by(func.lower(Item.name)).all() - + ).group_by(normalized_name).all() + usage_map = {row.name: row.count for row in item_usage} - # Unikalne nazwy all_names = sorted(usage_map.keys()) - # Sortowanie if sort == "popularity": sorted_names = sorted(all_names, key=lambda name: (-usage_map[name], name)) - else: # alphabetical + else: sorted_names = sorted(all_names) - # Paginacja paged_names = sorted_names[offset:offset+limit] - - # Dla każdego produktu zwróć dict: nazwa i liczba użyć (możesz użyć tylko nazw jeśli chcesz jak dawniej) products = [{"name": name, "count": usage_map[name]} for name in paged_names] - - # Ilość wszystkich dostępnych produktów product_count = len(all_names) return jsonify({"products": products, "total_count": product_count}) - - @app.route("/upload_receipt/", methods=["POST"]) @login_required def upload_receipt(list_id): diff --git a/static/js/mass_add.js b/static/js/mass_add.js index 6c8706f..69c7769 100644 --- a/static/js/mass_add.js +++ b/static/js/mass_add.js @@ -9,8 +9,8 @@ document.addEventListener('DOMContentLoaded', function () { return str ? str.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase() : ''; } - let sortMode = 'popularity'; // 'popularity' lub 'alphabetical' - let limit = 50; + let sortMode = 'popularity'; + let limit = 150; let offset = 0; let loading = false; let reachedEnd = false; @@ -20,7 +20,7 @@ document.addEventListener('DOMContentLoaded', function () { function renderSortBar() { if (!sortBar) return; sortBar.innerHTML = ` - Sortuj: Popularność | + Sortuj: Popularność | Alfabetycznie `; document.getElementById('sort-popularity').onclick = (e) => { @@ -152,8 +152,10 @@ document.addEventListener('DOMContentLoaded', function () { } // Infinite scroll - modal.addEventListener('scroll', function () { - if (!loading && !reachedEnd && (modal.scrollTop + modal.offsetHeight > modal.scrollHeight - 80)) { + const modalBody = modal.querySelector('.modal-body'); + + modalBody.addEventListener('scroll', function () { + if (!loading && !reachedEnd && (modalBody.scrollTop + modalBody.clientHeight > modalBody.scrollHeight - 80)) { fetchProducts(false); } });