UNPKG

ngx-mat-multi-sort-fork

Version:

An extension for the angular material table to support multi-sorting.

135 lines 30.4 kB
import { Component, ContentChild, Input, ViewChild } from '@angular/core'; import { moveItemInArray } from '@angular/cdk/drag-drop'; import { BlockScrollStrategy } from '@angular/cdk/overlay'; import { TemplatePortal } from '@angular/cdk/portal'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/overlay"; import * as i2 from "@angular/common"; import * as i3 from "@angular/cdk/drag-drop"; import * as i4 from "@angular/material/icon"; import * as i5 from "@angular/material/checkbox"; import * as i6 from "@angular/forms"; import * as i7 from "@angular/material/chips"; import * as i8 from "@angular/material/tooltip"; export class MatMultiSortTableSettingsComponent { set tableData(tableData) { this._tableData = tableData; } constructor(overlay, viewContainerRef, viewportRuler) { this.overlay = overlay; this.viewContainerRef = viewContainerRef; this.viewportRuler = viewportRuler; this.sort = []; this.sortToolTip = ''; this.closeDialogOnChoice = true; this.scrollStrategy = new BlockScrollStrategy(this.viewportRuler, document); } ngOnInit() { this.sort = this.getSort(); this._tableData.sortObservable.subscribe(() => this.sort = this.getSort()); this._tableData.onColumnsChange().subscribe(() => this.sort = this.getSort()); } openDialog() { const button = this.buttonRef.nativeElement; const positionStrategyBuilder = this.overlay.position(); const positionStrategy = positionStrategyBuilder .flexibleConnectedTo(button) .withFlexibleDimensions(true) .withViewportMargin(10) .withGrowAfterOpen(true) .withPush(true) .withPositions([{ originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top' }]); this.overlayRef = this.overlay.create({ hasBackdrop: true, backdropClass: 'cdk-overlay-transparent-backdrop', panelClass: 'column-overlay', positionStrategy, scrollStrategy: this.scrollStrategy }); const templatePortal = new TemplatePortal(this.templateRef, this.viewContainerRef); this.overlayRef.attach(templatePortal); this.overlayRef.backdropClick().subscribe(() => { this.overlayRef.dispose(); }); } drop(event) { moveItemInArray(this._tableData.columns, event.previousIndex, event.currentIndex); this._tableData.displayedColumns = this._tableData.columns.filter(c => c.isActive).map(c => c.id); this._tableData.storeTableSettings(); } toggle() { this._tableData.displayedColumns = this._tableData.columns.filter(c => { if (!c.isActive) { this.sort = this.sort.filter(s => s.id !== c.id); } return c.isActive; }).map(c => c.id); this.updateSort(); if (this.closeDialogOnChoice) { this.overlayRef.dispose(); } } dropSort(event) { moveItemInArray(this.sort, event.previousIndex, event.currentIndex); this.updateSort(); } getSort() { const sorting = []; for (let i = 0; i < this._tableData.sortParams.length; i++) { sorting.push({ id: this._tableData.sortParams[i], name: this._tableData.columns.find(c => c.id === this._tableData.sortParams[i]).name, direction: this._tableData.sortDirs[i] }); } return sorting; } remove(id) { this.sort = this.sort.filter(v => v.id !== id); this.updateSort(); } updateDirection(id) { const i = this.sort.findIndex(v => v.id === id); if (this.sort[i].direction === 'asc') { this.sort[i].direction = 'desc'; } else { this.sort[i].direction = 'asc'; } this.updateSort(); } updateSort() { this._tableData.sortParams = this.sort.map(v => v.id); this._tableData.sortDirs = this.sort.map(v => v.direction); this._tableData.updateSortHeaders(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.5", ngImport: i0, type: MatMultiSortTableSettingsComponent, deps: [{ token: i1.Overlay }, { token: i0.ViewContainerRef }, { token: i1.ViewportRuler }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.5", type: MatMultiSortTableSettingsComponent, selector: "mat-multi-sort-table-settings", inputs: { sortToolTip: "sortToolTip", closeDialogOnChoice: "closeDialogOnChoice", scrollStrategy: "scrollStrategy", tableData: "tableData" }, queries: [{ propertyName: "sortIndicatorRef", first: true, predicate: ["sortIndicator"], descendants: true }], viewQueries: [{ propertyName: "templateRef", first: true, predicate: ["templateRef"], descendants: true, static: true }, { propertyName: "buttonRef", first: true, predicate: ["settingsMenu"], descendants: true }], ngImport: i0, template: "<div class=\"table-settings\">\r\n <div class=\"table-settings-sort\">\r\n <mat-chip-list class=\"drag-chip-list\" cdkDropList cdkDropListOrientation='horizontal'\r\n (cdkDropListDropped)=\"dropSort($event)\">\r\n <mat-chip class=\"drag-chip\" *ngFor=\"let item of sort\" cdkDrag (removed)=\"remove(item.id)\"\r\n (click)=\"updateDirection(item.id)\">\r\n <ng-container *ngIf=\"sortIndicatorRef\"\r\n [ngTemplateOutlet]=\"sortIndicatorRef\"\r\n [ngTemplateOutletContext]=\"{direction:item.direction, columnName: item.name }\">\r\n </ng-container>\r\n <div *ngIf=\"!sortIndicatorRef\">\r\n {{item.name}}:\r\n <div class=\"sorting\" [matTooltip]=\"sortToolTip\">\r\n {{item.direction}}\r\n </div>\r\n </div>\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n </mat-chip-list>\r\n </div>\r\n <div style=\"flex: 1 1 auto;\"></div>\r\n <div #settingsMenu (click)=\"openDialog()\" class=\"table-settings-menu\">\r\n <ng-content #menuRef></ng-content>\r\n </div>\r\n</div>\r\n\r\n<ng-template #templateRef>\r\n <div cdkDropList class=\"column-list\" (cdkDropListDropped)=\"drop($event)\">\r\n <div class=\"column-item\" *ngFor=\"let column of _tableData.columns\" cdkDrag>\r\n <mat-icon>drag_indicator</mat-icon>\r\n <mat-checkbox [(ngModel)]=\"column.isActive\" (change)=\"toggle()\">{{column.name}}</mat-checkbox>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [".table-settings{display:flex}.table-settings .table-settings-menu{margin:8px 16px}.table-settings-sort{margin:auto 0}.sorting{display:inline-block;margin:0 6px;color:#757575}.sorting:hover{cursor:pointer}.drag-chip{border:solid 1px rgba(0,0,0,.12);background-color:#fff}.drag-chip:hover{cursor:move;background-color:#fff}.drag-chip:hover:after{opacity:0}.drag-chip:focus:after{opacity:0}.drag-chip-list.cdk-drop-list-dragging .drag-chip:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.column-list{max-height:70vh;overflow:auto;border-radius:4px;padding:1rem;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f;background-color:#fff;color:#000000de}.column-item{height:48px;display:flex;justify-content:flex-start;align-items:center;margin:1px;padding:0 16px 0 8px}.column-item mat-icon{margin-right:16px}.column-item mat-checkbox{line-height:48px;color:#000000de;font-size:14px;font-weight:400}.column-item:hover{cursor:move;border-top:solid 1px rgba(0,0,0,.12);border-bottom:solid 1px rgba(0,0,0,.12)}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.column-item:last-child{border:none}.column-list.cdk-drop-list-dragging .column-item:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i3.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "role", "id", "aria-label", "aria-description", "value", "removable", "highlighted"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "directive", type: i7.MatChipRemove, selector: "[matChipRemove]" }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.5", ngImport: i0, type: MatMultiSortTableSettingsComponent, decorators: [{ type: Component, args: [{ selector: 'mat-multi-sort-table-settings', template: "<div class=\"table-settings\">\r\n <div class=\"table-settings-sort\">\r\n <mat-chip-list class=\"drag-chip-list\" cdkDropList cdkDropListOrientation='horizontal'\r\n (cdkDropListDropped)=\"dropSort($event)\">\r\n <mat-chip class=\"drag-chip\" *ngFor=\"let item of sort\" cdkDrag (removed)=\"remove(item.id)\"\r\n (click)=\"updateDirection(item.id)\">\r\n <ng-container *ngIf=\"sortIndicatorRef\"\r\n [ngTemplateOutlet]=\"sortIndicatorRef\"\r\n [ngTemplateOutletContext]=\"{direction:item.direction, columnName: item.name }\">\r\n </ng-container>\r\n <div *ngIf=\"!sortIndicatorRef\">\r\n {{item.name}}:\r\n <div class=\"sorting\" [matTooltip]=\"sortToolTip\">\r\n {{item.direction}}\r\n </div>\r\n </div>\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n </mat-chip-list>\r\n </div>\r\n <div style=\"flex: 1 1 auto;\"></div>\r\n <div #settingsMenu (click)=\"openDialog()\" class=\"table-settings-menu\">\r\n <ng-content #menuRef></ng-content>\r\n </div>\r\n</div>\r\n\r\n<ng-template #templateRef>\r\n <div cdkDropList class=\"column-list\" (cdkDropListDropped)=\"drop($event)\">\r\n <div class=\"column-item\" *ngFor=\"let column of _tableData.columns\" cdkDrag>\r\n <mat-icon>drag_indicator</mat-icon>\r\n <mat-checkbox [(ngModel)]=\"column.isActive\" (change)=\"toggle()\">{{column.name}}</mat-checkbox>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [".table-settings{display:flex}.table-settings .table-settings-menu{margin:8px 16px}.table-settings-sort{margin:auto 0}.sorting{display:inline-block;margin:0 6px;color:#757575}.sorting:hover{cursor:pointer}.drag-chip{border:solid 1px rgba(0,0,0,.12);background-color:#fff}.drag-chip:hover{cursor:move;background-color:#fff}.drag-chip:hover:after{opacity:0}.drag-chip:focus:after{opacity:0}.drag-chip-list.cdk-drop-list-dragging .drag-chip:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.column-list{max-height:70vh;overflow:auto;border-radius:4px;padding:1rem;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f;background-color:#fff;color:#000000de}.column-item{height:48px;display:flex;justify-content:flex-start;align-items:center;margin:1px;padding:0 16px 0 8px}.column-item mat-icon{margin-right:16px}.column-item mat-checkbox{line-height:48px;color:#000000de;font-size:14px;font-weight:400}.column-item:hover{cursor:move;border-top:solid 1px rgba(0,0,0,.12);border-bottom:solid 1px rgba(0,0,0,.12)}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.column-item:last-child{border:none}.column-list.cdk-drop-list-dragging .column-item:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"] }] }], ctorParameters: () => [{ type: i1.Overlay }, { type: i0.ViewContainerRef }, { type: i1.ViewportRuler }], propDecorators: { templateRef: [{ type: ViewChild, args: ['templateRef', { static: true }] }], buttonRef: [{ type: ViewChild, args: ['settingsMenu'] }], sortIndicatorRef: [{ type: ContentChild, args: ['sortIndicator', { static: false }] }], sortToolTip: [{ type: Input }], closeDialogOnChoice: [{ type: Input }], scrollStrategy: [{ type: Input }], tableData: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LW11bHRpLXNvcnQtdGFibGUtc2V0dGluZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0LW11bHRpLXNvcnQvc3JjL2xpYi9tYXQtbXVsdGktc29ydC10YWJsZS1zZXR0aW5ncy9tYXQtbXVsdGktc29ydC10YWJsZS1zZXR0aW5ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXQtbXVsdGktc29ydC9zcmMvbGliL21hdC1tdWx0aS1zb3J0LXRhYmxlLXNldHRpbmdzL21hdC1tdWx0aS1zb3J0LXRhYmxlLXNldHRpbmdzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFjLEtBQUssRUFBdUIsU0FBUyxFQUFtQixNQUFNLGVBQWUsQ0FBQztBQUMzSCxPQUFPLEVBQWMsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFcEUsT0FBTyxFQUFDLG1CQUFtQixFQUFxRCxNQUFNLHNCQUFzQixDQUFDO0FBQzdHLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7OztBQVFuRCxNQUFNLE9BQU8sa0NBQWtDO0lBb0I3QyxJQUNJLFNBQVMsQ0FBQyxTQUF5QjtRQUNyQyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztJQUM5QixDQUFDO0lBR0QsWUFBb0IsT0FBZ0IsRUFBVSxnQkFBa0MsRUFBVSxhQUE0QjtRQUFsRyxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQVUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUFVLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBeEJ0SCxTQUFJLEdBQXNELEVBQUUsQ0FBQztRQVU3RCxnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUd6Qix3QkFBbUIsR0FBRyxJQUFJLENBQUM7UUFHM0IsbUJBQWMsR0FBbUIsSUFB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U1csV0FBVztzQkFBOUQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUVmLFNBQVM7c0JBQW5DLFNBQVM7dUJBQUMsY0FBYztnQkFFeUIsZ0JBQWdCO3NCQUFqRSxZQUFZO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBR2hELFdBQVc7c0JBRFYsS0FBSztnQkFJTixtQkFBbUI7c0JBRGxCLEtBQUs7Z0JBSU4sY0FBYztzQkFEYixLQUFLO2dCQUlGLFNBQVM7c0JBRFosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWZ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0Nka0RyYWdEcm9wLCBtb3ZlSXRlbUluQXJyYXl9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBUYWJsZURhdGEgfSBmcm9tICcuLi90YWJsZS1kYXRhJztcclxuaW1wb3J0IHtCbG9ja1Njcm9sbFN0cmF0ZWd5LCBPdmVybGF5LCBPdmVybGF5UmVmLCBTY3JvbGxTdHJhdGVneSwgVmlld3BvcnRSdWxlcn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQge1RlbXBsYXRlUG9ydGFsfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ21hdC1tdWx0aS1zb3J0LXRhYmxlLXNldHRpbmdzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbWF0LW11bHRpLXNvcnQtdGFibGUtc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL21hdC1tdWx0aS1zb3J0LXRhYmxlLXNldHRpbmdzLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE1hdE11bHRpU29ydFRhYmxlU2V0dGluZ3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIF90YWJsZURhdGEhOiBUYWJsZURhdGE8YW55PjtcclxuICBzb3J0OiB7IGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZGlyZWN0aW9uOiBzdHJpbmcgfVtdID0gW107XHJcbiAgb3ZlcmxheVJlZiE6IE92ZXJsYXlSZWY7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlUmVmJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSB0ZW1wbGF0ZVJlZiE6IFRlbXBsYXRlUmVmPEhUTUxFbGVtZW50PjtcclxuXHJcbiAgQFZpZXdDaGlsZCgnc2V0dGluZ3NNZW51JykgYnV0dG9uUmVmITogRWxlbWVudFJlZjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnc29ydEluZGljYXRvcicsIHsgc3RhdGljOiBmYWxzZSB9KSBzb3J0SW5kaWNhdG9yUmVmITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgQElucHV0KClcclxuICBzb3J0VG9vbFRpcDogc3RyaW5nID0gJyc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgY2xvc2VEaWFsb2dPbkNob2ljZSA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2Nyb2xsU3RyYXRlZ3k6IFNjcm9sbFN0cmF0ZWd5ID0gbmV3IEJsb2NrU2Nyb2xsU3RyYXRlZ3kodGhpcy52aWV3cG9ydFJ1bGVyLCBkb2N1bWVudCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHRhYmxlRGF0YSh0YWJsZURhdGE6IFRhYmxlRGF0YTxhbnk+KSB7XHJcbiAgICB0aGlzLl90YWJsZURhdGEgPSB0YWJsZURhdGE7XHJcbiAgfVxyXG5cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LCBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsIHByaXZhdGUgdmlld3BvcnRSdWxlcjogVmlld3BvcnRSdWxlcikgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zb3J0ID0gdGhpcy5nZXRTb3J0KCk7XHJcbiAgICB0aGlzLl90YWJsZURhdGEuc29ydE9ic2VydmFibGUuc3Vic2NyaWJlKCgpID0+IHRoaXMuc29ydCA9IHRoaXMuZ2V0U29ydCgpKTtcclxuICAgIHRoaXMuX3RhYmxlRGF0YS5vbkNvbHVtbnNDaGFuZ2UoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zb3J0ID0gdGhpcy5nZXRTb3J0KCkpO1xyXG4gIH1cclxuXHJcbiAgb3BlbkRpYWxvZygpIHtcclxuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuYnV0dG9uUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5QnVpbGRlciA9IHRoaXMub3ZlcmxheS5wb3NpdGlvbigpO1xyXG4gICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHBvc2l0aW9uU3RyYXRlZ3lCdWlsZGVyXHJcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKGJ1dHRvbilcclxuICAgICAgLndpdGhGbGV4aWJsZURpbWVuc2lvbnModHJ1ZSlcclxuICAgICAgLndpdGhWaWV3cG9ydE1hcmdpbigxMClcclxuICAgICAgLndpdGhHcm93QWZ0ZXJPcGVuKHRydWUpXHJcbiAgICAgIC53aXRoUHVzaCh0cnVlKVxyXG4gICAgICAud2l0aFBvc2l0aW9ucyhbe1xyXG4gICAgICAgIG9yaWdpblg6ICdlbmQnLFxyXG4gICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxyXG4gICAgICAgIG92ZXJsYXlYOiAnZW5kJyxcclxuICAgICAgICBvdmVybGF5WTogJ3RvcCdcclxuICAgICAgfV0pO1xyXG4gICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XHJcbiAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxyXG4gICAgICBiYWNrZHJvcENsYXNzOiAnY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AnLFxyXG4gICAgICBwYW5lbENsYXNzOiAnY29sdW1uLW92ZXJsYXknLFxyXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LFxyXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5zY3JvbGxTdHJhdGVneVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCB0ZW1wbGF0ZVBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLnRlbXBsYXRlUmVmLCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xyXG4gICAgdGhpcy5vdmVybGF5UmVmLmF0dGFjaCh0ZW1wbGF0ZVBvcnRhbCk7XHJcblxyXG4gICAgdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cclxuICAgICAgdGhpcy5vdmVybGF5UmVmLmRpc3Bvc2UoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XHJcbiAgICBtb3ZlSXRlbUluQXJyYXkodGhpcy5fdGFibGVEYXRhLmNvbHVtbnMsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XHJcbiAgICB0aGlzLl90YWJsZURhdGEuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuX3RhYmxlRGF0YS5jb2x1bW5zLmZpbHRlcihjID0+IGMuaXNBY3RpdmUpLm1hcChjID0+IGMuaWQpO1xyXG4gICAgdGhpcy5fdGFibGVEYXRhLnN0b3JlVGFibGVTZXR0aW5ncygpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlKCkge1xyXG4gICAgdGhpcy5fdGFibGVEYXRhLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLl90YWJsZURhdGEuY29sdW1ucy5maWx0ZXIoYyA9PiB7XHJcbiAgICAgIGlmICghYy5pc0FjdGl2ZSkge1xyXG4gICAgICAgIHRoaXMuc29ydCA9IHRoaXMuc29ydC5maWx0ZXIocyA9PiBzLmlkICE9PSBjLmlkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGMuaXNBY3RpdmU7XHJcbiAgICB9KS5tYXAoYyA9PiBjLmlkKTtcclxuICAgIHRoaXMudXBkYXRlU29ydCgpO1xyXG4gICAgaWYgKHRoaXMuY2xvc2VEaWFsb2dPbkNob2ljZSkge1xyXG4gICAgICB0aGlzLm92ZXJsYXlSZWYuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZHJvcFNvcnQoZXZlbnQ6IENka0RyYWdEcm9wPHN0cmluZ1tdPikge1xyXG4gICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuc29ydCwgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcclxuICAgIHRoaXMudXBkYXRlU29ydCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U29ydCgpOiB7IGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZGlyZWN0aW9uOiBzdHJpbmcgfVtdIHtcclxuICAgIGNvbnN0IHNvcnRpbmc6IHsgaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBkaXJlY3Rpb246IHN0cmluZyB9W10gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdGFibGVEYXRhLnNvcnRQYXJhbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgc29ydGluZy5wdXNoKHtcclxuICAgICAgICBpZDogdGhpcy5fdGFibGVEYXRhLnNvcnRQYXJhbXNbaV0sXHJcbiAgICAgICAgbmFtZTogdGhpcy5fdGFibGVEYXRhLmNvbHVtbnMuZmluZChjID0+IGMuaWQgPT09IHRoaXMuX3RhYmxlRGF0YS5zb3J0UGFyYW1zW2ldKSEubmFtZSxcclxuICAgICAgICBkaXJlY3Rpb246IHRoaXMuX3RhYmxlRGF0YS5zb3J0RGlyc1tpXVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBzb3J0aW5nO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlKGlkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc29ydCA9IHRoaXMuc29ydC5maWx0ZXIodiA9PiB2LmlkICE9PSBpZCk7XHJcbiAgICB0aGlzLnVwZGF0ZVNvcnQoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZURpcmVjdGlvbihpZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBpID0gdGhpcy5zb3J0LmZpbmRJbmRleCh2ID0+IHYuaWQgPT09IGlkKTtcclxuICAgIGlmICh0aGlzLnNvcnRbaV0uZGlyZWN0aW9uID09PSAnYXNjJykge1xyXG4gICAgICB0aGlzLnNvcnRbaV0uZGlyZWN0aW9uID0gJ2Rlc2MnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zb3J0W2ldLmRpcmVjdGlvbiA9ICdhc2MnO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVTb3J0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVNvcnQoKSB7XHJcbiAgICB0aGlzLl90YWJsZURhdGEuc29ydFBhcmFtcyA9IHRoaXMuc29ydC5tYXAodiA9PiB2LmlkKTtcclxuICAgIHRoaXMuX3RhYmxlRGF0YS5zb3J0RGlycyA9IHRoaXMuc29ydC5tYXAodiA9PiB2LmRpcmVjdGlvbik7XHJcbiAgICB0aGlzLl90YWJsZURhdGEudXBkYXRlU29ydEhlYWRlcnMoKTtcclxuICB9XHJcbn1cclxuXHJcblxyXG4iLCI8ZGl2IGNsYXNzPVwidGFibGUtc2V0dGluZ3NcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1zZXR0aW5ncy1zb3J0XCI+XHJcbiAgICAgICAgPG1hdC1jaGlwLWxpc3QgY2xhc3M9XCJkcmFnLWNoaXAtbGlzdFwiIGNka0Ryb3BMaXN0IGNka0Ryb3BMaXN0T3JpZW50YXRpb249J2hvcml6b250YWwnXHJcbiAgICAgICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcFNvcnQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8bWF0LWNoaXAgY2xhc3M9XCJkcmFnLWNoaXBcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzb3J0XCIgY2RrRHJhZyAocmVtb3ZlZCk9XCJyZW1vdmUoaXRlbS5pZClcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZURpcmVjdGlvbihpdGVtLmlkKVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNvcnRJbmRpY2F0b3JSZWZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzb3J0SW5kaWNhdG9yUmVmXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntkaXJlY3Rpb246aXRlbS5kaXJlY3Rpb24sIGNvbHVtbk5hbWU6IGl0ZW0ubmFtZSB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc29ydEluZGljYXRvclJlZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7aXRlbS5uYW1lfX06XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvcnRpbmdcIiBbbWF0VG9vbHRpcF09XCJzb3J0VG9vbFRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0uZGlyZWN0aW9ufX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdENoaXBSZW1vdmU+Y2FuY2VsPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9tYXQtY2hpcD5cclxuICAgICAgICA8L21hdC1jaGlwLWxpc3Q+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxIDEgYXV0bztcIj48L2Rpdj5cclxuICAgIDxkaXYgI3NldHRpbmdzTWVudSAoY2xpY2spPVwib3BlbkRpYWxvZygpXCIgY2xhc3M9XCJ0YWJsZS1zZXR0aW5ncy1tZW51XCI+XHJcbiAgICAgICAgPG5nLWNvbnRlbnQgI21lbnVSZWY+PC9uZy1jb250ZW50PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZVJlZj5cclxuICA8ZGl2IGNka0Ryb3BMaXN0IGNsYXNzPVwiY29sdW1uLWxpc3RcIiAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbi1pdGVtXCIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBfdGFibGVEYXRhLmNvbHVtbnNcIiBjZGtEcmFnPlxyXG4gICAgICA8bWF0LWljb24+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxyXG4gICAgICA8bWF0LWNoZWNrYm94IFsobmdNb2RlbCldPVwiY29sdW1uLmlzQWN0aXZlXCIgKGNoYW5nZSk9XCJ0b2dnbGUoKVwiPnt7Y29sdW1uLm5hbWV9fTwvbWF0LWNoZWNrYm94PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==