UNPKG

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
/** * @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1idXR0b24td2lkZ2V0LWNob29zZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNjaGVtYS1mb3Jtcy8iLCJzb3VyY2VzIjpbImxpYi9mb3JtL2Zvcm0tYnV0dG9uLXdpZGdldC1jaG9vc2VyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLGdCQUFnQixFQUdqQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRS9DLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsNkJBQTZCLEVBQzlCLE1BQU0scURBQXFELENBQUM7O0lBc0IzRCwwQ0FDVSxrQkFDQSxlQUNBLGdCQUNBO1FBSEEscUJBQWdCLEdBQWhCLGdCQUFnQjtRQUNoQixrQkFBYSxHQUFiLGFBQWE7UUFDYixtQkFBYyxHQUFkLGNBQWM7UUFDZCxxQkFBZ0IsR0FBaEIsZ0JBQWdCO0tBQ3JCOzs7O0lBR0wsb0RBQVM7OztJQUFUOztRQUNFLElBQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQztRQUNwQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN4QixNQUFNLENBQUMsRUFBRSxFQUFFLElBQUEsRUFBRSxDQUFDO1NBQ2Y7UUFFRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFD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LENBQUMsWUFBWSxDQUFDO1FBRTFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN4QztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDMUI7O1FBR0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7O1FBR3JELFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7UUFHakQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7S0FDNUI7Ozs7SUFFRCxzREFBVzs7O0lBQVg7UUFDRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQzdCO1FBQ0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDL0I7S0FDRjs7Z0JBL0hGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsNkJBQTZCO2lCQUN4Qzs7OztnQkF6QkMsZ0JBQWdCO2dCQVVULGFBQWE7Z0JBSmIsY0FBYztnQkFVckIsNkJBQTZCOzs7eUJBWTVCLEtBQUs7K0JBR0wsS0FBSzs7O1FBS0wsWUFBWSxFQUFFOzs7MkNBeENqQjs7U0E4QmEsZ0NBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBDb21wb25lbnRSZWYsXG4gIElucHV0LFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBPbkluaXQsXG4gIE9uRGVzdHJveVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZpbHRlciwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEFjdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vbW9kZWwvYWN0aW9ucmVnaXN0cnknO1xuaW1wb3J0IHsgQWN0aW9uLCBBY3Rpb25FdmVudCB9IGZyb20gJy4uL21vZGVsL2FjdGlvbic7XG5pbXBvcnQgeyBGb3JtUHJvcGVydHkgfSBmcm9tICcuLi9tb2RlbC9mb3JtLXByb3BlcnR5JztcbmltcG9ydCB7IFVuc3Vic2NyaWJlciB9IGZyb20gJy4uL3Vuc3Vic2NyaWJlcic7XG5pbXBvcnQgeyBXaWRnZXRGYWN0b3J5IH0gZnJvbSAnLi4vd2lkZ2V0ZmFjdG9yeSc7XG5pbXBvcnQgeyBCdXR0b25XaWRnZXQgfSBmcm9tICcuLi93aWRnZXRzL2Jhc2UnO1xuaW1wb3J0IHsgV2lkZ2V0VHlwZSB9IGZyb20gJy4uL3dpZGdldHJlZ2lzdHJ5JztcbmltcG9ydCB7IFdpZGdldCB9IGZyb20gJy4uL3dpZGdldHMvYmFzZS93aWRnZXQnO1xuaW1wb3J0IHtcbiAgVGVtcGxhdGVFbGVtZW50VHlwZSxcbiAgVGVtcGxhdGVTY2hlbWFFbGVtZW50UmVnaXN0cnlcbn0gZnJvbSAnLi4vdGVtcGxhdGUtc2NoZW1hL3RlbXBsYXRlLXNjaGVtYS1lbGVtZW50LXJlZ2lzdHJ5JztcbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudFxufSBmcm9tICcuLi90ZW1wbGF0ZS1zY2hlbWEvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuXG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tzZkZvcm1CdXR0b25XaWRnZXRDaG9vc2VyXSdcbn0pXG5leHBvcnQgY2xhc3MgRm9ybUJ1dHRvbldpZGdldENob29zZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KClcbiAgYnV0dG9uOiBCdXR0b25XaWRnZXQ7IC8vIGZyb20gc2NoZW1hXG5cbiAgQElucHV0KClcbiAgZm9ybVByb3BlcnR5OiBGb3JtUHJvcGVydHk7XG5cbiAgcHJpdmF0ZSBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxCdXR0b25XaWRnZXQ+O1xuXG4gIEBVbnN1YnNjcmliZXIoKVxuICBwcml2YXRlIHN1YnM7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgd2lkZ2V0RmFjdG9yeTogV2lkZ2V0RmFjdG9yeSxcbiAgICBwcml2YXRlIGFjdGlvblJlZ2lzdHJ5OiBBY3Rpb25SZWdpc3RyeSxcbiAgICBwcml2YXRlIHRlbXBsYXRlUmVnaXN0cnk6IFRlbXBsYXRlU2NoZW1hRWxlbWVudFJlZ2lzdHJ5XG4gICkgeyB9XG5cblxuICBnZXRXaWRnZXQoKTogV2lkZ2V0ICB7XG4gICAgY29uc3QgaWQgPSAnYnV0dG9uJztcbiAgICBpZiAoIXRoaXMuYnV0dG9uLndpZGdldCkge1xuICAgICAgcmV0dXJuIHsgaWQgfTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYnV0dG9uLndpZGdldC5pZCkge1xuICAgICAgdGhpcy5idXR0b24ud2lkZ2V0LmlkID0gaWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uLndpZGdldDtcbiAgfVxuXG4gIGdldEJ1dHRvbkFjdGlvbih3aWRnZXRJbnN0YW5jZTogQnV0dG9uV2lkZ2V0KTogKGV2ZW50LCBwYXJhbXM/KSA9PiB2b2lkIHtcblxuICAgIHJldHVybiAoZXZlbnQsIHBhcmFtcz8pOiB2b2lkID0+IHtcblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuYnV0dG9uLm9wdGlvbnM7XG4gICAgICBpZiAodGhpcy5mb3JtUHJvcGVydHkuaW52YWxpZCAmJiBvcHRpb25zLm9uSW52YWxpZEZvcm1Qcm9wZXJ0eS5wcmV2ZW50Q2xpY2spIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFjdGlvblJlZ2lzdHJ5LmdldCh0aGlzLmJ1dHRvbi5pZCk7XG4gICAgICBpZiAoIWFjdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFjdGlvbih7IGV2ZW50LCBmb3JtUHJvcGVydHk6IHRoaXMuZm9ybVByb3BlcnR5IH0sIHBhcmFtcyk7XG5cbiAgICAgIGlmIChldmVudC5oYXNPd25Qcm9wZXJ0eSgncHJldmVudERlZmF1bHQnKSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgfVxuXG4gIGJpbmRUZW1wbGF0ZUNoYW5nZXMoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMudGVtcGxhdGVSZWdpc3RyeS5nZXRFbGVtZW50PEJ1dHRvbkNvbXBvbmVudD4oXG4gICAgICB0aGlzLmJ1dHRvbi5pZCxcbiAgICAgIFRlbXBsYXRlRWxlbWVudFR5cGUuQnV0dG9uXG4gICAgKTtcblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHRlbXBsYXRlU2NoZW1hIGJ1dHRvbiBjaGFuZ2VzXG4gICAgdGhpcy5zdWJzID0gZWxlbWVudC5jaGFuZ2VzLnN1YnNjcmliZSgoYnV0dG9uKSA9PiB7XG5cbiAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2U7XG4gICAgICAvLyBUT0RPIG1ha2Ugc3VyZSB3aWRnZXQgaWQgaXMgbm90IGNoYW5nZWRcbiAgICAgIC8vIFRPRE8gd2lkZ2V0IGlkIGNoYW5nZSBzaG91bGQgdHJpZ2dlciBhIGZvcm0gcmVidWlsZFxuICAgICAgaW5zdGFuY2UubGFiZWwgPSBidXR0b24ubGFiZWw7XG4gICAgICBpZiAodHlwZW9mIGJ1dHRvbi53aWRnZXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2Uud2lkZ2V0LCBidXR0b24ud2lkZ2V0KTtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZS5vcHRpb25zLCBidXR0b24ub3B0aW9ucyk7XG4gICAgICAvLyBUT0RPIGRvbnQgcmVidWlsZCBpZiB0aGVyZSBpcyBubyBjaGFuZ2VzXG4gICAgICAvLyByZWJ1aWxkIGFjdGlvbiBpbiBjYXNlIG9uSW52YWxpZFByb3BlcnR5IGNoYW5nZWRcbiAgICAgIGluc3RhbmNlLmFjdGlvbiA9IHRoaXMuZ2V0QnV0dG9uQWN0aW9uKGluc3RhbmNlKTtcblxuICAgICAgdGhpcy5jb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3Qgd2lkZ2V0ID0gdGhpcy5nZXRXaWRnZXQoKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZiA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVXaWRnZXQ8QnV0dG9uV2lkZ2V0PihcbiAgICAgIHRoaXMudmlld0NvbnRhaW5lclJlZixcbiAgICAgIHdpZGdldC5pZCxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogV2lkZ2V0VHlwZS5CdXR0b25cbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZTtcbiAgICBpbnN0YW5jZS5sYWJlbCA9IHRoaXMuYnV0dG9uLmxhYmVsO1xuICAgIGluc3RhbmNlLmZvcm1Qcm9wZXJ0eSA9IHRoaXMuZm9ybVByb3BlcnR5O1xuXG4gICAgaWYgKGluc3RhbmNlLndpZGdldCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZS53aWRnZXQsIHdpZGdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlLndpZGdldCA9IHdpZGdldDtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgaW5zdGFuY2Ugb3B0aW9ucywgd2l0aCBzY2hlbWEgb3B0aW9uc1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2Uub3B0aW9ucywgdGhpcy5idXR0b24ub3B0aW9ucyk7XG5cbiAgICAvLyBhZnRlciB3aWRnZXQgaGFzIGJlZW4gbWVyZ2VkIHdpdGggZGVmYXVsdHNcbiAgICBpbnN0YW5jZS5hY3Rpb24gPSB0aGlzLmdldEJ1dHRvbkFjdGlvbihpbnN0YW5jZSk7XG5cbiAgICAvLyByZWFjdCB0byB0ZW1wbGF0ZVNjaGVtYSBidXR0b24gY2hhbmdlc1xuICAgIHRoaXMuYmluZFRlbXBsYXRlQ2hhbmdlcygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50UmVmKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdDb250YWluZXJSZWYpIHtcbiAgICAgIHRoaXMudmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xuICAgIH1cbiAgfVxufVxuIl19