UNPKG

ontimize-web-ngx

Version:
105 lines 15.3 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.lastRenderedRange = { start: 0, end: 0 }; this.savedScrollPosition = 0; this._dataLength = 0; } get dataLength() { return this._dataLength; } set dataLength(value) { this._dataLength = value; if (this.savedScrollPosition === 0) { this.onDataLengthChanged(); } this.savedScrollPosition = 0; } 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(); } setSavedScrollPosition(value) { this.savedScrollPosition = value; } getSavedScrollPosition() { return this.savedScrollPosition; } 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); if (this.savedScrollPosition === 0) { this.viewport.scrollToOffset(0); } this.savedScrollPosition = 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; if (this.lastRenderedRange.start === adjustedStart && this.lastRenderedRange.end === adjustedEnd) { return; } this.lastRenderedRange = { start: adjustedStart, end: adjustedEnd }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS1zdHJhdGVneS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvZXh0ZW5zaW9ucy9vLXRhYmxlLXN0cmF0ZWd5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUd0RCxNQUFNLE9BQU8sMkJBQTJCO0lBRHhDO1FBT21CLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUM5Qyx3QkFBbUIsR0FBdUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUNwQyxxQkFBZ0IsR0FBVyxDQUFDLENBQUM7UUFDdEMsc0JBQWlCLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUV6Qyx3QkFBbUIsR0FBRyxDQUFDLENBQUM7UUFjeEIsZ0JBQVcsR0FBRyxDQUFDLENBQUM7S0EyR3pCO0lBdkhDLElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsS0FBYTtRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxDQUFDLEVBQUU7WUFDbEMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDNUI7UUFDRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FB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QTNCLDJCQUEyQjtrQkFEdkMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgVmlydHVhbFNjcm9sbFN0cmF0ZWd5IH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9zY3JvbGxpbmdcIjtcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT1RhYmxlVmlydHVhbFNjcm9sbFN0cmF0ZWd5IGltcGxlbWVudHMgVmlydHVhbFNjcm9sbFN0cmF0ZWd5IHtcbiAgcHJpdmF0ZSB2aWV3cG9ydDogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuXG4gIHByaXZhdGUgcm93SGVpZ2h0ITogbnVtYmVyO1xuICBwcml2YXRlIGhlYWRlckhlaWdodCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBmb290ZXJIZWlnaHQhOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kZXhDaGFuZ2UgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gIHB1YmxpYyBzY3JvbGxlZEluZGV4Q2hhbmdlOiBPYnNlcnZhYmxlPG51bWJlcj4gPSB0aGlzLmluZGV4Q2hhbmdlLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIHB1YmxpYyByZWFkb25seSBzdGlja3lDaGFuZ2UgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnVmZmVyTXVsdGlwbGllcjogbnVtYmVyID0gMTtcbiAgcHJpdmF0ZSBsYXN0UmVuZGVyZWRSYW5nZSA9IHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAvLyBUbyBzYXZlIHNjcm9sbCBwb3NpdGlvbiB3aGVuIHJlbG9hZGluZyBkYXRhXG4gIHByaXZhdGUgc2F2ZWRTY3JvbGxQb3NpdGlvbiA9IDA7XG5cbiAgZ2V0IGRhdGFMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YUxlbmd0aDtcbiAgfVxuXG4gIHNldCBkYXRhTGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9kYXRhTGVuZ3RoID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuc2F2ZWRTY3JvbGxQb3NpdGlvbiA9PT0gMCkge1xuICAgICAgdGhpcy5vbkRhdGFMZW5ndGhDaGFuZ2VkKCk7XG4gICAgfVxuICAgIHRoaXMuc2F2ZWRTY3JvbGxQb3NpdGlvbiA9IDA7XG4gIH1cblxuICBwcml2YXRlIF9kYXRhTGVuZ3RoID0gMDtcblxuICBwdWJsaWMgYXR0YWNoKHZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgdGhpcy5vbkRhdGFMZW5ndGhDaGFuZ2VkKCk7XG4gICAgdGhpcy51cGRhdGVDb250ZW50KCk7XG4gIH1cblxuICBwdWJsaWMgZGV0YWNoKCk6IHZvaWQge1xuICAgIC8vbm8tb3BcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuaW5kZXhDaGFuZ2UuY29tcGxldGUoKTtcbiAgICB0aGlzLnN0aWNreUNoYW5nZS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIG9uQ29udGVudFJlbmRlcmVkKCk6IHZvaWQge1xuICAgIC8vIG5vLW9wXG4gIH1cblxuICBwdWJsaWMgb25SZW5kZXJlZE9mZnNldENoYW5nZWQoKTogdm9pZCB7XG4gICAgLy8gbm8tb3BcbiAgfVxuXG4gIHB1YmxpYyBzY3JvbGxUb0luZGV4KGluZGV4OiBudW1iZXIsIGJlaGF2aW9yPzogU2Nyb2xsQmVoYXZpb3IpOiB2b2lkIHtcbiAgICAvLyBuby1vcFxuICB9XG5cbiAgcHVibGljIG9uQ29udGVudFNjcm9sbGVkKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlQ29udGVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNhdmVkIHNjcm9sbCBwb3NpdGlvbiBmb3IgdGhlIHRhYmxlLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgc2Nyb2xsIHBvc2l0aW9uIHZhbHVlIHRvIGJlIHNhdmVkXG4gICAqL1xuICBwdWJsaWMgc2V0U2F2ZWRTY3JvbGxQb3NpdGlvbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zYXZlZFNjcm9sbFBvc2l0aW9uID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2F2ZWRTY3JvbGxQb3NpdGlvbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNhdmVkU2Nyb2xsUG9zaXRpb247XG4gIH1cblxuICBwdWJsaWMgc2V0Q29uZmlnKHJvd0hlaWdodDogbnVtYmVyLCBoZWFkZXJIZWlnaHQ6IG51bWJlciwgZm9vdGVySGVpZ2h0OiBudW1iZXIpIHtcblxuICAgIGlmIChcbiAgICAgIHRoaXMucm93SGVpZ2h0ID09PSByb3dIZWlnaHRcbiAgICAgICYmIHRoaXMuaGVhZGVySGVpZ2h0ID09PSBoZWFkZXJIZWlnaHRcbiAgICAgICYmIHRoaXMuZm9vdGVySGVpZ2h0ID09PSBmb290ZXJIZWlnaHRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yb3dIZWlnaHQgPSByb3dIZWlnaHQ7XG4gICAgdGhpcy5oZWFkZXJIZWlnaHQgPSBoZWFkZXJIZWlnaHQ7XG4gICAgdGhpcy5mb290ZXJIZWlnaHQgPSBmb290ZXJIZWlnaHQ7XG4gICAgLy9pZiBjaGFuZ2UgaGVpZ2h0cywgdGhlbiB1cGRhdGUgY29udGVudCBzaXplXG4gICAgdGhpcy5vbkRhdGFMZW5ndGhDaGFuZ2VkKCk7XG4gIH1cblxuICBwdWJsaWMgb25EYXRhTGVuZ3RoQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3cG9ydCkge1xuICAgICAgdGhpcy52aWV3cG9ydC5zZXRUb3RhbENvbnRlbnRTaXplKHRoaXMuZGF0YUxlbmd0aCAqIHRoaXMucm93SGVpZ2h0ICsgdGhpcy5oZWFkZXJIZWlnaHQgKyB0aGlzLmZvb3RlckhlaWdodCk7XG4gICAgICBpZiAodGhpcy5zYXZlZFNjcm9sbFBvc2l0aW9uID09PSAwKSB7XG4gICAgICAgIHRoaXMudmlld3BvcnQuc2Nyb2xsVG9PZmZzZXQoMCk7Ly9zZXQgc2Nyb2xsIHVwXG4gICAgICB9XG4gICAgICB0aGlzLnNhdmVkU2Nyb2xsUG9zaXRpb24gPSAwO1xuICAgICAgdGhpcy51cGRhdGVDb250ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb250ZW50KCkge1xuICAgIGlmICghdGhpcy52aWV3cG9ydCB8fCAhdGhpcy5yb3dIZWlnaHQgfHwgdGhpcy5kYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjcm9sbE9mZnNldCA9IHRoaXMudmlld3BvcnQubWVhc3VyZVNjcm9sbE9mZnNldCgpO1xuICAgIGNvbnN0IGl0ZW1zRGlzcGxheWVkID0gTWF0aC5jZWlsKHRoaXMudmlld3BvcnQuZ2V0Vmlld3BvcnRTaXplKCkgLyB0aGlzLnJvd0hlaWdodCk7XG4gICAgY29uc3QgcmVuZGVyZWRPZmZzZXQgPSB0aGlzLnZpZXdwb3J0LmdldE9mZnNldFRvUmVuZGVyZWRDb250ZW50U3RhcnQoKTtcbiAgICBjb25zdCBzdGFydCA9IHJlbmRlcmVkT2Zmc2V0IC8gdGhpcy5yb3dIZWlnaHQ7XG4gICAgY29uc3QgYnVmZmVySXRlbXMgPSBNYXRoLmNlaWwoaXRlbXNEaXNwbGF5ZWQgKiB0aGlzLmJ1ZmZlck11bHRpcGxpZXIpO1xuICAgIGNvbnN0IGJ1ZmZlck9mZnNldCA9IHJlbmRlcmVkT2Zmc2V0ICsgYnVmZmVySXRlbXMgKiB0aGlzLnJvd0hlaWdodDtcblxuICAgIGNvbnN0IHJlbGF0aXZlU2Nyb2xsT2Zmc2V0ID0gc2Nyb2xsT2Zmc2V0IC0gYnVmZmVyT2Zmc2V0Oy8vIEhvdyBmYXIgdGhlIHNjcm9sbCBvZmZzZXQgaXMgZnJvbSB0aGUgbG93ZXIgYnVmZmVyLCB3aGljaCBpcyB1c3VhbGx5IHdoZXJlIGl0ZW1zIHN0YXJ0IGJlaW5nIGRpc3BsYXllZFxuICAgIGNvbnN0IHJvd3NTY3JvbGxlZCA9IHJlbGF0aXZlU2Nyb2xsT2Zmc2V0IC8gdGhpcy5yb3dIZWlnaHQ7XG5cbiAgICBjb25zdCBkaXNwbGF5ZWQgPSBzY3JvbGxPZmZzZXQgLyB0aGlzLnJvd0hlaWdodDtcbiAgICB0aGlzLmluZGV4Q2hhbmdlLm5leHQoZGlzcGxheWVkKTtcblxuICAgIGNvbnN0IHJvd3NUb01vdmUgPSBNYXRoLnNpZ24ocm93c1Njcm9sbGVkKSAqIE1hdGguZmxvb3IoTWF0aC5hYnMocm93c1Njcm9sbGVkKSk7XG4gICAgY29uc3QgYWRqdXN0ZWRSZW5kZXJlZE9mZnNldCA9IE1hdGgubWF4KDAsIHJlbmRlcmVkT2Zmc2V0ICsgcm93c1RvTW92ZSAqIHRoaXMucm93SGVpZ2h0KTtcbiAgICB0aGlzLnZpZXdwb3J0LnNldFJlbmRlcmVkQ29udGVudE9mZnNldChhZGp1c3RlZFJlbmRlcmVkT2Zmc2V0KTtcblxuICAgIGNvbnN0IGFkanVzdGVkU3RhcnQgPSBNYXRoLm1heCgwLCBzdGFydCArIHJvd3NUb01vdmUpO1xuICAgIGNvbnN0IGFkanVzdGVkRW5kID0gYWRqdXN0ZWRTdGFydCArIGl0ZW1zRGlzcGxheWVkICsgYnVmZmVySXRlbXM7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmxhc3RSZW5kZXJlZFJhbmdlLnN0YXJ0ID09PSBhZGp1c3RlZFN0YXJ0ICYmXG4gICAgICB0aGlzLmxhc3RSZW5kZXJlZFJhbmdlLmVuZCA9PT0gYWRqdXN0ZWRFbmRcbiAgICApIHtcbiAgICAgIHJldHVybjsvLyBObyBjaGFuZ2UgaW4gcmVuZGVyZWQgcmFuZ2VcbiAgICB9XG4gICAgdGhpcy5sYXN0UmVuZGVyZWRSYW5nZSA9IHsgc3RhcnQ6IGFkanVzdGVkU3RhcnQsIGVuZDogYWRqdXN0ZWRFbmQgfTtcblxuICAgIHRoaXMudmlld3BvcnQuc2V0UmVuZGVyZWRSYW5nZSh7IHN0YXJ0OiBhZGp1c3RlZFN0YXJ0LCBlbmQ6IGFkanVzdGVkRW5kIH0pO1xuICAgIHRoaXMuc3RpY2t5Q2hhbmdlLm5leHQoYWRqdXN0ZWRSZW5kZXJlZE9mZnNldCk7XG4gIH1cbn0iXX0=