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

132 lines (131 loc) 13.9 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 { filter, startWith, distinctUntilChanged } from 'rxjs/operators'; import { Unsubscriber } from '../unsubscriber'; import { WidgetFactory } from '../widgetfactory'; import { GenericProperty } from '../model/generic-property'; import { TemplateSchemaElementRegistry } from '../template-schema/template-schema-element-registry'; export class FormPropertyWidgetChooserDirective { /** * @param {?} viewContainerRef * @param {?} widgetFactory * @param {?} templateRegistry */ constructor(viewContainerRef, widgetFactory, templateRegistry) { this.viewContainerRef = viewContainerRef; this.widgetFactory = widgetFactory; this.templateRegistry = templateRegistry; } /** * @return {?} */ isWidgetRequired() { /** @type {?} */ const parent = /** @type {?} */ ((/** @type {?} */ (this.formProperty.parent))); if (!parent || !parent.schema["required"]) { return false; } return parent.schema["required"].includes(this.formProperty.name); } /** * @return {?} */ ngOnInit() { // TODO break into functions this.componentRef = this.widgetFactory.createWidget(this.viewContainerRef, this.formProperty.schema["widget"].id); /** @type {?} */ const component = this.componentRef.instance; component.formProperty = this.formProperty; component.schema = this.formProperty.schema; component.id = this.formProperty.id; /** @type {?} */ const element = this.templateRegistry.getElement(this.formProperty.path); if (element) { this.subs = element.changes.subscribe((schema) => { component.schema = Object.assign(this.formProperty.schema, schema); this.componentRef.changeDetectorRef.detectChanges(); }); } component.required = this.isWidgetRequired(); // widget instance in formProperty this.formProperty.widgetInstance = component; // error messages if (this.formProperty instanceof GenericProperty) { this.subs = this.formProperty.statusChanges .pipe( // initial, to add error messages from schema validator startWith('INVALID'), filter((status) => { /** @type {?} */ const errorMessages = component.errorMessages; /** @type {?} */ const hasErrorMessages = errorMessages && errorMessages.length > 0; // it's valid, but error messages need to be cleared if (status === 'VALID' && hasErrorMessages) { return true; } return status === 'INVALID'; }), distinctUntilChanged()) .subscribe(() => { /** @type {?} */ const propertyErrors = this.formProperty.getErrors(); if (!propertyErrors) { // clear errors emssages this.componentRef.instance.errorMessages = []; return; } /** @type {?} */ const errorMessages = propertyErrors.getMessages(); this.componentRef.instance.errorMessages = errorMessages; this.componentRef.changeDetectorRef.detectChanges(); }); } } /** * @return {?} */ ngOnDestroy() { if (this.componentRef) { this.componentRef.destroy(); } if (this.viewContainerRef) { this.viewContainerRef.clear(); } } } FormPropertyWidgetChooserDirective.decorators = [ { type: Directive, args: [{ selector: '[sfFormPropertyWidgetChooser]', },] } ]; /** @nocollapse */ FormPropertyWidgetChooserDirective.ctorParameters = () => [ { type: ViewContainerRef }, { type: WidgetFactory }, { type: TemplateSchemaElementRegistry } ]; FormPropertyWidgetChooserDirective.propDecorators = { formProperty: [{ type: Input }] }; tslib_1.__decorate([ Unsubscriber(), tslib_1.__metadata("design:type", Object) ], FormPropertyWidgetChooserDirective.prototype, "subs", void 0); if (false) { /** @type {?} */ FormPropertyWidgetChooserDirective.prototype.formProperty; /** @type {?} */ FormPropertyWidgetChooserDirective.prototype.componentRef; /** @type {?} */ FormPropertyWidgetChooserDirective.prototype.subs; /** @type {?} */ FormPropertyWidgetChooserDirective.prototype.viewContainerRef; /** @type {?} */ FormPropertyWidgetChooserDirective.prototype.widgetFactory; /** @type {?} */ FormPropertyWidgetChooserDirective.prototype.templateRegistry; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1wcm9wZXJ0eS13aWRnZXQtY2hvb3Nlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc2NoZW1hLWZvcm1zLyIsInNvdXJjZXMiOlsibGliL2Zvcm0vZm9ybS1wcm9wZXJ0eS13aWRnZXQtY2hvb3Nlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxnQkFBZ0IsRUFHakIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1Qsb0JBQW9CLEVBR3JCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUNMLDZCQUE2QixFQUM5QixNQUFNLHFEQUFxRCxDQUFDO0FBTzdELE1BQU07Ozs7OztJQVVKLFlBQ1Usa0JBQ0EsZUFDRSxnQkFBK0M7UUFGakQscUJBQWdCLEdBQWhCLGdCQUFnQjtRQUNoQixrQkFBYSxHQUFiLGFBQWE7UUFDWCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQStCO0tBQ3REOzs7O0lBRUwsZ0JBQWdCOztRQUNkLE1BQU0sTUFBTSxxQkFBRyxtQkFBa0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQWlCLEVBQUM7UUFDM0UsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxZQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDZDtRQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxhQUFVLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ2hF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QUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUMvQjtLQUNGOzs7WUFuR0YsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSwrQkFBK0I7YUFDMUM7Ozs7WUEzQkMsZ0JBQWdCO1lBZ0JULGFBQWE7WUFJcEIsNkJBQTZCOzs7MkJBVTVCLEtBQUs7OztJQUtMLFlBQVksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgQ29tcG9uZW50UmVmLFxuICBJbnB1dCxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3lcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGZpbHRlcixcbiAgc3RhcnRXaXRoLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgVW5zdWJzY3JpYmVyIH0gZnJvbSAnLi4vdW5zdWJzY3JpYmVyJztcbmltcG9ydCB7IFByb3BlcnR5V2lkZ2V0IH0gZnJvbSAnLi4vd2lkZ2V0cy9iYXNlL3dpZGdldCc7XG5pbXBvcnQgeyBXaWRnZXRGYWN0b3J5IH0gZnJvbSAnLi4vd2lkZ2V0ZmFjdG9yeSc7XG5pbXBvcnQgeyBGb3JtUHJvcGVydHkgfSBmcm9tICcuLi9tb2RlbC9mb3JtLXByb3BlcnR5JztcbmltcG9ydCB7IEdlbmVyaWNQcm9wZXJ0eSB9IGZyb20gJy4uL21vZGVsL2dlbmVyaWMtcHJvcGVydHknO1xuaW1wb3J0IHtcbiAgVGVtcGxhdGVTY2hlbWFFbGVtZW50UmVnaXN0cnlcbn0gZnJvbSAnLi4vdGVtcGxhdGUtc2NoZW1hL3RlbXBsYXRlLXNjaGVtYS1lbGVtZW50LXJlZ2lzdHJ5JztcblxuXG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tzZkZvcm1Qcm9wZXJ0eVdpZGdldENob29zZXJdJyxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybVByb3BlcnR5V2lkZ2V0Q2hvb3NlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoKVxuICBmb3JtUHJvcGVydHk6IEZvcm1Qcm9wZXJ0eTtcblxuICBwcml2YXRlIGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT47XG5cbiAgQFVuc3Vic2NyaWJlcigpXG4gIHByaXZhdGUgc3VicztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSB3aWRnZXRGYWN0b3J5OiBXaWRnZXRGYWN0b3J5LFxuICAgIHByb3RlY3RlZCB0ZW1wbGF0ZVJlZ2lzdHJ5OiBUZW1wbGF0ZVNjaGVtYUVsZW1lbnRSZWdpc3RyeSxcbiAgKSB7IH1cblxuICBpc1dpZGdldFJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhcmVudCA9ICg8QWJzdHJhY3RDb250cm9sPnRoaXMuZm9ybVByb3BlcnR5LnBhcmVudCkgYXMgRm9ybVByb3BlcnR5O1xuICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQuc2NoZW1hLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudC5zY2hlbWEucmVxdWlyZWQuaW5jbHVkZXModGhpcy5mb3JtUHJvcGVydHkubmFtZSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcblxuICAgIC8vIFRPRE8gYnJlYWsgaW50byBmdW5jdGlvbnNcblxuICAgIHRoaXMuY29tcG9uZW50UmVmID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVdpZGdldDxQcm9wZXJ0eVdpZGdldD4oXG4gICAgICB0aGlzLnZpZXdDb250YWluZXJSZWYsXG4gICAgICB0aGlzLmZvcm1Qcm9wZXJ0eS5zY2hlbWEud2lkZ2V0LmlkXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlO1xuICAgIGNvbXBvbmVudC5mb3JtUHJvcGVydHkgPSB0aGlzLmZvcm1Qcm9wZXJ0eTtcbiAgICBjb21wb25lbnQuc2NoZW1hID0gdGhpcy5mb3JtUHJvcGVydHkuc2NoZW1hO1xuICAgIGNvbXBvbmVudC5pZCA9IHRoaXMuZm9ybVByb3BlcnR5LmlkO1xuXG4gICAgLy8gdGVtcGxhdGVTY2hlbWEgZmllbGQgdXBkYXRlc1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRlbXBsYXRlUmVnaXN0cnkuZ2V0RWxlbWVudCh0aGlzLmZvcm1Qcm9wZXJ0eS5wYXRoKTtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdGhpcy5zdWJzID0gZWxlbWVudC5jaGFuZ2VzLnN1YnNjcmliZSgoc2NoZW1hKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zY2hlbWEgPSBPYmplY3QuYXNzaWduKHRoaXMuZm9ybVByb3BlcnR5LnNjaGVtYSwgc2NoZW1hKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50LnJlcXVpcmVkID0gdGhpcy5pc1dpZGdldFJlcXVpcmVkKCk7XG5cbiAgICAvLyB3aWRnZXQgaW5zdGFuY2UgaW4gZm9ybVByb3BlcnR5XG4gICAgdGhpcy5mb3JtUHJvcGVydHkud2lkZ2V0SW5zdGFuY2UgPSBjb21wb25lbnQ7XG5cbiAgICAvLyBlcnJvciBtZXNzYWdlc1xuICAgIGlmICh0aGlzLmZvcm1Qcm9wZXJ0eSBpbnN0YW5jZW9mIEdlbmVyaWNQcm9wZXJ0eSkge1xuICAgICAgdGhpcy5zdWJzID0gdGhpcy5mb3JtUHJvcGVydHkuc3RhdHVzQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICAvLyBpbml0aWFsLCB0byBhZGQgZXJyb3IgbWVzc2FnZXMgZnJvbSBzY2hlbWEgdmFsaWRhdG9yXG4gICAgICAgICAgc3RhcnRXaXRoKCdJTlZBTElEJyksXG4gICAgICAgICAgZmlsdGVyKChzdGF0dXM6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IGNvbXBvbmVudC5lcnJvck1lc3NhZ2VzO1xuICAgICAgICAgICAgY29uc3QgaGFzRXJyb3JNZXNzYWdlcyA9IGVycm9yTWVzc2FnZXMgJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggPiAwO1xuXG4gICAgICAgICAgICAvLyBpdCdzIHZhbGlkLCBidXQgZXJyb3IgbWVzc2FnZXMgbmVlZCB0byBiZSBjbGVhcmVkXG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSAnVkFMSUQnICYmIGhhc0Vycm9yTWVzc2FnZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBzdGF0dXMgPT09ICdJTlZBTElEJztcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHlFcnJvcnMgPSB0aGlzLmZvcm1Qcm9wZXJ0eS5nZXRFcnJvcnMoKTtcblxuICAgICAgICAgIGlmICghcHJvcGVydHlFcnJvcnMpIHtcbiAgICAgICAgICAgIC8vIGNsZWFyIGVycm9ycyBlbXNzYWdlc1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuZXJyb3JNZXNzYWdlcyA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBwcm9wZXJ0eUVycm9ycy5nZXRNZXNzYWdlcygpO1xuICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmVycm9yTWVzc2FnZXMgPSBlcnJvck1lc3NhZ2VzO1xuICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudmlld0NvbnRhaW5lclJlZikge1xuICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XG4gICAgfVxuICB9XG59XG4iXX0=