@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
JavaScript
/**
* @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