ng-cdk-table-virtual-scroll
Version:
Virtual scroll for for Angular Cdk Table
93 lines • 13.7 kB
JavaScript
import { __decorate } from "tslib";
import { Injectable } from '@angular/core';
import { distinctUntilChanged } from 'rxjs/operators';
import { BehaviorSubject, Subject } from 'rxjs';
var FixedSizeTableVirtualScrollStrategy = /** @class */ (function () {
function FixedSizeTableVirtualScrollStrategy() {
this.indexChange = new Subject();
this.stickyChange = new Subject();
this.renderedRangeStream = new BehaviorSubject({ start: 0, end: 0 });
this.scrolledIndexChange = this.indexChange.pipe(distinctUntilChanged());
this._dataLength = 0;
}
Object.defineProperty(FixedSizeTableVirtualScrollStrategy.prototype, "dataLength", {
get: function () {
return this._dataLength;
},
set: function (value) {
this._dataLength = value;
this.onDataLengthChanged();
},
enumerable: true,
configurable: true
});
FixedSizeTableVirtualScrollStrategy.prototype.attach = function (viewport) {
this.viewport = viewport;
this.viewport.renderedRangeStream.subscribe(this.renderedRangeStream);
this.onDataLengthChanged();
};
FixedSizeTableVirtualScrollStrategy.prototype.detach = function () {
this.indexChange.complete();
this.stickyChange.complete();
this.renderedRangeStream.complete();
};
FixedSizeTableVirtualScrollStrategy.prototype.onContentScrolled = function () {
this.updateContent();
};
FixedSizeTableVirtualScrollStrategy.prototype.onDataLengthChanged = function () {
if (this.viewport) {
this.viewport.setTotalContentSize(this.dataLength * this.rowHeight + this.headerHeight + this.footerHeight);
}
this.updateContent();
};
FixedSizeTableVirtualScrollStrategy.prototype.onContentRendered = function () {
// no-op
};
FixedSizeTableVirtualScrollStrategy.prototype.onRenderedOffsetChanged = function () {
// no-op
};
FixedSizeTableVirtualScrollStrategy.prototype.scrollToIndex = function (index, behavior) {
if (!this.viewport || !this.rowHeight) {
return;
}
this.viewport.scrollToOffset((index - 1) * this.rowHeight + this.headerHeight);
};
FixedSizeTableVirtualScrollStrategy.prototype.setConfig = function (configs) {
var rowHeight = configs.rowHeight, headerHeight = configs.headerHeight, footerHeight = configs.footerHeight, bufferMultiplier = configs.bufferMultiplier;
if (this.rowHeight === rowHeight
&& this.headerHeight === headerHeight
&& this.footerHeight === footerHeight
&& this.bufferMultiplier === bufferMultiplier) {
return;
}
this.rowHeight = rowHeight;
this.headerHeight = headerHeight;
this.footerHeight = footerHeight;
this.bufferMultiplier = bufferMultiplier;
this.onDataLengthChanged();
};
FixedSizeTableVirtualScrollStrategy.prototype.updateContent = function () {
if (!this.viewport || !this.rowHeight) {
return;
}
var scrollOffset = this.viewport.measureScrollOffset();
var amount = Math.ceil(this.viewport.getViewportSize() / this.rowHeight);
var offset = Math.max(scrollOffset - this.headerHeight, 0);
var buffer = Math.ceil(amount * this.bufferMultiplier);
var skip = Math.round(offset / this.rowHeight);
var index = Math.max(0, skip);
var start = Math.max(0, index - buffer);
var end = Math.min(this.dataLength, index + amount + buffer);
var renderedOffset = start * this.rowHeight;
this.viewport.setRenderedContentOffset(renderedOffset);
this.viewport.setRenderedRange({ start: start, end: end });
this.indexChange.next(index);
this.stickyChange.next(renderedOffset);
};
FixedSizeTableVirtualScrollStrategy = __decorate([
Injectable()
], FixedSizeTableVirtualScrollStrategy);
return FixedSizeTableVirtualScrollStrategy;
}());
export { FixedSizeTableVirtualScrollStrategy };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4ZWQtc2l6ZS10YWJsZS12aXJ0dWFsLXNjcm9sbC1zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWNkay10YWJsZS12aXJ0dWFsLXNjcm9sbC8iLCJzb3VyY2VzIjpbImxpYi9maXhlZC1zaXplLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLXN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBWWhEO0lBQUE7UUFLVSxnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7UUFDckMsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBSXJDLHdCQUFtQixHQUFHLElBQUksZUFBZSxDQUFZLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQztRQUV6RSx3QkFBbUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFXbkUsZ0JBQVcsR0FBRyxDQUFDLENBQUM7SUE0RTFCLENBQUM7SUFyRkMsc0JBQUksMkRBQVU7YUFBZDtZQUNFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMxQixDQUFDO2FBRUQsVUFBZSxLQUFhO1lBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLENBQUM7OztPQUxBO0lBU00sb0RBQU0sR0FBYixVQUFjLFFBQWtDO1FBQzlDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLElBQUks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SUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQy9ELElBQU0sY0FBYyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFDLEtBQUssT0FBQSxFQUFFLEdBQUcsS0FBQSxFQUFDLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBbEdVLG1DQUFtQztRQUQvQyxVQUFVLEVBQUU7T0FDQSxtQ0FBbUMsQ0FtRy9DO0lBQUQsMENBQUM7Q0FBQSxBQW5HRCxJQW1HQztTQW5HWSxtQ0FBbUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCBWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcclxuaW1wb3J0IHsgTGlzdFJhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVFNWU3RyYXRlZ3lDb25maWdzIHtcclxuICByb3dIZWlnaHQ6IG51bWJlcjtcclxuICBoZWFkZXJIZWlnaHQ6IG51bWJlcjtcclxuICBmb290ZXJIZWlnaHQ6IG51bWJlcjtcclxuICBidWZmZXJNdWx0aXBsaWVyOiBudW1iZXI7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEZpeGVkU2l6ZVRhYmxlVmlydHVhbFNjcm9sbFN0cmF0ZWd5IGltcGxlbWVudHMgVmlydHVhbFNjcm9sbFN0cmF0ZWd5IHtcclxuICBwcml2YXRlIHJvd0hlaWdodCE6IG51bWJlcjtcclxuICBwcml2YXRlIGhlYWRlckhlaWdodCE6IG51bWJlcjtcclxuICBwcml2YXRlIGZvb3RlckhlaWdodCE6IG51bWJlcjtcclxuICBwcml2YXRlIGJ1ZmZlck11bHRpcGxpZXIhOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBpbmRleENoYW5nZSA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcclxuICBwdWJsaWMgc3RpY2t5Q2hhbmdlID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xyXG5cclxuICBwdWJsaWMgdmlld3BvcnQ6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcclxuXHJcbiAgcHVibGljIHJlbmRlcmVkUmFuZ2VTdHJlYW0gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PExpc3RSYW5nZT4oe3N0YXJ0OiAwLCBlbmQ6IDB9KTtcclxuXHJcbiAgcHVibGljIHNjcm9sbGVkSW5kZXhDaGFuZ2UgPSB0aGlzLmluZGV4Q2hhbmdlLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XHJcblxyXG4gIGdldCBkYXRhTGVuZ3RoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YUxlbmd0aDtcclxuICB9XHJcblxyXG4gIHNldCBkYXRhTGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2RhdGFMZW5ndGggPSB2YWx1ZTtcclxuICAgIHRoaXMub25EYXRhTGVuZ3RoQ2hhbmdlZCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZGF0YUxlbmd0aCA9IDA7XHJcblxyXG4gIHB1YmxpYyBhdHRhY2godmlld3BvcnQ6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCk6IHZvaWQge1xyXG4gICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xyXG4gICAgdGhpcy52aWV3cG9ydC5yZW5kZXJlZFJhbmdlU3RyZWFtLnN1YnNjcmliZSh0aGlzLnJlbmRlcmVkUmFuZ2VTdHJlYW0pO1xyXG4gICAgdGhpcy5vbkRhdGFMZW5ndGhDaGFuZ2VkKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGV0YWNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbmRleENoYW5nZS5jb21wbGV0ZSgpO1xyXG4gICAgdGhpcy5zdGlja3lDaGFuZ2UuY29tcGxldGUoKTtcclxuICAgIHRoaXMucmVuZGVyZWRSYW5nZVN0cmVhbS5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ29udGVudFNjcm9sbGVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVDb250ZW50KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25EYXRhTGVuZ3RoQ2hhbmdlZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnZpZXdwb3J0KSB7XHJcbiAgICAgIHRoaXMudmlld3BvcnQuc2V0VG90YWxDb250ZW50U2l6ZSh0aGlzLmRhdGFMZW5ndGggKiB0aGlzLnJvd0hlaWdodCArIHRoaXMuaGVhZGVySGVpZ2h0ICsgdGhpcy5mb290ZXJIZWlnaHQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVDb250ZW50KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Db250ZW50UmVuZGVyZWQoKTogdm9pZCB7XHJcbiAgICAvLyBuby1vcFxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uUmVuZGVyZWRPZmZzZXRDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgLy8gbm8tb3BcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb0luZGV4KGluZGV4OiBudW1iZXIsIGJlaGF2aW9yPzogU2Nyb2xsQmVoYXZpb3IpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy52aWV3cG9ydCB8fCAhdGhpcy5yb3dIZWlnaHQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy52aWV3cG9ydC5zY3JvbGxUb09mZnNldCgoaW5kZXggLSAxICkgKiB0aGlzLnJvd0hlaWdodCArIHRoaXMuaGVhZGVySGVpZ2h0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRDb25maWcoY29uZmlnczogVFNWU3RyYXRlZ3lDb25maWdzKSB7XHJcbiAgICBjb25zdCB7cm93SGVpZ2h0LCBoZWFkZXJIZWlnaHQsIGZvb3RlckhlaWdodCwgYnVmZmVyTXVsdGlwbGllcn0gPSBjb25maWdzO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnJvd0hlaWdodCA9PT0gcm93SGVpZ2h0XHJcbiAgICAgICYmIHRoaXMuaGVhZGVySGVpZ2h0ID09PSBoZWFkZXJIZWlnaHRcclxuICAgICAgJiYgdGhpcy5mb290ZXJIZWlnaHQgPT09IGZvb3RlckhlaWdodFxyXG4gICAgICAmJiB0aGlzLmJ1ZmZlck11bHRpcGxpZXIgPT09IGJ1ZmZlck11bHRpcGxpZXJcclxuICAgICkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJvd0hlaWdodCA9IHJvd0hlaWdodDtcclxuICAgIHRoaXMuaGVhZGVySGVpZ2h0ID0gaGVhZGVySGVpZ2h0O1xyXG4gICAgdGhpcy5mb290ZXJIZWlnaHQgPSBmb290ZXJIZWlnaHQ7XHJcbiAgICB0aGlzLmJ1ZmZlck11bHRpcGxpZXIgPSBidWZmZXJNdWx0aXBsaWVyO1xyXG4gICAgdGhpcy5vbkRhdGFMZW5ndGhDaGFuZ2VkKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUNvbnRlbnQoKSB7XHJcbiAgICBpZiAoIXRoaXMudmlld3BvcnQgfHwgIXRoaXMucm93SGVpZ2h0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHNjcm9sbE9mZnNldCA9IHRoaXMudmlld3BvcnQubWVhc3VyZVNjcm9sbE9mZnNldCgpO1xyXG4gICAgY29uc3QgYW1vdW50ID0gTWF0aC5jZWlsKHRoaXMudmlld3BvcnQuZ2V0Vmlld3BvcnRTaXplKCkgLyB0aGlzLnJvd0hlaWdodCk7XHJcbiAgICBjb25zdCBvZmZzZXQgPSBNYXRoLm1heChzY3JvbGxPZmZzZXQgLSB0aGlzLmhlYWRlckhlaWdodCwgMCk7XHJcbiAgICBjb25zdCBidWZmZXIgPSBNYXRoLmNlaWwoYW1vdW50ICogdGhpcy5idWZmZXJNdWx0aXBsaWVyKTtcclxuXHJcbiAgICBjb25zdCBza2lwID0gTWF0aC5yb3VuZChvZmZzZXQgLyB0aGlzLnJvd0hlaWdodCk7XHJcbiAgICBjb25zdCBpbmRleCA9IE1hdGgubWF4KDAsIHNraXApO1xyXG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBpbmRleCAtIGJ1ZmZlcik7XHJcbiAgICBjb25zdCBlbmQgPSBNYXRoLm1pbih0aGlzLmRhdGFMZW5ndGgsIGluZGV4ICsgYW1vdW50ICsgYnVmZmVyKTtcclxuICAgIGNvbnN0IHJlbmRlcmVkT2Zmc2V0ID0gc3RhcnQgKiB0aGlzLnJvd0hlaWdodDtcclxuICAgIHRoaXMudmlld3BvcnQuc2V0UmVuZGVyZWRDb250ZW50T2Zmc2V0KHJlbmRlcmVkT2Zmc2V0KTtcclxuICAgIHRoaXMudmlld3BvcnQuc2V0UmVuZGVyZWRSYW5nZSh7c3RhcnQsIGVuZH0pO1xyXG4gICAgdGhpcy5pbmRleENoYW5nZS5uZXh0KGluZGV4KTtcclxuICAgIHRoaXMuc3RpY2t5Q2hhbmdlLm5leHQocmVuZGVyZWRPZmZzZXQpO1xyXG4gIH1cclxufVxyXG4iXX0=