UNPKG

ontimize-web-ngx

Version:
86 lines 12.7 kB
import { Injectable } from "@angular/core"; import { Subject } from "rxjs"; import { distinctUntilChanged } from "rxjs/operators"; import * as i0 from "@angular/core"; export class OTableVirtualScrollStrategy { constructor() { this.indexChange = new Subject(); this.scrolledIndexChange = this.indexChange.pipe(distinctUntilChanged()); this.stickyChange = new Subject(); this.bufferMultiplier = 1; this._dataLength = 0; } get dataLength() { return this._dataLength; } set dataLength(value) { this._dataLength = value; this.onDataLengthChanged(); } attach(viewport) { this.viewport = viewport; this.onDataLengthChanged(); this.updateContent(); } detach() { } destroy() { this.indexChange.complete(); this.stickyChange.complete(); } onContentRendered() { } onRenderedOffsetChanged() { } scrollToIndex(index, behavior) { } onContentScrolled() { this.updateContent(); } setConfig(rowHeight, headerHeight, footerHeight) { if (this.rowHeight === rowHeight && this.headerHeight === headerHeight && this.footerHeight === footerHeight) { return; } this.rowHeight = rowHeight; this.headerHeight = headerHeight; this.footerHeight = footerHeight; this.onDataLengthChanged(); } onDataLengthChanged() { if (this.viewport) { this.viewport.setTotalContentSize(this.dataLength * this.rowHeight + this.headerHeight + this.footerHeight); this.viewport.scrollToOffset(0); this.updateContent(); } } updateContent() { if (!this.viewport || !this.rowHeight || this.dataLength === 0) { return; } const scrollOffset = this.viewport.measureScrollOffset(); const itemsDisplayed = Math.ceil(this.viewport.getViewportSize() / this.rowHeight); const renderedOffset = this.viewport.getOffsetToRenderedContentStart(); const start = renderedOffset / this.rowHeight; const bufferItems = Math.ceil(itemsDisplayed * this.bufferMultiplier); const bufferOffset = renderedOffset + bufferItems * this.rowHeight; const relativeScrollOffset = scrollOffset - bufferOffset; const rowsScrolled = relativeScrollOffset / this.rowHeight; const displayed = scrollOffset / this.rowHeight; this.indexChange.next(displayed); const rowsToMove = Math.sign(rowsScrolled) * Math.floor(Math.abs(rowsScrolled)); const adjustedRenderedOffset = Math.max(0, renderedOffset + rowsToMove * this.rowHeight); this.viewport.setRenderedContentOffset(adjustedRenderedOffset); const adjustedStart = Math.max(0, start + rowsToMove); const adjustedEnd = adjustedStart + itemsDisplayed + bufferItems; this.viewport.setRenderedRange({ start: adjustedStart, end: adjustedEnd }); this.stickyChange.next(adjustedRenderedOffset); } } OTableVirtualScrollStrategy.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableVirtualScrollStrategy, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); OTableVirtualScrollStrategy.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableVirtualScrollStrategy }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableVirtualScrollStrategy, decorators: [{ type: Injectable }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS1zdHJhdGVneS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvZXh0ZW5zaW9ucy9vLXRhYmxlLXN0cmF0ZWd5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUd0RCxNQUFNLE9BQU8sMkJBQTJCO0lBRHhDO1FBT21CLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUM5Qyx3QkFBbUIsR0FBdUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUM3QyxxQkFBZ0IsR0FBVyxDQUFDLENBQUM7UUFXN0IsZ0JBQVcsR0FBRyxDQUFDLENBQUM7S0FvRnpCO0lBN0ZDLElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsS0FBYTtRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBSU0sTUFBTSxDQUFDLFFBQWtDO1FBQzlDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU0sTUFBTTtJQUViLENBQUM7SUFFTSxPQUFPO1FB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QUUvRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUM7UUFDdEQsTUFBTSxXQUFXLEdBQUcsYUFBYSxHQUFHLGNBQWMsR0FBRyxXQUFXLENBQUM7UUFDakUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUNqRCxDQUFDOzt5SEF2R1UsMkJBQTJCOzZIQUEzQiwyQkFBMkI7NEZBQTNCLDJCQUEyQjtrQkFEdkMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgVmlydHVhbFNjcm9sbFN0cmF0ZWd5IH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9zY3JvbGxpbmdcIjtcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT1RhYmxlVmlydHVhbFNjcm9sbFN0cmF0ZWd5IGltcGxlbWVudHMgVmlydHVhbFNjcm9sbFN0cmF0ZWd5IHtcbiAgcHJpdmF0ZSB2aWV3cG9ydDogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuXG4gIHByaXZhdGUgcm93SGVpZ2h0ITogbnVtYmVyO1xuICBwcml2YXRlIGhlYWRlckhlaWdodCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBmb290ZXJIZWlnaHQhOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kZXhDaGFuZ2UgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gIHB1YmxpYyBzY3JvbGxlZEluZGV4Q2hhbmdlOiBPYnNlcnZhYmxlPG51bWJlcj4gPSB0aGlzLmluZGV4Q2hhbmdlLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIHB1YmxpYyByZWFkb25seSBzdGlja3lDaGFuZ2UgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gIHByaXZhdGUgYnVmZmVyTXVsdGlwbGllcjogbnVtYmVyID0gMTtcblxuICBnZXQgZGF0YUxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRhTGVuZ3RoO1xuICB9XG5cbiAgc2V0IGRhdGFMZW5ndGgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2RhdGFMZW5ndGggPSB2YWx1ZTtcbiAgICB0aGlzLm9uRGF0YUxlbmd0aENoYW5nZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RhdGFMZW5ndGggPSAwO1xuXG4gIHB1YmxpYyBhdHRhY2godmlld3BvcnQ6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCk6IHZvaWQge1xuICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICB0aGlzLm9uRGF0YUxlbmd0aENoYW5nZWQoKTtcbiAgICB0aGlzLnVwZGF0ZUNvbnRlbnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBkZXRhY2goKTogdm9pZCB7XG4gICAgLy9uby1vcFxuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5pbmRleENoYW5nZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuc3RpY2t5Q2hhbmdlLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgb25Db250ZW50UmVuZGVyZWQoKTogdm9pZCB7XG4gICAgLy8gbm8tb3BcbiAgfVxuXG4gIHB1YmxpYyBvblJlbmRlcmVkT2Zmc2V0Q2hhbmdlZCgpOiB2b2lkIHtcbiAgICAvLyBuby1vcFxuICB9XG5cbiAgcHVibGljIHNjcm9sbFRvSW5kZXgoaW5kZXg6IG51bWJlciwgYmVoYXZpb3I/OiBTY3JvbGxCZWhhdmlvcik6IHZvaWQge1xuICAgIC8vIG5vLW9wXG4gIH1cblxuICBwdWJsaWMgb25Db250ZW50U2Nyb2xsZWQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDb250ZW50KCk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29uZmlnKHJvd0hlaWdodDogbnVtYmVyLCBoZWFkZXJIZWlnaHQ6IG51bWJlciwgZm9vdGVySGVpZ2h0OiBudW1iZXIpIHtcblxuICAgIGlmIChcbiAgICAgIHRoaXMucm93SGVpZ2h0ID09PSByb3dIZWlnaHRcbiAgICAgICYmIHRoaXMuaGVhZGVySGVpZ2h0ID09PSBoZWFkZXJIZWlnaHRcbiAgICAgICYmIHRoaXMuZm9vdGVySGVpZ2h0ID09PSBmb290ZXJIZWlnaHRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yb3dIZWlnaHQgPSByb3dIZWlnaHQ7XG4gICAgdGhpcy5oZWFkZXJIZWlnaHQgPSBoZWFkZXJIZWlnaHQ7XG4gICAgdGhpcy5mb290ZXJIZWlnaHQgPSBmb290ZXJIZWlnaHQ7XG4gICAgLy9pZiBjaGFuZ2UgaGVpZ2h0cywgdGhlbiB1cGRhdGUgY29udGVudCBzaXplXG4gICAgdGhpcy5vbkRhdGFMZW5ndGhDaGFuZ2VkKCk7XG4gIH1cblxuICBwdWJsaWMgb25EYXRhTGVuZ3RoQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3cG9ydCkge1xuICAgICAgdGhpcy52aWV3cG9ydC5zZXRUb3RhbENvbnRlbnRTaXplKHRoaXMuZGF0YUxlbmd0aCAqIHRoaXMucm93SGVpZ2h0ICsgdGhpcy5oZWFkZXJIZWlnaHQgKyB0aGlzLmZvb3RlckhlaWdodCk7XG4gICAgICB0aGlzLnZpZXdwb3J0LnNjcm9sbFRvT2Zmc2V0KDApOy8vc2V0IHNjcm9sbCB1cFxuICAgICAgdGhpcy51cGRhdGVDb250ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb250ZW50KCkge1xuICAgIGlmICghdGhpcy52aWV3cG9ydCB8fCAhdGhpcy5yb3dIZWlnaHQgfHwgdGhpcy5kYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjcm9sbE9mZnNldCA9IHRoaXMudmlld3BvcnQubWVhc3VyZVNjcm9sbE9mZnNldCgpO1xuICAgIGNvbnN0IGl0ZW1zRGlzcGxheWVkID0gTWF0aC5jZWlsKHRoaXMudmlld3BvcnQuZ2V0Vmlld3BvcnRTaXplKCkgLyB0aGlzLnJvd0hlaWdodCk7XG4gICAgY29uc3QgcmVuZGVyZWRPZmZzZXQgPSB0aGlzLnZpZXdwb3J0LmdldE9mZnNldFRvUmVuZGVyZWRDb250ZW50U3RhcnQoKTtcbiAgICBjb25zdCBzdGFydCA9IHJlbmRlcmVkT2Zmc2V0IC8gdGhpcy5yb3dIZWlnaHQ7XG4gICAgY29uc3QgYnVmZmVySXRlbXMgPSBNYXRoLmNlaWwoaXRlbXNEaXNwbGF5ZWQgKiB0aGlzLmJ1ZmZlck11bHRpcGxpZXIpO1xuICAgIGNvbnN0IGJ1ZmZlck9mZnNldCA9IHJlbmRlcmVkT2Zmc2V0ICsgYnVmZmVySXRlbXMgKiB0aGlzLnJvd0hlaWdodDtcblxuICAgIGNvbnN0IHJlbGF0aXZlU2Nyb2xsT2Zmc2V0ID0gc2Nyb2xsT2Zmc2V0IC0gYnVmZmVyT2Zmc2V0Oy8vIEhvdyBmYXIgdGhlIHNjcm9sbCBvZmZzZXQgaXMgZnJvbSB0aGUgbG93ZXIgYnVmZmVyLCB3aGljaCBpcyB1c3VhbGx5IHdoZXJlIGl0ZW1zIHN0YXJ0IGJlaW5nIGRpc3BsYXllZFxuICAgIGNvbnN0IHJvd3NTY3JvbGxlZCA9IHJlbGF0aXZlU2Nyb2xsT2Zmc2V0IC8gdGhpcy5yb3dIZWlnaHQ7XG5cbiAgICBjb25zdCBkaXNwbGF5ZWQgPSBzY3JvbGxPZmZzZXQgLyB0aGlzLnJvd0hlaWdodDtcbiAgICB0aGlzLmluZGV4Q2hhbmdlLm5leHQoZGlzcGxheWVkKTtcblxuICAgIGNvbnN0IHJvd3NUb01vdmUgPSBNYXRoLnNpZ24ocm93c1Njcm9sbGVkKSAqIE1hdGguZmxvb3IoTWF0aC5hYnMocm93c1Njcm9sbGVkKSk7XG5cbiAgICBjb25zdCBhZGp1c3RlZFJlbmRlcmVkT2Zmc2V0ID0gTWF0aC5tYXgoMCwgcmVuZGVyZWRPZmZzZXQgKyByb3dzVG9Nb3ZlICogdGhpcy5yb3dIZWlnaHQpO1xuICAgIHRoaXMudmlld3BvcnQuc2V0UmVuZGVyZWRDb250ZW50T2Zmc2V0KGFkanVzdGVkUmVuZGVyZWRPZmZzZXQpO1xuXG4gICAgY29uc3QgYWRqdXN0ZWRTdGFydCA9IE1hdGgubWF4KDAsIHN0YXJ0ICsgcm93c1RvTW92ZSk7XG4gICAgY29uc3QgYWRqdXN0ZWRFbmQgPSBhZGp1c3RlZFN0YXJ0ICsgaXRlbXNEaXNwbGF5ZWQgKyBidWZmZXJJdGVtcztcbiAgICB0aGlzLnZpZXdwb3J0LnNldFJlbmRlcmVkUmFuZ2UoeyBzdGFydDogYWRqdXN0ZWRTdGFydCwgZW5kOiBhZGp1c3RlZEVuZCB9KTtcbiAgICB0aGlzLnN0aWNreUNoYW5nZS5uZXh0KGFkanVzdGVkUmVuZGVyZWRPZmZzZXQpO1xuICB9XG59Il19