Merge pull request #4433 from expsa/eltayar

Fix: Enhanced Search Module v2.1 - Critical Issues Resolved
This commit is contained in:
Mohamed Eltayar 2025-08-29 22:50:23 +03:00 committed by GitHub
commit 1ad600302c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
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,29 +320,30 @@ 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 {
// 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');
return Promise.resolve();
}).catch(function(error) {
console.warn('_renderRows failed, trying fallback:', error);
return self._fallbackRerender();
});
} catch (err) {
console.warn('_renderRows failed:', err);
}
}
// Method 2: Use _renderBody if available
// Method 2: Try using _renderBody if available
if (this._renderBody && typeof this._renderBody === 'function') {
try {
console.log('Using _renderBody method');
try {
var $body = this._renderBody();
if ($body && $body.length) {
this.$('tbody').replaceWith($body);
@ -355,10 +356,123 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) {
}
}
// Method 3: Trigger view update event (safest fallback)
console.log('Using event trigger method');
this.trigger_up('reload');
// 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();
}
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;
},
/**
@ -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;