ng-table-virtual-scroll
Version:
Virtual scroll for for Angular Material Table
88 lines • 15.1 kB
JavaScript
import { BehaviorSubject, combineLatest, merge, of, ReplaySubject, Subscription } from 'rxjs';
import { map } from 'rxjs/operators';
import { MatTableDataSource } from '@angular/material/table';
import { DataSource } from '@angular/cdk/collections';
export function isTVSDataSource(dataSource) {
return dataSource instanceof CdkTableVirtualScrollDataSource || dataSource instanceof TableVirtualScrollDataSource;
}
export class CdkTableVirtualScrollDataSource extends DataSource {
constructor(initialData = []) {
super();
/** Stream emitting render data to the table (depends on ordered data changes). */
this._renderData = new BehaviorSubject([]);
/**
* Subscription to the changes that should trigger an update to the table's rendered rows, such
* as filtering, sorting, pagination, or base data changes.
*/
this._renderChangesSubscription = null;
this._data = new BehaviorSubject(initialData);
this._updateChangeSubscription();
}
/** Array of data that should be rendered by the table, where each object represents one row. */
get data() {
return this._data.value;
}
set data(data) {
data = Array.isArray(data) ? data : [];
this._data.next(data);
}
_updateChangeSubscription() {
this.initStreams();
this._renderChangesSubscription?.unsubscribe();
this._renderChangesSubscription = new Subscription();
this._renderChangesSubscription.add(this._data.subscribe(data => this.dataToRender$.next(data)));
this._renderChangesSubscription.add(this.dataOfRange$.subscribe(data => this._renderData.next(data)));
}
connect() {
if (!this._renderChangesSubscription) {
this._updateChangeSubscription();
}
return this._renderData;
}
disconnect() {
this._renderChangesSubscription?.unsubscribe();
this._renderChangesSubscription = null;
}
initStreams() {
if (!this.streamsReady) {
this.dataToRender$ = new ReplaySubject(1);
this.dataOfRange$ = new ReplaySubject(1);
this.streamsReady = true;
}
}
}
export class TableVirtualScrollDataSource extends MatTableDataSource {
_updateChangeSubscription() {
this.initStreams();
const _sort = this['_sort'];
const _paginator = this['_paginator'];
const _internalPageChanges = this['_internalPageChanges'];
const _filter = this['_filter'];
const _renderData = this['_renderData'];
const sortChange = _sort ?
merge(_sort.sortChange, _sort.initialized) :
of(null);
const pageChange = _paginator ?
merge(_paginator.page, _internalPageChanges, _paginator.initialized) :
of(null);
const dataStream = this['_data'];
const filteredData = combineLatest([dataStream, _filter])
.pipe(map(([data]) => this._filterData(data)));
const orderedData = combineLatest([filteredData, sortChange])
.pipe(map(([data]) => this._orderData(data)));
const paginatedData = combineLatest([orderedData, pageChange])
.pipe(map(([data]) => this._pageData(data)));
this._renderChangesSubscription?.unsubscribe();
this._renderChangesSubscription = new Subscription();
this._renderChangesSubscription.add(paginatedData.subscribe(data => this.dataToRender$.next(data)));
this._renderChangesSubscription.add(this.dataOfRange$.subscribe(data => _renderData.next(data)));
}
initStreams() {
if (!this.streamsReady) {
this.dataToRender$ = new ReplaySubject(1);
this.dataOfRange$ = new ReplaySubject(1);
this.streamsReady = true;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZGF0YS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy10YWJsZS12aXJ0dWFsLXNjcm9sbC9zcmMvbGliL3RhYmxlLWRhdGEtc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsYUFBYSxFQUFXLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBT3RELE1BQU0sVUFBVSxlQUFlLENBQUksVUFBbUI7SUFDcEQsT0FBTyxVQUFVLFlBQVksK0JBQStCLElBQUksVUFBVSxZQUFZLDRCQUE0QixDQUFDO0FBQ3JILENBQUM7QUFFRCxNQUFNLE9BQU8sK0JBQW1DLFNBQVEsVUFBYTtJQTRCbkUsWUFBWSxjQUFtQixFQUFFO1FBQy9CLEtBQUssRUFBRSxDQUFDO1FBekJWLGtGQUFrRjtRQUNqRSxnQkFBVyxHQUFHLElBQUksZUFBZSxDQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRTVEOzs7V0FHRztRQUNILCtCQUEwQixHQUF3QixJQUFJLENBQUM7UUFtQnJELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxlQUFlLENBQU0sV0FBVyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQW5CRCxnR0FBZ0c7SUFDaEcsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxJQUFJLENBQUMsSUFBUztRQUNoQixJQUFJLEdBQUcsS0FBSyxDQUFDLE9B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SUFBSSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBtZXJnZSwgT2JzZXJ2YWJsZSwgb2YsIFJlcGxheVN1YmplY3QsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgTWF0U29ydCwgU29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yLCBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVFZTRGF0YVNvdXJjZTxUPiB7XG4gIGRhdGFUb1JlbmRlciQ6IFN1YmplY3Q8VFtdPjtcbiAgZGF0YU9mUmFuZ2UkOiBTdWJqZWN0PFRbXT47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RWU0RhdGFTb3VyY2U8VD4oZGF0YVNvdXJjZTogdW5rbm93bik6IGRhdGFTb3VyY2UgaXMgVFZTRGF0YVNvdXJjZTxUPiB7XG4gIHJldHVybiBkYXRhU291cmNlIGluc3RhbmNlb2YgQ2RrVGFibGVWaXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZSB8fCBkYXRhU291cmNlIGluc3RhbmNlb2YgVGFibGVWaXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZTtcbn1cblxuZXhwb3J0IGNsYXNzIENka1RhYmxlVmlydHVhbFNjcm9sbERhdGFTb3VyY2U8VD4gZXh0ZW5kcyBEYXRhU291cmNlPFQ+IGltcGxlbWVudHMgVFZTRGF0YVNvdXJjZTxUPiB7XG4gIC8qKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuIGEgbmV3IGRhdGEgYXJyYXkgaXMgc2V0IG9uIHRoZSBkYXRhIHNvdXJjZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZGF0YTogQmVoYXZpb3JTdWJqZWN0PFRbXT47XG5cbiAgLyoqIFN0cmVhbSBlbWl0dGluZyByZW5kZXIgZGF0YSB0byB0aGUgdGFibGUgKGRlcGVuZHMgb24gb3JkZXJlZCBkYXRhIGNoYW5nZXMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJEYXRhID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUW10+KFtdKTtcblxuICAvKipcbiAgICogU3Vic2NyaXB0aW9uIHRvIHRoZSBjaGFuZ2VzIHRoYXQgc2hvdWxkIHRyaWdnZXIgYW4gdXBkYXRlIHRvIHRoZSB0YWJsZSdzIHJlbmRlcmVkIHJvd3MsIHN1Y2hcbiAgICogYXMgZmlsdGVyaW5nLCBzb3J0aW5nLCBwYWdpbmF0aW9uLCBvciBiYXNlIGRhdGEgY2hhbmdlcy5cbiAgICovXG4gIF9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcblxuICAvKiogQXJyYXkgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSByZW5kZXJlZCBieSB0aGUgdGFibGUsIHdoZXJlIGVhY2ggb2JqZWN0IHJlcHJlc2VudHMgb25lIHJvdy4gKi9cbiAgZ2V0IGRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEudmFsdWU7XG4gIH1cblxuICBzZXQgZGF0YShkYXRhOiBUW10pIHtcbiAgICBkYXRhID0gQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbXTtcbiAgICB0aGlzLl9kYXRhLm5leHQoZGF0YSk7XG4gIH1cblxuICBwdWJsaWMgZGF0YVRvUmVuZGVyJDogU3ViamVjdDxUW10+O1xuICBwdWJsaWMgZGF0YU9mUmFuZ2UkOiBTdWJqZWN0PFRbXT47XG4gIHByaXZhdGUgc3RyZWFtc1JlYWR5OiBib29sZWFuO1xuXG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbERhdGE6IFRbXSA9IFtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9kYXRhID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUW10+KGluaXRpYWxEYXRhKTtcbiAgICB0aGlzLl91cGRhdGVDaGFuZ2VTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIF91cGRhdGVDaGFuZ2VTdWJzY3JpcHRpb24oKSB7XG4gICAgdGhpcy5pbml0U3RyZWFtcygpO1xuXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgIHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5fZGF0YS5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLmRhdGFUb1JlbmRlciQubmV4dChkYXRhKSlcbiAgICApO1xuICAgIHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5kYXRhT2ZSYW5nZSQuc3Vic2NyaWJlKGRhdGEgPT4gdGhpcy5fcmVuZGVyRGF0YS5uZXh0KGRhdGEpKVxuICAgICk7XG4gIH1cblxuICBjb25uZWN0KCkge1xuICAgIGlmICghdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fdXBkYXRlQ2hhbmdlU3Vic2NyaXB0aW9uKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlbmRlckRhdGE7XG4gIH1cblxuXG4gIGRpc2Nvbm5lY3QoKSB7XG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFN0cmVhbXMoKSB7XG4gICAgaWYgKCF0aGlzLnN0cmVhbXNSZWFkeSkge1xuICAgICAgdGhpcy5kYXRhVG9SZW5kZXIkID0gbmV3IFJlcGxheVN1YmplY3Q8VFtdPigxKTtcbiAgICAgIHRoaXMuZGF0YU9mUmFuZ2UkID0gbmV3IFJlcGxheVN1YmplY3Q8VFtdPigxKTtcbiAgICAgIHRoaXMuc3RyZWFtc1JlYWR5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhYmxlVmlydHVhbFNjcm9sbERhdGFTb3VyY2U8VD4gZXh0ZW5kcyBNYXRUYWJsZURhdGFTb3VyY2U8VD4gaW1wbGVtZW50cyBUVlNEYXRhU291cmNlPFQ+IHtcbiAgcHVibGljIGRhdGFUb1JlbmRlciQ6IFN1YmplY3Q8VFtdPjtcbiAgcHVibGljIGRhdGFPZlJhbmdlJDogU3ViamVjdDxUW10+O1xuICBwcml2YXRlIHN0cmVhbXNSZWFkeTogYm9vbGVhbjtcblxuICBfdXBkYXRlQ2hhbmdlU3Vic2NyaXB0aW9uKCkge1xuICAgIHRoaXMuaW5pdFN0cmVhbXMoKTtcbiAgICBjb25zdCBfc29ydDogTWF0U29ydCB8IG51bGwgPSB0aGlzWydfc29ydCddO1xuICAgIGNvbnN0IF9wYWdpbmF0b3I6IE1hdFBhZ2luYXRvciB8IG51bGwgPSB0aGlzWydfcGFnaW5hdG9yJ107XG4gICAgY29uc3QgX2ludGVybmFsUGFnZUNoYW5nZXM6IFN1YmplY3Q8dm9pZD4gPSB0aGlzWydfaW50ZXJuYWxQYWdlQ2hhbmdlcyddO1xuICAgIGNvbnN0IF9maWx0ZXI6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gdGhpc1snX2ZpbHRlciddO1xuICAgIGNvbnN0IF9yZW5kZXJEYXRhOiBCZWhhdmlvclN1YmplY3Q8VFtdPiA9IHRoaXNbJ19yZW5kZXJEYXRhJ107XG5cbiAgICBjb25zdCBzb3J0Q2hhbmdlOiBPYnNlcnZhYmxlPFNvcnQgfCBudWxsIHwgdm9pZD4gPSBfc29ydCA/XG4gICAgICBtZXJnZShfc29ydC5zb3J0Q2hhbmdlLCBfc29ydC5pbml0aWFsaXplZCkgYXMgT2JzZXJ2YWJsZTxTb3J0IHwgdm9pZD4gOlxuICAgICAgb2YobnVsbCk7XG4gICAgY29uc3QgcGFnZUNoYW5nZTogT2JzZXJ2YWJsZTxQYWdlRXZlbnQgfCBudWxsIHwgdm9pZD4gPSBfcGFnaW5hdG9yID9cbiAgICAgIG1lcmdlKFxuICAgICAgICBfcGFnaW5hdG9yLnBhZ2UsXG4gICAgICAgIF9pbnRlcm5hbFBhZ2VDaGFuZ2VzLFxuICAgICAgICBfcGFnaW5hdG9yLmluaXRpYWxpemVkXG4gICAgICApIGFzIE9ic2VydmFibGU8UGFnZUV2ZW50IHwgdm9pZD4gOlxuICAgICAgb2YobnVsbCk7XG4gICAgY29uc3QgZGF0YVN0cmVhbTogT2JzZXJ2YWJsZTxUW10+ID0gdGhpc1snX2RhdGEnXTtcbiAgICBjb25zdCBmaWx0ZXJlZERhdGEgPSBjb21iaW5lTGF0ZXN0KFtkYXRhU3RyZWFtLCBfZmlsdGVyXSlcbiAgICAgIC5waXBlKG1hcCgoW2RhdGFdKSA9PiB0aGlzLl9maWx0ZXJEYXRhKGRhdGEpKSk7XG4gICAgY29uc3Qgb3JkZXJlZERhdGEgPSBjb21iaW5lTGF0ZXN0KFtmaWx0ZXJlZERhdGEsIHNvcnRDaGFuZ2VdKVxuICAgICAgLnBpcGUobWFwKChbZGF0YV0pID0+IHRoaXMuX29yZGVyRGF0YShkYXRhKSkpO1xuICAgIGNvbnN0IHBhZ2luYXRlZERhdGEgPSBjb21iaW5lTGF0ZXN0KFtvcmRlcmVkRGF0YSwgcGFnZUNoYW5nZV0pXG4gICAgICAucGlwZShtYXAoKFtkYXRhXSkgPT4gdGhpcy5fcGFnZURhdGEoZGF0YSkpKTtcblxuICAgIHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHBhZ2luYXRlZERhdGEuc3Vic2NyaWJlKGRhdGEgPT4gdGhpcy5kYXRhVG9SZW5kZXIkLm5leHQoZGF0YSkpXG4gICAgKTtcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuZGF0YU9mUmFuZ2UkLnN1YnNjcmliZShkYXRhID0+IF9yZW5kZXJEYXRhLm5leHQoZGF0YSkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFN0cmVhbXMoKSB7XG4gICAgaWYgKCF0aGlzLnN0cmVhbXNSZWFkeSkge1xuICAgICAgdGhpcy5kYXRhVG9SZW5kZXIkID0gbmV3IFJlcGxheVN1YmplY3Q8VFtdPigxKTtcbiAgICAgIHRoaXMuZGF0YU9mUmFuZ2UkID0gbmV3IFJlcGxheVN1YmplY3Q8VFtdPigxKTtcbiAgICAgIHRoaXMuc3RyZWFtc1JlYWR5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==