UNPKG

redux-form

Version:

A higher order component decorator for forms using Redux and React

207 lines (178 loc) 7.81 kB
'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createOnBlur = require('./events/createOnBlur'); var _createOnBlur2 = _interopRequireDefault(_createOnBlur); var _createOnChange = require('./events/createOnChange'); var _createOnChange2 = _interopRequireDefault(_createOnChange); var _createOnDragStart = require('./events/createOnDragStart'); var _createOnDragStart2 = _interopRequireDefault(_createOnDragStart); var _createOnDrop = require('./events/createOnDrop'); var _createOnDrop2 = _interopRequireDefault(_createOnDrop); var _createOnFocus = require('./events/createOnFocus'); var _createOnFocus2 = _interopRequireDefault(_createOnFocus); var _silencePromise = require('./silencePromise'); var _silencePromise2 = _interopRequireDefault(_silencePromise); var _read = require('./read'); var _read2 = _interopRequireDefault(_read); var _updateField = require('./updateField'); var _updateField2 = _interopRequireDefault(_updateField); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function getSuffix(input, closeIndex) { var suffix = input.substring(closeIndex + 1); if (suffix[0] === '.') { suffix = suffix.substring(1); } return suffix; } var getNextKey = function getNextKey(path) { var dotIndex = path.indexOf('.'); var openIndex = path.indexOf('['); if (openIndex > 0 && (dotIndex < 0 || openIndex < dotIndex)) { return path.substring(0, openIndex); } return dotIndex > 0 ? path.substring(0, dotIndex) : path; }; var readField = function readField(state, fieldName) { var pathToHere = arguments.length <= 2 || arguments[2] === undefined ? '' : arguments[2]; var fields = arguments[3]; var syncErrors = arguments[4]; var asyncValidate = arguments[5]; var isReactNative = arguments[6]; var props = arguments[7]; var callback = arguments.length <= 8 || arguments[8] === undefined ? function () { return null; } : arguments[8]; var prefix = arguments.length <= 9 || arguments[9] === undefined ? '' : arguments[9]; var asyncBlurFields = props.asyncBlurFields; var blur = props.blur; var change = props.change; var focus = props.focus; var form = props.form; var initialValues = props.initialValues; var readonly = props.readonly; var addArrayValue = props.addArrayValue; var removeArrayValue = props.removeArrayValue; var swapArrayValues = props.swapArrayValues; var dotIndex = fieldName.indexOf('.'); var openIndex = fieldName.indexOf('['); var closeIndex = fieldName.indexOf(']'); if (openIndex > 0 && closeIndex !== openIndex + 1) { throw new Error('found [ not followed by ]'); } if (openIndex > 0 && (dotIndex < 0 || openIndex < dotIndex)) { var _ret = function () { // array field var key = fieldName.substring(0, openIndex); var rest = getSuffix(fieldName, closeIndex); var stateArray = state && state[key] || []; var fullPrefix = prefix + fieldName.substring(0, closeIndex + 1); var subfields = props.fields.reduce(function (accumulator, field) { if (field.indexOf(fullPrefix) === 0) { accumulator.push(field); } return accumulator; }, []).map(function (field) { return getSuffix(field, prefix.length + closeIndex); }); var addMethods = function addMethods(dest) { Object.defineProperty(dest, 'addField', { value: function value(_value, index) { return addArrayValue(pathToHere + key, _value, index, subfields); } }); Object.defineProperty(dest, 'removeField', { value: function value(index) { return removeArrayValue(pathToHere + key, index); } }); Object.defineProperty(dest, 'swapFields', { value: function value(indexA, indexB) { return swapArrayValues(pathToHere + key, indexA, indexB); } }); return dest; }; if (!fields[key] || fields[key].length !== stateArray.length) { fields[key] = fields[key] ? [].concat(fields[key]) : []; addMethods(fields[key]); } var fieldArray = fields[key]; var changed = false; stateArray.forEach(function (fieldState, index) { if (rest && !fieldArray[index]) { fieldArray[index] = {}; changed = true; } var dest = rest ? fieldArray[index] : {}; var nextPath = '' + pathToHere + key + '[' + index + ']' + (rest ? '.' : ''); var nextPrefix = '' + prefix + key + '[]' + (rest ? '.' : ''); var result = readField(fieldState, rest, nextPath, dest, syncErrors, asyncValidate, isReactNative, props, callback, nextPrefix); if (!rest && fieldArray[index] !== result) { // if nothing after [] in field name, assign directly to array fieldArray[index] = result; changed = true; } }); if (fieldArray.length > stateArray.length) { // remove extra items that aren't in state array fieldArray.splice(stateArray.length, fieldArray.length - stateArray.length); } return { v: changed ? addMethods([].concat(fieldArray)) : fieldArray }; }(); if (typeof _ret === "object") return _ret.v; } if (dotIndex > 0) { // subobject field var key = fieldName.substring(0, dotIndex); var rest = fieldName.substring(dotIndex + 1); var subobject = fields[key] || {}; var nextPath = pathToHere + key + '.'; var nextKey = getNextKey(rest); var previous = subobject[nextKey]; var result = readField(state[key] || {}, rest, nextPath, subobject, syncErrors, asyncValidate, isReactNative, props, callback, nextPath); if (result !== previous) { var _extends2; subobject = _extends({}, subobject, (_extends2 = {}, _extends2[nextKey] = result, _extends2)); } fields[key] = subobject; return subobject; } var name = pathToHere + fieldName; var field = fields[fieldName] || {}; if (field.name !== name) { var onChange = (0, _createOnChange2.default)(name, change, isReactNative); var initialFormValue = (0, _read2.default)(name + '.initial', form); var initialValue = initialFormValue || (0, _read2.default)(name, initialValues); field.name = name; field.defaultChecked = initialValue === true; field.defaultValue = initialValue; field.initialValue = initialValue; if (!readonly) { field.onBlur = (0, _createOnBlur2.default)(name, blur, isReactNative, ~asyncBlurFields.indexOf(name) && function (blurName, blurValue) { return (0, _silencePromise2.default)(asyncValidate(blurName, blurValue)); }); field.onChange = onChange; field.onDragStart = (0, _createOnDragStart2.default)(name, function () { return field.value; }); field.onDrop = (0, _createOnDrop2.default)(name, change); field.onFocus = (0, _createOnFocus2.default)(name, focus); field.onUpdate = onChange; // alias to support belle. https://github.com/nikgraf/belle/issues/58 } field.valid = true; field.invalid = false; Object.defineProperty(field, '_isField', { value: true }); } var fieldState = (fieldName ? state[fieldName] : state) || {}; var syncError = (0, _read2.default)(name, syncErrors); var updated = (0, _updateField2.default)(field, fieldState, name === form._active, syncError); if (fieldName || fields[fieldName] !== updated) { fields[fieldName] = updated; } callback(updated); return updated; }; exports.default = readField;