feat: override productsToDisplay to remove hardcoded product limit for progressive rendering

This commit is contained in:
Suherdy Yacob 2026-06-03 14:53:55 +07:00
parent e2fd06fbd6
commit ffb9d3feaf

View File

@ -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]);
}
}