CRITICAL FIX: Enhanced search functionality with main pager synchronization
- Fixed DOM filtering to properly detect available row IDs vs filtered IDs - Added comprehensive debugging logs for better troubleshooting - Implemented _forceUpdateMainPager with 4 fallback methods to update Odoo's main pager - Enhanced _filterExistingRows with intersection detection logic - Fixed _showNoResults to properly update main pager count to 0 - Improved state management to ensure count updates are persistent - Added proper logging throughout the search flow for debugging
This commit is contained in:
parent
4333b0460e
commit
e62acbbc33
|
|
@ -247,37 +247,46 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) {
|
|||
|
||||
if (count === 0) {
|
||||
this._showNoResults();
|
||||
// CRITICAL: Update main pager for empty results
|
||||
this._forceUpdateMainPager(0);
|
||||
return;
|
||||
}
|
||||
|
||||
// Update the view with filtered results - CRITICAL FIX
|
||||
// Update the view with filtered results
|
||||
this._updateViewWithFilteredData(records);
|
||||
},
|
||||
|
||||
/**
|
||||
* Update view with filtered data - COMPLETELY REWRITTEN
|
||||
* Update view with filtered data - FIXED CRITICAL LOGIC
|
||||
*/
|
||||
_updateViewWithFilteredData: function(records) {
|
||||
var self = this;
|
||||
console.log('=== _updateViewWithFilteredData ===');
|
||||
console.log('Records count:', records.length);
|
||||
console.log('Filtered IDs:', this._search.filteredIds);
|
||||
|
||||
// Method 1: Try to filter existing DOM rows first
|
||||
// ALWAYS try to update the view, regardless of DOM filtering success
|
||||
|
||||
// Method 1: Try DOM filtering first (fastest if it works)
|
||||
var domFilterWorked = this._filterExistingRows();
|
||||
console.log('DOM filtering worked:', domFilterWorked);
|
||||
|
||||
if (domFilterWorked) {
|
||||
// Update pager with correct count
|
||||
this._updatePager(records.length);
|
||||
// DOM filtering worked, but STILL update pager properly
|
||||
this._forceUpdateMainPager(records.length);
|
||||
return;
|
||||
}
|
||||
|
||||
// Method 2: Update the actual data and re-render
|
||||
// Method 2: DOM filtering failed, need to re-render with filtered data
|
||||
console.log('DOM filtering failed, re-rendering...');
|
||||
this._updateStateAndRerender(records);
|
||||
},
|
||||
|
||||
/**
|
||||
* Filter existing rows in DOM - ENHANCED METHOD
|
||||
* Filter existing rows in DOM - ENHANCED WITH BETTER LOGGING
|
||||
*/
|
||||
_filterExistingRows: function() {
|
||||
if (!this._search.filteredIds || this._search.filteredIds.length === 0) {
|
||||
console.log('No filtered IDs to work with');
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -286,33 +295,58 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) {
|
|||
var limit = this.state.limit || 80;
|
||||
var visibleCount = 0;
|
||||
var foundAnyMatch = false;
|
||||
var availableRowIds = [];
|
||||
|
||||
console.log('Filtering rows. Total rows:', $allRows.length, 'Filtered IDs:', this._search.filteredIds);
|
||||
console.log('=== DOM Filtering Debug ===');
|
||||
console.log('Total rows in DOM:', $allRows.length);
|
||||
console.log('Looking for IDs:', this._search.filteredIds);
|
||||
console.log('Limit:', limit);
|
||||
|
||||
// First pass: hide all rows
|
||||
$allRows.hide();
|
||||
|
||||
// Second pass: show matching rows up to limit
|
||||
// First, collect all available row IDs for debugging
|
||||
$allRows.each(function(index) {
|
||||
var $row = $(this);
|
||||
var rowId = self._getRowId($row);
|
||||
if (rowId) {
|
||||
availableRowIds.push(rowId);
|
||||
}
|
||||
});
|
||||
|
||||
console.log('Available row IDs in DOM:', availableRowIds);
|
||||
|
||||
// Check if any of our filtered IDs exist in DOM
|
||||
var intersection = this._search.filteredIds.filter(function(id) {
|
||||
return availableRowIds.includes(id);
|
||||
});
|
||||
|
||||
console.log('Intersection (IDs that exist in DOM):', intersection);
|
||||
|
||||
if (intersection.length === 0) {
|
||||
console.log('No matching IDs found in DOM - need to re-render');
|
||||
return false;
|
||||
}
|
||||
|
||||
// Hide all rows first
|
||||
$allRows.hide();
|
||||
|
||||
// Show matching rows up to limit
|
||||
$allRows.each(function(index) {
|
||||
var $row = $(this);
|
||||
var rowId = self._getRowId($row);
|
||||
|
||||
console.log('Row', index, 'ID:', rowId, 'Should show:', self._search.filteredIds.includes(rowId));
|
||||
|
||||
if (rowId && self._search.filteredIds.includes(rowId)) {
|
||||
if (visibleCount < limit) {
|
||||
$row.show();
|
||||
visibleCount++;
|
||||
foundAnyMatch = true;
|
||||
console.log('Showing row', index, 'with ID', rowId);
|
||||
console.log('✓ Showing row', index, 'with ID', rowId);
|
||||
} else {
|
||||
console.log('✗ Hiding row', index, 'with ID', rowId, '(over limit)');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
console.log('DOM filtering result - Found matches:', foundAnyMatch, 'Visible count:', visibleCount);
|
||||
|
||||
// If no matches found in DOM, we need to re-render
|
||||
return foundAnyMatch;
|
||||
console.log('DOM filtering completed - Visible rows:', visibleCount, 'Found matches:', foundAnyMatch);
|
||||
return foundAnyMatch && visibleCount > 0;
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
@ -323,74 +357,111 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) {
|
|||
var limit = this.state.limit || 80;
|
||||
var pageRecords = records.slice(0, limit);
|
||||
|
||||
console.log('Re-rendering with filtered data. Total records:', records.length, 'Page records:', pageRecords.length);
|
||||
console.log('=== Re-rendering ===');
|
||||
console.log('Total records:', records.length);
|
||||
console.log('Page records:', pageRecords.length);
|
||||
|
||||
// Update state
|
||||
if (this.state && this.state.data) {
|
||||
this.state.data.records = pageRecords;
|
||||
this.state.count = records.length;
|
||||
// Update state with filtered data
|
||||
if (this.state) {
|
||||
if (this.state.data) {
|
||||
this.state.data.records = pageRecords;
|
||||
}
|
||||
this.state.count = records.length; // CRITICAL: Update count
|
||||
this.state.res_ids = this._search.filteredIds;
|
||||
}
|
||||
|
||||
// Clear existing rows
|
||||
// Clear existing content
|
||||
this.$('tbody .o_data_row').remove();
|
||||
this.$('.oe_no_results').remove();
|
||||
|
||||
// Try different rendering approaches
|
||||
this._tryMultipleRenderMethods(pageRecords);
|
||||
// Create new rows with filtered data
|
||||
if (pageRecords.length > 0) {
|
||||
this._createRowsManually(pageRecords);
|
||||
} else {
|
||||
this._showNoResults();
|
||||
}
|
||||
|
||||
// Update pager
|
||||
this._updatePager(records.length);
|
||||
// CRITICAL: Force update main pager
|
||||
this._forceUpdateMainPager(records.length);
|
||||
},
|
||||
|
||||
/**
|
||||
* Try multiple rendering methods - NEW ENHANCED METHOD
|
||||
* CRITICAL FIX: Force update main Odoo pager
|
||||
*/
|
||||
_tryMultipleRenderMethods: function(records) {
|
||||
var self = this;
|
||||
var renderSuccess = false;
|
||||
_forceUpdateMainPager: function(totalCount) {
|
||||
console.log('=== Updating Main Pager ===');
|
||||
console.log('Total count:', totalCount);
|
||||
|
||||
// Method 1: Try Odoo's _renderRows if available
|
||||
if (!renderSuccess && typeof this._renderRows === 'function') {
|
||||
// Method 1: Try standard pager update
|
||||
if (this.getParent() && this.getParent().pager) {
|
||||
try {
|
||||
var $rows = this._renderRows();
|
||||
if ($rows && $rows.length > 0) {
|
||||
this.$('tbody').append($rows);
|
||||
renderSuccess = true;
|
||||
console.log('Render method 1 succeeded');
|
||||
}
|
||||
console.log('Trying method 1: getParent().pager.updateState');
|
||||
this.getParent().pager.updateState({
|
||||
current_min: totalCount > 0 ? 1 : 0,
|
||||
size: totalCount,
|
||||
limit: this.state.limit || 80
|
||||
});
|
||||
console.log('✓ Method 1 succeeded');
|
||||
return;
|
||||
} catch (err) {
|
||||
console.warn('Render method 1 failed:', err);
|
||||
console.warn('Method 1 failed:', err);
|
||||
}
|
||||
}
|
||||
|
||||
// Method 2: Try _renderBody if available
|
||||
if (!renderSuccess && typeof this._renderBody === 'function') {
|
||||
try {
|
||||
var result = this._renderBody();
|
||||
if (result) {
|
||||
if (typeof result.then === 'function') {
|
||||
result.then(function() {
|
||||
console.log('Render method 2 succeeded (async)');
|
||||
});
|
||||
} else {
|
||||
console.log('Render method 2 succeeded (sync)');
|
||||
}
|
||||
renderSuccess = true;
|
||||
}
|
||||
} catch (err) {
|
||||
console.warn('Render method 2 failed:', err);
|
||||
// Method 2: Try alternative pager access
|
||||
try {
|
||||
var controller = this.getParent();
|
||||
while (controller && !controller.pager) {
|
||||
controller = controller.getParent();
|
||||
}
|
||||
if (controller && controller.pager) {
|
||||
console.log('Trying method 2: controller.pager');
|
||||
controller.pager.updateState({
|
||||
current_min: totalCount > 0 ? 1 : 0,
|
||||
size: totalCount,
|
||||
limit: this.state.limit || 80
|
||||
});
|
||||
console.log('✓ Method 2 succeeded');
|
||||
return;
|
||||
}
|
||||
} catch (err) {
|
||||
console.warn('Method 2 failed:', err);
|
||||
}
|
||||
|
||||
// Method 3: Manual row creation (fallback)
|
||||
if (!renderSuccess) {
|
||||
console.log('Using manual row creation fallback');
|
||||
this._createRowsManually(records);
|
||||
renderSuccess = true;
|
||||
// Method 3: Direct state update + trigger change
|
||||
try {
|
||||
console.log('Trying method 3: direct state update');
|
||||
if (this.state) {
|
||||
this.state.count = totalCount;
|
||||
// Trigger a state change event
|
||||
this.trigger_up('reload', {
|
||||
keepChanges: true,
|
||||
currentId: this.state.res_id
|
||||
});
|
||||
console.log('✓ Method 3 triggered');
|
||||
}
|
||||
} catch (err) {
|
||||
console.warn('Method 3 failed:', err);
|
||||
}
|
||||
|
||||
return renderSuccess;
|
||||
// Method 4: Update DOM directly if all else fails
|
||||
try {
|
||||
console.log('Trying method 4: direct DOM update');
|
||||
var $pager = this.$el.closest('.o_content').find('.o_pager_value');
|
||||
if ($pager.length) {
|
||||
var displayText = totalCount > 0 ? '1-' + Math.min(totalCount, this.state.limit || 80) : '0';
|
||||
$pager.text(displayText);
|
||||
console.log('✓ Method 4 succeeded');
|
||||
}
|
||||
|
||||
var $pagerSize = this.$el.closest('.o_content').find('.o_pager_size');
|
||||
if ($pagerSize.length) {
|
||||
$pagerSize.text(totalCount);
|
||||
console.log('✓ Updated pager size directly');
|
||||
}
|
||||
} catch (err) {
|
||||
console.warn('Method 4 failed:', err);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
@ -442,7 +513,7 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) {
|
|||
},
|
||||
|
||||
/**
|
||||
* Create cell for specific field - NEW HELPER METHOD
|
||||
* Create cell for specific field - HELPER METHOD
|
||||
*/
|
||||
_createCellForField: function(record, col) {
|
||||
var fieldName = col.attrs.name;
|
||||
|
|
@ -535,23 +606,9 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) {
|
|||
return parseInt(match[1]);
|
||||
}
|
||||
|
||||
console.warn('Could not determine row ID for row:', $row[0]);
|
||||
return null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Update pager
|
||||
*/
|
||||
_updatePager: function(totalCount) {
|
||||
if (this.getParent() && this.getParent().pager) {
|
||||
this.getParent().pager.updateState({
|
||||
current_min: totalCount > 0 ? 1 : 0,
|
||||
size: totalCount,
|
||||
limit: this.state.limit || 80
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Client-side search fallback - ENHANCED
|
||||
*/
|
||||
|
|
@ -601,7 +658,8 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) {
|
|||
this._showNoResults();
|
||||
}
|
||||
|
||||
this._updatePager(visible);
|
||||
// CRITICAL: Update main pager
|
||||
this._forceUpdateMainPager(visible);
|
||||
|
||||
console.log('Client-side search completed. Visible:', visible, 'IDs:', matchedIds);
|
||||
},
|
||||
|
|
@ -610,7 +668,7 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) {
|
|||
* Clear search - ENHANCED
|
||||
*/
|
||||
_clearSearch: function() {
|
||||
console.log('Clearing search');
|
||||
console.log('=== Clearing search ===');
|
||||
|
||||
// Clear UI
|
||||
this.$('.oe_search_input').val('');
|
||||
|
|
@ -627,6 +685,8 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) {
|
|||
|
||||
// Restore original data
|
||||
if (this._search.originalData) {
|
||||
console.log('Restoring original data:', this._search.originalData);
|
||||
|
||||
// Restore state
|
||||
if (this.state) {
|
||||
if (this.state.data) {
|
||||
|
|
@ -645,8 +705,8 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) {
|
|||
$(this).toggle(index < limit);
|
||||
});
|
||||
|
||||
// Restore pager
|
||||
this._updatePager(this._search.originalData.count);
|
||||
// CRITICAL: Restore main pager
|
||||
this._forceUpdateMainPager(this._search.originalData.count);
|
||||
|
||||
// Clear stored original data
|
||||
this._search.originalData = null;
|
||||
|
|
@ -664,11 +724,11 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) {
|
|||
});
|
||||
|
||||
if (this.state) {
|
||||
this._updatePager(this.state.count || $rows.length);
|
||||
this._forceUpdateMainPager(this.state.count || $rows.length);
|
||||
}
|
||||
}
|
||||
|
||||
console.log('Search cleared');
|
||||
console.log('Search cleared successfully');
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
@ -801,9 +861,11 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) {
|
|||
},
|
||||
|
||||
/**
|
||||
* Show no results message
|
||||
* Show no results message - ENHANCED
|
||||
*/
|
||||
_showNoResults: function() {
|
||||
console.log('Showing no results message');
|
||||
|
||||
// Remove existing message
|
||||
this.$('.oe_no_results').remove();
|
||||
|
||||
|
|
@ -819,6 +881,8 @@ odoo.define('fims_general_search_tree_view.list_search', function (require) {
|
|||
'</td></tr>';
|
||||
|
||||
this.$('tbody').append(html);
|
||||
|
||||
console.log('No results message displayed');
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue