ngx-schema-forms
Version:
New features: - Ajv schema validator. - Angular forms compatible: Property tree is created using FormGroup, FormArray and FormControl classes. - Array now properly loads initial data from model. - WidgetTyep: WidgetRegistry now supports WidgetType, now wo
179 lines (178 loc) • 16.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Directive, Input, ViewContainerRef } from '@angular/core';
import { ActionRegistry } from '../model/actionregistry';
import { Unsubscriber } from '../unsubscriber';
import { WidgetFactory } from '../widgetfactory';
import { ButtonWidget } from '../widgets/base';
import { WidgetType } from '../widgetregistry';
import { TemplateElementType, TemplateSchemaElementRegistry } from '../template-schema/template-schema-element-registry';
var FormButtonWidgetChooserDirective = /** @class */ (function () {
function FormButtonWidgetChooserDirective(viewContainerRef, widgetFactory, actionRegistry, templateRegistry) {
this.viewContainerRef = viewContainerRef;
this.widgetFactory = widgetFactory;
this.actionRegistry = actionRegistry;
this.templateRegistry = templateRegistry;
}
/**
* @return {?}
*/
FormButtonWidgetChooserDirective.prototype.getWidget = /**
* @return {?}
*/
function () {
/** @type {?} */
var id = 'button';
if (!this.button.widget) {
return { id: id };
}
if (!this.button.widget.id) {
this.button.widget.id = id;
}
return this.button.widget;
};
/**
* @param {?} widgetInstance
* @return {?}
*/
FormButtonWidgetChooserDirective.prototype.getButtonAction = /**
* @param {?} widgetInstance
* @return {?}
*/
function (widgetInstance) {
var _this = this;
return function (event, params) {
/** @type {?} */
var options = _this.button.options;
if (_this.formProperty.invalid && options.onInvalidFormProperty.preventClick) {
return;
}
/** @type {?} */
var action = _this.actionRegistry.get(_this.button.id);
if (!action) {
return;
}
action({ event: event, formProperty: _this.formProperty }, params);
if (event.hasOwnProperty('preventDefault')) {
event.preventDefault();
}
};
};
/**
* @return {?}
*/
FormButtonWidgetChooserDirective.prototype.bindTemplateChanges = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var element = this.templateRegistry.getElement(this.button.id, TemplateElementType.Button);
if (!element) {
return;
}
// templateSchema button changes
this.subs = element.changes.subscribe(function (button) {
/** @type {?} */
var instance = _this.componentRef.instance;
// TODO make sure widget id is not changed
// TODO widget id change should trigger a form rebuild
instance.label = button.label;
if (typeof button.widget !== 'string') {
Object.assign(instance.widget, button.widget);
}
Object.assign(instance.options, button.options);
// TODO dont rebuild if there is no changes
// rebuild action in case onInvalidProperty changed
instance.action = _this.getButtonAction(instance);
_this.componentRef.changeDetectorRef.detectChanges();
});
};
/**
* @return {?}
*/
FormButtonWidgetChooserDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
/** @type {?} */
var widget = this.getWidget();
this.componentRef = this.widgetFactory.createWidget(this.viewContainerRef, widget.id, {
type: WidgetType.Button
});
/** @type {?} */
var instance = this.componentRef.instance;
instance.label = this.button.label;
instance.formProperty = this.formProperty;
if (instance.widget) {
Object.assign(instance.widget, widget);
}
else {
instance.widget = widget;
}
// update instance options, with schema options
Object.assign(instance.options, this.button.options);
// after widget has been merged with defaults
instance.action = this.getButtonAction(instance);
// react to templateSchema button changes
this.bindTemplateChanges();
};
/**
* @return {?}
*/
FormButtonWidgetChooserDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this.componentRef) {
this.componentRef.destroy();
}
if (this.viewContainerRef) {
this.viewContainerRef.clear();
}
};
FormButtonWidgetChooserDirective.decorators = [
{ type: Directive, args: [{
selector: '[sfFormButtonWidgetChooser]'
},] }
];
/** @nocollapse */
FormButtonWidgetChooserDirective.ctorParameters = function () { return [
{ type: ViewContainerRef },
{ type: WidgetFactory },
{ type: ActionRegistry },
{ type: TemplateSchemaElementRegistry }
]; };
FormButtonWidgetChooserDirective.propDecorators = {
button: [{ type: Input }],
formProperty: [{ type: Input }]
};
tslib_1.__decorate([
Unsubscriber(),
tslib_1.__metadata("design:type", Object)
], FormButtonWidgetChooserDirective.prototype, "subs", void 0);
return FormButtonWidgetChooserDirective;
}());
export { FormButtonWidgetChooserDirective };
if (false) {
/** @type {?} */
FormButtonWidgetChooserDirective.prototype.button;
/** @type {?} */
FormButtonWidgetChooserDirective.prototype.formProperty;
/** @type {?} */
FormButtonWidgetChooserDirective.prototype.componentRef;
/** @type {?} */
FormButtonWidgetChooserDirective.prototype.subs;
/** @type {?} */
FormButtonWidgetChooserDirective.prototype.viewContainerRef;
/** @type {?} */
FormButtonWidgetChooserDirective.prototype.widgetFactory;
/** @type {?} */
FormButtonWidgetChooserDirective.prototype.actionRegistry;
/** @type {?} */
FormButtonWidgetChooserDirective.prototype.templateRegistry;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1idXR0b24td2lkZ2V0LWNob29zZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNjaGVtYS1mb3Jtcy8iLCJzb3VyY2VzIjpbImxpYi9mb3JtL2Zvcm0tYnV0dG9uLXdpZGdldC1jaG9vc2VyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLGdCQUFnQixFQUdqQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRS9DLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsNkJBQTZCLEVBQzlCLE1BQU0scURBQXFELENBQUM7O0lBc0IzRCwwQ0FDVSxrQkFDQSxlQUNBLGdCQUNBO1FBSEEscUJBQWdCLEdBQWhCLGdCQUFnQjtRQUNoQixrQkFBYSxHQUFiLGFBQWE7UUFDYixtQkFBYyxHQUFkLGNBQWM7UUFDZCxxQkFBZ0IsR0FBaEIsZ0JBQWdCO0tBQ3JCOzs7O0lBR0wsb0RBQVM7OztJQUFUOztRQUNFLElBQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQztRQUNwQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN4QixNQUFNLENBQUMsRUFBRSxFQUFFLElBQUEsRUFBRSxDQUFDO1NBQ2Y7UUFFRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztTQUM1QjtRQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztLQUMzQjs7Ozs7SUFFRCwwREFBZTs7OztJQUFmLFVBQWdCLGNBQTRCO1FBQTVDLGlCQXFCQztRQW5CQyxNQUFNLENBQUMsVUFBQyxLQUFLLEVBQUUsTUFBTzs7WUFFcEIsSUFBTSxPQUFPLEdBQUcsS0FBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDcEMsRUFBRSxDQUFDLENBQUMsS0FBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQzVFLE1BQU0sQ0FBQzthQUNSOztZQUVELElBQU0sTUFBTSxHQUFHLEtBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkQsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNaLE1BQU0sQ0FBQzthQUNSO1lBRUQsTUFBTSxDQUFDLEVBQUUsS0FBSyxPQUFBLEVBQUUsWUFBWSxFQUFFLEtBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUUzRCxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDeEI7U0FDRixDQUFDO0tBRUg7Ozs7SUFFRCw4REFBbUI7OztJQUFuQjtRQUFBLGlCQTRCQzs7UUEzQkMsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FDOUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQ2QsbUJBQW1CLENBQUMsTUFBTSxDQUMzQixDQUFDO1FBRUYsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2IsTUFBTSxDQUFDO1NBQ1I7O1FBR0QsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFDLE1BQU07O1lBRTNDLElBQU0sUUFBUSxHQUFHLEtBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDOzs7WUFHNUMsUUFBUSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQzlCLEVBQUUsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQy9DO1lBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQzs7O1lBR2hELFFBQVEsQ0FBQyxNQUFNLEdBQUcsS0FBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVqRCxLQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3JELENBQUMsQ0FBQztLQUNKOzs7O0lBRUQsbURBQVE7OztJQUFSOztRQUNFLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUNqRCxJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLE1BQU0sQ0FBQyxFQUFFLEVBQ1Q7WUFDRSxJQUFJLEVBQUUsVUFBVSxDQUFDLE1BQU07U0FDeEIsQ0FDRixDQUFDOztRQUVGLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO1FBQzVDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDbkMsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRTFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN4QztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDMUI7O1FBR0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7O1FBR3JELFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7UUFHakQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7S0FDNUI7Ozs7SUFFRCxzREFBVzs7O0lBQVg7UUFDRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQzdCO1FBQ0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDL0I7S0FDRjs7Z0JBL0hGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsNkJBQTZCO2lCQUN4Qzs7OztnQkF6QkMsZ0JBQWdCO2dCQVVULGFBQWE7Z0JBSmIsY0FBYztnQkFVckIsNkJBQTZCOzs7eUJBWTVCLEtBQUs7K0JBR0wsS0FBSzs7O1FBS0wsWUFBWSxFQUFFOzs7MkNBeENqQjs7U0E4QmEsZ0NBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBDb21wb25lbnRSZWYsXG4gIElucHV0LFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBPbkluaXQsXG4gIE9uRGVzdHJveVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZpbHRlciwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEFjdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vbW9kZWwvYWN0aW9ucmVnaXN0cnknO1xuaW1wb3J0IHsgQWN0aW9uLCBBY3Rpb25FdmVudCB9IGZyb20gJy4uL21vZGVsL2FjdGlvbic7XG5pbXBvcnQgeyBGb3JtUHJvcGVydHkgfSBmcm9tICcuLi9tb2RlbC9mb3JtLXByb3BlcnR5JztcbmltcG9ydCB7IFVuc3Vic2NyaWJlciB9IGZyb20gJy4uL3Vuc3Vic2NyaWJlcic7XG5pbXBvcnQgeyBXaWRnZXRGYWN0b3J5IH0gZnJvbSAnLi4vd2lkZ2V0ZmFjdG9yeSc7XG5pbXBvcnQgeyBCdXR0b25XaWRnZXQgfSBmcm9tICcuLi93aWRnZXRzL2Jhc2UnO1xuaW1wb3J0IHsgV2lkZ2V0VHlwZSB9IGZyb20gJy4uL3dpZGdldHJlZ2lzdHJ5JztcbmltcG9ydCB7IFdpZGdldCB9IGZyb20gJy4uL3dpZGdldHMvYmFzZS93aWRnZXQnO1xuaW1wb3J0IHtcbiAgVGVtcGxhdGVFbGVtZW50VHlwZSxcbiAgVGVtcGxhdGVTY2hlbWFFbGVtZW50UmVnaXN0cnlcbn0gZnJvbSAnLi4vdGVtcGxhdGUtc2NoZW1hL3RlbXBsYXRlLXNjaGVtYS1lbGVtZW50LXJlZ2lzdHJ5JztcbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudFxufSBmcm9tICcuLi90ZW1wbGF0ZS1zY2hlbWEvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuXG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tzZkZvcm1CdXR0b25XaWRnZXRDaG9vc2VyXSdcbn0pXG5leHBvcnQgY2xhc3MgRm9ybUJ1dHRvbldpZGdldENob29zZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KClcbiAgYnV0dG9uOiBCdXR0b25XaWRnZXQ7IC8vIGZyb20gc2NoZW1hXG5cbiAgQElucHV0KClcbiAgZm9ybVByb3BlcnR5OiBGb3JtUHJvcGVydHk7XG5cbiAgcHJpdmF0ZSBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxCdXR0b25XaWRnZXQ+O1xuXG4gIEBVbnN1YnNjcmliZXIoKVxuICBwcml2YXRlIHN1YnM7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgd2lkZ2V0RmFjdG9yeTogV2lkZ2V0RmFjdG9yeSxcbiAgICBwcml2YXRlIGFjdGlvblJlZ2lzdHJ5OiBBY3Rpb25SZWdpc3RyeSxcbiAgICBwcml2YXRlIHRlbXBsYXRlUmVnaXN0cnk6IFRlbXBsYXRlU2NoZW1hRWxlbWVudFJlZ2lzdHJ5XG4gICkgeyB9XG5cblxuICBnZXRXaWRnZXQoKTogV2lkZ2V0ICB7XG4gICAgY29uc3QgaWQgPSAnYnV0dG9uJztcbiAgICBpZiAoIXRoaXMuYnV0dG9uLndpZGdldCkge1xuICAgICAgcmV0dXJuIHsgaWQgfTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYnV0dG9uLndpZGdldC5pZCkge1xuICAgICAgdGhpcy5idXR0b24ud2lkZ2V0LmlkID0gaWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uLndpZGdldDtcbiAgfVxuXG4gIGdldEJ1dHRvbkFjdGlvbih3aWRnZXRJbnN0YW5jZTogQnV0dG9uV2lkZ2V0KTogKGV2ZW50LCBwYXJhbXM/KSA9PiB2b2lkIHtcblxuICAgIHJldHVybiAoZXZlbnQsIHBhcmFtcz8pOiB2b2lkID0+IHtcblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuYnV0dG9uLm9wdGlvbnM7XG4gICAgICBpZiAodGhpcy5mb3JtUHJvcGVydHkuaW52YWxpZCAmJiBvcHRpb25zLm9uSW52YWxpZEZvcm1Qcm9wZXJ0eS5wcmV2ZW50Q2xpY2spIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFjdGlvblJlZ2lzdHJ5LmdldCh0aGlzLmJ1dHRvbi5pZCk7XG4gICAgICBpZiAoIWFjdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFjdGlvbih7IGV2ZW50LCBmb3JtUHJvcGVydHk6IHRoaXMuZm9ybVByb3BlcnR5IH0sIHBhcmFtcyk7XG5cbiAgICAgIGlmIChldmVudC5oYXNPd25Qcm9wZXJ0eSgncHJldmVudERlZmF1bHQnKSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgfVxuXG4gIGJpbmRUZW1wbGF0ZUNoYW5nZXMoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMudGVtcGxhdGVSZWdpc3RyeS5nZXRFbGVtZW50PEJ1dHRvbkNvbXBvbmVudD4oXG4gICAgICB0aGlzLmJ1dHRvbi5pZCxcbiAgICAgIFRlbXBsYXRlRWxlbWVudFR5cGUuQnV0dG9uXG4gICAgKTtcblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHRlbXBsYXRlU2NoZW1hIGJ1dHRvbiBjaGFuZ2VzXG4gICAgdGhpcy5zdWJzID0gZWxlbWVudC5jaGFuZ2VzLnN1YnNjcmliZSgoYnV0dG9uKSA9PiB7XG5cbiAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2U7XG4gICAgICAvLyBUT0RPIG1ha2Ugc3VyZSB3aWRnZXQgaWQgaXMgbm90IGNoYW5nZWRcbiAgICAgIC8vIFRPRE8gd2lkZ2V0IGlkIGNoYW5nZSBzaG91bGQgdHJpZ2dlciBhIGZvcm0gcmVidWlsZFxuICAgICAgaW5zdGFuY2UubGFiZWwgPSBidXR0b24ubGFiZWw7XG4gICAgICBpZiAodHlwZW9mIGJ1dHRvbi53aWRnZXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2Uud2lkZ2V0LCBidXR0b24ud2lkZ2V0KTtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZS5vcHRpb25zLCBidXR0b24ub3B0aW9ucyk7XG4gICAgICAvLyBUT0RPIGRvbnQgcmVidWlsZCBpZiB0aGVyZSBpcyBubyBjaGFuZ2VzXG4gICAgICAvLyByZWJ1aWxkIGFjdGlvbiBpbiBjYXNlIG9uSW52YWxpZFByb3BlcnR5IGNoYW5nZWRcbiAgICAgIGluc3RhbmNlLmFjdGlvbiA9IHRoaXMuZ2V0QnV0dG9uQWN0aW9uKGluc3RhbmNlKTtcblxuICAgICAgdGhpcy5jb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3Qgd2lkZ2V0ID0gdGhpcy5nZXRXaWRnZXQoKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZiA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVXaWRnZXQ8QnV0dG9uV2lkZ2V0PihcbiAgICAgIHRoaXMudmlld0NvbnRhaW5lclJlZixcbiAgICAgIHdpZGdldC5pZCxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogV2lkZ2V0VHlwZS5CdXR0b25cbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZTtcbiAgICBpbnN0YW5jZS5sYWJlbCA9IHRoaXMuYnV0dG9uLmxhYmVsO1xuICAgIGluc3RhbmNlLmZvcm1Qcm9wZXJ0eSA9IHRoaXMuZm9ybVByb3BlcnR5O1xuXG4gICAgaWYgKGluc3RhbmNlLndpZGdldCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZS53aWRnZXQsIHdpZGdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlLndpZGdldCA9IHdpZGdldDtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgaW5zdGFuY2Ugb3B0aW9ucywgd2l0aCBzY2hlbWEgb3B0aW9uc1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2Uub3B0aW9ucywgdGhpcy5idXR0b24ub3B0aW9ucyk7XG5cbiAgICAvLyBhZnRlciB3aWRnZXQgaGFzIGJlZW4gbWVyZ2VkIHdpdGggZGVmYXVsdHNcbiAgICBpbnN0YW5jZS5hY3Rpb24gPSB0aGlzLmdldEJ1dHRvbkFjdGlvbihpbnN0YW5jZSk7XG5cbiAgICAvLyByZWFjdCB0byB0ZW1wbGF0ZVNjaGVtYSBidXR0b24gY2hhbmdlc1xuICAgIHRoaXMuYmluZFRlbXBsYXRlQ2hhbmdlcygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50UmVmKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdDb250YWluZXJSZWYpIHtcbiAgICAgIHRoaXMudmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xuICAgIH1cbiAgfVxufVxuIl19