From ffb9d3feaf53a651c7a21bb609dc57848de201b0 Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Wed, 3 Jun 2026 14:53:55 +0700 Subject: [PATCH] feat: override productsToDisplay to remove hardcoded product limit for progressive rendering --- static/src/app/services/pos_store_patch.js | 67 ++++++++++++++++++++-- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/static/src/app/services/pos_store_patch.js b/static/src/app/services/pos_store_patch.js index fbcca5e..c0404c0 100644 --- a/static/src/app/services/pos_store_patch.js +++ b/static/src/app/services/pos_store_patch.js @@ -4,11 +4,71 @@ import { PosStore } from "@point_of_sale/app/services/pos_store"; import { patch } from "@web/core/utils/patch"; patch(PosStore.prototype, { + get productsToDisplay() { + // We override this getter to remove Odoo's hardcoded 100-product limit. + // Because our custom UI optimization module uses progressive rendering (lazy loading) + // on scroll, we can safely return the entire product list without risking browser freezing. + const searchWord = this.searchProductWord.trim(); + let recordIterator; + const isSearchByWord = searchWord !== ""; + + const productTemplateModel = this.models["product.template"].toRaw(); + if (isSearchByWord) { + if (!this._searchTriggered) { + this.setSelectedCategory(0); + this._searchTriggered = true; + } + recordIterator = this.getProductsBySearchWord( + searchWord, + this.selectedCategory?.id + ? this.selectedCategory.associatedProducts.values() + : productTemplateModel.getIterator() + ); + } else { + this._searchTriggered = false; + if (this.selectedCategory?.id) { + recordIterator = this.selectedCategory.associatedProducts; + } else { + recordIterator = productTemplateModel.getIterator(); + } + } + + const filteredList = []; + const excludedProductIds = new Set(this.getExcludedProductIds()); + const availableCateg = new Set( + (this.config.iface_available_categ_ids || []).map((c) => c.id) + ); + + for (const p of recordIterator) { + // Remove the 100 items limit because our custom progressive rendering handles lazy loading. + if (excludedProductIds.has(p.id) || !p.canBeDisplayed) { + continue; + } + + if ( + availableCateg.size && + !this.config._pos_special_display_products_ids?.includes(p.id) && + !p.pos_categ_ids.some((c) => availableCateg.has(c.id)) + ) { + continue; + } + + filteredList.push(p); + } + + if ( + !isSearchByWord && + !this.selectedCategory?.id && + this.areAllProductsSpecial(filteredList) + ) { + return []; + } + + return this.orderProductBySequenceAndFav(filteredList); + }, + get productToDisplayByCateg() { // We override this getter to remove Odoo's hardcoded 100-product category limit. - // Because our custom UI optimization module uses progressive rendering (lazy loading) - // on scroll, we can safely return the entire category's product list without risking - // browser freeze or UI lockups. const sortedProducts = this.productsToDisplay; if (!this.config.iface_group_by_categ) { return sortedProducts.length ? [["0", sortedProducts]] : []; @@ -53,7 +113,6 @@ patch(PosStore.prototype, { if (filtered.length) { const sorted = this.orderProductBySequenceAndFav(filtered); // Return the complete list instead of splicing to 100 items. - // Our lazy loading mechanism will handle rendering chunk-by-chunk. results.push([catId, sorted]); } }