ng-cdk-table-virtual-scroll
Version:
Virtual scroll for for Angular Cdk Table
168 lines • 22.7 kB
JavaScript
var TableItemSizeDirective_1;
import { __decorate } from "tslib";
import { AfterContentInit, ContentChild, Directive, forwardRef, Input, NgZone, OnChanges, OnDestroy, } from '@angular/core';
import { distinctUntilChanged, filter, map, switchMap, takeUntil, takeWhile, tap, } from 'rxjs/operators';
import { Subject } from 'rxjs';
import { VIRTUAL_SCROLL_STRATEGY } from '@angular/cdk/scrolling';
import { CdkTable } from '@angular/cdk/table';
import { TableVirtualScrollDataSource } from './table-data-source';
import { FixedSizeTableVirtualScrollStrategy } from './fixed-size-table-virtual-scroll-strategy';
export function _tableVirtualScrollDirectiveStrategyFactory(tableDir) {
return tableDir.scrollStrategy;
}
const stickyHeaderSelector = '.cdk-header-row .cdk-table-sticky';
const stickyFooterSelector = '.cdk-footer-row .cdk-table-sticky';
const defaults = {
rowHeight: 48,
headerHeight: 56,
headerEnabled: true,
footerHeight: 48,
footerEnabled: false,
bufferMultiplier: 0.7,
};
let TableItemSizeDirective = TableItemSizeDirective_1 = class TableItemSizeDirective {
constructor(zone) {
this.zone = zone;
this.alive = true;
// tslint:disable-next-line:no-input-rename
this.rowHeight = defaults.rowHeight;
this.headerEnabled = defaults.headerEnabled;
this.headerHeight = defaults.headerHeight;
this.footerEnabled = defaults.footerEnabled;
this.footerHeight = defaults.footerHeight;
this.bufferMultiplier = defaults.bufferMultiplier;
this.scrollStrategy = new FixedSizeTableVirtualScrollStrategy();
this.dataSourceChanges = new Subject();
}
ngOnDestroy() {
this.alive = false;
this.dataSourceChanges.complete();
}
isAlive() {
return () => this.alive;
}
isStickyEnabled() {
return (!!this.scrollStrategy.viewport &&
this.table['_headerRowDefs']
.map((def) => def.sticky)
.reduce((prevState, state) => prevState && state, true));
}
ngAfterContentInit() {
const switchDataSourceOrigin = this.table['_switchDataSource'];
this.table['_switchDataSource'] = (dataSource) => {
switchDataSourceOrigin.call(this.table, dataSource);
this.connectDataSource(dataSource);
};
this.connectDataSource(this.table.dataSource);
this.scrollStrategy.stickyChange
.pipe(filter(() => this.isStickyEnabled()), tap(() => {
if (!this.stickyPositions) {
this.initStickyPositions();
}
}), takeWhile(this.isAlive()))
.subscribe((stickyOffset) => {
this.setSticky(stickyOffset);
});
}
connectDataSource(dataSource) {
this.dataSourceChanges.next();
if (dataSource instanceof TableVirtualScrollDataSource) {
dataSource.dataToRender$
.pipe(distinctUntilChanged(), takeUntil(this.dataSourceChanges), takeWhile(this.isAlive()), tap((data) => (this.scrollStrategy.dataLength = data.length)), switchMap((data) => this.scrollStrategy.renderedRangeStream.pipe(map(({ start, end }) => typeof start !== 'number' || typeof end !== 'number'
? data
: data.slice(start, end)))))
.subscribe((data) => {
this.zone.run(() => {
dataSource.dataOfRange$.next(data);
});
});
}
else {
throw new Error('[tvsItemSize] requires TableVirtualScrollDataSource be set as [dataSource] of [cdk-table]');
}
}
ngOnChanges() {
const config = {
rowHeight: +this.rowHeight || defaults.rowHeight,
headerHeight: this.headerEnabled
? +this.headerHeight || defaults.headerHeight
: 0,
footerHeight: this.footerEnabled
? +this.footerHeight || defaults.footerHeight
: 0,
bufferMultiplier: +this.bufferMultiplier || defaults.bufferMultiplier,
};
this.scrollStrategy.setConfig(config);
}
setSticky(offset) {
this.scrollStrategy.viewport.elementRef.nativeElement
.querySelectorAll(stickyHeaderSelector)
.forEach((el) => {
const parent = el.parentElement;
let baseOffset = 0;
if (this.stickyPositions.has(parent)) {
baseOffset = this.stickyPositions.get(parent);
}
el.style.top = `${baseOffset - offset}px`;
});
this.scrollStrategy.viewport.elementRef.nativeElement
.querySelectorAll(stickyFooterSelector)
.forEach((el) => {
const parent = el.parentElement;
let baseOffset = 0;
if (this.stickyPositions.has(parent)) {
baseOffset = this.stickyPositions.get(parent);
}
el.style.bottom = `${-baseOffset + offset}px`;
});
}
initStickyPositions() {
this.stickyPositions = new Map();
this.scrollStrategy.viewport.elementRef.nativeElement
.querySelectorAll(stickyHeaderSelector)
.forEach((el) => {
const parent = el.parentElement;
if (!this.stickyPositions.has(parent)) {
this.stickyPositions.set(parent, parent.offsetTop);
}
});
}
};
TableItemSizeDirective.ctorParameters = () => [
{ type: NgZone }
];
__decorate([
Input('tvsItemSize')
], TableItemSizeDirective.prototype, "rowHeight", void 0);
__decorate([
Input()
], TableItemSizeDirective.prototype, "headerEnabled", void 0);
__decorate([
Input()
], TableItemSizeDirective.prototype, "headerHeight", void 0);
__decorate([
Input()
], TableItemSizeDirective.prototype, "footerEnabled", void 0);
__decorate([
Input()
], TableItemSizeDirective.prototype, "footerHeight", void 0);
__decorate([
Input()
], TableItemSizeDirective.prototype, "bufferMultiplier", void 0);
__decorate([
ContentChild(CdkTable, { static: false })
], TableItemSizeDirective.prototype, "table", void 0);
TableItemSizeDirective = TableItemSizeDirective_1 = __decorate([
Directive({
selector: 'cdk-virtual-scroll-viewport[tvsItemSize]',
providers: [
{
provide: VIRTUAL_SCROLL_STRATEGY,
useFactory: _tableVirtualScrollDirectiveStrategyFactory,
deps: [forwardRef(() => TableItemSizeDirective_1)],
},
],
})
], TableItemSizeDirective);
export { TableItemSizeDirective };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtaXRlbS1zaXplLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWNkay10YWJsZS12aXJ0dWFsLXNjcm9sbC8iLCJzb3VyY2VzIjpbImxpYi90YWJsZS1pdGVtLXNpemUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sR0FBRyxFQUNILFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakUsT0FBTyxFQUFtQixRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUvRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVqRyxNQUFNLFVBQVUsMkNBQTJDLENBQ3pELFFBQWdDO0lBRWhDLE9BQU8sUUFBUSxDQUFDLGNBQWMsQ0FBQztBQUNqQyxDQUFDO0FBRUQsTUFBTSxvQkFBb0IsR0FBRyxtQ0FBbUMsQ0FBQztBQUNqRSxNQUFNLG9CQUFvQixHQUFHLG1DQUFtQyxDQUFDO0FBRWpFLE1BQU0sUUFBUSxHQUFHO0lBQ2YsU0FBUyxFQUFFLEVBQUU7SUFDYixZQUFZLEVBQUUsRUFBRTtJQUNoQixhQUFhLEVBQUUsSUFBSTtJQUNuQixZQUFZLEVBQUUsRUFBRTtJQUNoQixhQUFhLEVBQUUsS0FBSztJQUNwQixnQkFBZ0IsRUFBRSxH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QUUsQ0FBQyx3QkFBc0IsQ0FBQyxDQUFDO2FBQ2pEO1NBQ0Y7S0FDRixDQUFDO0dBQ1csc0JBQXNCLENBMkpsQztTQTNKWSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyQ29udGVudEluaXQsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIERpcmVjdGl2ZSxcclxuICBmb3J3YXJkUmVmLFxyXG4gIElucHV0LFxyXG4gIE5nWm9uZSxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxyXG4gIGZpbHRlcixcclxuICBtYXAsXHJcbiAgc3dpdGNoTWFwLFxyXG4gIHRha2VVbnRpbCxcclxuICB0YWtlV2hpbGUsXHJcbiAgdGFwLFxyXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBWSVJUVUFMX1NDUk9MTF9TVFJBVEVHWSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xyXG5pbXBvcnQgeyBDZGtIZWFkZXJSb3dEZWYsIENka1RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RhYmxlJztcclxuXHJcbmltcG9ydCB7IFRhYmxlVmlydHVhbFNjcm9sbERhdGFTb3VyY2UgfSBmcm9tICcuL3RhYmxlLWRhdGEtc291cmNlJztcclxuaW1wb3J0IHsgRml4ZWRTaXplVGFibGVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICcuL2ZpeGVkLXNpemUtdGFibGUtdmlydHVhbC1zY3JvbGwtc3RyYXRlZ3knO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF90YWJsZVZpcnR1YWxTY3JvbGxEaXJlY3RpdmVTdHJhdGVneUZhY3RvcnkoXHJcbiAgdGFibGVEaXI6IFRhYmxlSXRlbVNpemVEaXJlY3RpdmVcclxuKSB7XHJcbiAgcmV0dXJuIHRhYmxlRGlyLnNjcm9sbFN0cmF0ZWd5O1xyXG59XHJcblxyXG5jb25zdCBzdGlja3lIZWFkZXJTZWxlY3RvciA9ICcuY2RrLWhlYWRlci1yb3cgLmNkay10YWJsZS1zdGlja3knO1xyXG5jb25zdCBzdGlja3lGb290ZXJTZWxlY3RvciA9ICcuY2RrLWZvb3Rlci1yb3cgLmNkay10YWJsZS1zdGlja3knO1xyXG5cclxuY29uc3QgZGVmYXVsdHMgPSB7XHJcbiAgcm93SGVpZ2h0OiA0OCxcclxuICBoZWFkZXJIZWlnaHQ6IDU2LFxyXG4gIGhlYWRlckVuYWJsZWQ6IHRydWUsXHJcbiAgZm9vdGVySGVpZ2h0OiA0OCxcclxuICBmb290ZXJFbmFibGVkOiBmYWxzZSxcclxuICBidWZmZXJNdWx0aXBsaWVyOiAwLjcsXHJcbn07XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFt0dnNJdGVtU2l6ZV0nLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBWSVJUVUFMX1NDUk9MTF9TVFJBVEVHWSxcclxuICAgICAgdXNlRmFjdG9yeTogX3RhYmxlVmlydHVhbFNjcm9sbERpcmVjdGl2ZVN0cmF0ZWd5RmFjdG9yeSxcclxuICAgICAgZGVwczogW2ZvcndhcmRSZWYoKCkgPT4gVGFibGVJdGVtU2l6ZURpcmVjdGl2ZSldLFxyXG4gICAgfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGFibGVJdGVtU2l6ZURpcmVjdGl2ZVxyXG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgYWxpdmUgPSB0cnVlO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8taW5wdXQtcmVuYW1lXHJcbiAgQElucHV0KCd0dnNJdGVtU2l6ZScpXHJcbiAgcm93SGVpZ2h0ID0gZGVmYXVsdHMucm93SGVpZ2h0O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGhlYWRlckVuYWJsZWQgPSBkZWZhdWx0cy5oZWFkZXJFbmFibGVkO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGhlYWRlckhlaWdodCA9IGRlZmF1bHRzLmhlYWRlckhlaWdodDtcclxuXHJcbiAgQElucHV0KClcclxuICBmb290ZXJFbmFibGVkID0gZGVmYXVsdHMuZm9vdGVyRW5hYmxlZDtcclxuXHJcbiAgQElucHV0KClcclxuICBmb290ZXJIZWlnaHQgPSBkZWZhdWx0cy5mb290ZXJIZWlnaHQ7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgYnVmZmVyTXVsdGlwbGllciA9IGRlZmF1bHRzLmJ1ZmZlck11bHRpcGxpZXI7XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoQ2RrVGFibGUsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIHRhYmxlOiBDZGtUYWJsZTxhbnk+O1xyXG5cclxuICBzY3JvbGxTdHJhdGVneSA9IG5ldyBGaXhlZFNpemVUYWJsZVZpcnR1YWxTY3JvbGxTdHJhdGVneSgpO1xyXG5cclxuICBkYXRhU291cmNlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIHByaXZhdGUgc3RpY2t5UG9zaXRpb25zOiBNYXA8SFRNTEVsZW1lbnQsIG51bWJlcj47XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgem9uZTogTmdab25lKSB7fVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuYWxpdmUgPSBmYWxzZTtcclxuICAgIHRoaXMuZGF0YVNvdXJjZUNoYW5nZXMuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNBbGl2ZSgpIHtcclxuICAgIHJldHVybiAoKSA9PiB0aGlzLmFsaXZlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1N0aWNreUVuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAhIXRoaXMuc2Nyb2xsU3RyYXRlZ3kudmlld3BvcnQgJiZcclxuICAgICAgKHRoaXMudGFibGVbJ19oZWFkZXJSb3dEZWZzJ10gYXMgQ2RrSGVhZGVyUm93RGVmW10pXHJcbiAgICAgICAgLm1hcCgoZGVmKSA9PiBkZWYuc3RpY2t5KVxyXG4gICAgICAgIC5yZWR1Y2UoKHByZXZTdGF0ZSwgc3RhdGUpID0+IHByZXZTdGF0ZSAmJiBzdGF0ZSwgdHJ1ZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICBjb25zdCBzd2l0Y2hEYXRhU291cmNlT3JpZ2luID0gdGhpcy50YWJsZVsnX3N3aXRjaERhdGFTb3VyY2UnXTtcclxuICAgIHRoaXMudGFibGVbJ19zd2l0Y2hEYXRhU291cmNlJ10gPSAoZGF0YVNvdXJjZTogYW55KSA9PiB7XHJcbiAgICAgIHN3aXRjaERhdGFTb3VyY2VPcmlnaW4uY2FsbCh0aGlzLnRhYmxlLCBkYXRhU291cmNlKTtcclxuICAgICAgdGhpcy5jb25uZWN0RGF0YVNvdXJjZShkYXRhU291cmNlKTtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5jb25uZWN0RGF0YVNvdXJjZSh0aGlzLnRhYmxlLmRhdGFTb3VyY2UpO1xyXG5cclxuICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ3kuc3RpY2t5Q2hhbmdlXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmlzU3RpY2t5RW5hYmxlZCgpKSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLnN0aWNreVBvc2l0aW9ucykge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRTdGlja3lQb3NpdGlvbnMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICB0YWtlV2hpbGUodGhpcy5pc0FsaXZlKCkpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoc3RpY2t5T2Zmc2V0KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGlja3koc3RpY2t5T2Zmc2V0KTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25uZWN0RGF0YVNvdXJjZShkYXRhU291cmNlOiBhbnkpIHtcclxuICAgIHRoaXMuZGF0YVNvdXJjZUNoYW5nZXMubmV4dCgpO1xyXG4gICAgaWYgKGRhdGFTb3VyY2UgaW5zdGFuY2VvZiBUYWJsZVZpcnR1YWxTY3JvbGxEYXRhU291cmNlKSB7XHJcbiAgICAgIGRhdGFTb3VyY2UuZGF0YVRvUmVuZGVyJFxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRhdGFTb3VyY2VDaGFuZ2VzKSxcclxuICAgICAgICAgIHRha2VXaGlsZSh0aGlzLmlzQWxpdmUoKSksXHJcbiAgICAgICAgICB0YXAoKGRhdGEpID0+ICh0aGlzLnNjcm9sbFN0cmF0ZWd5LmRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCkpLFxyXG4gICAgICAgICAgc3dpdGNoTWFwKChkYXRhKSA9PlxyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5LnJlbmRlcmVkUmFuZ2VTdHJlYW0ucGlwZShcclxuICAgICAgICAgICAgICBtYXAoKHsgc3RhcnQsIGVuZCB9KSA9PlxyXG4gICAgICAgICAgICAgICAgdHlwZW9mIHN0YXJ0ICE9PSAnbnVtYmVyJyB8fCB0eXBlb2YgZW5kICE9PSAnbnVtYmVyJ1xyXG4gICAgICAgICAgICAgICAgICA/IGRhdGFcclxuICAgICAgICAgICAgICAgICAgOiBkYXRhLnNsaWNlKHN0YXJ0LCBlbmQpXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBkYXRhU291cmNlLmRhdGFPZlJhbmdlJC5uZXh0KGRhdGEpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1t0dnNJdGVtU2l6ZV0gcmVxdWlyZXMgVGFibGVWaXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZSBiZSBzZXQgYXMgW2RhdGFTb3VyY2VdIG9mIFtjZGstdGFibGVdJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoKSB7XHJcbiAgICBjb25zdCBjb25maWcgPSB7XHJcbiAgICAgIHJvd0hlaWdodDogK3RoaXMucm93SGVpZ2h0IHx8IGRlZmF1bHRzLnJvd0hlaWdodCxcclxuICAgICAgaGVhZGVySGVpZ2h0OiB0aGlzLmhlYWRlckVuYWJsZWRcclxuICAgICAgICA/ICt0aGlzLmhlYWRlckhlaWdodCB8fCBkZWZhdWx0cy5oZWFkZXJIZWlnaHRcclxuICAgICAgICA6IDAsXHJcbiAgICAgIGZvb3RlckhlaWdodDogdGhpcy5mb290ZXJFbmFibGVkXHJcbiAgICAgICAgPyArdGhpcy5mb290ZXJIZWlnaHQgfHwgZGVmYXVsdHMuZm9vdGVySGVpZ2h0XHJcbiAgICAgICAgOiAwLFxyXG4gICAgICBidWZmZXJNdWx0aXBsaWVyOiArdGhpcy5idWZmZXJNdWx0aXBsaWVyIHx8IGRlZmF1bHRzLmJ1ZmZlck11bHRpcGxpZXIsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5zY3JvbGxTdHJhdGVneS5zZXRDb25maWcoY29uZmlnKTtcclxuICB9XHJcblxyXG4gIHNldFN0aWNreShvZmZzZXQpIHtcclxuICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ3kudmlld3BvcnQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50XHJcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKHN0aWNreUhlYWRlclNlbGVjdG9yKVxyXG4gICAgICAuZm9yRWFjaCgoZWw6IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWwucGFyZW50RWxlbWVudDtcclxuICAgICAgICBsZXQgYmFzZU9mZnNldCA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RpY2t5UG9zaXRpb25zLmhhcyhwYXJlbnQpKSB7XHJcbiAgICAgICAgICBiYXNlT2Zmc2V0ID0gdGhpcy5zdGlja3lQb3NpdGlvbnMuZ2V0KHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsLnN0eWxlLnRvcCA9IGAke2Jhc2VPZmZzZXQgLSBvZmZzZXR9cHhgO1xyXG4gICAgICB9KTtcclxuICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ3kudmlld3BvcnQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50XHJcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKHN0aWNreUZvb3RlclNlbGVjdG9yKVxyXG4gICAgICAuZm9yRWFjaCgoZWw6IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWwucGFyZW50RWxlbWVudDtcclxuICAgICAgICBsZXQgYmFzZU9mZnNldCA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RpY2t5UG9zaXRpb25zLmhhcyhwYXJlbnQpKSB7XHJcbiAgICAgICAgICBiYXNlT2Zmc2V0ID0gdGhpcy5zdGlja3lQb3NpdGlvbnMuZ2V0KHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsLnN0eWxlLmJvdHRvbSA9IGAkey1iYXNlT2Zmc2V0ICsgb2Zmc2V0fXB4YDtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRTdGlja3lQb3NpdGlvbnMoKSB7XHJcbiAgICB0aGlzLnN0aWNreVBvc2l0aW9ucyA9IG5ldyBNYXA8SFRNTEVsZW1lbnQsIG51bWJlcj4oKTtcclxuICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ3kudmlld3BvcnQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50XHJcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKHN0aWNreUhlYWRlclNlbGVjdG9yKVxyXG4gICAgICAuZm9yRWFjaCgoZWwpID0+IHtcclxuICAgICAgICBjb25zdCBwYXJlbnQgPSBlbC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIGlmICghdGhpcy5zdGlja3lQb3NpdGlvbnMuaGFzKHBhcmVudCkpIHtcclxuICAgICAgICAgIHRoaXMuc3RpY2t5UG9zaXRpb25zLnNldChwYXJlbnQsIHBhcmVudC5vZmZzZXRUb3ApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==