Fix select all did not respect some filters

Certain sequence of applying filters could trigger long task & get all IDs, which failed.
This commit is contained in:
nathan 2023-03-16 11:20:45 -06:00
parent de9c1f5c48
commit 7c3aaba861
2 changed files with 69 additions and 61 deletions

View File

@ -668,15 +668,17 @@ export class et2_dataview_selectionManager
_query_ranges(queryRanges) _query_ranges(queryRanges)
{ {
var that = this; let that = this;
var record_count = 0; let record_count = 0;
var range_index = 0; let range_index = 0;
var range_count = queryRanges.length; let range_count = queryRanges.length;
var cont = true; let cont = true;
var fetchPromise = new Promise(function(resolve) let fetchResolver;
let fetchPromise = new Promise(function(resolve)
{ {
resolve(); fetchResolver = resolve;
}); });
let fetchList = [fetchPromise];
// Found after dialog loads // Found after dialog loads
var progressbar; var progressbar;
@ -696,27 +698,27 @@ export class et2_dataview_selectionManager
}], }],
width: 300 width: 300
}); });
(this._context._widget.getDOMNode() || document.body).appendChild(dialog); (this._context._widget.getDOMNode() || document.body).append(dialog);
dialog.updateComplete.then(() => dialog.updateComplete.then(() =>
{ {
dialog.template.DOMContainer.addEventListener('load', function() dialog.template.DOMContainer.addEventListener('load', () =>
{ {
// Get access to template widgets // Get access to template widgets
progressbar = dialog.template.widgetContainer.getWidgetById('progressbar'); progressbar = dialog.template.widgetContainer.getWidgetById('progressbar');
}); let rangePromise = fetchPromise;
});
for(var i = 0; i < queryRanges.length; i++) for(var i = 0; i < queryRanges.length; i++)
{ {
if(record_count + (queryRanges[i].bottom - queryRanges[i].top + 1) > that.MAX_SELECTION) if(record_count + (queryRanges[i].bottom - queryRanges[i].top + 1) > et2_dataview_selectionManager.MAX_SELECTION)
{ {
egw.message(egw.lang('Too many rows selected.<br />Select all, or less than %1 rows', that.MAX_SELECTION)); egw.message(egw.lang('Too many rows selected.<br />Select all, or less than %1 rows', et2_dataview_selectionManager.MAX_SELECTION));
break; break;
} }
else else
{ {
record_count += (queryRanges[i].bottom - queryRanges[i].top + 1); record_count += (queryRanges[i].bottom - queryRanges[i].top + 1);
fetchPromise = fetchPromise.then((function() // We want to chain these one after the other, not fire them all right away
rangePromise = rangePromise.then((function()
{ {
// Check for abort // Check for abort
if(!cont) if(!cont)
@ -740,17 +742,23 @@ export class et2_dataview_selectionManager
egwSetBit(entry.state, EGW_AO_STATE_SELECTED, true)); egwSetBit(entry.state, EGW_AO_STATE_SELECTED, true));
} }
} }
progressbar.set_value(100*(++range_index/range_count)); progressbar.set_value(100 * (++range_index / range_count));
resolve(); resolve();
}, that); }, that);
}.bind(this)); }.bind(this));
}).bind(queryRanges[i])); }).bind(queryRanges[i]));
fetchList.push(rangePromise);
} }
} }
fetchPromise.finally(function() {
// Start the first fetch
fetchResolver();
Promise.all(fetchList).finally(function()
{
dialog.close(); dialog.close();
}); });
})
});
} }
} }

View File

@ -12,8 +12,8 @@
</et2-vbox> </et2-vbox>
</et2-hbox> </et2-hbox>
<styles> <styles>
.long_task .ui-dialog-content { #long_task > div {
width: 90%; width: 100%;
} }
.long_task .log { .long_task .log {
max-height: 10em; max-height: 10em;