ng-cdk-table-virtual-scroll
Version:
Virtual scroll for for Angular Cdk Table
68 lines • 8.68 kB
JavaScript
import { __extends } from "tslib";
import { DataSource } from '@angular/cdk/table';
import { BehaviorSubject, ReplaySubject, Subscription, } from 'rxjs';
var TableVirtualScrollDataSource = /** @class */ (function (_super) {
__extends(TableVirtualScrollDataSource, _super);
function TableVirtualScrollDataSource(initialData) {
if (initialData === void 0) { initialData = []; }
var _this = _super.call(this) || this;
/** 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();
return _this;
}
Object.defineProperty(TableVirtualScrollDataSource.prototype, "data", {
/** Array of data that should be rendered by the table, where each object represents one row. */
get: function () {
return this._data.value;
},
set: function (data) {
this._data.next(data);
},
enumerable: true,
configurable: true
});
TableVirtualScrollDataSource.prototype.updateChangeSubscription = function () {
var _this = this;
this.initStreams();
this._renderChangesSubscription = new Subscription();
this._renderChangesSubscription.add(this._data.subscribe(function (data) { return _this.dataToRender$.next(data); }));
this._renderChangesSubscription.add(this.dataOfRange$.subscribe(function (data) { return _this._renderData.next(data); }));
};
TableVirtualScrollDataSource.prototype.initStreams = function () {
if (!this.streamsReady) {
this.dataToRender$ = new ReplaySubject(1);
this.dataOfRange$ = new ReplaySubject(1);
this.streamsReady = true;
}
};
/**
* Used by the MatTable. Called when it connects to the data source.
* @private
*/
TableVirtualScrollDataSource.prototype.connect = function () {
if (!this._renderChangesSubscription) {
this.updateChangeSubscription();
}
return this._renderData;
};
/**
* Used by the MatTable. Called when it disconnects from the data source.
* @private
*/
TableVirtualScrollDataSource.prototype.disconnect = function () {
if (this._renderChangesSubscription) {
this._renderChangesSubscription.unsubscribe();
}
this._renderChangesSubscription = null;
};
return TableVirtualScrollDataSource;
}(DataSource));
export { TableVirtualScrollDataSource };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZGF0YS1zb3VyY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1jZGstdGFibGUtdmlydHVhbC1zY3JvbGwvIiwic291cmNlcyI6WyJsaWIvdGFibGUtZGF0YS1zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsZUFBZSxFQUVmLGFBQWEsRUFFYixZQUFZLEdBQ2IsTUFBTSxNQUFNLENBQUM7QUFFZDtJQUFxRCxnREFBYTtJQXlCaEUsc0NBQVksV0FBcUI7UUFBckIsNEJBQUEsRUFBQSxnQkFBcUI7UUFBakMsWUFDRSxpQkFBTyxTQUdSO1FBekJELGtGQUFrRjtRQUNqRSxpQkFBVyxHQUFHLElBQUksZUFBZSxDQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRTVEOzs7V0FHRztRQUNPLGdDQUEwQixHQUF3QixJQUFJLENBQUM7UUFnQi9ELEtBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxlQUFlLENBQU0sV0FBVyxDQUFDLENBQUM7UUFDbkQsS0FBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7O0lBQ2xDLENBQUM7SUFYRCxzQkFBSSw4Q0FBSTtRQURSLGdHQUFnRzthQUNoRztZQUNFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDMUIsQ0FBQzthQUNELFVBQVMsSUFBUztZQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixDQUFDOzs7T0FIQTtJQVdTLCtEQUF3QixHQUFsQztRQUFBLGlCQVNDO1FBUkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3JELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQUMsSUFBSSxJQUFLLE9BQUEsS0FBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQTdCLENBQTZCLENBQUMsQ0FDOUQsQ0FBQztRQUNGLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQUMsSUFBSSxJQUFLLE9BQUEsS0FBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQTNCLENBQTJCLENBQUMsQ0FDbkUsQ0FBQztJQUNKLENBQUM7SUFFUyxrREFBVyxHQUFyQjtRQUNFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQU0sQ0FBQyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGFBQWEsQ0FBTSxDQUFDLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCw4Q0FBTyxHQUFQO1FBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRTtZQUNwQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztTQUNqQztRQUVELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsaURBQVUsR0FBVjtRQUNFLElBQUksSUFBSSxDQUFDLDBCQUEwQixFQUFFO1lBQ25DLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUMvQztRQUNELElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7SUFDekMsQ0FBQztJQUNILG1DQUFDO0FBQUQsQ0FBQyxBQXhFRCxDQUFxRCxVQUFVLEdBd0U5RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9jZGsvdGFibGUnO1xyXG5pbXBvcnQge1xyXG4gIEJlaGF2aW9yU3ViamVjdCxcclxuICBPYnNlcnZhYmxlLFxyXG4gIFJlcGxheVN1YmplY3QsXHJcbiAgU3ViamVjdCxcclxuICBTdWJzY3JpcHRpb24sXHJcbn0gZnJvbSAncnhqcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgVGFibGVWaXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZTxUPiBleHRlbmRzIERhdGFTb3VyY2U8VD4ge1xyXG4gIC8qKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuIGEgbmV3IGRhdGEgYXJyYXkgaXMgc2V0IG9uIHRoZSBkYXRhIHNvdXJjZS4gKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IF9kYXRhOiBCZWhhdmlvclN1YmplY3Q8VFtdPjtcclxuXHJcbiAgLyoqIFN0cmVhbSBlbWl0dGluZyByZW5kZXIgZGF0YSB0byB0aGUgdGFibGUgKGRlcGVuZHMgb24gb3JkZXJlZCBkYXRhIGNoYW5nZXMpLiAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlbmRlckRhdGEgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRbXT4oW10pO1xyXG5cclxuICAvKipcclxuICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIGNoYW5nZXMgdGhhdCBzaG91bGQgdHJpZ2dlciBhbiB1cGRhdGUgdG8gdGhlIHRhYmxlJ3MgcmVuZGVyZWQgcm93cywgc3VjaFxyXG4gICAqIGFzIGZpbHRlcmluZywgc29ydGluZywgcGFnaW5hdGlvbiwgb3IgYmFzZSBkYXRhIGNoYW5nZXMuXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIF9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHVibGljIGRhdGFUb1JlbmRlciQ6IFN1YmplY3Q8VFtdPjtcclxuICBwdWJsaWMgZGF0YU9mUmFuZ2UkOiBTdWJqZWN0PFRbXT47XHJcbiAgcHJvdGVjdGVkIHN0cmVhbXNSZWFkeTogYm9vbGVhbjtcclxuXHJcbiAgLyoqIEFycmF5IG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQgYnkgdGhlIHRhYmxlLCB3aGVyZSBlYWNoIG9iamVjdCByZXByZXNlbnRzIG9uZSByb3cuICovXHJcbiAgZ2V0IGRhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YS52YWx1ZTtcclxuICB9XHJcbiAgc2V0IGRhdGEoZGF0YTogVFtdKSB7XHJcbiAgICB0aGlzLl9kYXRhLm5leHQoZGF0YSk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihpbml0aWFsRGF0YTogVFtdID0gW10pIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLl9kYXRhID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUW10+KGluaXRpYWxEYXRhKTtcclxuICAgIHRoaXMudXBkYXRlQ2hhbmdlU3Vic2NyaXB0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgdXBkYXRlQ2hhbmdlU3Vic2NyaXB0aW9uKCkge1xyXG4gICAgdGhpcy5pbml0U3RyZWFtcygpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb24uYWRkKFxyXG4gICAgICB0aGlzLl9kYXRhLnN1YnNjcmliZSgoZGF0YSkgPT4gdGhpcy5kYXRhVG9SZW5kZXIkLm5leHQoZGF0YSkpXHJcbiAgICApO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbi5hZGQoXHJcbiAgICAgIHRoaXMuZGF0YU9mUmFuZ2UkLnN1YnNjcmliZSgoZGF0YSkgPT4gdGhpcy5fcmVuZGVyRGF0YS5uZXh0KGRhdGEpKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpbml0U3RyZWFtcygpIHtcclxuICAgIGlmICghdGhpcy5zdHJlYW1zUmVhZHkpIHtcclxuICAgICAgdGhpcy5kYXRhVG9SZW5kZXIkID0gbmV3IFJlcGxheVN1YmplY3Q8VFtdPigxKTtcclxuICAgICAgdGhpcy5kYXRhT2ZSYW5nZSQgPSBuZXcgUmVwbGF5U3ViamVjdDxUW10+KDEpO1xyXG4gICAgICB0aGlzLnN0cmVhbXNSZWFkeSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVc2VkIGJ5IHRoZSBNYXRUYWJsZS4gQ2FsbGVkIHdoZW4gaXQgY29ubmVjdHMgdG8gdGhlIGRhdGEgc291cmNlLlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgY29ubmVjdCgpOiBPYnNlcnZhYmxlPFRbXSB8IHJlYWRvbmx5IFRbXT4ge1xyXG4gICAgaWYgKCF0aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ2hhbmdlU3Vic2NyaXB0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3JlbmRlckRhdGE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVc2VkIGJ5IHRoZSBNYXRUYWJsZS4gQ2FsbGVkIHdoZW4gaXQgZGlzY29ubmVjdHMgZnJvbSB0aGUgZGF0YSBzb3VyY2UuXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBkaXNjb25uZWN0KCkge1xyXG4gICAgaWYgKHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IG51bGw7XHJcbiAgfVxyXG59XHJcbiJdfQ==