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