formik-fields
Version:
An extension to the great formik-library
391 lines (318 loc) • 12 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('formik')) :
typeof define === 'function' && define.amd ? define(['exports', 'react', 'formik'], factory) :
(factory((global.FormikFields = {}),global.React,global.Formik));
}(this, (function (exports,React,formik) { 'use strict';
function _objectWithoutPropertiesLoose(source, excluded) {
if (source == null) return {};
var target = {};
var sourceKeys = Object.keys(source);
var key, i;
for (i = 0; i < sourceKeys.length; i++) {
key = sourceKeys[i];
if (excluded.indexOf(key) >= 0) continue;
target[key] = source[key];
}
return target;
}
function _objectWithoutProperties(source, excluded) {
if (source == null) return {};
var target = _objectWithoutPropertiesLoose(source, excluded);
var key, i;
if (Object.getOwnPropertySymbols) {
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
for (i = 0; i < sourceSymbolKeys.length; i++) {
key = sourceSymbolKeys[i];
if (excluded.indexOf(key) >= 0) continue;
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
target[key] = source[key];
}
}
return target;
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a 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);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); }
function _typeof(obj) {
if (typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol") {
_typeof = function _typeof(obj) {
return _typeof2(obj);
};
} else {
_typeof = function _typeof(obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj);
};
}
return _typeof(obj);
}
function _assertThisInitialized(self) {
if (self === void 0) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return self;
}
function _possibleConstructorReturn(self, call) {
if (call && (_typeof(call) === "object" || typeof call === "function")) {
return call;
}
return _assertThisInitialized(self);
}
function _getPrototypeOf(o) {
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
return o.__proto__ || Object.getPrototypeOf(o);
};
return _getPrototypeOf(o);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function");
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
writable: true,
configurable: true
}
});
if (superClass) _setPrototypeOf(subClass, superClass);
}
var simpleIsEqual = function simpleIsEqual(a, b) {
return a === b;
};
function index (resultFn, isEqual) {
if (isEqual === void 0) {
isEqual = simpleIsEqual;
}
var lastThis;
var lastArgs = [];
var lastResult;
var calledOnce = false;
var isNewArgEqualToLast = function isNewArgEqualToLast(newArg, index) {
return isEqual(newArg, lastArgs[index]);
};
var result = function result() {
for (var _len = arguments.length, newArgs = new Array(_len), _key = 0; _key < _len; _key++) {
newArgs[_key] = arguments[_key];
}
if (calledOnce && lastThis === this && newArgs.length === lastArgs.length && newArgs.every(isNewArgEqualToLast)) {
return lastResult;
}
lastResult = resultFn.apply(this, newArgs);
calledOnce = true;
lastThis = this;
lastArgs = newArgs;
return lastResult;
};
return result;
}
function getFieldKeys(props) {
return Object.keys(props.fields);
}
function calcInitialValues(props) {
var res = {};
getFieldKeys(props).forEach(function (key) {
return res[key] = props.fields[key].initialValue;
});
return res;
}
function toMemoizedValidator(props, key) {
return index(props.fields[key].validate);
}
function calcMemoizedValidatorsFromProps(props) {
var memoizedValidators = {};
getFieldKeys(props).filter(function (key) {
return props.fields[key].validate;
}).forEach(function (key) {
return memoizedValidators[key] = toMemoizedValidator(props, key);
});
return memoizedValidators;
}
function toFormikFieldStateMemoizedByKey(key) {
return index(function (value, error, isTouched, setFieldValue, setFieldTouched) {
return {
name: key,
error: error,
isTouched: isTouched,
value: value,
handleChange: function handleChange(e) {
return setFieldValue(key, e.target.value);
},
handleBlur: function handleBlur() {
return setFieldTouched(key, true);
},
setValue: function setValue(newValue, shouldValidate) {
return setFieldValue(key, newValue, shouldValidate);
},
setIsTouched: function setIsTouched(newTouched, shouldValidate) {
return setFieldTouched(key, newTouched, shouldValidate);
}
};
});
}
function calcMemoizedFormikBagToFormikFieldStateMap(props) {
var res = {};
getFieldKeys(props).forEach(function (key) {
return res[key] = toFormikFieldStateMemoizedByKey(key);
});
return res;
}
var shallowEq = function shallowEq(a, b) {
for (var key in a) {
// @ts-ignore
if (a[key] !== b[key]) {
return false;
}
}
return true;
};
var RenderPureFormikFields =
/*#__PURE__*/
function (_React$Component) {
_inherits(RenderPureFormikFields, _React$Component);
function RenderPureFormikFields() {
_classCallCheck(this, RenderPureFormikFields);
return _possibleConstructorReturn(this, _getPrototypeOf(RenderPureFormikFields).apply(this, arguments));
}
_createClass(RenderPureFormikFields, [{
key: "shouldComponentUpdate",
value: function shouldComponentUpdate(nextProps) {
var formikFields = nextProps.formikFields,
errors = nextProps.errors,
rest = _objectWithoutProperties(nextProps, ["formikFields", "errors"]);
if (shallowEq(rest, this.props) && shallowEq(formikFields, this.props.formikFields) && shallowEq(errors, this.props.errors)) {
return false;
}
return true;
}
}, {
key: "render",
value: function render() {
var _this$props = this.props,
render = _this$props.render,
children = _this$props.children,
formikFields = _this$props.formikFields,
formikBag = _objectWithoutProperties(_this$props, ["render", "children", "formikFields"]);
if (render) {
return render(formikFields, formikBag);
}
if (children) {
return children(formikFields, formikBag);
}
throw new Error('you have to provide either the children- or the render-prop');
}
}]);
return RenderPureFormikFields;
}(React.Component);
var withoutFalsies = function withoutFalsies(obj) {
var res = {};
Object.keys(obj) // @ts-ignore
.filter(function (key) {
return !!obj[key];
}) // @ts-ignore
.forEach(function (key) {
return res[key] = obj[key];
});
return res;
};
var FormikFields =
/*#__PURE__*/
function (_React$PureComponent) {
_inherits(FormikFields, _React$PureComponent);
function FormikFields(props) {
var _this;
_classCallCheck(this, FormikFields);
_this = _possibleConstructorReturn(this, _getPrototypeOf(FormikFields).call(this, props));
_this.initialValues = void 0;
_this.memoizedValidatorMap = void 0;
_this.memoizedFormikBagToFormikFieldStateMap = void 0;
_this.fieldKeys = function () {
return getFieldKeys(_this.props);
};
_this.validateKey = function (key, values) {
if (!_this.memoizedValidatorMap[key]) {
return false;
}
var validator = _this.memoizedValidatorMap[key];
return validator(values[key]);
};
_this.validate = function (values) {
var res = {};
_this.fieldKeys().filter(function (key) {
return _this.memoizedValidatorMap[key];
}).forEach(function (key) {
return res[key] = _this.validateKey(key, values);
});
if (_this.props.validate) {
return withoutFalsies(Object.assign(res, _this.props.validate(values)));
}
return withoutFalsies(res);
};
_this.formikFieldStateByKey = function (key, formikBag) {
return _this.memoizedFormikBagToFormikFieldStateMap[key](formikBag.values[key], formikBag.errors[key], !!formikBag.touched[key], formikBag.setFieldValue, formikBag.setFieldTouched);
};
_this.getState = function (formikBag) {
var res = {};
_this.fieldKeys().forEach(function (key) {
return res[key] = _this.formikFieldStateByKey(key, formikBag);
});
return res;
};
_this.renderCustomFieldsForm = function (formikBag) {
var isValidating = formikBag.isValidating,
other = _objectWithoutProperties(formikBag, ["isValidating"]);
return React.createElement(RenderPureFormikFields, Object.assign({}, other, {
render: _this.props.render,
children: _this.props.children,
formikFields: _this.getState(formikBag)
}));
};
_this.initialValues = calcInitialValues(props);
_this.memoizedValidatorMap = calcMemoizedValidatorsFromProps(props);
_this.memoizedFormikBagToFormikFieldStateMap = calcMemoizedFormikBagToFormikFieldStateMap(props);
return _this;
}
_createClass(FormikFields, [{
key: "render",
value: function render() {
var _this$props = this.props,
fields = _this$props.fields,
render = _this$props.render,
children = _this$props.children,
props = _objectWithoutProperties(_this$props, ["fields", "render", "children"]);
return React.createElement(formik.Formik, Object.assign({}, props, {
initialValues: this.initialValues,
validate: this.validate,
render: this.renderCustomFieldsForm
}));
}
}]);
return FormikFields;
}(React.PureComponent);
exports.FormikFields = FormikFields;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=formik-fields.umd.js.map