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

213 lines (212 loc) 18.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, Input, forwardRef, ChangeDetectorRef, ViewEncapsulation } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { ActionRegistry } from '../model/actionregistry'; import { ValidatorRegistry } from '../model/validatorregistry'; import { SchemaPropertyType } from '../schema'; import { SchemaValidatorFactory } from '../schemavalidatorfactory'; import { WidgetFactory } from '../widgetfactory'; import { FormPropertyFactory } from '../model/form-property-factory'; import { TemplateSchemaElementRegistry } from '../template-schema/template-schema-element-registry'; /** * @param {?} schemaValidatorFactory * @param {?} validatorRegistry * @return {?} */ export function useFactory(schemaValidatorFactory, validatorRegistry) { return new FormPropertyFactory(schemaValidatorFactory, validatorRegistry); } export class FormComponent { /** * @param {?} changeDetectorRef * @param {?} formPropertyFactory * @param {?} actionRegistry * @param {?} validatorRegistry */ constructor(changeDetectorRef, formPropertyFactory, actionRegistry, validatorRegistry) { this.changeDetectorRef = changeDetectorRef; this.formPropertyFactory = formPropertyFactory; this.actionRegistry = actionRegistry; this.validatorRegistry = validatorRegistry; this.schema = null; this.actions = {}; this.validators = {}; this.rootFormProperty = null; } /** * @param {?} value * @return {?} */ writeValue(value) { // value should be object if (this.rootFormProperty && value) { this.rootFormProperty.patchValue(value); } } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this.onChangeCallback = fn; if (this.rootFormProperty) { this.rootFormProperty.nonEmptyValueChanges.subscribe(fn); } } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { } /** * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { if (!this.rootFormProperty) { return; } if (isDisabled) { this.rootFormProperty.disable(); } else { this.rootFormProperty.enable(); } } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes["validators"]) { this.registerValidators(); } if (changes["actions"]) { this.registerActions(); } if (this.schema && !this.schema.type) { this.schema.type = SchemaPropertyType.Object; } if (this.schema && changes["schema"]) { /** @type {?} */ let value; if (this.rootFormProperty) { // TODO validate model against schema value = this.rootFormProperty.nonEmptyValue; } // force component destruction this.rootFormProperty = null; this.changeDetectorRef.detectChanges(); /** @type {?} */ const rootFormProperty = this.formPropertyFactory.createProperty(this.schema); // registerOnChange for changes after init if (this.onChangeCallback) { rootFormProperty.nonEmptyValueChanges.subscribe(this.onChangeCallback); if (value) { rootFormProperty.patchValue(value); } } this.rootFormProperty = rootFormProperty; } } /** * @return {?} */ ngOnInit() { } /** * @return {?} */ registerValidators() { this.validatorRegistry.clear(); if (!this.validators) { return; } for (const propertyPath in this.validators) { if (this.validators.hasOwnProperty(propertyPath)) { this.validatorRegistry.register(propertyPath, this.validators[propertyPath]); } } } /** * @return {?} */ registerActions() { this.actionRegistry.clear(); if (!this.actions) { return; } for (const actionId in this.actions) { if (this.actions.hasOwnProperty(actionId)) { this.actionRegistry.register(actionId, this.actions[actionId]); } } } } FormComponent.decorators = [ { type: Component, args: [{ selector: 'sf-form', template: ` <form #form="ngForm"> <sf-form-element *ngIf="rootFormProperty; else noSchema" [formProperty]="rootFormProperty"> </sf-form-element> <ng-template #noSchema> You need to provide a json or a template schema! </ng-template> </form> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => FormComponent), multi: true }, ActionRegistry, ValidatorRegistry, WidgetFactory, { provide: FormPropertyFactory, useFactory: useFactory, deps: [SchemaValidatorFactory, ValidatorRegistry] }, TemplateSchemaElementRegistry ], encapsulation: ViewEncapsulation.None }] } ]; /** @nocollapse */ FormComponent.ctorParameters = () => [ { type: ChangeDetectorRef }, { type: FormPropertyFactory }, { type: ActionRegistry }, { type: ValidatorRegistry } ]; FormComponent.propDecorators = { schema: [{ type: Input }], actions: [{ type: Input }], validators: [{ type: Input }] }; if (false) { /** @type {?} */ FormComponent.prototype.schema; /** @type {?} */ FormComponent.prototype.actions; /** @type {?} */ FormComponent.prototype.validators; /** @type {?} */ FormComponent.prototype.rootFormProperty; /** @type {?} */ FormComponent.prototype.onChangeCallback; /** @type {?} */ FormComponent.prototype.changeDetectorRef; /** @type {?} */ FormComponent.prototype.formPropertyFactory; /** @type {?} */ FormComponent.prototype.actionRegistry; /** @type {?} */ FormComponent.prototype.validatorRegistry; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc2NoZW1hLWZvcm1zLyIsInNvdXJjZXMiOlsibGliL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUVMLFVBQVUsRUFDVixpQkFBaUIsRUFJakIsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxpQkFBaUIsRUFHbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVyRSxPQUFPLEVBQ0wsNkJBQTZCLEVBQzlCLE1BQU0scURBQXFELENBQUM7Ozs7OztBQUU3RCxNQUFNLHFCQUFxQixzQkFBc0IsRUFBRSxpQkFBaUI7SUFDbEUsTUFBTSxDQUFDLElBQUksbUJBQW1CLENBQUMsc0JBQXNCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztDQUMzRTtBQWdDRCxNQUFNOzs7Ozs7O0lBZUosWUFDVSxtQkFDQSxxQkFDQSxnQkFDQTtRQUhBLHNCQUFpQixHQUFqQixpQkFBaUI7UUFDakIsd0JBQW1CLEdBQW5CLG1CQUFtQjtRQUNuQixtQkFBYyxHQUFkLGNBQWM7UUFDZCxzQkFBaUIsR0FBakIsaUJBQWlCO3NCQWhCYixJQUFJO3VCQUd3QixFQUFFOzBCQUdrQixFQUFFO2dDQUUvQixJQUFJO0tBU2pDOzs7OztJ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O2lCQUM5QjtnQkFDRCxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTthQUN0Qzs7OztZQTFEQyxpQkFBaUI7WUFtQlYsbUJBQW1CO1lBTG5CLGNBQWM7WUFDZCxpQkFBaUI7OztxQkE4Q3ZCLEtBQUs7c0JBR0wsS0FBSzt5QkFHTCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkNoYW5nZXMsXG4gIElucHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBmb3J3YXJkUmVmLFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBPbkluaXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0b3JGbixcbiAgTmdGb3JtXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSAnLi4vbW9kZWwvYWN0aW9uJztcbmltcG9ydCB7IEFjdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vbW9kZWwvYWN0aW9ucmVnaXN0cnknO1xuaW1wb3J0IHsgVmFsaWRhdG9yUmVnaXN0cnkgfSBmcm9tICcuLi9tb2RlbC92YWxpZGF0b3JyZWdpc3RyeSc7XG5pbXBvcnQgeyBTY2hlbWFQcm9wZXJ0eVR5cGUgfSBmcm9tICcuLi9zY2hlbWEnO1xuaW1wb3J0IHsgU2NoZW1hVmFsaWRhdG9yRmFjdG9yeSB9IGZyb20gJy4uL3NjaGVtYXZhbGlkYXRvcmZhY3RvcnknO1xuaW1wb3J0IHsgV2lkZ2V0RmFjdG9yeSB9IGZyb20gJy4uL3dpZGdldGZhY3RvcnknO1xuaW1wb3J0IHsgRm9ybVByb3BlcnR5RmFjdG9yeSB9IGZyb20gJy4uL21vZGVsL2Zvcm0tcHJvcGVydHktZmFjdG9yeSc7XG5pbXBvcnQgeyBGb3JtUHJvcGVydHkgfSBmcm9tICcuLi9tb2RlbC9mb3JtLXByb3BlcnR5JztcbmltcG9ydCB7XG4gIFRlbXBsYXRlU2NoZW1hRWxlbWVudFJlZ2lzdHJ5XG59IGZyb20gJy4uL3RlbXBsYXRlLXNjaGVtYS90ZW1wbGF0ZS1zY2hlbWEtZWxlbWVudC1yZWdpc3RyeSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VGYWN0b3J5KHNjaGVtYVZhbGlkYXRvckZhY3RvcnksIHZhbGlkYXRvclJlZ2lzdHJ5KSB7XG4gIHJldHVybiBuZXcgRm9ybVByb3BlcnR5RmFjdG9yeShzY2hlbWFWYWxpZGF0b3JGYWN0b3J5LCB2YWxpZGF0b3JSZWdpc3RyeSk7XG59XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2YtZm9ybScsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGZvcm0gI2Zvcm09XCJuZ0Zvcm1cIj5cbiAgICAgIDxzZi1mb3JtLWVsZW1lbnQgKm5nSWY9XCJyb290Rm9ybVByb3BlcnR5OyBlbHNlIG5vU2NoZW1hXCIgW2Zvcm1Qcm9wZXJ0eV09XCJyb290Rm9ybVByb3BlcnR5XCI+XG4gICAgICA8L3NmLWZvcm0tZWxlbWVudD5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjbm9TY2hlbWE+XG4gICAgICAgIFlvdSBuZWVkIHRvIHByb3ZpZGUgYSBqc29uIG9yIGEgdGVtcGxhdGUgc2NoZW1hIVxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Zvcm0+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRm9ybUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH0sXG4gICAgQWN0aW9uUmVnaXN0cnksXG4gICAgVmFsaWRhdG9yUmVnaXN0cnksXG4gICAgV2lkZ2V0RmFjdG9yeSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBGb3JtUHJvcGVydHlGYWN0b3J5LFxuICAgICAgdXNlRmFjdG9yeTogdXNlRmFjdG9yeSxcbiAgICAgIGRlcHM6IFtTY2hlbWFWYWxpZGF0b3JGYWN0b3J5LCBWYWxpZGF0b3JSZWdpc3RyeV1cbiAgICB9LFxuICAgIFRlbXBsYXRlU2NoZW1hRWxlbWVudFJlZ2lzdHJ5XG4gIF0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgQElucHV0KClcbiAgc2NoZW1hOiBhbnkgPSBudWxsO1xuXG4gIEBJbnB1dCgpXG4gIGFjdGlvbnM6IHsgW2FjdGlvbklkOiBzdHJpbmddOiBBY3Rpb24gfSA9IHt9O1xuXG4gIEBJbnB1dCgpXG4gIHZhbGlkYXRvcnM6IHsgW3BhdGg6IHN0cmluZ106IFZhbGlkYXRvckZuIHwgVmFsaWRhdG9yRm5bXSB9ID0ge307XG5cbiAgcm9vdEZvcm1Qcm9wZXJ0eTogRm9ybVByb3BlcnR5ID0gbnVsbDtcblxuICBwcml2YXRlIG9uQ2hhbmdlQ2FsbGJhY2s6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGZvcm1Qcm9wZXJ0eUZhY3Rvcnk6IEZvcm1Qcm9wZXJ0eUZhY3RvcnksXG4gICAgcHJpdmF0ZSBhY3Rpb25SZWdpc3RyeTogQWN0aW9uUmVnaXN0cnksXG4gICAgcHJpdmF0ZSB2YWxpZGF0b3JSZWdpc3RyeTogVmFsaWRhdG9yUmVnaXN0cnksXG4gICkge31cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICAvLyB2YWx1ZSBzaG91bGQgYmUgb2JqZWN0XG4gICAgaWYgKHRoaXMucm9vdEZvcm1Qcm9wZXJ0eSAmJiB2YWx1ZSkge1xuICAgICAgdGhpcy5yb290Rm9ybVByb3BlcnR5LnBhdGNoVmFsdWUodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICAgIGlmICh0aGlzLnJvb3RGb3JtUHJvcGVydHkpIHtcbiAgICAgIHRoaXMucm9vdEZvcm1Qcm9wZXJ0eS5ub25FbXB0eVZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoZm4pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8gaW1wbGVtZW50XG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHt9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKSB7XG4gICAgaWYgKCF0aGlzLnJvb3RGb3JtUHJvcGVydHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNhYmxlZCkge1xuICAgICAgdGhpcy5yb290Rm9ybVByb3BlcnR5LmRpc2FibGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb290Rm9ybVByb3BlcnR5LmVuYWJsZSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy52YWxpZGF0b3JzKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyVmFsaWRhdG9ycygpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLmFjdGlvbnMpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJBY3Rpb25zKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2NoZW1hICYmICF0aGlzLnNjaGVtYS50eXBlKSB7XG4gICAgICB0aGlzLnNjaGVtYS50eXBlID0gU2NoZW1hUHJvcGVydHlUeXBlLk9iamVjdDtcbiAgICB9XG5cblxuICAgIGlmICh0aGlzLnNjaGVtYSAmJiBjaGFuZ2VzLnNjaGVtYSkge1xuICAgICAgbGV0IHZhbHVlOiBhbnk7XG4gICAgICBpZiAodGhpcy5yb290Rm9ybVByb3BlcnR5KSB7XG4gICAgICAgIC8vIFRPRE8gdmFsaWRhdGUgbW9kZWwgYWdhaW5zdCBzY2hlbWFcbiAgICAgICAgdmFsdWUgPSB0aGlzLnJvb3RGb3JtUHJvcGVydHkubm9uRW1wdHlWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZm9yY2UgY29tcG9uZW50IGRlc3RydWN0aW9uXG4gICAgICB0aGlzLnJvb3RGb3JtUHJvcGVydHkgPSBudWxsO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgIC8vIFNjaGVtYVByZXByb2Nlc3NvciBpcyBub3cgZG9uZSBpbiBmb3JtUHJvcGVydHlGYWN0b3J5IHVzaW5nIHByb3BlcnR5XG4gICAgICAvLyBjcmVhdGlvbiByZWN1cnNpb24sIHRoaXMgcmVtb3ZlcyB0aGUgbmVlZCB0byB0cmF2ZXJzZSB0aGUgdHJlZSB0d2ljZS5cbiAgICAgIC8vIFRPRE8gdGVzdCBzY2hlbWEgcHJlcHJvY2Vzc2luZyBtb3ZlXG4gICAgICBjb25zdCByb290Rm9ybVByb3BlcnR5ID0gdGhpcy5mb3JtUHJvcGVydHlGYWN0b3J5LmNyZWF0ZVByb3BlcnR5KFxuICAgICAgICB0aGlzLnNjaGVtYVxuICAgICAgKTtcblxuICAgICAgLy8gcmVnaXN0ZXJPbkNoYW5nZSBmb3IgY2hhbmdlcyBhZnRlciBpbml0XG4gICAgICBpZiAodGhpcy5vbkNoYW5nZUNhbGxiYWNrKSB7XG4gICAgICAgIHJvb3RGb3JtUHJvcGVydHkubm9uRW1wdHlWYWx1ZUNoYW5nZXMuc3Vic2NyaWJlKFxuICAgICAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFja1xuICAgICAgICApO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICByb290Rm9ybVByb3BlcnR5LnBhdGNoVmFsdWUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMucm9vdEZvcm1Qcm9wZXJ0eSA9IHJvb3RGb3JtUHJvcGVydHk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJWYWxpZGF0b3JzKCkge1xuICAgIHRoaXMudmFsaWRhdG9yUmVnaXN0cnkuY2xlYXIoKTtcbiAgICBpZiAoIXRoaXMudmFsaWRhdG9ycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvcGVydHlQYXRoIGluIHRoaXMudmFsaWRhdG9ycykge1xuICAgICAgaWYgKHRoaXMudmFsaWRhdG9ycy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eVBhdGgpKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdG9yUmVnaXN0cnkucmVnaXN0ZXIoXG4gICAgICAgICAgcHJvcGVydHlQYXRoLFxuICAgICAgICAgIHRoaXMudmFsaWRhdG9yc1twcm9wZXJ0eVBhdGhdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckFjdGlvbnMoKSB7XG4gICAgdGhpcy5hY3Rpb25SZWdpc3RyeS5jbGVhcigpO1xuICAgIGlmICghdGhpcy5hY3Rpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhY3Rpb25JZCBpbiB0aGlzLmFjdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLmFjdGlvbnMuaGFzT3duUHJvcGVydHkoYWN0aW9uSWQpKSB7XG4gICAgICAgIHRoaXMuYWN0aW9uUmVnaXN0cnkucmVnaXN0ZXIoYWN0aW9uSWQsIHRoaXMuYWN0aW9uc1thY3Rpb25JZF0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19