[FIX] website_sale_aplicoop: Complete infinite scroll and search filter integration

Major fixes:
- Fix JSON body parsing in load_products_ajax with type='http' route
  * Parse JSON from request.httprequest.get_data() instead of post params
  * Correctly read page, search, category from JSON request body

- Fix search and category filter combination
  * Use intersection (&) instead of replacement to preserve both filters
  * Now respects search AND category simultaneously

- Integrate realtime_search.js with infinite_scroll.js
  * Add resetWithFilters() method to reset scroll to page 1 with new filters
  * When search/category changes, reload products from server
  * Clear grid and load fresh results

- Fix pagination reset logic
  * Set currentPage = 0 in resetWithFilters() so loadNextPage() increments to 1
  * Prevents loading empty page 2 when resetting filters

Results:
✅ Infinite scroll loads all pages correctly (1, 2, 3...)
✅ Search filters work across all products (not just loaded)
✅ Category filters work correctly
✅ Search AND category filters work together
✅ Page resets to 1 when filters change
This commit is contained in:
snt 2026-02-17 01:26:20 +01:00
parent 5eb039ffe0
commit 40ce973bd6
4 changed files with 463 additions and 239 deletions

View file

@ -1380,7 +1380,7 @@ class AplicoopWebsiteSale(WebsiteSale):
@http.route(
["/eskaera/<int:order_id>/load-products-ajax"],
type="json",
type="http",
auth="user",
website=True,
methods=["POST"],
@ -1407,17 +1407,27 @@ class AplicoopWebsiteSale(WebsiteSale):
)
)
# Get page from POST
# Parse JSON body for parameters (type="http" doesn't auto-parse JSON)
params = {}
try:
page = int(post.get("page", 1))
if request.httprequest.content_length:
data = request.httprequest.get_data(as_text=True)
if data:
params = json.loads(data)
except (ValueError, json.JSONDecodeError, AttributeError):
params = {}
# Get page from POST/JSON
try:
page = int(params.get("page", post.get("page", 1)))
if page < 1:
page = 1
except (ValueError, TypeError):
page = 1
# Get filters
search_query = post.get("search", "").strip()
category_filter = str(post.get("category", "0"))
search_query = params.get("search", post.get("search", "")).strip()
category_filter = str(params.get("category", post.get("category", "0")))
_logger.info(
"load_products_ajax: order_id=%d, page=%d, search=%s, category=%s",
@ -1477,7 +1487,8 @@ class AplicoopWebsiteSale(WebsiteSale):
lambda p: p.categ_id.id in order_cat_ids
)
filtered_products = cat_filtered
# Preserve search filter by using intersection
filtered_products = filtered_products & cat_filtered
except (ValueError, TypeError) as e:
_logger.warning(
"load_products_ajax: Invalid category filter: %s", str(e)
@ -1556,7 +1567,7 @@ class AplicoopWebsiteSale(WebsiteSale):
}
# Render HTML
html = request.env["ir.ui.view"]._render(
html = request.env["ir.ui.view"]._render_template(
"website_sale_aplicoop.eskaera_shop_products",
{
"group_order": group_order,
@ -1571,13 +1582,18 @@ class AplicoopWebsiteSale(WebsiteSale):
},
)
return {
"html": html,
"has_next": has_next,
"next_page": page + 1,
"total": total_products,
"page": page,
}
return request.make_response(
json.dumps(
{
"html": html,
"has_next": has_next,
"next_page": page + 1,
"total": total_products,
"page": page,
}
),
[("Content-Type", "application/json")],
)
@http.route(
["/eskaera/add-to-cart"],