From d5b40aceadd5cbaed9f841627a6f4f8b60eeda77 Mon Sep 17 00:00:00 2001 From: Mohamed Eltayar <152964073+maltayyar2@users.noreply.github.com> Date: Sat, 30 Aug 2025 14:06:33 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20FINAL=20FIX:=20Using=20trigger?= =?UTF-8?q?=5Fup('reload')=20-=20The=20CORRECT=20Odoo=20way=20to=20filter?= =?UTF-8?q?=20records?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 💡 ROOT CAUSE DISCOVERED: After deep research, the real issue was trying to trigger search from ListRenderer. The correct Odoo approach is: - ListRenderer is for DISPLAY only, not data updates - The proper way is trigger_up('reload') with domain parameter - This is exactly how Odoo's own search functionality works internally ✅ CORRECTED IMPLEMENTATION: - Changed from trigger_up('search') to trigger_up('reload') - Added proper domain parameter passing - Added keepSelection: false for proper filtering behavior - Maintained all other enhancements (count, Arabic support, etc.) 🎯 HOW IT WORKS (Standard Odoo Pattern): 1. ListRenderer triggers 'reload' event with new domain 2. Controller receives reload event and updates state.domain 3. Controller calls reload() which refetches data with new domain 4. View re-renders with filtered records 🚀 EXPECTED RESULT: - Search count continues to work (RPC call) - Records will now be properly filtered using Odoo's standard reload mechanism - Clear function restores all records using original domain - Perfect integration with Odoo's data loading system This follows the exact same pattern used by Odoo's native search and filter functionality. --- .../static/src/js/list_search.js | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/odex25_base/fims_general_search_tree_view/static/src/js/list_search.js b/odex25_base/fims_general_search_tree_view/static/src/js/list_search.js index 8a5b4bc29..435db7d82 100644 --- a/odex25_base/fims_general_search_tree_view/static/src/js/list_search.js +++ b/odex25_base/fims_general_search_tree_view/static/src/js/list_search.js @@ -162,7 +162,7 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) { }, /** - * FIXED: Perform search using CORRECT Odoo method + * CORRECTED: Perform search using PROPER Odoo reload method */ _performSearch: function(value) { var self = this; @@ -173,7 +173,7 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) { return Promise.resolve(); } - console.log('=== FIXED PERFORM SEARCH ==='); + console.log('=== CORRECTED PERFORM SEARCH ==='); console.log('Search value:', value); console.log('Value length:', value ? value.length : 0); @@ -195,7 +195,7 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) { return Promise.resolve(); } - console.log('Starting FIXED search for model:', self.state.model); + console.log('Starting CORRECTED search for model:', self.state.model); // Store original domain only once if (!self._search.originalDomain && !self._search.isFiltered) { @@ -205,22 +205,22 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) { // Show loading self._showLoading(true); - // FIXED: Use correct Odoo search method - return self._searchWithCorrectMethod(value).finally(function() { + // CORRECTED: Use proper Odoo reload method with domain update + return self._searchWithReload(value).finally(function() { self._showLoading(false); self._searchInProgress = false; - console.log('=== Fixed search completed ==='); + console.log('=== Corrected search completed ==='); }); }); }, /** - * FIXED: Use the CORRECT Odoo search method that actually filters records + * CORRECTED: The PROPER way - Use reload with updated domain */ - _searchWithCorrectMethod: function(value) { + _searchWithReload: function(value) { var self = this; - console.log('=== USING CORRECT ODOO SEARCH METHOD ==='); + console.log('=== USING CORRECT RELOAD METHOD ==='); // Build search domain var searchDomain = this._buildSearchDomain(value); @@ -249,12 +249,13 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) { // Update UI with accurate count self.$('.oe_search_count').text(_t('Found: ') + count + _t(' records')).show(); - // STEP 2: THE CORRECT WAY - Use trigger_up with 'search' event - // This is the proper way to trigger search in Odoo - self.trigger_up('search', { + // STEP 2: THE CORRECT WAY - Use trigger_up with 'reload' passing domain + // This is how Odoo's own search works! + self.trigger_up('reload', { domain: finalDomain, context: self.state.context || {}, - groupBy: self.state.groupedBy || [] + groupBy: self.state.groupedBy || [], + keepSelection: false }); // Update search state @@ -264,11 +265,12 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) { }).catch(function(error) { console.error('Error getting search count:', error); - // Fallback: still apply search without count - self.trigger_up('search', { + // Fallback: still apply reload without count + self.trigger_up('reload', { domain: finalDomain, context: self.state.context || {}, - groupBy: self.state.groupedBy || [] + groupBy: self.state.groupedBy || [], + keepSelection: false }); self._search.isFiltered = true; @@ -279,12 +281,12 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) { }, /** - * FIXED: Clear search using CORRECT Odoo method + * CORRECTED: Clear search using proper reload method */ _clearSearchInternal: function() { var self = this; - console.log('=== FIXED CLEAR SEARCH ==='); + console.log('=== CORRECTED CLEAR SEARCH ==='); // Clear UI immediately this.$('.oe_search_input').val(''); @@ -299,17 +301,18 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) { // Use original domain to clear search var originalDomain = this._search.originalDomain || []; - // FIXED: Use correct 'search' event instead of 'do_search' - this.trigger_up('search', { + // CORRECTED: Use proper reload with original domain + this.trigger_up('reload', { domain: originalDomain, context: this.state.context || {}, - groupBy: this.state.groupedBy || [] + groupBy: this.state.groupedBy || [], + keepSelection: false }); // Clear stored original domain this._search.originalDomain = null; - console.log('Search cleared using FIXED method'); + console.log('Search cleared using CORRECTED method'); return Promise.resolve(); },