🔧 FINAL FIX: Using trigger_up('reload') - The CORRECT Odoo way to filter records

💡 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.
This commit is contained in:
Mohamed Eltayar 2025-08-30 14:06:33 +03:00
parent 2e41d89cf9
commit d5b40acead
1 changed files with 25 additions and 22 deletions

View File

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