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

164 lines (163 loc) 13.9 kB
/** * @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==