@asi-ngtools/lib
Version:
This project is a little components library, simple to use, which will help you to simplify your project.
223 lines (222 loc) • 18.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Input, forwardRef, ElementRef, ContentChild, ViewChild, Renderer2 } from '@angular/core';
import { NG_VALUE_ACCESSOR, FormControl } from '@angular/forms';
import { DefaultControlValueAccessor } from './../../common/default-control-value-accessor';
import { AsiComponentTemplateOptionDef, AsiComponentTemplateTagDef } from './../../common/asi-component-template';
import { debounceTime, switchMap, tap } from 'rxjs/operators';
import * as nh from '../../../native-helper';
/**
* asi-autocomplete-multiple component
*/
export class AsiAutoCompleteMultipleComponent extends DefaultControlValueAccessor {
/**
* @param {?} renderer
*/
constructor(renderer) {
super();
this.renderer = renderer;
/**
* Label position
*/
this.labelPosition = 'top';
/**
* Placeholder if needed
*/
this.placeholder = '';
/**
* Delay between the moment you stop typing and onRequestData is called
*/
this.delay = 500;
/**
* Option to keep the list open once an item is selected
*/
this.closeAfterSelect = false;
this.autoCompleteControl = new FormControl();
this.open = false;
// Var used to manage component initialization
this.firstRequestDone = null;
this.init = false;
this.currentValue = null;
}
/**
* @return {?}
*/
checkInput() {
if (null == this.onRequestData) {
throw new Error("AsiAutoCompleteMultipleComponent : @Input 'onRequestData' is required");
}
}
/**
* @return {?}
*/
ngOnInit() {
this.checkInput();
this.renderer.addClass(this.container.nativeElement, 'label-' + this.labelPosition);
this.autoCompleteControl.valueChanges
.pipe(debounceTime(this.delay), tap((value) => (this.currentValue = value)), switchMap((value) => nh.observe(this.onRequestData(value, !this.firstRequestDone))))
.subscribe((data) => {
this.data = data;
if (this.firstRequestDone && data && data.length > 0) {
this.open = true;
}
this.firstRequestDone = true;
});
}
/**
* @return {?}
*/
onDropdownClose() {
this.open = false;
}
/**
* @return {?}
*/
ngOnChanges() {
if (this.init) {
this.open = true;
}
else {
if (this.firstRequestDone) {
this.init = true;
}
}
}
/**
* @param {?} data
* @return {?}
*/
addValue(data) {
this.value = (this.value ? /** @type {?} */ (this.value) : []).concat([data]);
if (this.closeAfterSelect) {
this.open = false;
}
}
/**
* @param {?} data
* @return {?}
*/
removeValue(data) {
/** @type {?} */
const tab = this.value;
nh.remove(tab, (value) => {
return data === value;
});
this.value = tab;
if (nh.isEmpty(this.value)) {
this.value = null;
}
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
this._value = value;
if (this.init === false) {
this.autoCompleteControl.setValue(this.currentValue);
}
else {
this.currentValue = value;
if (this.value == null) {
this.autoCompleteControl.setValue(this.currentValue, { emitEvent: false });
}
}
}
}
AsiAutoCompleteMultipleComponent.decorators = [
{ type: Component, args: [{
selector: 'asi-autocomplete-multiple',
template: "<div class=\"tag-container\">\r\n <div class=\"tag\" *ngFor=\"let aValue of value\">\r\n <span>\r\n <ng-template [ngTemplateOutlet]=\"tagDef.template\" [ngTemplateOutletContext]=\"{$implicit : aValue}\"></ng-template>\r\n </span>\r\n <button type=\"button\" [disabled]=\"disabled\" class=\"remove-icon-container\" (click)=\"removeValue(aValue)\">\r\n <span class=\"remove-icon\" [innerHTML]=\"'✕'\"></span>\r\n </button>\r\n </div>\r\n</div>\r\n<div class=\"autocomplete-container\" #container>\r\n <label class=\"input-label\" *ngIf=\"label != null\">{{label | translate}}</label>\r\n <div class=\"autocomplete\">\r\n <input [attr.id]=\"id\" [attr.name]=\"name\"\r\n [attr.disabled]=\"disabled ? '' : null\" class=\"asi-focus-error\"\r\n [placeholder]=\"placeholder\" [formControl]=\"autoCompleteControl\"/>\r\n\r\n <asi-dropdown [open]=\"open\" (onClose)=\"onDropdownClose()\" dropDownClass=\"asi-autocomplete-multiple-dropdown\">\r\n <div class=\"drop-down-autocomplete-multiple\">\r\n <div class=\"drop-down-panel\" [ngClass]=\"{'open' : open }\">\r\n <button [id]=\"'asi-acmddi-'+ id\" type=\"button\" class=\"drop-down-item\" (click)=\"addValue(aData)\" *ngFor=\"let aData of data\">\r\n <div class=\"option\">\r\n <span class=\"item\">\r\n <ng-template *ngIf=\"aData != null\" [ngTemplateOutlet]=\"optionDef.template\" [ngTemplateOutletContext]=\"{$implicit : aData}\"></ng-template>\r\n </span>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n </asi-dropdown>\r\n\r\n </div>\r\n</div>\r\n",
host: { class: 'asi-component asi-autocomplete-multiple' },
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AsiAutoCompleteMultipleComponent),
multi: true
}
]
}] }
];
/** @nocollapse */
AsiAutoCompleteMultipleComponent.ctorParameters = () => [
{ type: Renderer2 }
];
AsiAutoCompleteMultipleComponent.propDecorators = {
id: [{ type: Input }],
name: [{ type: Input }],
label: [{ type: Input }],
labelPosition: [{ type: Input }],
placeholder: [{ type: Input }],
delay: [{ type: Input }],
closeAfterSelect: [{ type: Input }],
onRequestData: [{ type: Input }],
optionDef: [{ type: ContentChild, args: [AsiComponentTemplateOptionDef,] }],
tagDef: [{ type: ContentChild, args: [AsiComponentTemplateTagDef,] }],
container: [{ type: ViewChild, args: ['container',] }]
};
if (false) {
/**
* html id
* @type {?}
*/
AsiAutoCompleteMultipleComponent.prototype.id;
/**
* html name
* @type {?}
*/
AsiAutoCompleteMultipleComponent.prototype.name;
/**
* Label to display (is translated)
* @type {?}
*/
AsiAutoCompleteMultipleComponent.prototype.label;
/**
* Label position
* @type {?}
*/
AsiAutoCompleteMultipleComponent.prototype.labelPosition;
/**
* Placeholder if needed
* @type {?}
*/
AsiAutoCompleteMultipleComponent.prototype.placeholder;
/**
* Delay between the moment you stop typing and onRequestData is called
* @type {?}
*/
AsiAutoCompleteMultipleComponent.prototype.delay;
/**
* Option to keep the list open once an item is selected
* @type {?}
*/
AsiAutoCompleteMultipleComponent.prototype.closeAfterSelect;
/**
* Function called to request new data (can return Observable/Promise/Object) : Throw error if null
* @type {?}
*/
AsiAutoCompleteMultipleComponent.prototype.onRequestData;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.optionDef;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.tagDef;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.container;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.data;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.autoCompleteControl;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.open;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.firstRequestDone;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.init;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.currentValue;
/** @type {?} */
AsiAutoCompleteMultipleComponent.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWF1dG9jb21wbGV0ZS1tdWx0aXBsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYXNpLW5ndG9vbHMvbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYXNpLWF1dG9jb21wbGV0ZS9tdWx0aXBsZS9hc2ktYXV0b2NvbXBsZXRlLW11bHRpcGxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFVLFVBQVUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDNUYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLDBCQUEwQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDbEgsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7OztBQWdCN0MsTUFBTSx1Q0FBd0MsU0FBUSwyQkFBMkI7Ozs7SUF3Qy9FLFlBQW9CLFFBQW1CO1FBQ3JDLEtBQUssRUFBRSxDQUFDO1FBRFUsYUFBUSxHQUFSLFFBQVEsQ0FBVzs7Ozs2QkE5QndELEtBQUs7Ozs7MkJBRzdFLEVBQUU7Ozs7cUJBR1IsR0FBRzs7OztnQ0FHUSxLQUFLO21DQVlYLElBQUksV0FBVyxFQUFFO29CQUNoQyxLQUFLOztnQ0FHZ0IsSUFBSTtvQkFDekIsS0FBSzs0QkFFUSxJQUFJO0tBSXZCOzs7O0lBRU8sVUFBVTtRQUNoQixFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDL0IsTUFBTSxJ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LENBQUM7U0FDdEQ7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDNUU7U0FDRjtLQUNGOzs7WUE1SEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSwyQkFBMkI7Z0JBQ3JDLHdvREFBdUQ7Z0JBQ3ZELElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSx5Q0FBeUMsRUFBRTtnQkFDMUQsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7d0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsZ0NBQWdDLENBQUM7d0JBQy9ELEtBQUssRUFBRSxJQUFJO3FCQUNaO2lCQUNGO2FBQ0Y7Ozs7WUFwQjhGLFNBQVM7OztpQkF1QnJHLEtBQUs7bUJBRUwsS0FBSztvQkFHTCxLQUFLOzRCQUdMLEtBQUs7MEJBR0wsS0FBSztvQkFHTCxLQUFLOytCQUdMLEtBQUs7NEJBR0wsS0FBSzt3QkFFTCxZQUFZLFNBQUMsNkJBQTZCO3FCQUMxQyxZQUFZLFNBQUMsMEJBQTBCO3dCQUV2QyxTQUFTLFNBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIGZvcndhcmRSZWYsIE9uSW5pdCwgRWxlbWVudFJlZiwgQ29udGVudENoaWxkLCBWaWV3Q2hpbGQsIE9uQ2hhbmdlcywgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEZWZhdWx0Q29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICcuLy4uLy4uL2NvbW1vbi9kZWZhdWx0LWNvbnRyb2wtdmFsdWUtYWNjZXNzb3InO1xuaW1wb3J0IHsgQXNpQ29tcG9uZW50VGVtcGxhdGVPcHRpb25EZWYsIEFzaUNvbXBvbmVudFRlbXBsYXRlVGFnRGVmIH0gZnJvbSAnLi8uLi8uLi9jb21tb24vYXNpLWNvbXBvbmVudC10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0ICogYXMgbmggZnJvbSAnLi4vLi4vLi4vbmF0aXZlLWhlbHBlcic7XG4vKipcbiAqIGFzaS1hdXRvY29tcGxldGUtbXVsdGlwbGUgY29tcG9uZW50XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FzaS1hdXRvY29tcGxldGUtbXVsdGlwbGUnLFxuICB0ZW1wbGF0ZVVybDogJ2FzaS1hdXRvY29tcGxldGUtbXVsdGlwbGUuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnYXNpLWNvbXBvbmVudCBhc2ktYXV0b2NvbXBsZXRlLW11bHRpcGxlJyB9LFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFzaUF1dG9Db21wbGV0ZU11bHRpcGxlQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEFzaUF1dG9Db21wbGV0ZU11bHRpcGxlQ29tcG9uZW50IGV4dGVuZHMgRGVmYXVsdENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKiogaHRtbCBpZCAqL1xuICBASW5wdXQoKSBpZDogc3RyaW5nO1xuICAvKiogaHRtbCBuYW1lICovXG4gIEBJbnB1dCgpIG5hbWU6IHN0cmluZztcblxuICAvKiogTGFiZWwgdG8gZGlzcGxheSAoaXMgdHJhbnNsYXRlZCkgKi9cbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcblxuICAvKiogTGFiZWwgcG9zaXRpb24gKi9cbiAgQElucHV0KCkgbGFiZWxQb3NpdGlvbjogJ3RvcCcgfCAnbGVmdCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnYm90dG9tLWNlbnRlcicgfCAndG9wLWNlbnRlcicgPSAndG9wJztcblxuICAvKiogUGxhY2Vob2xkZXIgaWYgbmVlZGVkICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJyc7XG5cbiAgLyoqIERlbGF5IGJldHdlZW4gdGhlIG1vbWVudCB5b3Ugc3RvcCB0eXBpbmcgYW5kIG9uUmVxdWVzdERhdGEgaXMgY2FsbGVkICovXG4gIEBJbnB1dCgpIGRlbGF5ID0gNTAwO1xuXG4gIC8qKiBPcHRpb24gdG8ga2VlcCB0aGUgbGlzdCBvcGVuIG9uY2UgYW4gaXRlbSBpcyBzZWxlY3RlZCAqL1xuICBASW5wdXQoKSBjbG9zZUFmdGVyU2VsZWN0ID0gZmFsc2U7XG5cbiAgLyoqIEZ1bmN0aW9uIGNhbGxlZCB0byByZXF1ZXN0IG5ldyBkYXRhIChjYW4gcmV0dXJuIE9ic2VydmFibGUvUHJvbWlzZS9PYmplY3QpIDogVGhyb3cgZXJyb3IgaWYgbnVsbCAqL1xuICBASW5wdXQoKSBvblJlcXVlc3REYXRhOiBGdW5jdGlvbjtcblxuICBAQ29udGVudENoaWxkKEFzaUNvbXBvbmVudFRlbXBsYXRlT3B0aW9uRGVmKSBvcHRpb25EZWY6IEFzaUNvbXBvbmVudFRlbXBsYXRlT3B0aW9uRGVmO1xuICBAQ29udGVudENoaWxkKEFzaUNvbXBvbmVudFRlbXBsYXRlVGFnRGVmKSB0YWdEZWY6IEFzaUNvbXBvbmVudFRlbXBsYXRlVGFnRGVmO1xuXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIGNvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICBkYXRhOiBBcnJheTxhbnk+O1xuXG4gIGF1dG9Db21wbGV0ZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcbiAgb3BlbiA9IGZhbHNlO1xuXG4gIC8vIFZhciB1c2VkIHRvIG1hbmFnZSBjb21wb25lbnQgaW5pdGlhbGl6YXRpb25cbiAgZmlyc3RSZXF1ZXN0RG9uZTogQm9vbGVhbiA9IG51bGw7XG4gIGluaXQgPSBmYWxzZTtcblxuICBjdXJyZW50VmFsdWU6IGFueSA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tJbnB1dCgpIHtcbiAgICBpZiAobnVsbCA9PSB0aGlzLm9uUmVxdWVzdERhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFzaUF1dG9Db21wbGV0ZU11bHRpcGxlQ29tcG9uZW50IDogQElucHV0ICdvblJlcXVlc3REYXRhJyBpcyByZXF1aXJlZFwiKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNoZWNrSW5wdXQoKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsICdsYWJlbC0nICsgdGhpcy5sYWJlbFBvc2l0aW9uKTtcblxuICAgIHRoaXMuYXV0b0NvbXBsZXRlQ29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWxheSksXG4gICAgICAgIHRhcCgodmFsdWUpID0+ICh0aGlzLmN1cnJlbnRWYWx1ZSA9IHZhbHVlKSksXG4gICAgICAgIHN3aXRjaE1hcCgodmFsdWUpID0+IG5oLm9ic2VydmUodGhpcy5vblJlcXVlc3REYXRhKHZhbHVlLCAhdGhpcy5maXJzdFJlcXVlc3REb25lKSkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgaWYgKHRoaXMuZmlyc3RSZXF1ZXN0RG9uZSAmJiBkYXRhICYmIGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMub3BlbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXJzdFJlcXVlc3REb25lID0gdHJ1ZTtcbiAgICAgIH0pO1xuICB9XG5cbiAgb25Ecm9wZG93bkNsb3NlKCkge1xuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgaWYgKHRoaXMuaW5pdCkge1xuICAgICAgdGhpcy5vcGVuID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZmlyc3RSZXF1ZXN0RG9uZSkge1xuICAgICAgICB0aGlzLmluaXQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZFZhbHVlKGRhdGE6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSAodGhpcy52YWx1ZSA/IHRoaXMudmFsdWUgYXMgYW55W10gOiBbXSkuY29uY2F0KFtkYXRhXSk7XG4gICAgaWYgKHRoaXMuY2xvc2VBZnRlclNlbGVjdCkge1xuICAgICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlVmFsdWUoZGF0YTogYW55KSB7XG4gICAgY29uc3QgdGFiID0gdGhpcy52YWx1ZTtcbiAgICBuaC5yZW1vdmUodGFiLCAodmFsdWUpID0+IHtcbiAgICAgIHJldHVybiBkYXRhID09PSB2YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnZhbHVlID0gdGFiO1xuXG4gICAgaWYgKG5oLmlzRW1wdHkodGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuaW5pdCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuYXV0b0NvbXBsZXRlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmN1cnJlbnRWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuYXV0b0NvbXBsZXRlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmN1cnJlbnRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19