@deskpro/react-forms
Version:
Forms library for React
218 lines (178 loc) • 8.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.update = exports.select = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /**
* @copyright 2016-present, Prometheus Research, LLC
*/
exports.create = create;
var _memoizeDecorator = require('memoize-decorator');
var _memoizeDecorator2 = _interopRequireDefault(_memoizeDecorator);
var _derivable = require('derivable');
var _get = require('lodash/get');
var _get2 = _interopRequireDefault(_get);
var _Schema = require('../Schema');
var Schema = _interopRequireWildcard(_Schema);
var _keyPath = require('../keyPath');
var _keyPath2 = _interopRequireDefault(_keyPath);
var _applyDecorator = require('../applyDecorator');
var _applyDecorator2 = _interopRequireDefault(_applyDecorator);
var _update2 = require('../update');
var _equality = require('../equality');
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function create() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
schema = _ref.schema,
_ref$value = _ref.value,
value = _ref$value === undefined ? {} : _ref$value,
_ref$params = _ref.params,
params = _ref$params === undefined ? {} : _ref$params,
errorList = _ref.errorList,
_ref$externalErrorLis = _ref.externalErrorList,
externalErrorList = _ref$externalErrorLis === undefined ? [] : _ref$externalErrorLis,
onChange = _ref.onChange,
_ref$validate = _ref.validate,
validate = _ref$validate === undefined ? function (schema, value) {
return Schema.validate(schema, value);
} : _ref$validate;
if (!(0, _derivable.isDerivable)(value)) {
value = (0, _derivable.atom)(value);
}
if (!(0, _derivable.isDerivable)(params)) {
params = (0, _derivable.atom)(params);
}
if (errorList == null) {
errorList = value.derive(function (value) {
return validate(schema, value);
});
} else if (!(0, _derivable.isDerivable)(errorList)) {
errorList = (0, _derivable.atom)(errorList);
}
if (onChange == null) {
onChange = function onChange(update, keyPath) {
var nextValue = (0, _update2.update)(value.get(), keyPath, update, schema);
value.set(nextValue);
};
}
if (!(0, _derivable.isDerivable)(externalErrorList)) {
externalErrorList = (0, _derivable.atom)(externalErrorList);
}
var formValue = new Value(null, [], schema, value, errorList, externalErrorList, params, onChange);
return formValue;
}
function _select(parent) {
for (var _len = arguments.length, key = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
key[_key - 1] = arguments[_key];
}
var keyPath = parent.keyPath.concat(key);
var schema = Schema.select(parent.schema, key);
var value = void 0;
if (schema && schema.select) {
value = parent.root._value.derive(function (value) {
return schema.select(value, keyPath, schema);
});
} else {
value = parent._value.derive(function (value) {
return (0, _get2.default)(value, key);
});
}
var validationErrorList = parent._validationErrorList.derive(function (errorList) {
return filterErrorListByKeyPathPrefix(errorList, keyPath);
});
var externalErrorList = parent._externalErrorList.derive(function (errorList) {
return filterErrorListByKeyPathPrefix(errorList, keyPath);
});
return new Value(parent, keyPath, schema, value, validationErrorList, externalErrorList, parent._params, parent._onChange);
}
exports.select = _select;
function _update(cursor, value) {
cursor._onChange(value, cursor.keyPath);
return cursor;
}
exports.update = _update;
var Value = function () {
function Value(parent, keyPath, schema, value, validationErrorList, externalErrorList, params, onChange) {
var _this = this;
_classCallCheck(this, Value);
this.parent = parent;
this.keyPath = keyPath;
this.schema = schema;
this._value = value;
this._validationErrorList = validationErrorList;
this._externalErrorList = externalErrorList;
this._params = params;
this._onChange = onChange;
this._completeErrorList = (0, _derivable.derivation)(function () {
var validationErrorList = _this._validationErrorList.get();
var externalErrorList = _this._externalErrorList.get();
return validationErrorList.concat(externalErrorList);
}).withEquality(_equality.eqArray);
this._errorList = (0, _derivable.derivation)(function () {
var completeErrorList = _this._completeErrorList.get();
return filterErrorListByKeyPath(completeErrorList, _this.keyPath);
}).withEquality(_equality.eqArray);
}
_createClass(Value, [{
key: 'select',
value: function select(keyPath) {
keyPath = (0, _keyPath2.default)(keyPath);
return _select.apply(undefined, [this].concat(_toConsumableArray(keyPath)));
}
}, {
key: 'update',
value: function update(value) {
return _update(this, value);
}
}, {
key: 'root',
get: function get() {
var root = this;
while (root.parent) {
root = root.parent;
}
return root;
}
}, {
key: 'errorList',
get: function get() {
return this._errorList.get();
}
}, {
key: 'completeErrorList',
get: function get() {
return this._completeErrorList.get();
}
}, {
key: 'value',
get: function get() {
return this._value.get();
}
}, {
key: 'params',
get: function get() {
return this._params.get();
}
}]);
return Value;
}();
(0, _applyDecorator2.default)(Value.prototype, 'root', _memoizeDecorator2.default);
function filterErrorListByKeyPath(errorList, keyPath) {
var field = ['data'].concat(keyPath).join('.');
return errorList.filter(function (error) {
return error.field === field;
});
}
function filterErrorListByKeyPathPrefix(errorList, keyPath) {
if (keyPath.length === 0) {
return errorList;
}
var field = ['data'].concat(keyPath).join('.');
var length = field.length;
return errorList.filter(function (error) {
return error.field === field || error.field.slice(0, length) === field && error.field[length] === '.';
});
}