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
164 lines (163 loc) • 13.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { EventEmitter } from '@angular/core';
import { BehaviorSubject, combineLatest } from 'rxjs';
import { map, startWith } from 'rxjs/operators';
import { FormPropertyErrors } from './form-property-errors';
/** @typedef {?} */
var Constructor;
export { Constructor };
/**
* @template T
* @param {?} Base
* @return {?}
*/
export function ControlProperty(Base) {
/**
* @abstract
*/
class Property extends Base {
/**
* @param {...?} args
*/
constructor(...args) {
super(...args);
this.nonEmptyValueChanges = new EventEmitter();
this.visibilityChanges = new BehaviorSubject(true);
this._visible = true;
}
/**
* @return {?}
*/
get id() {
return this.path.toLowerCase().slice(1).replace(/\//g, '-');
}
/**
* @return {?}
*/
get isRoot() {
return this === this.root;
}
/**
* @return {?}
*/
get name() {
return this.path.split('/').pop();
}
/**
* @return {?}
*/
get visible() {
return this._visible;
}
/**
* @return {?}
*/
getErrors() {
/** @type {?} */
const errors = this.errors;
if (!errors) {
return null;
}
return new FormPropertyErrors({ [this.path]: errors });
}
/**
* @param {?} visible
* @param {?=} opts
* @return {?}
*/
setVisible(visible, opts = { disable: false }) {
this._visible = visible;
if (opts.disable) {
if (this.visible) {
this.enable();
}
else {
this.disable();
}
}
this.visibilityChanges.next(this.visible);
}
/**
* @return {?}
*/
bindVisibility() {
/** @type {?} */
const visibleIf = this.schema["visibleIf"];
if (visibleIf === undefined) {
return;
}
/** @type {?} */
const paths = Object.keys(visibleIf);
if (typeof visibleIf === 'object' && paths.length === 0) {
this.setVisible(false);
return;
}
/** @type {?} */
const observables = [];
for (const path of paths) {
if (!visibleIf.hasOwnProperty(path)) {
continue;
}
/** @type {?} */
const property = this.root.get(path);
if (!property) {
console.warn(`Couldn't find property ${path} for visibility check of ` + this.path);
continue;
}
/** @type {?} */
const values = visibleIf[path];
/** @type {?} */
const observable = property.valueChanges.pipe(startWith(values.includes(property.value)), map((value) => {
return values.includes('$ANY$') || values.includes(value);
}));
observables.push(observable);
}
// TODO unsubscribe
combineLatest(observables)
.subscribe((values) => {
this.setVisible(values.includes(true));
});
}
/**
* @param {?} path
* @return {?}
*/
get(path) {
if (typeof path === 'string' && path.includes('/')) {
path = this.normalizePath(path);
}
return super.get(path);
}
/**
* @param {?} path
* @return {?}
*/
normalizePath(path) {
if (path[0] === '/') {
path = path.slice(1);
}
return path.split('/');
}
}
if (false) {
/** @type {?} */
Property.prototype.widgetInstance;
/** @type {?} */
Property.prototype.nonEmptyValue;
/** @type {?} */
Property.prototype.nonEmptyValueChanges;
/** @type {?} */
Property.prototype.visibilityChanges;
/** @type {?} */
Property.prototype.path;
/** @type {?} */
Property.prototype.schema;
/** @type {?} */
Property.prototype._visible;
}
return Property;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC1wcm9wZXJ0eS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zY2hlbWEtZm9ybXMvIiwic291cmNlcyI6WyJsaWIvbW9kZWwvY29udHJvbC1wcm9wZXJ0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVE3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRyxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7QUFPNUQsTUFBTSwwQkFDSixJQUFPOzs7O0lBR1AsY0FBd0IsU0FBUSxJQUFJOzs7O1FBNEJsQyxZQUFZLEdBQUcsSUFBVztZQUN4QixLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQzt3Q0F4Qk0sSUFBSSxZQUFZLEVBQUU7cUNBQ3JCLElBQUksZUFBZSxDQUFVLElBQUksQ0FBQzs0QkFpQmpDLElBQUk7U0FReEI7Ozs7UUF2QkQsSUFBSSxFQUFFO1lBQ0osTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDN0Q7Ozs7UUFFRCxJQUFJLE1BQU07WUFDUixNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDM0I7Ozs7UUFLRCxJQUFJLElBQUk7WUFDTixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDbkM7Ozs7UUFHRCxJQUFJLE9BQU87WUFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUN0Qjs7OztRQU9ELFNB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Q0FBQyxDQUFDO1NBRU47Ozs7O1FBRUQsR0FBRyxDQUFDLElBQWlDO1lBQ25DLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDakM7WUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4Qjs7Ozs7UUFFTyxhQUFhLENBQUMsSUFBWTtZQUNoQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEI7WUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzs7S0FHMUI7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQztDQUVqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUFycmF5LFxuICBGb3JtR3JvdXBcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHN0YXJ0V2l0aCAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEZvcm1Qcm9wZXJ0eSB9IGZyb20gJy4vZm9ybS1wcm9wZXJ0eSc7XG5pbXBvcnQgeyBGb3JtUHJvcGVydHlFcnJvcnMgfSBmcm9tICcuL2Zvcm0tcHJvcGVydHktZXJyb3JzJztcbmltcG9ydCB7IFNjaGVtYSwgU2NoZW1hVmFsaWRhdG9yRm4gfSBmcm9tICcuLi9zY2hlbWEnO1xuXG5cbmV4cG9ydCB0eXBlIENvbnN0cnVjdG9yPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuXG5leHBvcnQgZnVuY3Rpb24gQ29udHJvbFByb3BlcnR5PFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxBYnN0cmFjdENvbnRyb2w+PihcbiAgQmFzZTogVFxuKTogVCAmIENvbnN0cnVjdG9yPEZvcm1Qcm9wZXJ0eT4ge1xuXG4gIGFic3RyYWN0IGNsYXNzIFByb3BlcnR5IGV4dGVuZHMgQmFzZSBpbXBsZW1lbnRzIEZvcm1Qcm9wZXJ0eSB7XG5cbiAgICB3aWRnZXRJbnN0YW5jZTogYW55O1xuXG4gICAgbm9uRW1wdHlWYWx1ZTogYW55O1xuICAgIG5vbkVtcHR5VmFsdWVDaGFuZ2VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHZpc2liaWxpdHlDaGFuZ2VzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcblxuICAgIGdldCBpZCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMucGF0aC50b0xvd2VyQ2FzZSgpLnNsaWNlKDEpLnJlcGxhY2UoL1xcLy9nLCAnLScpO1xuICAgIH1cblxuICAgIGdldCBpc1Jvb3QoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcyA9PT0gdGhpcy5yb290O1xuICAgIH1cblxuICAgIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgICByZWFkb25seSBzY2hlbWE6IFNjaGVtYTtcblxuICAgIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5wYXRoLnNwbGl0KCcvJykucG9wKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF92aXNpYmxlID0gdHJ1ZTtcbiAgICBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBzdXBlciguLi5hcmdzKTtcblxuICAgIH1cblxuICAgIGdldEVycm9ycygpOiBGb3JtUHJvcGVydHlFcnJvcnMgfCBudWxsIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuZXJyb3JzO1xuXG4gICAgICBpZiAoIWVycm9ycykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBGb3JtUHJvcGVydHlFcnJvcnMoeyBbdGhpcy5wYXRoXTogZXJyb3JzIH0pO1xuICAgIH1cblxuICAgIHNldFZpc2libGUodmlzaWJsZTogYm9vbGVhbiwgb3B0cyA9IHsgZGlzYWJsZTogZmFsc2UgfSkge1xuICAgICAgdGhpcy5fdmlzaWJsZSA9IHZpc2libGU7XG4gICAgICBpZiAob3B0cy5kaXNhYmxlKSB7XG4gICAgICAgIGlmICh0aGlzLnZpc2libGUpIHtcbiAgICAgICAgICB0aGlzLmVuYWJsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnZpc2liaWxpdHlDaGFuZ2VzLm5leHQodGhpcy52aXNpYmxlKTtcbiAgICB9XG5cbiAgICAvLyB2aXNpYmxlIGlmIEFUIExFQVNUIE9ORSBvZiB0aGUgcHJvcGVydGllcyBpdCBkZXBlbmRzIG9uIGlzIHZpc2libGVcbiAgICAvLyBBTkQgaGFzIGEgdmFsdWUgaW4gdGhlIGxpc3RcbiAgICBiaW5kVmlzaWJpbGl0eSgpIHtcbiAgICAgIC8vIFNIT1VMRCBPTkxZIEJFIENBTExFRCBBRlRFUiBFTlRJUkUgUFJPUEVSVFkgVFJFRSBJUyBCVUlMVFxuICAgICAgY29uc3QgdmlzaWJsZUlmID0gdGhpcy5zY2hlbWEudmlzaWJsZUlmO1xuXG4gICAgICBpZiAodmlzaWJsZUlmID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXRocyA9IE9iamVjdC5rZXlzKHZpc2libGVJZik7XG4gICAgICBpZiAodHlwZW9mIHZpc2libGVJZiA9PT0gJ29iamVjdCcgJiYgcGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuc2V0VmlzaWJsZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2JzZXJ2YWJsZXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgICAgICBpZiAoIXZpc2libGVJZi5oYXNPd25Qcm9wZXJ0eShwYXRoKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnJvb3QuZ2V0KHBhdGgpO1xuICAgICAgICBpZiAoIXByb3BlcnR5KSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYENvdWxkbid0IGZpbmQgcHJvcGVydHkgJHtwYXRofSBmb3IgdmlzaWJpbGl0eSBjaGVjayBvZiBgICsgdGhpcy5wYXRoXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHZpc2libGVJZltwYXRoXTtcblxuICAgICAgICBjb25zdCBvYnNlcnZhYmxlID0gcHJvcGVydHkudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgc3RhcnRXaXRoKHZhbHVlcy5pbmNsdWRlcyhwcm9wZXJ0eS52YWx1ZSkpLFxuICAgICAgICAgIG1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZXMuaW5jbHVkZXMoJyRBTlkkJykgfHwgdmFsdWVzLmluY2x1ZGVzKHZhbHVlKTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIG9ic2VydmFibGVzLnB1c2gob2JzZXJ2YWJsZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE8gdW5zdWJzY3JpYmVcbiAgICAgIGNvbWJpbmVMYXRlc3Qob2JzZXJ2YWJsZXMpXG4gICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlczogYm9vbGVhbltdKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRWaXNpYmxlKHZhbHVlcy5pbmNsdWRlcyh0cnVlKSk7XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgZ2V0KHBhdGg6IEFycmF5PHN0cmluZ3xudW1iZXI+fHN0cmluZyk6IEFic3RyYWN0Q29udHJvbHxudWxsIHtcbiAgICAgIGlmICh0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycgJiYgcGF0aC5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgIHBhdGggPSB0aGlzLm5vcm1hbGl6ZVBhdGgocGF0aCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VwZXIuZ2V0KHBhdGgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbm9ybWFsaXplUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICBpZiAocGF0aFswXSA9PT0gJy8nKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGguc3BsaXQoJy8nKTtcbiAgICB9XG5cbiAgfVxuXG4gIHJldHVybiBQcm9wZXJ0eTtcblxufVxuXG5cbiJdfQ==