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

227 lines (226 loc) 16.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; 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 */ var /** * @abstract */ Property = /** @class */ (function (_super) { tslib_1.__extends(Property, _super); function Property() { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var _this = _super.apply(this, tslib_1.__spread(args)) || this; _this.nonEmptyValueChanges = new EventEmitter(); _this.visibilityChanges = new BehaviorSubject(true); _this._visible = true; return _this; } Object.defineProperty(Property.prototype, "id", { get: /** * @return {?} */ function () { return this.path.toLowerCase().slice(1).replace(/\//g, '-'); }, enumerable: true, configurable: true }); Object.defineProperty(Property.prototype, "isRoot", { get: /** * @return {?} */ function () { return this === this.root; }, enumerable: true, configurable: true }); Object.defineProperty(Property.prototype, "name", { get: /** * @return {?} */ function () { return this.path.split('/').pop(); }, enumerable: true, configurable: true }); Object.defineProperty(Property.prototype, "visible", { get: /** * @return {?} */ function () { return this._visible; }, enumerable: true, configurable: true }); /** * @return {?} */ Property.prototype.getErrors = /** * @return {?} */ function () { /** @type {?} */ var errors = this.errors; if (!errors) { return null; } return new FormPropertyErrors((_a = {}, _a[this.path] = errors, _a)); var _a; }; /** * @param {?} visible * @param {?=} opts * @return {?} */ Property.prototype.setVisible = /** * @param {?} visible * @param {?=} opts * @return {?} */ function (visible, opts) { if (opts === void 0) { opts = { disable: false }; } this._visible = visible; if (opts.disable) { if (this.visible) { this.enable(); } else { this.disable(); } } this.visibilityChanges.next(this.visible); }; // visible if AT LEAST ONE of the properties it depends on is visible // AND has a value in the list /** * @return {?} */ Property.prototype.bindVisibility = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var visibleIf = this.schema["visibleIf"]; if (visibleIf === undefined) { return; } /** @type {?} */ var paths = Object.keys(visibleIf); if (typeof visibleIf === 'object' && paths.length === 0) { this.setVisible(false); return; } /** @type {?} */ var observables = []; var _loop_1 = function (path) { if (!visibleIf.hasOwnProperty(path)) { return "continue"; } /** @type {?} */ var property = this_1.root.get(path); if (!property) { console.warn("Couldn't find property " + path + " for visibility check of " + this_1.path); return "continue"; } /** @type {?} */ var values = visibleIf[path]; /** @type {?} */ var observable = property.valueChanges.pipe(startWith(values.includes(property.value)), map(function (value) { return values.includes('$ANY$') || values.includes(value); })); observables.push(observable); }; var this_1 = this; try { for (var paths_1 = tslib_1.__values(paths), paths_1_1 = paths_1.next(); !paths_1_1.done; paths_1_1 = paths_1.next()) { var path = paths_1_1.value; _loop_1(path); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (paths_1_1 && !paths_1_1.done && (_a = paths_1.return)) _a.call(paths_1); } finally { if (e_1) throw e_1.error; } } // TODO unsubscribe combineLatest(observables) .subscribe(function (values) { _this.setVisible(values.includes(true)); }); var e_1, _a; }; /** * @param {?} path * @return {?} */ Property.prototype.get = /** * @param {?} path * @return {?} */ function (path) { if (typeof path === 'string' && path.includes('/')) { path = this.normalizePath(path); } return _super.prototype.get.call(this, path); }; /** * @param {?} path * @return {?} */ Property.prototype.normalizePath = /** * @param {?} path * @return {?} */ function (path) { if (path[0] === '/') { path = path.slice(1); } return path.split('/'); }; return Property; }(Base)); 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC1wcm9wZXJ0eS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zY2hlbWEtZm9ybXMvIiwic291cmNlcyI6WyJsaWIvbW9kZWwvY29udHJvbC1wcm9wZXJ0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFRN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUcsTUFBTSxnQkFBZ0IsQ0FBQztBQUdqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7O0FBTzVELE1BQU0sMEJBQ0osSUFBTzs7OztJQUdQOzs7SUFBQTtRQUFnQyxvQ0FBSTtRQTRCbEM7WUFBWSxjQUFjO2lCQUFkLFVBQWMsRUFBZCxxQkFBYyxFQUFkLElBQWM7Z0JBQWQseUJBQWM7O1lBQTFCLGdEQUNXLElBQUksV0FFZDt5Q0ExQnNCLElBQUksWUFBWSxFQUFFO3NDQUNyQixJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUM7NkJBaUJqQyxJQUFJOztTQVF4QjtRQXZCRCxzQkFBSSx3QkFBRTs7OztZQUFOO2dCQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2FBQzdEOzs7V0FBQTtRQUVELHNCQUFJLDRCQUFNOzs7O1lBQVY7Z0JBQ0UsTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQzNCOzs7V0FBQTtRQUtELHNCQUFJLDBCQUFJOzs7O1lBQVI7Z0JBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ25DOzs7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LElBQUk7aUJBdUJkOzs7Ozs7Ozs7O1lBR0QsYUFBYSxDQUFDLFdBQVcsQ0FBQztpQkFDdkIsU0FBUyxDQUFDLFVBQUMsTUFBaUI7Z0JBQzNCLEtBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQ3hDLENBQUMsQ0FBQzs7U0FFTjs7Ozs7UUFFRCxzQkFBRzs7OztRQUFILFVBQUksSUFBaUM7WUFDbkMsRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNqQztZQUNELE1BQU0sQ0FBQyxpQkFBTSxHQUFHLFlBQUMsSUFBSSxDQUFDLENBQUM7U0FDeEI7Ozs7O1FBRU8sZ0NBQWE7Ozs7a0JBQUMsSUFBWTtZQUNoQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEI7WUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzs7dUJBM0k3QjtNQXVCa0MsSUFBSSxFQXVIbkMsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDO0NBRWpCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtQXJyYXksXG4gIEZvcm1Hcm91cFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc3RhcnRXaXRoICB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRm9ybVByb3BlcnR5IH0gZnJvbSAnLi9mb3JtLXByb3BlcnR5JztcbmltcG9ydCB7IEZvcm1Qcm9wZXJ0eUVycm9ycyB9IGZyb20gJy4vZm9ybS1wcm9wZXJ0eS1lcnJvcnMnO1xuaW1wb3J0IHsgU2NoZW1hLCBTY2hlbWFWYWxpZGF0b3JGbiB9IGZyb20gJy4uL3NjaGVtYSc7XG5cblxuZXhwb3J0IHR5cGUgQ29uc3RydWN0b3I8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBDb250cm9sUHJvcGVydHk8VCBleHRlbmRzIENvbnN0cnVjdG9yPEFic3RyYWN0Q29udHJvbD4+KFxuICBCYXNlOiBUXG4pOiBUICYgQ29uc3RydWN0b3I8Rm9ybVByb3BlcnR5PiB7XG5cbiAgYWJzdHJhY3QgY2xhc3MgUHJvcGVydHkgZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgRm9ybVByb3BlcnR5IHtcblxuICAgIHdpZGdldEluc3RhbmNlOiBhbnk7XG5cbiAgICBub25FbXB0eVZhbHVlOiBhbnk7XG4gICAgbm9uRW1wdHlWYWx1ZUNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdmlzaWJpbGl0eUNoYW5nZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuXG4gICAgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5wYXRoLnRvTG93ZXJDYXNlKCkuc2xpY2UoMSkucmVwbGFjZSgvXFwvL2csICctJyk7XG4gICAgfVxuXG4gICAgZ2V0IGlzUm9vdCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzID09PSB0aGlzLnJvb3Q7XG4gICAgfVxuXG4gICAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHNjaGVtYTogU2NoZW1hO1xuXG4gICAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLnBhdGguc3BsaXQoJy8nKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3Zpc2libGUgPSB0cnVlO1xuICAgIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3Zpc2libGU7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgIHN1cGVyKC4uLmFyZ3MpO1xuXG4gICAgfVxuXG4gICAgZ2V0RXJyb3JzKCk6IEZvcm1Qcm9wZXJ0eUVycm9ycyB8IG51bGwge1xuICAgICAgY29uc3QgZXJyb3JzID0gdGhpcy5lcnJvcnM7XG5cbiAgICAgIGlmICghZXJyb3JzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEZvcm1Qcm9wZXJ0eUVycm9ycyh7IFt0aGlzLnBhdGhdOiBlcnJvcnMgfSk7XG4gICAgfVxuXG4gICAgc2V0VmlzaWJsZSh2aXNpYmxlOiBib29sZWFuLCBvcHRzID0geyBkaXNhYmxlOiBmYWxzZSB9KSB7XG4gICAgICB0aGlzLl92aXNpYmxlID0gdmlzaWJsZTtcbiAgICAgIGlmIChvcHRzLmRpc2FibGUpIHtcbiAgICAgICAgaWYgKHRoaXMudmlzaWJsZSkge1xuICAgICAgICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudmlzaWJpbGl0eUNoYW5nZXMubmV4dCh0aGlzLnZpc2libGUpO1xuICAgIH1cblxuICAgIC8vIHZpc2libGUgaWYgQVQgTEVBU1QgT05FIG9mIHRoZSBwcm9wZXJ0aWVzIGl0IGRlcGVuZHMgb24gaXMgdmlzaWJsZVxuICAgIC8vIEFORCBoYXMgYSB2YWx1ZSBpbiB0aGUgbGlzdFxuICAgIGJpbmRWaXNpYmlsaXR5KCkge1xuICAgICAgLy8gU0hPVUxEIE9OTFkgQkUgQ0FMTEVEIEFGVEVSIEVOVElSRSBQUk9QRVJUWSBUUkVFIElTIEJVSUxUXG4gICAgICBjb25zdCB2aXNpYmxlSWYgPSB0aGlzLnNjaGVtYS52aXNpYmxlSWY7XG5cbiAgICAgIGlmICh2aXNpYmxlSWYgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdGhzID0gT2JqZWN0LmtleXModmlzaWJsZUlmKTtcbiAgICAgIGlmICh0eXBlb2YgdmlzaWJsZUlmID09PSAnb2JqZWN0JyAmJiBwYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zZXRWaXNpYmxlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvYnNlcnZhYmxlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICAgIGlmICghdmlzaWJsZUlmLmhhc093blByb3BlcnR5KHBhdGgpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucm9vdC5nZXQocGF0aCk7XG4gICAgICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgQ291bGRuJ3QgZmluZCBwcm9wZXJ0eSAke3BhdGh9IGZvciB2aXNpYmlsaXR5IGNoZWNrIG9mIGAgKyB0aGlzLnBhdGhcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWVzID0gdmlzaWJsZUlmW3BhdGhdO1xuXG4gICAgICAgIGNvbnN0IG9ic2VydmFibGUgPSBwcm9wZXJ0eS52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICBzdGFydFdpdGgodmFsdWVzLmluY2x1ZGVzKHByb3BlcnR5LnZhbHVlKSksXG4gICAgICAgICAgbWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlcy5pbmNsdWRlcygnJEFOWSQnKSB8fCB2YWx1ZXMuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgb2JzZXJ2YWJsZXMucHVzaChvYnNlcnZhYmxlKTtcbiAgICAgIH1cblxuICAgICAgLy8gVE9ETyB1bnN1YnNjcmliZVxuICAgICAgY29tYmluZUxhdGVzdChvYnNlcnZhYmxlcylcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWVzOiBib29sZWFuW10pID0+IHtcbiAgICAgICAgICB0aGlzLnNldFZpc2libGUodmFsdWVzLmluY2x1ZGVzKHRydWUpKTtcbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICBnZXQocGF0aDogQXJyYXk8c3RyaW5nfG51bWJlcj58c3RyaW5nKTogQWJzdHJhY3RDb250cm9sfG51bGwge1xuICAgICAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJyAmJiBwYXRoLmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgcGF0aCA9IHRoaXMubm9ybWFsaXplUGF0aChwYXRoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdXBlci5nZXQocGF0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3JtYWxpemVQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgIGlmIChwYXRoWzBdID09PSAnLycpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aC5zcGxpdCgnLycpO1xuICAgIH1cblxuICB9XG5cbiAgcmV0dXJuIFByb3BlcnR5O1xuXG59XG5cblxuIl19