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,61 +698,67 @@ 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)
{
egw.message(egw.lang('Too many rows selected.<br />Select all, or less than %1 rows', that.MAX_SELECTION));
break;
}
else
{
record_count += (queryRanges[i].bottom - queryRanges[i].top + 1);
fetchPromise = fetchPromise.then((function()
{ {
// Check for abort if(record_count + (queryRanges[i].bottom - queryRanges[i].top + 1) > et2_dataview_selectionManager.MAX_SELECTION)
if(!cont)
{ {
return; egw.message(egw.lang('Too many rows selected.<br />Select all, or less than %1 rows', et2_dataview_selectionManager.MAX_SELECTION));
break;
} }
else
return new Promise(function(resolve)
{ {
that._queryRangeCallback.call(that._context, this, record_count += (queryRanges[i].bottom - queryRanges[i].top + 1);
function(_order) // We want to chain these one after the other, not fire them all right away
rangePromise = rangePromise.then((function()
{
// Check for abort
if(!cont)
{ {
for(var j = 0; j < _order.length; j++) return;
{
// Check for no_actions flag via data since entry isn't there/available
var data = egw.dataGetUIDdata(_order[j]);
if(!data || data && data.data && !data.data.no_actions)
{
var entry = this._getRegisteredRowsEntry(_order[j]);
this._updateEntryState(entry,
egwSetBit(entry.state, EGW_AO_STATE_SELECTED, true));
}
} }
progressbar.set_value(100*(++range_index/range_count));
resolve(); return new Promise(function(resolve)
}, that); {
}.bind(this)); that._queryRangeCallback.call(that._context, this,
}).bind(queryRanges[i])); function(_order)
} {
} for(var j = 0; j < _order.length; j++)
fetchPromise.finally(function() { {
dialog.close(); // Check for no_actions flag via data since entry isn't there/available
var data = egw.dataGetUIDdata(_order[j]);
if(!data || data && data.data && !data.data.no_actions)
{
var entry = this._getRegisteredRowsEntry(_order[j]);
this._updateEntryState(entry,
egwSetBit(entry.state, EGW_AO_STATE_SELECTED, true));
}
}
progressbar.set_value(100 * (++range_index / range_count));
resolve();
}, that);
}.bind(this));
}).bind(queryRanges[i]));
fetchList.push(rangePromise);
}
}
// Start the first fetch
fetchResolver();
Promise.all(fetchList).finally(function()
{
dialog.close();
});
})
}); });
} }
} }

View File

@ -12,17 +12,17 @@
</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;
overflow: auto; overflow: auto;
} }
.long_task .et2_progress { .long_task .et2_progress {
width: 100%; width: 100%;
height: 1em; height: 1em;
} }
</styles> </styles>
</template> </template>
</overlay> </overlay>