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
127 lines (126 loc) • 13.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Directive, ContentChildren, QueryList, SimpleChange, Input } from '@angular/core';
import { merge } from 'rxjs';
import { filter } from 'rxjs/operators';
import { FormComponent } from '../form/form.component';
import { ActionRegistry } from '../model/actionregistry';
import { ValidatorRegistry } from '../model/validatorregistry';
import { SchemaPropertyType } from '../schema';
import { TemplateSchemaService } from './template-schema.service';
import { FieldComponent } from './field/field.component';
import { ButtonComponent } from './button/button.component';
import { FieldParent } from './field/field-parent';
import { TemplateSchemaElementRegistry } from '../template-schema/template-schema-element-registry';
export class TemplateSchemaDirective extends FieldParent {
/**
* @param {?} formComponent
* @param {?} templateSchemaService
* @param {?} actionRegistry
* @param {?} validatorRegistry
* @param {?} templateRegistry
*/
constructor(formComponent, templateSchemaService, actionRegistry, validatorRegistry, templateRegistry) {
super();
this.formComponent = formComponent;
this.templateSchemaService = templateSchemaService;
this.actionRegistry = actionRegistry;
this.validatorRegistry = validatorRegistry;
this.templateRegistry = templateRegistry;
}
/**
* @param {?} fields
* @return {?}
*/
setFormDocumentSchema(fields) {
this.actionRegistry.clear();
this.validatorRegistry.clear();
/** @type {?} */
const schema = this.getFieldsSchema(fields);
this.templateRegistry.clear();
// register fields recursively
fields.forEach((field) => {
field.register();
});
/** @type {?} */
const _validators = this.getFieldsValidators(fields);
_validators.forEach(({ path, validators }) => {
this.validatorRegistry.register(path, validators);
});
/** @type {?} */
const previousSchema = this.formComponent.schema;
this.formComponent.schema = {
type: SchemaPropertyType.Object,
properties: schema.properties
};
if (this.fieldsets) {
this.formComponent.schema.fieldsets = this.fieldsets;
}
if (schema.required && schema.required.length > 0) {
this.formComponent.schema.required = schema.required;
}
/** @type {?} */
const buttons = this.getButtons();
if (buttons.length > 0) {
this.formComponent.schema.buttons = buttons;
}
this.formComponent.ngOnChanges({
schema: new SimpleChange(previousSchema, this.formComponent.schema, Boolean(previousSchema))
});
}
/**
* @return {?}
*/
ngAfterContentInit() {
if (this.childFields.length > 0) {
this.setFormDocumentSchema(this.childFields.toArray());
}
merge(this.childFields.changes, this.childButtons.changes, this.templateSchemaService.changes)
.pipe(filter((value) => Boolean(value)))
.subscribe(() => {
this.setFormDocumentSchema(this.childFields.toArray());
});
}
}
TemplateSchemaDirective.decorators = [
{ type: Directive, args: [{
selector: 'sf-form[templateSchema]',
providers: [
TemplateSchemaService
]
},] }
];
/** @nocollapse */
TemplateSchemaDirective.ctorParameters = () => [
{ type: FormComponent },
{ type: TemplateSchemaService },
{ type: ActionRegistry },
{ type: ValidatorRegistry },
{ type: TemplateSchemaElementRegistry }
];
TemplateSchemaDirective.propDecorators = {
childFields: [{ type: ContentChildren, args: [FieldComponent,] }],
childButtons: [{ type: ContentChildren, args: [ButtonComponent,] }],
fieldsets: [{ type: Input }]
};
if (false) {
/** @type {?} */
TemplateSchemaDirective.prototype.childFields;
/** @type {?} */
TemplateSchemaDirective.prototype.childButtons;
/** @type {?} */
TemplateSchemaDirective.prototype.fieldsets;
/** @type {?} */
TemplateSchemaDirective.prototype.formComponent;
/** @type {?} */
TemplateSchemaDirective.prototype.templateSchemaService;
/** @type {?} */
TemplateSchemaDirective.prototype.actionRegistry;
/** @type {?} */
TemplateSchemaDirective.prototype.validatorRegistry;
/** @type {?} */
TemplateSchemaDirective.prototype.templateRegistry;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtc2NoZW1hLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zY2hlbWEtZm9ybXMvIiwic291cmNlcyI6WyJsaWIvdGVtcGxhdGUtc2NoZW1hL3RlbXBsYXRlLXNjaGVtYS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFNBQVMsRUFHVCxZQUFZLEVBRVosS0FBSyxFQUNOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBZ0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUUvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsNkJBQTZCLEVBQzlCLE1BQU0scURBQXFELENBQUM7QUFTN0QsTUFBTSw4QkFBK0IsU0FBUSxXQUFXOzs7Ozs7OztJQVl0RCxZQUNVLGVBQ0EsdUJBQ0UsY0FBOEIsRUFDOUIsaUJBQW9DLEVBQ3BDLGdCQUErQztRQUV6RCxLQUFLLEVBQUUsQ0FBQztRQU5BLGtCQUFhLEdBQWIsYUFBYTtRQUNiLDBCQUFxQixHQUFyQixxQkFBcUI7UUFDbkIs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RSxDQUFDLENBQUM7U0FDeEQsQ0FBQyxDQUFDO0tBRUo7OztZQWhHRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHlCQUF5QjtnQkFDbkMsU0FBUyxFQUFFO29CQUNULHFCQUFxQjtpQkFDdEI7YUFDRjs7OztZQXBCUSxhQUFhO1lBS2IscUJBQXFCO1lBSnJCLGNBQWM7WUFDZCxpQkFBaUI7WUFTeEIsNkJBQTZCOzs7MEJBYTVCLGVBQWUsU0FBQyxjQUFjOzJCQUc5QixlQUFlLFNBQUMsZUFBZTt3QkFHL0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgQ29udGVudENoaWxkcmVuLFxuICBRdWVyeUxpc3QsXG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEhvc3RCaW5kaW5nLFxuICBTaW1wbGVDaGFuZ2UsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIElucHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS9mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBY3Rpb25SZWdpc3RyeSB9IGZyb20gJy4uL21vZGVsL2FjdGlvbnJlZ2lzdHJ5JztcbmltcG9ydCB7IFZhbGlkYXRvclJlZ2lzdHJ5IH0gZnJvbSAnLi4vbW9kZWwvdmFsaWRhdG9ycmVnaXN0cnknO1xuaW1wb3J0IHsgU2NoZW1hUHJvcGVydHlUeXBlIH0gZnJvbSAnLi4vc2NoZW1hJztcblxuaW1wb3J0IHsgVGVtcGxhdGVTY2hlbWFTZXJ2aWNlIH0gZnJvbSAnLi90ZW1wbGF0ZS1zY2hlbWEuc2VydmljZSc7XG5pbXBvcnQgeyBGaWVsZENvbXBvbmVudCB9IGZyb20gJy4vZmllbGQvZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9maWVsZC9maWVsZCc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IEZpZWxkUGFyZW50IH0gZnJvbSAnLi9maWVsZC9maWVsZC1wYXJlbnQnO1xuaW1wb3J0IHtcbiAgVGVtcGxhdGVTY2hlbWFFbGVtZW50UmVnaXN0cnlcbn0gZnJvbSAnLi4vdGVtcGxhdGUtc2NoZW1hL3RlbXBsYXRlLXNjaGVtYS1lbGVtZW50LXJlZ2lzdHJ5JztcblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdzZi1mb3JtW3RlbXBsYXRlU2NoZW1hXScsXG4gIHByb3ZpZGVyczogW1xuICAgIFRlbXBsYXRlU2NoZW1hU2VydmljZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlU2NoZW1hRGlyZWN0aXZlIGV4dGVuZHMgRmllbGRQYXJlbnRcbmltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihGaWVsZENvbXBvbmVudClcbiAgY2hpbGRGaWVsZHM6IFF1ZXJ5TGlzdDxGaWVsZENvbXBvbmVudD47XG5cbiAgQENvbnRlbnRDaGlsZHJlbihCdXR0b25Db21wb25lbnQpXG4gIGNoaWxkQnV0dG9uczogUXVlcnlMaXN0PEJ1dHRvbkNvbXBvbmVudD47XG5cbiAgQElucHV0KClcbiAgZmllbGRzZXRzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9W107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmb3JtQ29tcG9uZW50OiBGb3JtQ29tcG9uZW50LFxuICAgIHByaXZhdGUgdGVtcGxhdGVTY2hlbWFTZXJ2aWNlOiBUZW1wbGF0ZVNjaGVtYVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGFjdGlvblJlZ2lzdHJ5OiBBY3Rpb25SZWdpc3RyeSxcbiAgICBwcm90ZWN0ZWQgdmFsaWRhdG9yUmVnaXN0cnk6IFZhbGlkYXRvclJlZ2lzdHJ5LFxuICAgIHByb3RlY3RlZCB0ZW1wbGF0ZVJlZ2lzdHJ5OiBUZW1wbGF0ZVNjaGVtYUVsZW1lbnRSZWdpc3RyeSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHNldEZvcm1Eb2N1bWVudFNjaGVtYShmaWVsZHM6IEZpZWxkQ29tcG9uZW50W10pIHtcbiAgICB0aGlzLmFjdGlvblJlZ2lzdHJ5LmNsZWFyKCk7XG4gICAgdGhpcy52YWxpZGF0b3JSZWdpc3RyeS5jbGVhcigpO1xuXG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5nZXRGaWVsZHNTY2hlbWEoZmllbGRzKTtcblxuICAgIHRoaXMudGVtcGxhdGVSZWdpc3RyeS5jbGVhcigpO1xuICAgIC8vIHJlZ2lzdGVyIGZpZWxkcyByZWN1cnNpdmVseVxuICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgZmllbGQucmVnaXN0ZXIoKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IF92YWxpZGF0b3JzID0gdGhpcy5nZXRGaWVsZHNWYWxpZGF0b3JzKGZpZWxkcyk7XG4gICAgX3ZhbGlkYXRvcnMuZm9yRWFjaCgoeyBwYXRoLCB2YWxpZGF0b3JzIH0pID0+IHtcbiAgICAgIHRoaXMudmFsaWRhdG9yUmVnaXN0cnkucmVnaXN0ZXIocGF0aCwgdmFsaWRhdG9ycyk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcmV2aW91c1NjaGVtYSA9IHRoaXMuZm9ybUNvbXBvbmVudC5zY2hlbWE7XG4gICAgdGhpcy5mb3JtQ29tcG9uZW50LnNjaGVtYSA9IHtcbiAgICAgIHR5cGU6IFNjaGVtYVByb3BlcnR5VHlwZS5PYmplY3QsXG4gICAgICBwcm9wZXJ0aWVzOiBzY2hlbWEucHJvcGVydGllc1xuICAgIH07XG5cbiAgICBpZiAodGhpcy5maWVsZHNldHMpIHtcbiAgICAgIHRoaXMuZm9ybUNvbXBvbmVudC5zY2hlbWEuZmllbGRzZXRzID0gdGhpcy5maWVsZHNldHM7XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYS5yZXF1aXJlZCAmJiBzY2hlbWEucmVxdWlyZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5mb3JtQ29tcG9uZW50LnNjaGVtYS5yZXF1aXJlZCA9IHNjaGVtYS5yZXF1aXJlZDtcbiAgICB9XG5cbiAgICBjb25zdCBidXR0b25zID0gdGhpcy5nZXRCdXR0b25zKCk7XG4gICAgaWYgKGJ1dHRvbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5mb3JtQ29tcG9uZW50LnNjaGVtYS5idXR0b25zID0gYnV0dG9ucztcbiAgICB9XG5cbiAgICB0aGlzLmZvcm1Db21wb25lbnQubmdPbkNoYW5nZXMoe1xuICAgICAgc2NoZW1hOiBuZXcgU2ltcGxlQ2hhbmdlKFxuICAgICAgICBwcmV2aW91c1NjaGVtYSxcbiAgICAgICAgdGhpcy5mb3JtQ29tcG9uZW50LnNjaGVtYSxcbiAgICAgICAgQm9vbGVhbihwcmV2aW91c1NjaGVtYSlcbiAgICAgIClcbiAgICB9KTtcblxuICB9XG5cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG5cbiAgICBpZiAodGhpcy5jaGlsZEZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNldEZvcm1Eb2N1bWVudFNjaGVtYSh0aGlzLmNoaWxkRmllbGRzLnRvQXJyYXkoKSk7XG4gICAgfVxuXG4gICAgbWVyZ2UoXG4gICAgICB0aGlzLmNoaWxkRmllbGRzLmNoYW5nZXMsXG4gICAgICB0aGlzLmNoaWxkQnV0dG9ucy5jaGFuZ2VzLFxuICAgICAgdGhpcy50ZW1wbGF0ZVNjaGVtYVNlcnZpY2UuY2hhbmdlc1xuICAgIClcbiAgICAucGlwZShcbiAgICAgIGZpbHRlcigodmFsdWUpID0+IEJvb2xlYW4odmFsdWUpKSxcbiAgICAgIC8vIGJ1aWxkaW5nIHRoZSBqc29uIHNjaGVtYSBpcyBhIGhlYXZ5IHRhc2ssIGF2b2lkIHVubmVjZXNzYXJ5IGJ1aWxkc1xuICAgICAgLy8gVE9ETyB1c2UgdGhpc1xuICAgICAgLy8gZGVib3VuY2VUaW1lKDUwKVxuICAgIClcbiAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0Rm9ybURvY3VtZW50U2NoZW1hKHRoaXMuY2hpbGRGaWVsZHMudG9BcnJheSgpKTtcbiAgICB9KTtcblxuICB9XG5cbn1cbiJdfQ==