ngrx-forms
Version:
Proper integration of forms in Angular 4 applications using ngrx
160 lines • 20.1 kB
JavaScript
import { Directive, forwardRef, Host, HostListener, Input, Optional, } from '@angular/core';
import { NGRX_FORM_VIEW_ADAPTER } from './view-adapter';
import * as i0 from "@angular/core";
// tslint:disable:directive-class-suffix
export class NgrxSelectViewAdapter {
constructor(renderer, elementRef) {
this.renderer = renderer;
this.elementRef = elementRef;
this.optionMap = {};
this.idCounter = 0;
this.selectedId = null;
this.value = undefined;
this.nativeIdWasSet = false;
this.onChangeFn = () => void 0;
this.onTouched = () => void 0;
}
set ngrxFormControlState(value) {
if (!value) {
throw new Error('The control state must not be undefined!');
}
this.state = value;
const nativeId = this.elementRef.nativeElement.id;
const shouldSetNativeId = value.id !== nativeId && this.nativeIdWasSet;
if (shouldSetNativeId) {
this.renderer.setProperty(this.elementRef.nativeElement, 'id', value.id);
}
}
ngAfterViewInit() {
const nativeId = this.elementRef.nativeElement.id;
const shouldSetNativeId = this.state.id !== nativeId && !nativeId;
if (shouldSetNativeId) {
this.renderer.setProperty(this.elementRef.nativeElement, 'id', this.state.id);
this.nativeIdWasSet = true;
}
}
setViewValue(value) {
this.value = value;
this.selectedId = this.getOptionId(value);
if (this.selectedId === null) {
this.renderer.setProperty(this.elementRef.nativeElement, 'selectedIndex', -1);
}
this.renderer.setProperty(this.elementRef.nativeElement, 'value', this.selectedId);
}
onChange({ target }) {
this.selectedId = target.value;
const value = this.optionMap[this.selectedId];
this.value = value;
this.onChangeFn(value);
}
setOnChangeCallback(fn) {
this.onChangeFn = fn;
}
setOnTouchedCallback(fn) {
this.onTouched = fn;
}
setIsDisabled(isDisabled) {
this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);
}
createOptionId() {
const id = this.idCounter.toString();
this.idCounter += 1;
return id;
}
updateOptionValue(id, value) {
this.optionMap[id] = value;
if (this.selectedId === id) {
this.onChangeFn(value);
}
else if (value === this.value) {
this.setViewValue(value);
}
}
deregisterOption(id) {
delete this.optionMap[id];
}
getOptionId(value) {
for (const id of Array.from(Object.keys(this.optionMap))) {
if (this.optionMap[id] === value) {
return id;
}
}
return null;
}
}
NgrxSelectViewAdapter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: NgrxSelectViewAdapter, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
NgrxSelectViewAdapter.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.13", type: NgrxSelectViewAdapter, selector: "select:not([multiple])[ngrxFormControlState]", inputs: { ngrxFormControlState: "ngrxFormControlState" }, host: { listeners: { "blur": "onTouched()", "change": "onChange($event)" } }, providers: [{
provide: NGRX_FORM_VIEW_ADAPTER,
useExisting: forwardRef(() => NgrxSelectViewAdapter),
multi: true,
}], ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: NgrxSelectViewAdapter, decorators: [{
type: Directive,
args: [{
// tslint:disable-next-line:directive-selector
selector: 'select:not([multiple])[ngrxFormControlState]',
providers: [{
provide: NGRX_FORM_VIEW_ADAPTER,
useExisting: forwardRef(() => NgrxSelectViewAdapter),
multi: true,
}],
}]
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }]; }, propDecorators: { onTouched: [{
type: HostListener,
args: ['blur']
}], ngrxFormControlState: [{
type: Input
}], onChange: [{
type: HostListener,
args: ['change', ['$event']]
}] } });
const NULL_VIEW_ADAPTER = {
createOptionId: () => '',
deregisterOption: () => void 0,
updateOptionValue: () => void 0,
};
const NULL_RENDERER = {
setProperty: () => void 0,
};
export class NgrxSelectOption {
constructor(element, renderer, viewAdapter) {
this.element = element;
this.renderer = renderer;
this.viewAdapter = viewAdapter;
this.isInitialized = false;
this.renderer = viewAdapter ? renderer : NULL_RENDERER;
this.viewAdapter = viewAdapter || NULL_VIEW_ADAPTER;
this.id = this.viewAdapter.createOptionId();
}
set value(value) {
// this cannot be done inside ngOnInit since the value property
// must be already set when the option value is updated in the view
// adapter and the initial binding of 'value' happens before
// ngOnInit runs
if (!this.isInitialized) {
this.isInitialized = true;
this.renderer.setProperty(this.element.nativeElement, 'value', this.id);
}
this.viewAdapter.updateOptionValue(this.id, value);
}
ngOnDestroy() {
this.viewAdapter.deregisterOption(this.id);
}
}
NgrxSelectOption.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: NgrxSelectOption, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: NgrxSelectViewAdapter, host: true, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
NgrxSelectOption.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.13", type: NgrxSelectOption, selector: "option", inputs: { value: "value" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: NgrxSelectOption, decorators: [{
type: Directive,
args: [{
// tslint:disable-next-line:directive-selector
selector: 'option',
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: NgrxSelectViewAdapter, decorators: [{
type: Host
}, {
type: Optional
}] }]; }, propDecorators: { value: [{
type: Input,
args: ['value']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3ZpZXctYWRhcHRlci9zZWxlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxVQUFVLEVBQ1YsSUFBSSxFQUNKLFlBQVksRUFDWixLQUFLLEVBRUwsUUFBUSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBbUIsc0JBQXNCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFekUsd0NBQXdDO0FBV3hDLE1BQU0sT0FBTyxxQkFBcUI7SUEwQmhDLFlBQW9CLFFBQW1CLEVBQVUsVUFBc0I7UUFBbkQsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUFVLGVBQVUsR0FBVixVQUFVLENBQVk7UUF4Qi9ELGNBQVMsR0FBMEIsRUFBRSxDQUFDO1FBQ3RDLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxlQUFVLEdBQWtCLElBQUksQ0FBQztRQUNqQyxVQUFLLEdBQVEsU0FBUyxDQUFDO1FBQ3ZCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBRS9CLGVBQVUsR0FBeUIsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFHaEQsY0FBUyxHQUFlLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBZXVDLENBQUM7SUFiNUUsSUFBYSxvQkFBb0IsQ0FBQyxLQUE0QjtRQUM1RCxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1NBQzdEO1FBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLEVBQUUsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUN2RSxJQUFJLGlC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OEM7b0JBQzlDLFFBQVEsRUFBRSxRQUFRO2lCQUNuQjsyR0FRNEMscUJBQXFCOzBCQUE3RCxJQUFJOzswQkFBSSxRQUFROzRDQVFmLEtBQUs7c0JBRFIsS0FBSzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSG9zdCxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9wdGlvbmFsLFxyXG4gIFJlbmRlcmVyMixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IEZvcm1Db250cm9sU3RhdGUgfSBmcm9tICcuLi9zdGF0ZSc7XHJcbmltcG9ydCB7IEZvcm1WaWV3QWRhcHRlciwgTkdSWF9GT1JNX1ZJRVdfQURBUFRFUiB9IGZyb20gJy4vdmlldy1hZGFwdGVyJztcclxuXHJcbi8vIHRzbGludDpkaXNhYmxlOmRpcmVjdGl2ZS1jbGFzcy1zdWZmaXhcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ3NlbGVjdDpub3QoW211bHRpcGxlXSlbbmdyeEZvcm1Db250cm9sU3RhdGVdJyxcclxuICBwcm92aWRlcnM6IFt7XHJcbiAgICBwcm92aWRlOiBOR1JYX0ZPUk1fVklFV19BREFQVEVSLFxyXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmdyeFNlbGVjdFZpZXdBZGFwdGVyKSxcclxuICAgIG11bHRpOiB0cnVlLFxyXG4gIH1dLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmdyeFNlbGVjdFZpZXdBZGFwdGVyIGltcGxlbWVudHMgRm9ybVZpZXdBZGFwdGVyLCBBZnRlclZpZXdJbml0IHtcclxuICBwcml2YXRlIHN0YXRlOiBGb3JtQ29udHJvbFN0YXRlPGFueT47XHJcbiAgcHJpdmF0ZSBvcHRpb25NYXA6IHsgW2lkOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG4gIHByaXZhdGUgaWRDb3VudGVyID0gMDtcclxuICBwcml2YXRlIHNlbGVjdGVkSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgdmFsdWU6IGFueSA9IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIG5hdGl2ZUlkV2FzU2V0ID0gZmFsc2U7XHJcblxyXG4gIG9uQ2hhbmdlRm46ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4gdm9pZCAwO1xyXG5cclxuICBASG9zdExpc3RlbmVyKCdibHVyJylcclxuICBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB2b2lkIDBcclxuXHJcbiAgQElucHV0KCkgc2V0IG5ncnhGb3JtQ29udHJvbFN0YXRlKHZhbHVlOiBGb3JtQ29udHJvbFN0YXRlPGFueT4pIHtcclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY29udHJvbCBzdGF0ZSBtdXN0IG5vdCBiZSB1bmRlZmluZWQhJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdGF0ZSA9IHZhbHVlO1xyXG4gICAgY29uc3QgbmF0aXZlSWQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5pZDtcclxuICAgIGNvbnN0IHNob3VsZFNldE5hdGl2ZUlkID0gdmFsdWUuaWQgIT09IG5hdGl2ZUlkICYmIHRoaXMubmF0aXZlSWRXYXNTZXQ7XHJcbiAgICBpZiAoc2hvdWxkU2V0TmF0aXZlSWQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2lkJywgdmFsdWUuaWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLCBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHsgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICBjb25zdCBuYXRpdmVJZCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmlkO1xyXG4gICAgY29uc3Qgc2hvdWxkU2V0TmF0aXZlSWQgPSB0aGlzLnN0YXRlLmlkICE9PSBuYXRpdmVJZCAmJiAhbmF0aXZlSWQ7XHJcbiAgICBpZiAoc2hvdWxkU2V0TmF0aXZlSWQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2lkJywgdGhpcy5zdGF0ZS5pZCk7XHJcbiAgICAgIHRoaXMubmF0aXZlSWRXYXNTZXQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0Vmlld1ZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRJZCA9IHRoaXMuZ2V0T3B0aW9uSWQodmFsdWUpO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJZCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnc2VsZWN0ZWRJbmRleCcsIC0xKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB0aGlzLnNlbGVjdGVkSWQpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignY2hhbmdlJywgWyckZXZlbnQnXSlcclxuICBvbkNoYW5nZSh7IHRhcmdldCB9OiB7IHRhcmdldDogSFRNTE9wdGlvbkVsZW1lbnQgfSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZElkID0gdGFyZ2V0LnZhbHVlO1xyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm9wdGlvbk1hcFt0aGlzLnNlbGVjdGVkSWRdO1xyXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5vbkNoYW5nZUZuKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHNldE9uQ2hhbmdlQ2FsbGJhY2soZm46ICh2YWx1ZTogYW55KSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcclxuICB9XHJcblxyXG4gIHNldE9uVG91Y2hlZENhbGxiYWNrKGZuOiAoKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgc2V0SXNEaXNhYmxlZChpc0Rpc2FibGVkOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZU9wdGlvbklkKCkge1xyXG4gICAgY29uc3QgaWQgPSB0aGlzLmlkQ291bnRlci50b1N0cmluZygpO1xyXG4gICAgdGhpcy5pZENvdW50ZXIgKz0gMTtcclxuICAgIHJldHVybiBpZDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZU9wdGlvblZhbHVlKGlkOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMub3B0aW9uTWFwW2lkXSA9IHZhbHVlO1xyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkSWQgPT09IGlkKSB7XHJcbiAgICAgIHRoaXMub25DaGFuZ2VGbih2YWx1ZSk7XHJcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSB0aGlzLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuc2V0Vmlld1ZhbHVlKHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRlcmVnaXN0ZXJPcHRpb24oaWQ6IHN0cmluZykge1xyXG4gICAgZGVsZXRlIHRoaXMub3B0aW9uTWFwW2lkXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0T3B0aW9uSWQodmFsdWU6IGFueSkge1xyXG4gICAgZm9yIChjb25zdCBpZCBvZiBBcnJheS5mcm9tKE9iamVjdC5rZXlzKHRoaXMub3B0aW9uTWFwKSkpIHtcclxuICAgICAgaWYgKHRoaXMub3B0aW9uTWFwW2lkXSA9PT0gdmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IE5VTExfVklFV19BREFQVEVSOiBOZ3J4U2VsZWN0Vmlld0FkYXB0ZXIgPSB7XHJcbiAgY3JlYXRlT3B0aW9uSWQ6ICgpID0+ICcnLFxyXG4gIGRlcmVnaXN0ZXJPcHRpb246ICgpID0+IHZvaWQgMCxcclxuICB1cGRhdGVPcHRpb25WYWx1ZTogKCkgPT4gdm9pZCAwLFxyXG59IGFzIGFueTtcclxuXHJcbmNvbnN0IE5VTExfUkVOREVSRVI6IFJlbmRlcmVyMiA9IHtcclxuICBzZXRQcm9wZXJ0eTogKCkgPT4gdm9pZCAwLFxyXG59IGFzIGFueTtcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ29wdGlvbicsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3J4U2VsZWN0T3B0aW9uIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICBwcml2YXRlIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBpZDogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIEBIb3N0KCkgQE9wdGlvbmFsKCkgcHJpdmF0ZSB2aWV3QWRhcHRlcjogTmdyeFNlbGVjdFZpZXdBZGFwdGVyLFxyXG4gICkge1xyXG4gICAgdGhpcy5yZW5kZXJlciA9IHZpZXdBZGFwdGVyID8gcmVuZGVyZXIgOiBOVUxMX1JFTkRFUkVSO1xyXG4gICAgdGhpcy52aWV3QWRhcHRlciA9IHZpZXdBZGFwdGVyIHx8IE5VTExfVklFV19BREFQVEVSO1xyXG4gICAgdGhpcy5pZCA9IHRoaXMudmlld0FkYXB0ZXIuY3JlYXRlT3B0aW9uSWQoKTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgndmFsdWUnKVxyXG4gIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAvLyB0aGlzIGNhbm5vdCBiZSBkb25lIGluc2lkZSBuZ09uSW5pdCBzaW5jZSB0aGUgdmFsdWUgcHJvcGVydHlcclxuICAgIC8vIG11c3QgYmUgYWxyZWFkeSBzZXQgd2hlbiB0aGUgb3B0aW9uIHZhbHVlIGlzIHVwZGF0ZWQgaW4gdGhlIHZpZXdcclxuICAgIC8vIGFkYXB0ZXIgYW5kIHRoZSBpbml0aWFsIGJpbmRpbmcgb2YgJ3ZhbHVlJyBoYXBwZW5zIGJlZm9yZVxyXG4gICAgLy8gbmdPbkluaXQgcnVuc1xyXG4gICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdGhpcy5pZCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy52aWV3QWRhcHRlci51cGRhdGVPcHRpb25WYWx1ZSh0aGlzLmlkLCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMudmlld0FkYXB0ZXIuZGVyZWdpc3Rlck9wdGlvbih0aGlzLmlkKTtcclxuICB9XHJcbn1cclxuIl19