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.
This commit is contained in:
Mohamed Eltayar 2025-08-29 22:46:06 +03:00
parent 03d36ab0cc
commit 71fbd9f73a
1 changed files with 148 additions and 33 deletions

View File

@ -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 = $('<tr class="o_data_row"></tr>');
// Set proper Odoo attributes
$row.attr('data-id', record.res_id || record.id);
$row.data('id', record.res_id || record.id);
// Add record data for proper event handling
$row.data('record', record);
// Create cells based on columns
if (this.columns && this.columns.length > 0) {
this.columns.forEach(function(col) {
if (!col.invisible && col.attrs && col.attrs.name) {
var fieldValue = record.data ? record.data[col.attrs.name] : null;
var $cell = $('<td class="o_data_cell"></td>');
// Basic field value display
if (fieldValue !== null && fieldValue !== undefined) {
if (Array.isArray(fieldValue) && fieldValue.length >= 2) {
// Many2one field [id, name]
$cell.text(fieldValue[1]);
} else {
$cell.text(String(fieldValue));
}
}
$row.append($cell);
}
});
} else {
// Simple fallback
var displayName = record.data ? (record.data.display_name || record.data.name || record.id) : record.id;
$row.append($('<td class="o_data_cell"></td>').text(displayName));
}
return $row;
},
/**
* IMPROVED: Client-side search fallback
*/
@ -439,6 +553,7 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) {
* NEW: Internal clear search logic
*/
_clearSearchInternal: function() {
var self = this;
console.log('=== CLEARING SEARCH (INTERNAL) ===');
if (this._searchInProgress) {
@ -466,8 +581,8 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) {
// Clear stored original state
this._search.originalState = null;
// Trigger proper update
return this._triggerProperUpdate();
// Force complete re-render to show all records
return this._forceCompleteRerender();
} else {
// Just show all visible rows
this.$('.o_data_row').show();
@ -693,7 +808,7 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) {
_getOrderString: function() {
if (this.state.orderedBy && this.state.orderedBy.length > 0) {
return this.state.orderedBy.map(function(order) {
return order.name + ' ' + order.asc ? 'ASC' : 'DESC';
return order.name + ' ' + (order.asc ? 'ASC' : 'DESC');
}).join(', ');
}
return null;