= new BehaviorSubject(0);
public floatingTooltip: FloatingTooltip;
+ public bulkSelectionInProgress = false;
+ public bulkSelectionMessage = '';
@Input() selectListener: CanvasTableSelectListener;
@Output() touchscroll = new EventEmitter();
@@ -723,6 +726,10 @@ export class CanvasTableComponent implements AfterViewInit, DoCheck, OnInit {
}
public selectRows() {
+ if (this.bulkSelectionInProgress) {
+ return;
+ }
+
if (this.selectWhichRows === CanvasTable.RowSelect.Visible) {
this.selectAllVisibleRows();
} else {
@@ -732,14 +739,36 @@ export class CanvasTableComponent implements AfterViewInit, DoCheck, OnInit {
public selectAllRows() {
const allSelected = this.rows.allSelected();
+ const totalRows = this.rows.rowCount();
+ let processedRows = 0;
- this.rows.rows.forEach((rowobj, rowIndex) =>
- this.selectListener.rowSelected(
- rowIndex,
- 0,
- !allSelected
- )
- );
+ if (totalRows === 0) {
+ return;
+ }
+
+ this.updateBulkSelectionMessage(allSelected, processedRows, totalRows);
+
+ const selectNextBatch = () => {
+ const batchEnd = Math.min(processedRows + CanvasTableComponent.selectAllBatchSize, totalRows);
+
+ for (let rowIndex = processedRows; rowIndex < batchEnd; rowIndex++) {
+ this.selectListener.rowSelected(rowIndex, 0, !allSelected);
+ }
+
+ processedRows = batchEnd;
+
+ if (processedRows < totalRows) {
+ this.updateBulkSelectionMessage(allSelected, processedRows, totalRows);
+ setTimeout(selectNextBatch);
+ return;
+ }
+
+ this.bulkSelectionInProgress = false;
+ this.bulkSelectionMessage = '';
+ this.hasChanges = true;
+ };
+
+ setTimeout(selectNextBatch);
}
public selectAllVisibleRows() {
@@ -759,6 +788,13 @@ export class CanvasTableComponent implements AfterViewInit, DoCheck, OnInit {
this.hasChanges = true;
}
+ private updateBulkSelectionMessage(allSelected: boolean, processedRows: number, totalRows: number) {
+ this.bulkSelectionInProgress = true;
+ this.bulkSelectionMessage =
+ `${allSelected ? 'Clearing' : 'Selecting'} ${processedRows} of ${totalRows} messages...`;
+ this.hasChanges = true;
+ }
+
public selectRow(clientX: number, clientY: number, multiSelect?: boolean) {
const selectedRowIndex = this.getRowIndexByClientY(clientY);
this.selectRowByIndex(clientX, selectedRowIndex, multiSelect);
diff --git a/src/app/canvastable/canvastablecontainer.component.html b/src/app/canvastable/canvastablecontainer.component.html
index 0c43569ff..4235dac73 100644
--- a/src/app/canvastable/canvastablecontainer.component.html
+++ b/src/app/canvastable/canvastablecontainer.component.html
@@ -82,6 +82,9 @@
+
+ {{ canvastable.bulkSelectionMessage }}
+