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

165 lines (164 loc) 15.7 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'; export class FormButtonWidgetChooserDirective { /** * @param {?} viewContainerRef * @param {?} widgetFactory * @param {?} actionRegistry * @param {?} templateRegistry */ constructor(viewContainerRef, widgetFactory, actionRegistry, templateRegistry) { this.viewContainerRef = viewContainerRef; this.widgetFactory = widgetFactory; this.actionRegistry = actionRegistry; this.templateRegistry = templateRegistry; } /** * @return {?} */ getWidget() { /** @type {?} */ const id = 'button'; if (!this.button.widget) { return { id }; } if (!this.button.widget.id) { this.button.widget.id = id; } return this.button.widget; } /** * @param {?} widgetInstance * @return {?} */ getButtonAction(widgetInstance) { return (event, params) => { /** @type {?} */ const options = this.button.options; if (this.formProperty.invalid && options.onInvalidFormProperty.preventClick) { return; } /** @type {?} */ const action = this.actionRegistry.get(this.button.id); if (!action) { return; } action({ event, formProperty: this.formProperty }, params); if (event.hasOwnProperty('preventDefault')) { event.preventDefault(); } }; } /** * @return {?} */ bindTemplateChanges() { /** @type {?} */ const element = this.templateRegistry.getElement(this.button.id, TemplateElementType.Button); if (!element) { return; } // templateSchema button changes this.subs = element.changes.subscribe((button) => { /** @type {?} */ const 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 {?} */ ngOnInit() { /** @type {?} */ const widget = this.getWidget(); this.componentRef = this.widgetFactory.createWidget(this.viewContainerRef, widget.id, { type: WidgetType.Button }); /** @type {?} */ const 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 {?} */ ngOnDestroy() { if (this.componentRef) { this.componentRef.destroy(); } if (this.viewContainerRef) { this.viewContainerRef.clear(); } } } FormButtonWidgetChooserDirective.decorators = [ { type: Directive, args: [{ selector: '[sfFormButtonWidgetChooser]' },] } ]; /** @nocollapse */ FormButtonWidgetChooserDirective.ctorParameters = () => [ { 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); 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1idXR0b24td2lkZ2V0LWNob29zZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNjaGVtYS1mb3Jtcy8iLCJzb3VyY2VzIjpbImxpYi9mb3JtL2Zvcm0tYnV0dG9uLXdpZGdldC1jaG9vc2VyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLGdCQUFnQixFQUdqQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRS9DLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsNkJBQTZCLEVBQzlCLE1BQU0scURBQXFELENBQUM7QUFTN0QsTUFBTTs7Ozs7OztJQWFKLFlBQ1Usa0JBQ0EsZUFDQSxnQkFDQTtRQUhBLHFCQUFnQixHQUFoQixnQkFBZ0I7UUFDaEIsa0JBQWEsR0FBYixhQUFhO1FBQ2IsbUJBQWMsR0FBZCxjQUFjO1FBQ2QscUJBQWdCLEdBQWhCLGdCQUFnQjtLQUNyQjs7OztJQUdMLFNBQVM7O1FBQ1AsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDO1FBQ3BCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO1NBQ2Y7UUFFRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFD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LFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN4QztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDMUI7O1FBR0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7O1FBR3JELFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7UUFHakQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7S0FDNUI7Ozs7SUFFRCxXQUFXO1FBQ1QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUM3QjtRQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1NBQy9CO0tBQ0Y7OztZQS9IRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDZCQUE2QjthQUN4Qzs7OztZQXpCQyxnQkFBZ0I7WUFVVCxhQUFhO1lBSmIsY0FBYztZQVVyQiw2QkFBNkI7OztxQkFZNUIsS0FBSzsyQkFHTCxLQUFLOzs7SUFLTCxZQUFZLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIENvbXBvbmVudFJlZixcbiAgSW5wdXQsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZmlsdGVyLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQWN0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi9tb2RlbC9hY3Rpb25yZWdpc3RyeSc7XG5pbXBvcnQgeyBBY3Rpb24sIEFjdGlvbkV2ZW50IH0gZnJvbSAnLi4vbW9kZWwvYWN0aW9uJztcbmltcG9ydCB7IEZvcm1Qcm9wZXJ0eSB9IGZyb20gJy4uL21vZGVsL2Zvcm0tcHJvcGVydHknO1xuaW1wb3J0IHsgVW5zdWJzY3JpYmVyIH0gZnJvbSAnLi4vdW5zdWJzY3JpYmVyJztcbmltcG9ydCB7IFdpZGdldEZhY3RvcnkgfSBmcm9tICcuLi93aWRnZXRmYWN0b3J5JztcbmltcG9ydCB7IEJ1dHRvbldpZGdldCB9IGZyb20gJy4uL3dpZGdldHMvYmFzZSc7XG5pbXBvcnQgeyBXaWRnZXRUeXBlIH0gZnJvbSAnLi4vd2lkZ2V0cmVnaXN0cnknO1xuaW1wb3J0IHsgV2lkZ2V0IH0gZnJvbSAnLi4vd2lkZ2V0cy9iYXNlL3dpZGdldCc7XG5pbXBvcnQge1xuICBUZW1wbGF0ZUVsZW1lbnRUeXBlLFxuICBUZW1wbGF0ZVNjaGVtYUVsZW1lbnRSZWdpc3RyeVxufSBmcm9tICcuLi90ZW1wbGF0ZS1zY2hlbWEvdGVtcGxhdGUtc2NoZW1hLWVsZW1lbnQtcmVnaXN0cnknO1xuaW1wb3J0IHtcbiAgQnV0dG9uQ29tcG9uZW50XG59IGZyb20gJy4uL3RlbXBsYXRlLXNjaGVtYS9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3NmRm9ybUJ1dHRvbldpZGdldENob29zZXJdJ1xufSlcbmV4cG9ydCBjbGFzcyBGb3JtQnV0dG9uV2lkZ2V0Q2hvb3NlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoKVxuICBidXR0b246IEJ1dHRvbldpZGdldDsgLy8gZnJvbSBzY2hlbWFcblxuICBASW5wdXQoKVxuICBmb3JtUHJvcGVydHk6IEZvcm1Qcm9wZXJ0eTtcblxuICBwcml2YXRlIGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPEJ1dHRvbldpZGdldD47XG5cbiAgQFVuc3Vic2NyaWJlcigpXG4gIHByaXZhdGUgc3VicztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSB3aWRnZXRGYWN0b3J5OiBXaWRnZXRGYWN0b3J5LFxuICAgIHByaXZhdGUgYWN0aW9uUmVnaXN0cnk6IEFjdGlvblJlZ2lzdHJ5LFxuICAgIHByaXZhdGUgdGVtcGxhdGVSZWdpc3RyeTogVGVtcGxhdGVTY2hlbWFFbGVtZW50UmVnaXN0cnlcbiAgKSB7IH1cblxuXG4gIGdldFdpZGdldCgpOiBXaWRnZXQgIHtcbiAgICBjb25zdCBpZCA9ICdidXR0b24nO1xuICAgIGlmICghdGhpcy5idXR0b24ud2lkZ2V0KSB7XG4gICAgICByZXR1cm4geyBpZCB9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5idXR0b24ud2lkZ2V0LmlkKSB7XG4gICAgICB0aGlzLmJ1dHRvbi53aWRnZXQuaWQgPSBpZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5idXR0b24ud2lkZ2V0O1xuICB9XG5cbiAgZ2V0QnV0dG9uQWN0aW9uKHdpZGdldEluc3RhbmNlOiBCdXR0b25XaWRnZXQpOiAoZXZlbnQsIHBhcmFtcz8pID0+IHZvaWQge1xuXG4gICAgcmV0dXJuIChldmVudCwgcGFyYW1zPyk6IHZvaWQgPT4ge1xuXG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5idXR0b24ub3B0aW9ucztcbiAgICAgIGlmICh0aGlzLmZvcm1Qcm9wZXJ0eS5pbnZhbGlkICYmIG9wdGlvbnMub25JbnZhbGlkRm9ybVByb3BlcnR5LnByZXZlbnRDbGljaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuYWN0aW9uUmVnaXN0cnkuZ2V0KHRoaXMuYnV0dG9uLmlkKTtcbiAgICAgIGlmICghYWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYWN0aW9uKHsgZXZlbnQsIGZvcm1Qcm9wZXJ0eTogdGhpcy5mb3JtUHJvcGVydHkgfSwgcGFyYW1zKTtcblxuICAgICAgaWYgKGV2ZW50Lmhhc093blByb3BlcnR5KCdwcmV2ZW50RGVmYXVsdCcpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICB9XG5cbiAgYmluZFRlbXBsYXRlQ2hhbmdlcygpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy50ZW1wbGF0ZVJlZ2lzdHJ5LmdldEVsZW1lbnQ8QnV0dG9uQ29tcG9uZW50PihcbiAgICAgIHRoaXMuYnV0dG9uLmlkLFxuICAgICAgVGVtcGxhdGVFbGVtZW50VHlwZS5CdXR0b25cbiAgICApO1xuXG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdGVtcGxhdGVTY2hlbWEgYnV0dG9uIGNoYW5nZXNcbiAgICB0aGlzLnN1YnMgPSBlbGVtZW50LmNoYW5nZXMuc3Vic2NyaWJlKChidXR0b24pID0+IHtcblxuICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZTtcbiAgICAgIC8vIFRPRE8gbWFrZSBzdXJlIHdpZGdldCBpZCBpcyBub3QgY2hhbmdlZFxuICAgICAgLy8gVE9ETyB3aWRnZXQgaWQgY2hhbmdlIHNob3VsZCB0cmlnZ2VyIGEgZm9ybSByZWJ1aWxkXG4gICAgICBpbnN0YW5jZS5sYWJlbCA9IGJ1dHRvbi5sYWJlbDtcbiAgICAgIGlmICh0eXBlb2YgYnV0dG9uLndpZGdldCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZS53aWRnZXQsIGJ1dHRvbi53aWRnZXQpO1xuICAgICAgfVxuXG4gICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLm9wdGlvbnMsIGJ1dHRvbi5vcHRpb25zKTtcbiAgICAgIC8vIFRPRE8gZG9udCByZWJ1aWxkIGlmIHRoZXJlIGlzIG5vIGNoYW5nZXNcbiAgICAgIC8vIHJlYnVpbGQgYWN0aW9uIGluIGNhc2Ugb25JbnZhbGlkUHJvcGVydHkgY2hhbmdlZFxuICAgICAgaW5zdGFuY2UuYWN0aW9uID0gdGhpcy5nZXRCdXR0b25BY3Rpb24oaW5zdGFuY2UpO1xuXG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCB3aWRnZXQgPSB0aGlzLmdldFdpZGdldCgpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVdpZGdldDxCdXR0b25XaWRnZXQ+KFxuICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLFxuICAgICAgd2lkZ2V0LmlkLFxuICAgICAge1xuICAgICAgICB0eXBlOiBXaWRnZXRUeXBlLkJ1dHRvblxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlO1xuICAgIGluc3RhbmNlLmxhYmVsID0gdGhpcy5idXR0b24ubGFiZWw7XG4gICAgaW5zdGFuY2UuZm9ybVByb3BlcnR5ID0gdGhpcy5mb3JtUHJvcGVydHk7XG5cbiAgICBpZiAoaW5zdGFuY2Uud2lkZ2V0KSB7XG4gICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLndpZGdldCwgd2lkZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2Uud2lkZ2V0ID0gd2lkZ2V0O1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBpbnN0YW5jZSBvcHRpb25zLCB3aXRoIHNjaGVtYSBvcHRpb25zXG4gICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZS5vcHRpb25zLCB0aGlzLmJ1dHRvbi5vcHRpb25zKTtcblxuICAgIC8vIGFmdGVyIHdpZGdldCBoYXMgYmVlbiBtZXJnZWQgd2l0aCBkZWZhdWx0c1xuICAgIGluc3RhbmNlLmFjdGlvbiA9IHRoaXMuZ2V0QnV0dG9uQWN0aW9uKGluc3RhbmNlKTtcblxuICAgIC8vIHJlYWN0IHRvIHRlbXBsYXRlU2NoZW1hIGJ1dHRvbiBjaGFuZ2VzXG4gICAgdGhpcy5iaW5kVGVtcGxhdGVDaGFuZ2VzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudmlld0NvbnRhaW5lclJlZikge1xuICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XG4gICAgfVxuICB9XG59XG4iXX0=