From 71fbd9f73a2ce8de9fa4a6e793370604b42206c3 Mon Sep 17 00:00:00 2001 From: Mohamed Eltayar <152964073+maltayyar2@users.noreply.github.com> Date: Fri, 29 Aug 2025 22:46:06 +0300 Subject: [PATCH] CRITICAL FIX: Proper list filtering with forced re-render Fixed the main issue where records weren't being filtered properly: 1. Enhanced _forceCompleteRerender() with multiple fallback methods 2. Added _fallbackRerender() for reliable DOM manipulation 3. Improved _createFilteredRows() with proper Odoo integration 4. Added _createBasicRow() as ultimate fallback 5. Fixed record data structure and event binding 6. Enhanced error handling throughout the rendering process The list should now properly show only the filtered records while maintaining all Odoo functionality. --- .../static/src/js/list_search.js | 181 ++++++++++++++---- 1 file changed, 148 insertions(+), 33 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 079c07b0b..2fda562a1 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 @@ -205,10 +205,10 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) { // IMPROVED: Use proper domain and controller approach return self._performServerSearch(value).then(function(results) { - if (results && results.records) { + if (results && results.records !== undefined) { self._updateStateWithResults(results); - // CRITICAL: Trigger proper re-render using Odoo's mechanism - return self._triggerProperUpdate(); + // CRITICAL FIX: Force complete re-render + return self._forceCompleteRerender(); } }).catch(function(error) { console.error('Server search failed:', error); @@ -320,47 +320,161 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) { }, /** - * NEW: Trigger proper update using Odoo's mechanisms + * CRITICAL FIX: Force complete re-render to show filtered results */ - _triggerProperUpdate: function() { + _forceCompleteRerender: function() { var self = this; - console.log('=== TRIGGER PROPER UPDATE ==='); + console.log('=== FORCE COMPLETE RE-RENDER ==='); - // Method 1: Use _renderRows if available (most compatible) - if (this._renderRows && typeof this._renderRows === 'function') { - try { + try { + // Method 1: Try using _renderRows if available (most reliable) + if (this._renderRows && typeof this._renderRows === 'function') { console.log('Using _renderRows method'); return this._renderRows().then(function() { self._updatePager(); console.log('✓ _renderRows update completed'); - }); - } catch (err) { - console.warn('_renderRows failed:', err); - } - } - - // Method 2: Use _renderBody if available - if (this._renderBody && typeof this._renderBody === 'function') { - try { - console.log('Using _renderBody method'); - var $body = this._renderBody(); - if ($body && $body.length) { - this.$('tbody').replaceWith($body); - this._updatePager(); - console.log('✓ _renderBody update completed'); return Promise.resolve(); - } - } catch (err) { - console.warn('_renderBody failed:', err); + }).catch(function(error) { + console.warn('_renderRows failed, trying fallback:', error); + return self._fallbackRerender(); + }); } + + // Method 2: Try using _renderBody if available + if (this._renderBody && typeof this._renderBody === 'function') { + console.log('Using _renderBody method'); + try { + var $body = this._renderBody(); + if ($body && $body.length) { + this.$('tbody').replaceWith($body); + this._updatePager(); + console.log('✓ _renderBody update completed'); + return Promise.resolve(); + } + } catch (err) { + console.warn('_renderBody failed:', err); + } + } + + // Method 3: Manual DOM manipulation (most reliable fallback) + return this._fallbackRerender(); + + } catch (error) { + console.error('Complete re-render failed:', error); + return this._fallbackRerender(); + } + }, + + /** + * NEW: Fallback re-render method + */ + _fallbackRerender: function() { + var self = this; + console.log('Using fallback re-render method'); + + // Clear existing rows + this.$('tbody .o_data_row').remove(); + this.$('.oe_no_results').remove(); + + // Check if we have filtered results + if (!this.state || !this.state.data || !this.state.data.records) { + console.warn('No state data available for rendering'); + this._showNoResults(); + this._updatePager(); + return Promise.resolve(); } - // Method 3: Trigger view update event (safest fallback) - console.log('Using event trigger method'); - this.trigger_up('reload'); + var records = this.state.data.records; + console.log('Rendering', records.length, 'filtered records'); + + if (records.length === 0) { + this._showNoResults(); + } else { + // Create rows for filtered records using Odoo's method + this._createFilteredRows(records); + } + + this._updatePager(); return Promise.resolve(); }, + /** + * NEW: Create filtered rows using proper Odoo rendering + */ + _createFilteredRows: function(records) { + var self = this; + var $tbody = this.$('tbody'); + + records.forEach(function(record, index) { + try { + // Use Odoo's internal row rendering if available + var $row; + if (self._renderRow && typeof self._renderRow === 'function') { + $row = $(self._renderRow(record, index)); + } else { + // Fallback to manual row creation + $row = self._createBasicRow(record, index); + } + + if ($row && $row.length) { + $tbody.append($row); + } + } catch (error) { + console.warn('Failed to create row for record', record.id, ':', error); + // Create basic fallback row + var $fallbackRow = self._createBasicRow(record, index); + if ($fallbackRow && $fallbackRow.length) { + $tbody.append($fallbackRow); + } + } + }); + + console.log('Created', records.length, 'filtered rows'); + }, + + /** + * NEW: Create basic row as fallback + */ + _createBasicRow: function(record, index) { + var self = this; + var $row = $('