UNPKG

@asi-ngtools/lib

Version:

This project is a little components library, simple to use, which will help you to simplify your project.

273 lines (272 loc) 20.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, ViewChild, Renderer2, ElementRef, forwardRef, ContentChild } from '@angular/core'; import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms'; import { AsiComponentTemplateTreeLeafDef, AsiComponentTemplateTreeNodeDef, AsiComponentTemplateClearDef } from '../common/asi-component-template'; import { AsiTreeViewComponent } from '../asi-tree-view/asi-tree-view.component'; import { DefaultControlValueAccessor } from '../common/default-control-value-accessor'; import * as nh from '../../native-helper'; var AsiTreeSelectComponent = /** @class */ (function (_super) { tslib_1.__extends(AsiTreeSelectComponent, _super); function AsiTreeSelectComponent(renderer, elementRef) { var _this = _super.call(this) || this; _this.renderer = renderer; _this.elementRef = elementRef; /** * Label position */ _this.labelPosition = 'top'; /** * Field containing the label of the item to display */ _this.labelField = 'label'; /** * Field containing the children of an item */ _this.childrenField = 'children'; /** * Allow selection of nodes which have children */ _this.allowParentSelection = false; /** * Display a clear button */ _this.clearButton = false; _this.formControl = new FormControl(); _this.dropdownOpened = false; _this.isLeaf = function (item) { return item && nh.isEmpty(item[_this.childrenField]); }; return _this; } /** * @return {?} */ AsiTreeSelectComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.renderer.addClass(this.elementRef.nativeElement, 'label-' + this.labelPosition); }; /** * @param {?} node * @return {?} */ AsiTreeSelectComponent.prototype.onNodeSelected = /** * @param {?} node * @return {?} */ function (node) { /** @type {?} */ var item = node.data; if (this.isLeaf(item) || this.allowParentSelection) { this.asiTreeView.filterNodes(function () { return true; }); this.dropdownOpened = false; if (item && item[this.labelField]) { this.value = item; this.formControl.setValue(item[this.labelField], { emitEvent: false }); } else { this.value = null; this.formControl.setValue(null, { emitEvent: false }); } } }; /** * @param {?} filter * @return {?} */ AsiTreeSelectComponent.prototype.onFilter = /** * @param {?} filter * @return {?} */ function (filter) { var _this = this; if (filter) { if (this.filter) { this.asiTreeView.filterNodes(function (item) { return _this.filter && _this.filter(item, filter); }); } } else { this.asiTreeView.filterNodes(function () { return true; }); } }; /** * @return {?} */ AsiTreeSelectComponent.prototype.toggleDropdown = /** * @return {?} */ function () { this.dropdownOpened = !this.disabled && !this.dropdownOpened; }; /** * @return {?} */ AsiTreeSelectComponent.prototype.onDropdownClosed = /** * @return {?} */ function () { this.dropdownOpened = false; }; /** * @return {?} */ AsiTreeSelectComponent.prototype.clear = /** * @return {?} */ function () { this.dropdownOpened = false; this.value = null; this.formControl.reset(); }; /** * @return {?} */ AsiTreeSelectComponent.prototype.displayClearButton = /** * @return {?} */ function () { return this.clearButton && this.value; }; // override DefaultControlValueAccessor#writeValue /** * @param {?} value * @return {?} */ AsiTreeSelectComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { this._value = value; if (this.value && this.value[this.labelField]) { this.formControl.setValue(this.value[this.labelField], { emitEvent: false }); } else { this.formControl.reset(); } }; AsiTreeSelectComponent.decorators = [ { type: Component, args: [{ selector: 'asi-tree-select', template: "<label class=\"input-label\" *ngIf=\"label\">{{label | translate}}</label>\n\n<div class=\"select\" [class.disabled]=\"disabled\">\n <div class=\"header asi-focus-error\" #selectHeader>\n <asi-input [placeholder]=\"placeholder\" [formControl]=\"formControl\" [disabled]=\"disabled\" [id]=\"id\" [name]=\"name\"\n (onValueChange)=\"onFilter($event)\" (click)=\"toggleDropdown()\"></asi-input>\n <asi-fa-icon *ngIf=\"displayClearButton()\" (click)=\"clear()\" icon=\"fas fa-times\" class=\"smaller\"></asi-fa-icon>\n <asi-fa-icon [icon]=\"(dropdownOpened) ? 'fa fa-chevron-up' : 'fa fa-chevron-down'\" [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"></asi-fa-icon>\n </div>\n\n <div class=\"options\">\n <asi-dropdown [relativeTo]=\"selectHeaderContainer\" [calculWidth]=\"true\" [open]=\"dropdownOpened\"\n (onClose)=\"onDropdownClosed()\" dropDownClass=\"asi-tree-select-dropdown\">\n <div class=\"drop-down-tree-select\">\n <div class=\"drop-down-panel\">\n <div *ngIf=\"clearDef\" (click)=\"clear()\" class=\"clear-value-item\">\n <ng-template [ngTemplateOutlet]=\"clearDef.template\"></ng-template>\n </div>\n\n <asi-tree-view [data]=\"data\" [isLeaf]=\"isLeaf\" [nodeName]=\"childrenField\"\n (onNodeSelected)=\"onNodeSelected($event)\" iconOpen=\"far fa-plus-square\" iconClose=\"far fa-minus-square\">\n <asi-tree-node *asiTreeNodeDef=\"let node\">\n <div class=\"drop-down-item\">\n <ng-template [ngTemplateOutlet]=\"nodeDef.template\" [ngTemplateOutletContext]=\"{$implicit : node}\">\n </ng-template>\n </div>\n </asi-tree-node>\n\n <asi-tree-leaf *asiTreeLeafDef=\"let node\">\n <div class=\"drop-down-item\">\n <ng-template [ngTemplateOutlet]=\"leafDef.template\" [ngTemplateOutletContext]=\"{$implicit : node}\">\n </ng-template>\n </div>\n </asi-tree-leaf>\n </asi-tree-view>\n </div>\n </div>\n </asi-dropdown>\n </div>\n</div>\n", host: { 'class': 'asi-component asi-tree-select' }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return AsiTreeSelectComponent; }), multi: true } ] }] } ]; /** @nocollapse */ AsiTreeSelectComponent.ctorParameters = function () { return [ { type: Renderer2 }, { type: ElementRef } ]; }; AsiTreeSelectComponent.propDecorators = { id: [{ type: Input }], name: [{ type: Input }], label: [{ type: Input }], labelPosition: [{ type: Input }], placeholder: [{ type: Input }], data: [{ type: Input }], labelField: [{ type: Input }], childrenField: [{ type: Input }], allowParentSelection: [{ type: Input }], filter: [{ type: Input }], clearButton: [{ type: Input }], selectHeaderContainer: [{ type: ViewChild, args: ['selectHeader',] }], asiTreeView: [{ type: ViewChild, args: [AsiTreeViewComponent,] }], clearDef: [{ type: ContentChild, args: [AsiComponentTemplateClearDef,] }], nodeDef: [{ type: ContentChild, args: [AsiComponentTemplateTreeNodeDef,] }], leafDef: [{ type: ContentChild, args: [AsiComponentTemplateTreeLeafDef,] }] }; return AsiTreeSelectComponent; }(DefaultControlValueAccessor)); export { AsiTreeSelectComponent }; if (false) { /** * html id * @type {?} */ AsiTreeSelectComponent.prototype.id; /** * html name * @type {?} */ AsiTreeSelectComponent.prototype.name; /** * Label to display (is translated) * @type {?} */ AsiTreeSelectComponent.prototype.label; /** * Label position * @type {?} */ AsiTreeSelectComponent.prototype.labelPosition; /** * Placeholder * @type {?} */ AsiTreeSelectComponent.prototype.placeholder; /** * Select data * @type {?} */ AsiTreeSelectComponent.prototype.data; /** * Field containing the label of the item to display * @type {?} */ AsiTreeSelectComponent.prototype.labelField; /** * Field containing the children of an item * @type {?} */ AsiTreeSelectComponent.prototype.childrenField; /** * Allow selection of nodes which have children * @type {?} */ AsiTreeSelectComponent.prototype.allowParentSelection; /** * Functions used to decide if an item should be displayed when a filter is applied (returns a boolean) * @type {?} */ AsiTreeSelectComponent.prototype.filter; /** * Display a clear button * @type {?} */ AsiTreeSelectComponent.prototype.clearButton; /** @type {?} */ AsiTreeSelectComponent.prototype.selectHeaderContainer; /** @type {?} */ AsiTreeSelectComponent.prototype.asiTreeView; /** @type {?} */ AsiTreeSelectComponent.prototype.clearDef; /** @type {?} */ AsiTreeSelectComponent.prototype.nodeDef; /** @type {?} */ AsiTreeSelectComponent.prototype.leafDef; /** @type {?} */ AsiTreeSelectComponent.prototype.formControl; /** @type {?} */ AsiTreeSelectComponent.prototype.dropdownOpened; /** @type {?} */ AsiTreeSelectComponent.prototype.isLeaf; /** @type {?} */ AsiTreeSelectComponent.prototype.renderer; /** @type {?} */ AsiTreeSelectComponent.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLXRyZWUtc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bhc2ktbmd0b29scy9saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9hc2ktdHJlZS1zZWxlY3QvYXNpLXRyZWUtc2VsZWN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckgsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhFLE9BQU8sRUFDTCwrQkFBK0IsRUFDL0IsK0JBQStCLEVBQy9CLDRCQUE0QixFQUM3QixNQUFNLGtDQUFrQyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRWhGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ3ZGLE9BQU8sS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0lBY0Usa0RBQTJCO0lBNkNyRSxnQ0FDVSxVQUNBO1FBRlYsWUFHSSxpQkFBTyxTQUFHO1FBRkosY0FBUSxHQUFSLFFBQVE7UUFDUixnQkFBVSxHQUFWLFVBQVU7Ozs7OEJBbkMyRSxLQUFLOzs7OzJCQVM5RSxPQUFPOzs7OzhCQUdKLFVBQVU7Ozs7cUNBR0gsS0FBSzs7Ozs0QkFNZCxLQUFLOzRCQVNkLElBQUksV0FBVyxFQUFFOytCQUNkLEtBQUs7dUJBV2IsVUFBQyxJQUFTO1lBQ2pCLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7U0FDckQ7O0tBUmE7Ozs7SUFFZCx5Q0FBUTs7O0lBQVI7UUFDRSxJQUFJLENBQUMsUUFBUSxD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LENBQUMsQ0FBQztTQUM5RTtRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUMxQjtLQUNGOztnQkE1SEYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLHNsRUFBNkM7b0JBQzdDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRTtvQkFDbEQsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsY0FBTSxPQUFBLHNCQUFzQixFQUF0QixDQUFzQixDQUFDOzRCQUNyRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtpQkFDRjs7OztnQkF4QjZDLFNBQVM7Z0JBQUUsVUFBVTs7O3FCQTRCaEUsS0FBSzt1QkFHTCxLQUFLO3dCQUdMLEtBQUs7Z0NBR0wsS0FBSzs4QkFHTCxLQUFLO3VCQUdMLEtBQUs7NkJBR0wsS0FBSztnQ0FHTCxLQUFLO3VDQUdMLEtBQUs7eUJBR0wsS0FBSzs4QkFHTCxLQUFLO3dDQUVMLFNBQVMsU0FBQyxjQUFjOzhCQUN4QixTQUFTLFNBQUMsb0JBQW9COzJCQUU5QixZQUFZLFNBQUMsNEJBQTRCOzBCQUN6QyxZQUFZLFNBQUMsK0JBQStCOzBCQUM1QyxZQUFZLFNBQUMsK0JBQStCOztpQ0FqRS9DO0VBeUI0QywyQkFBMkI7U0FBMUQsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkLCBPbkluaXQsIFJlbmRlcmVyMiwgRWxlbWVudFJlZiwgZm9yd2FyZFJlZiwgQ29udGVudENoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7XG4gIEFzaUNvbXBvbmVudFRlbXBsYXRlVHJlZUxlYWZEZWYsXG4gIEFzaUNvbXBvbmVudFRlbXBsYXRlVHJlZU5vZGVEZWYsXG4gIEFzaUNvbXBvbmVudFRlbXBsYXRlQ2xlYXJEZWZcbn0gZnJvbSAnLi4vY29tbW9uL2FzaS1jb21wb25lbnQtdGVtcGxhdGUnO1xuaW1wb3J0IHsgQXNpVHJlZVZpZXdDb21wb25lbnQgfSBmcm9tICcuLi9hc2ktdHJlZS12aWV3L2FzaS10cmVlLXZpZXcuY29tcG9uZW50JztcbmltcG9ydCB7IEFzaVRyZWVWaWV3Tm9kZUNvbXBvbmVudCB9IGZyb20gJy4uL2FzaS10cmVlLXZpZXcvbm9kZS9hc2ktdHJlZS12aWV3LW5vZGUuY29tcG9uZW50JztcbmltcG9ydCB7IERlZmF1bHRDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJy4uL2NvbW1vbi9kZWZhdWx0LWNvbnRyb2wtdmFsdWUtYWNjZXNzb3InO1xuaW1wb3J0ICogYXMgbmggZnJvbSAnLi4vLi4vbmF0aXZlLWhlbHBlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FzaS10cmVlLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnYXNpLXRyZWUtc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyAnY2xhc3MnOiAnYXNpLWNvbXBvbmVudCBhc2ktdHJlZS1zZWxlY3QnIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXNpVHJlZVNlbGVjdENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBBc2lUcmVlU2VsZWN0Q29tcG9uZW50IGV4dGVuZHMgRGVmYXVsdENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudHMgT25Jbml0IHtcblxuICAvKiogaHRtbCBpZCAqL1xuICBASW5wdXQoKSBpZDogc3RyaW5nO1xuXG4gIC8qKiBodG1sIG5hbWUgKi9cbiAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBMYWJlbCB0byBkaXNwbGF5IChpcyB0cmFuc2xhdGVkKSAqL1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBMYWJlbCBwb3NpdGlvbiAqL1xuICBASW5wdXQoKSBsYWJlbFBvc2l0aW9uOiAndG9wJyB8ICdsZWZ0JyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdib3R0b20tY2VudGVyJyB8ICd0b3AtY2VudGVyJyA9ICd0b3AnO1xuXG4gIC8qKiBQbGFjZWhvbGRlciAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gIC8qKiBTZWxlY3QgZGF0YSAqL1xuICBASW5wdXQoKSBkYXRhOiBhbnlbXTtcblxuICAvKiogRmllbGQgY29udGFpbmluZyB0aGUgbGFiZWwgb2YgdGhlIGl0ZW0gdG8gZGlzcGxheSAqL1xuICBASW5wdXQoKSBsYWJlbEZpZWxkID0gJ2xhYmVsJztcblxuICAvKiogRmllbGQgY29udGFpbmluZyB0aGUgY2hpbGRyZW4gb2YgYW4gaXRlbSAqL1xuICBASW5wdXQoKSBjaGlsZHJlbkZpZWxkID0gJ2NoaWxkcmVuJztcblxuICAvKiogQWxsb3cgc2VsZWN0aW9uIG9mIG5vZGVzIHdoaWNoIGhhdmUgY2hpbGRyZW4gKi9cbiAgQElucHV0KCkgYWxsb3dQYXJlbnRTZWxlY3Rpb24gPSBmYWxzZTtcblxuICAvKiogRnVuY3Rpb25zIHVzZWQgdG8gZGVjaWRlIGlmIGFuIGl0ZW0gc2hvdWxkIGJlIGRpc3BsYXllZCB3aGVuIGEgZmlsdGVyIGlzIGFwcGxpZWQgKHJldHVybnMgYSBib29sZWFuKSAqL1xuICBASW5wdXQoKSBmaWx0ZXI6IChpdGVtOiBhbnksIGZpbHRlcjogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8qKiBEaXNwbGF5IGEgY2xlYXIgYnV0dG9uICovXG4gIEBJbnB1dCgpIGNsZWFyQnV0dG9uID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnc2VsZWN0SGVhZGVyJykgc2VsZWN0SGVhZGVyQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKEFzaVRyZWVWaWV3Q29tcG9uZW50KSBhc2lUcmVlVmlldzogQXNpVHJlZVZpZXdDb21wb25lbnQ7XG5cbiAgQENvbnRlbnRDaGlsZChBc2lDb21wb25lbnRUZW1wbGF0ZUNsZWFyRGVmKSBjbGVhckRlZjogQXNpQ29tcG9uZW50VGVtcGxhdGVDbGVhckRlZjtcbiAgQENvbnRlbnRDaGlsZChBc2lDb21wb25lbnRUZW1wbGF0ZVRyZWVOb2RlRGVmKSBub2RlRGVmOiBBc2lDb21wb25lbnRUZW1wbGF0ZVRyZWVOb2RlRGVmO1xuICBAQ29udGVudENoaWxkKEFzaUNvbXBvbmVudFRlbXBsYXRlVHJlZUxlYWZEZWYpIGxlYWZEZWY6IEFzaUNvbXBvbmVudFRlbXBsYXRlVHJlZUxlYWZEZWY7XG5cbiAgZm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcbiAgZHJvcGRvd25PcGVuZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmXG4gICkgeyBzdXBlcigpOyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2xhYmVsLScgKyB0aGlzLmxhYmVsUG9zaXRpb24pO1xuICB9XG5cbiAgaXNMZWFmID0gKGl0ZW06IGFueSkgPT4ge1xuICAgIHJldHVybiBpdGVtICYmIG5oLmlzRW1wdHkoaXRlbVt0aGlzLmNoaWxkcmVuRmllbGRdKTtcbiAgfTtcblxuICBvbk5vZGVTZWxlY3RlZChub2RlOiBBc2lUcmVlVmlld05vZGVDb21wb25lbnQpIHtcbiAgICBjb25zdCBpdGVtID0gbm9kZS5kYXRhO1xuICAgIGlmICh0aGlzLmlzTGVhZihpdGVtKSB8fCB0aGlzLmFsbG93UGFyZW50U2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLmFzaVRyZWVWaWV3LmZpbHRlck5vZGVzKCgpID0+IHRydWUpO1xuICAgICAgdGhpcy5kcm9wZG93bk9wZW5lZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoaXRlbSAmJiBpdGVtW3RoaXMubGFiZWxGaWVsZF0pIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGl0ZW07XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUoaXRlbVt0aGlzLmxhYmVsRmllbGRdLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZShudWxsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25GaWx0ZXIoZmlsdGVyOiBzdHJpbmcpIHtcbiAgICBpZiAoZmlsdGVyKSB7XG4gICAgICBpZiAodGhpcy5maWx0ZXIpIHtcbiAgICAgICAgdGhpcy5hc2lUcmVlVmlldy5maWx0ZXJOb2RlcygoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyICYmIHRoaXMuZmlsdGVyKGl0ZW0sIGZpbHRlcik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFzaVRyZWVWaWV3LmZpbHRlck5vZGVzKCgpID0+IHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZURyb3Bkb3duKCkge1xuICAgIHRoaXMuZHJvcGRvd25PcGVuZWQgPSAhdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5kcm9wZG93bk9wZW5lZDtcbiAgfVxuXG4gIG9uRHJvcGRvd25DbG9zZWQoKSB7XG4gICAgdGhpcy5kcm9wZG93bk9wZW5lZCA9IGZhbHNlO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5kcm9wZG93bk9wZW5lZCA9IGZhbHNlO1xuICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIHRoaXMuZm9ybUNvbnRyb2wucmVzZXQoKTtcbiAgfVxuXG4gIGRpc3BsYXlDbGVhckJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jbGVhckJ1dHRvbiAmJiB0aGlzLnZhbHVlO1xuICB9XG5cbiAgLy8gb3ZlcnJpZGUgRGVmYXVsdENvbnRyb2xWYWx1ZUFjY2Vzc29yI3dyaXRlVmFsdWVcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlW3RoaXMubGFiZWxGaWVsZF0pIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy52YWx1ZVt0aGlzLmxhYmVsRmllbGRdLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wucmVzZXQoKTtcbiAgICB9XG4gIH1cblxufVxuIl19