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
JavaScript
/**
* @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=