UNPKG

@deskpro/react-forms

Version:
218 lines (178 loc) 8.5 kB
'use strict'; 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] === '.'; }); }