@danderson00/react-forms 0.0.42 → 0.0.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/Form.js CHANGED
@@ -54,12 +54,12 @@ var Form = function Form(ContextProvider) {
54
54
  setValid(form.current.checkValidity());
55
55
  }
56
56
  }, [form.current]);
57
- var getFieldValue = function getFieldValue(path) {
57
+ var getFieldValue = (0, _react.useCallback)(function (path) {
58
58
  return (0, _objectPathImmutable.get)(fieldValues, path);
59
- };
60
- var getFieldValues = function getFieldValues() {
59
+ }, [fieldValues]);
60
+ var getFieldValues = (0, _react.useCallback)(function () {
61
61
  return fieldValues;
62
- };
62
+ }, [fieldValues]);
63
63
  var mapFieldValues = function mapFieldValues(target) {
64
64
  return Object.keys(target).reduce(function (values, name) {
65
65
  return (0, _objectPathImmutable.set)(values, name, target[name]);
@@ -73,13 +73,13 @@ var Form = function Form(ContextProvider) {
73
73
  setValid(form.current.checkValidity());
74
74
  }
75
75
  };
76
- var onSubmit = function onSubmit(e) {
76
+ var onSubmit = (0, _react.useCallback)(function (e) {
77
77
  var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
78
78
  additionalValues = _ref2.additionalValues,
79
79
  validate = _ref2.validate;
80
80
  if (validate !== false) {
81
81
  fieldValidators.forEach(function (setFieldValidated) {
82
- return setFieldValidated();
82
+ return setFieldValidated(undefined, fieldValues);
83
83
  });
84
84
  }
85
85
  if ((validate === false || form.current.checkValidity()) && props.onSubmit) {
@@ -119,7 +119,7 @@ var Form = function Form(ContextProvider) {
119
119
  }
120
120
  e && e.preventDefault && e.preventDefault();
121
121
  e && e.stopPropagation && e.stopPropagation();
122
- };
122
+ }, [props, fieldValues]);
123
123
  var classNames = ['react-forms', props.className];
124
124
  if (row) {
125
125
  classNames.push('react-forms-row');
package/dist/Form.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Form.js","names":["Form","ContextProvider","additionalContext","ErrorMessage","resetOnSubmit","row","gap","props","useState","values","fieldValues","setFieldValues","useReducer","validators","validator","fieldValidators","registerFieldValidator","error","setError","valid","setValid","form","createRef","useEffect","current","checkValidity","getFieldValue","path","get","getFieldValues","mapFieldValues","target","Object","keys","reduce","name","set","setFieldValue","value","previousValues","onSubmit","e","additionalValues","validate","forEach","setFieldValidated","undefined","interactiveElements","querySelectorAll","setFormDisabled","disabled","x","reset","checkResultForError","result","success","message","then","preventDefault","stopPropagation","classNames","className","push","mergedAdditionalContext","property","createElement","join","noValidate","ref","style","children","key","type","visibility","position"],"sources":["../src/Form.js"],"sourcesContent":["import { createElement, createRef, useEffect, useReducer, useState } from 'react'\nimport { get, set } from 'object-path-immutable'\n\nconst Form = (ContextProvider, additionalContext = {}, ErrorMessage) => (\n ({ resetOnSubmit, row, gap, ...props }) => {\n const [fieldValues, setFieldValues] = useState(props.values || {})\n const [fieldValidators, registerFieldValidator] = useReducer((validators, validator) => [...validators, validator], [])\n const [error, setError] = useState()\n const [valid, setValid] = useState()\n const form = createRef()\n\n useEffect(() => {\n if(form.current) {\n setValid(form.current.checkValidity())\n }\n }, [form.current])\n\n const getFieldValue = path => get(fieldValues, path)\n const getFieldValues = () => fieldValues\n const mapFieldValues = target => Object.keys(target).reduce(\n (values, name) => set(values, name, target[name]),\n {}\n )\n\n const setFieldValue = (path, value) => {\n setFieldValues(previousValues => set(previousValues, path, value))\n if(form.current) {\n setValid(form.current.checkValidity())\n }\n }\n\n const onSubmit = (e, { additionalValues, validate } = {}) => {\n if(validate !== false) {\n fieldValidators.forEach(setFieldValidated => setFieldValidated())\n }\n\n if((validate === false || form.current.checkValidity()) && props.onSubmit) {\n setError(undefined)\n\n const interactiveElements = form.current.querySelectorAll('input,button,textarea,select')\n const setFormDisabled = disabled => interactiveElements.forEach(x => x.disabled = disabled)\n\n const reset = () => {\n if(resetOnSubmit) {\n setFieldValues(props.values || {})\n }\n }\n\n try {\n const checkResultForError = result => {\n if(result && (result.success === false || result.error)) {\n setError(result.error || result.message || 'Form submission failed')\n } else {\n reset()\n }\n return result\n }\n\n const result = props.onSubmit(mapFieldValues({ ...fieldValues, ...additionalValues }))\n if(result && typeof result.then === 'function') {\n setFormDisabled(true)\n result\n .then(checkResultForError)\n .catch(setError)\n .finally(() => setFormDisabled(false))\n } else {\n reset()\n }\n } catch(error) {\n setError(error)\n }\n }\n\n e && e.preventDefault && e.preventDefault()\n e && e.stopPropagation && e.stopPropagation()\n }\n\n const classNames = ['react-forms', props.className]\n if(row) {\n classNames.push('react-forms-row')\n }\n\n const mergedAdditionalContext = Object.keys(additionalContext).reduce(\n (result, property) => ({ ...result, [property]: props[property] || additionalContext[property] }),\n {}\n )\n\n return (\n createElement('form', {\n ...props,\n className: classNames.join(' '),\n noValidate: true,\n onSubmit: onSubmit,\n ref: form,\n ...(gap && { style: { gap } }),\n children: [\n createElement(ContextProvider, {\n ...props,\n key: 'context',\n value: {\n registerFieldValidator,\n setFieldValue,\n getFieldValue,\n getFieldValues,\n onSubmit,\n valid,\n ...mergedAdditionalContext\n }\n }),\n error && createElement(ErrorMessage, { key: 'error', error }),\n createElement('input', {\n key: 'submit',\n type: 'submit',\n style: {\n visibility: 'hidden',\n position: 'absolute'\n }\n }),\n ]\n })\n )\n }\n)\nexport default Form"],"mappings":"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"}
1
+ {"version":3,"file":"Form.js","names":["Form","ContextProvider","additionalContext","ErrorMessage","resetOnSubmit","row","gap","props","useState","values","fieldValues","setFieldValues","useReducer","validators","validator","fieldValidators","registerFieldValidator","error","setError","valid","setValid","form","createRef","useEffect","current","checkValidity","getFieldValue","useCallback","path","get","getFieldValues","mapFieldValues","target","Object","keys","reduce","name","set","setFieldValue","value","previousValues","onSubmit","e","additionalValues","validate","forEach","setFieldValidated","undefined","interactiveElements","querySelectorAll","setFormDisabled","disabled","x","reset","checkResultForError","result","success","message","then","preventDefault","stopPropagation","classNames","className","push","mergedAdditionalContext","property","createElement","join","noValidate","ref","style","children","key","type","visibility","position"],"sources":["../src/Form.js"],"sourcesContent":["import { createElement, createRef, useCallback, useEffect, useReducer, useState } from 'react'\nimport { get, set } from 'object-path-immutable'\n\nconst Form = (ContextProvider, additionalContext = {}, ErrorMessage) => (\n ({ resetOnSubmit, row, gap, ...props }) => {\n const [fieldValues, setFieldValues] = useState(props.values || {})\n const [fieldValidators, registerFieldValidator] = useReducer((validators, validator) => [...validators, validator], [])\n const [error, setError] = useState()\n const [valid, setValid] = useState()\n const form = createRef()\n\n useEffect(() => {\n if(form.current) {\n setValid(form.current.checkValidity())\n }\n }, [form.current])\n\n const getFieldValue = useCallback(path => get(fieldValues, path), [fieldValues])\n const getFieldValues = useCallback(() => fieldValues, [fieldValues])\n const mapFieldValues = target => Object.keys(target).reduce(\n (values, name) => set(values, name, target[name]),\n {}\n )\n\n const setFieldValue = (path, value) => {\n setFieldValues(previousValues => set(previousValues, path, value))\n if(form.current) {\n setValid(form.current.checkValidity())\n }\n }\n\n const onSubmit = useCallback((e, { additionalValues, validate } = {}) => {\n if(validate !== false) {\n fieldValidators.forEach(setFieldValidated => setFieldValidated(undefined, fieldValues))\n }\n\n if((validate === false || form.current.checkValidity()) && props.onSubmit) {\n setError(undefined)\n\n const interactiveElements = form.current.querySelectorAll('input,button,textarea,select')\n const setFormDisabled = disabled => interactiveElements.forEach(x => x.disabled = disabled)\n\n const reset = () => {\n if(resetOnSubmit) {\n setFieldValues(props.values || {})\n }\n }\n\n try {\n const checkResultForError = result => {\n if(result && (result.success === false || result.error)) {\n setError(result.error || result.message || 'Form submission failed')\n } else {\n reset()\n }\n return result\n }\n\n const result = props.onSubmit(mapFieldValues({ ...fieldValues, ...additionalValues }))\n if(result && typeof result.then === 'function') {\n setFormDisabled(true)\n result\n .then(checkResultForError)\n .catch(setError)\n .finally(() => setFormDisabled(false))\n } else {\n reset()\n }\n } catch(error) {\n setError(error)\n }\n }\n\n e && e.preventDefault && e.preventDefault()\n e && e.stopPropagation && e.stopPropagation()\n }, [props, fieldValues])\n\n const classNames = ['react-forms', props.className]\n if(row) {\n classNames.push('react-forms-row')\n }\n\n const mergedAdditionalContext = Object.keys(additionalContext).reduce(\n (result, property) => ({ ...result, [property]: props[property] || additionalContext[property] }),\n {}\n )\n\n return (\n createElement('form', {\n ...props,\n className: classNames.join(' '),\n noValidate: true,\n onSubmit: onSubmit,\n ref: form,\n ...(gap && { style: { gap } }),\n children: [\n createElement(ContextProvider, {\n ...props,\n key: 'context',\n value: {\n registerFieldValidator,\n setFieldValue,\n getFieldValue,\n getFieldValues,\n onSubmit,\n valid,\n ...mergedAdditionalContext\n }\n }),\n error && createElement(ErrorMessage, { key: 'error', error }),\n createElement('input', {\n key: 'submit',\n type: 'submit',\n style: {\n visibility: 'hidden',\n position: 'absolute'\n }\n }),\n ]\n })\n )\n }\n)\nexport default Form"],"mappings":"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"}
package/dist/input.js CHANGED
@@ -9,7 +9,7 @@ var _usePrevious = _interopRequireDefault(require("./usePrevious"));
9
9
  var _useUpdate = _interopRequireDefault(require("./useUpdate"));
10
10
  var _inputTypes = _interopRequireDefault(require("./inputTypes"));
11
11
  var _throttle2 = _interopRequireDefault(require("./throttle"));
12
- var _excluded = ["type", "value", "checked", "defaultValue", "numeric", "onSubmit", "registerFieldValidator", "setFieldValue", "getFieldValue", "getFieldValues", "submitOnChange", "submitOnBlur", "selectOnFocus", "throttle", "valid", "onValidated"];
12
+ var _excluded = ["type", "value", "checked", "defaultValue", "numeric", "getValidationMessage", "onSubmit", "registerFieldValidator", "setFieldValue", "getFieldValue", "getFieldValues", "submitOnChange", "submitOnBlur", "selectOnFocus", "throttle", "valid", "onValidated"];
13
13
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
14
14
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
15
15
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -65,8 +65,8 @@ var _default = function _default(render) {
65
65
  // don't override values that were set from passing a values prop to the form
66
66
  if (getFieldValue(name) === undefined) {
67
67
  // TODO: change setter to a getter and return a private `UNSET` symbol to indicate not to call the field setter
68
- // this allows us to set the default value with useState above and not have an initial render cycle without the default value
69
- // BUT... to get the default value of a select list, we need to render it first? dilemma....
68
+ // this allows us to set the default value with useState above and not have an initial render cycle without the default value
69
+ // BUT... to get the default value of a select list, we need to render it first? dilemma....
70
70
 
71
71
  setInitialValue({
72
72
  // pass a setter function - radio buttons do not always want to set a value!
@@ -83,27 +83,32 @@ var _default = function _default(render) {
83
83
 
84
84
  // ensure form values are updated to reflect passed `value` prop
85
85
  // this probably introduces some redundancy with the onChange handler below
86
- var type = props.type,
87
- checked = props.checked,
88
- value = props.value,
89
- defaultValue = props.defaultValue,
90
- setFieldValue = props.setFieldValue;
91
86
  (0, _useUpdate["default"])(function () {
92
- var _types2 = (0, _inputTypes["default"])({
93
- type: type,
94
- checked: checked,
95
- value: value,
96
- defaultValue: defaultValue,
97
- setFieldValue: setFieldValue
98
- }, options),
87
+ var value = props.value,
88
+ setFieldValue = props.setFieldValue;
89
+ var _types2 = (0, _inputTypes["default"])(props, options),
99
90
  applyValueTransforms = _types2.applyValueTransforms;
100
91
  if (value !== previousValueProp) {
101
92
  setFieldValue(name, applyValueTransforms(value));
102
93
  }
103
- }, [type, checked, value, defaultValue, setFieldValue]);
94
+ }, [props]);
95
+ var updateValidationState = (0, _react.useCallback)(function (newValue, oldValues) {
96
+ var getValidationMessage = props.getValidationMessage,
97
+ getFieldValue = props.getFieldValue,
98
+ getFieldValues = props.getFieldValues;
99
+ var element = document.querySelector("#".concat(id));
100
+ var validationMessage = getValidationMessage && getValidationMessage(newValue === undefined ? getFieldValue(name) : newValue, oldValues || getFieldValues());
101
+ element.setCustomValidity(validationMessage || "");
102
+ setFieldValidated(true);
103
+ // this is a little hacky, but the simplest way I could think of to determine the
104
+ // validity of the actual input element. :invalid is also not supported by enzyme
105
+ var invalid = !!validationMessage || Boolean(document.querySelector("#".concat(id, ":invalid")));
106
+ setError(invalid);
107
+ props.onValidated && props.onValidated(!invalid);
108
+ }, [props]);
104
109
 
105
110
  // TODO: refactor bubbling to prop pattern
106
- var onChange = function onChange() {
111
+ var onChange = (0, _react.useCallback)(function () {
107
112
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
108
113
  args[_key] = arguments[_key];
109
114
  }
@@ -121,7 +126,7 @@ var _default = function _default(render) {
121
126
  setFieldValue(name, applyValueTransforms(elementValue));
122
127
  if (event && event.target && event.target.checkValidity) {
123
128
  event.target.checkValidity();
124
- updateValidationState();
129
+ updateValidationState(applyValueTransforms(elementValue));
125
130
  }
126
131
  if (onChange) {
127
132
  onChange.apply(event.target, args);
@@ -133,7 +138,7 @@ var _default = function _default(render) {
133
138
  additionalValues: _defineProperty({}, name, applyValueTransforms(elementValue))
134
139
  });
135
140
  }
136
- };
141
+ }, [props.setFieldValue, props.onChange, props.submitOnChange, props.setFieldValue, updateValidationState]);
137
142
  var onBlur = function onBlur() {
138
143
  var submitOnBlur = props.submitOnBlur,
139
144
  onSubmit = props.onSubmit,
@@ -183,28 +188,21 @@ var _default = function _default(render) {
183
188
  onKeyDown.apply(element, args);
184
189
  }
185
190
  };
186
- var updateValidationState = function updateValidationState() {
187
- setFieldValidated(true);
188
- // this is a little hacky, but the simplest way I could think of to determine the
189
- // validity of the actual input element. :invalid is also not supported by enzyme
190
- var invalid = Boolean(document.querySelector("#".concat(id, ":invalid")));
191
- setError(invalid);
192
- props.onValidated && props.onValidated(!invalid);
193
- };
194
191
 
195
192
  /* render */
196
193
  {
197
194
  var passErrorProp = options.passErrorProp;
198
195
  var _types4 = (0, _inputTypes["default"])(props, options),
199
196
  getValueProps = _types4.getValueProps;
200
- var _type = props.type,
201
- _value = props.value,
202
- _checked = props.checked,
203
- _defaultValue = props.defaultValue,
197
+ var type = props.type,
198
+ value = props.value,
199
+ checked = props.checked,
200
+ defaultValue = props.defaultValue,
204
201
  numeric = props.numeric,
202
+ getValidationMessage = props.getValidationMessage,
205
203
  _onSubmit = props.onSubmit,
206
204
  registerFieldValidator = props.registerFieldValidator,
207
- _setFieldValue = props.setFieldValue,
205
+ setFieldValue = props.setFieldValue,
208
206
  getFieldValue = props.getFieldValue,
209
207
  getFieldValues = props.getFieldValues,
210
208
  submitOnChange = props.submitOnChange,
@@ -220,8 +218,8 @@ var _default = function _default(render) {
220
218
  var numericProps = numeric && {
221
219
  type: 'number'
222
220
  };
223
- var typeProps = _type && {
224
- type: _type
221
+ var typeProps = type && {
222
+ type: type
225
223
  };
226
224
  var errorProps = passErrorProp && {
227
225
  error: error
package/dist/input.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"input.js","names":["nextElementId","id","render","options","Input","props","name","Error","setFieldValue","useState","fieldValidated","setFieldValidated","error","setError","previousValueProp","usePrevious","value","groups","throttle","onSubmit","map","group","submitHandler","createThrottled","isNaN","useEffect","getFieldValue","registerFieldValidator","types","setInitialValue","applyValueTransforms","undefined","set","element","document","querySelector","updateValidationState","type","checked","defaultValue","useUpdate","onChange","args","event","submitOnChange","valueFromEvent","getOutputValue","elementValue","apply","target","checkValidity","additionalValues","onBlur","submitOnBlur","onFocus","selectOnFocus","selectText","selectionStart","selectionEnd","length","setTimeout","onKeyDown","numeric","exec","key","includes","keyCode","preventDefault","invalid","Boolean","onValidated","passErrorProp","getValueProps","getFieldValues","valid","passThroughProps","valueProps","currentValue","numericProps","typeProps","errorProps","className","finalProps"],"sources":["../src/input.js"],"sourcesContent":["import { useState, useEffect } from 'react'\nimport usePrevious from './usePrevious'\nimport useUpdate from './useUpdate'\nimport types from './inputTypes'\nimport createThrottled from './throttle'\n\nconst nextElementId = (id => () => `react-forms-${++id}`)(0)\n\nexport default (render, options = {}) => function Input(props) {\n if (!props.name) throw new Error(\"You must provide a name prop to form components\")\n if (!props.setFieldValue) throw new Error(\"Input components must be contained within a Form component\")\n\n const [fieldValidated, setFieldValidated] = useState(false)\n const [error, setError] = useState(false)\n const [id] = useState(props.id || nextElementId())\n const previousValueProp = usePrevious(props.value)\n\n // this is currently broken :-\\\n const { groups = [], throttle, onSubmit } = props\n const name = groups.map(group => group + '.') + props.name\n const submitHandler = (throttle && onSubmit) ? createThrottled(onSubmit, isNaN(throttle) ? 200 : throttle) : onSubmit\n\n useEffect(() => {\n const { getFieldValue, setFieldValue, registerFieldValidator } = props\n const { setInitialValue, applyValueTransforms } = types(props, options)\n\n // don't override values that were set from passing a values prop to the form\n if(getFieldValue(name) === undefined) {\n // TODO: change setter to a getter and return a private `UNSET` symbol to indicate not to call the field setter\n // this allows us to set the default value with useState above and not have an initial render cycle without the default value\n // BUT... to get the default value of a select list, we need to render it first? dilemma....\n\n setInitialValue({\n // pass a setter function - radio buttons do not always want to set a value!\n set: value => setFieldValue(name, applyValueTransforms(value)),\n element: document.querySelector(`#${id}`)\n })\n }\n registerFieldValidator(updateValidationState)\n\n // TODO: need to unregister in case of dynamic form elements\n }, [])\n\n // ensure form values are updated to reflect passed `value` prop\n // this probably introduces some redundancy with the onChange handler below\n const { type, checked, value, defaultValue, setFieldValue } = props\n useUpdate(() => {\n const { applyValueTransforms } = types({ type, checked, value, defaultValue, setFieldValue }, options)\n\n if(value !== previousValueProp) {\n setFieldValue(name, applyValueTransforms(value))\n }\n }, [type, checked, value, defaultValue, setFieldValue])\n\n // TODO: refactor bubbling to prop pattern\n const onChange = (...args) => {\n const [event] = args\n const { setFieldValue, onChange, submitOnChange } = props\n const { valueFromEvent } = options\n const { getOutputValue, applyValueTransforms } = types(props, options)\n\n const elementValue = valueFromEvent\n ? valueFromEvent.apply(null, args)\n : getOutputValue({ event })\n\n setFieldValue(name, applyValueTransforms(elementValue))\n\n if(event && event.target && event.target.checkValidity) {\n event.target.checkValidity()\n updateValidationState()\n }\n\n if(onChange) {\n onChange.apply(event.target, args)\n }\n\n if(submitOnChange && submitHandler) {\n // the setFieldValue above sets state on the Form component, used in the onSubmit handler\n // setting state requires an additional render cycle - we need to pass in the new value so it's set correctly\n submitHandler(undefined, { additionalValues: { [name]: applyValueTransforms(elementValue) } })\n }\n }\n\n const onBlur = (...args) => {\n const { submitOnBlur, onSubmit, onBlur } = props\n const [event] = args\n\n if(submitOnBlur) {\n onSubmit()\n }\n if(onBlur) {\n onBlur.apply(event.target, args)\n }\n }\n\n const onFocus = (...args) => {\n const { selectOnFocus, onFocus } = props\n const [event] = args\n const element = event.target\n\n const selectText = () => {\n element.selectionStart = 0\n element.selectionEnd = element.value.length\n }\n\n if(selectOnFocus) {\n selectText()\n setTimeout(selectText)\n }\n if(onFocus) {\n onFocus.apply(element, args)\n }\n }\n\n const onKeyDown = (...args) => {\n const { onKeyDown } = props\n const [event] = args\n const element = event.target\n \n if(props.numeric && !/[0-9-]/.exec(event.key) && ![null, 0, 8, 9, 13, 27, 35, 36, 37, 39, 46].includes(event.keyCode)) {\n event.preventDefault()\n }\n\n if(onKeyDown) {\n onKeyDown.apply(element, args)\n }\n }\n\n const updateValidationState = () => {\n setFieldValidated(true)\n // this is a little hacky, but the simplest way I could think of to determine the\n // validity of the actual input element. :invalid is also not supported by enzyme\n const invalid = Boolean(document.querySelector(`#${id}:invalid`))\n setError(invalid)\n props.onValidated && props.onValidated(!invalid)\n }\n\n /* render */ {\n const { passErrorProp } = options\n const { getValueProps } = types(props, options)\n\n const {\n type, value, checked, defaultValue, numeric,\n onSubmit, registerFieldValidator, setFieldValue, getFieldValue, getFieldValues,\n submitOnChange, submitOnBlur, selectOnFocus, throttle, valid, onValidated,\n ...passThroughProps\n } = props\n const valueProps = getValueProps({ currentValue: getFieldValue(name) })\n const numericProps = (numeric && { type: 'number' })\n const typeProps = (type && { type })\n const errorProps = (passErrorProp && { error })\n const className = ((fieldValidated ? 'validated ' : '') + (props.className || '') || undefined)\n\n const finalProps = {\n id, name, className,\n ...passThroughProps, ...valueProps, ...numericProps, ...typeProps, ...errorProps,\n onChange, onFocus, onBlur, onKeyDown\n }\n\n return render(finalProps)\n }\n}"],"mappings":"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"}
1
+ {"version":3,"file":"input.js","names":["nextElementId","id","render","options","Input","props","name","Error","setFieldValue","useState","fieldValidated","setFieldValidated","error","setError","previousValueProp","usePrevious","value","groups","throttle","onSubmit","map","group","submitHandler","createThrottled","isNaN","useEffect","getFieldValue","registerFieldValidator","types","setInitialValue","applyValueTransforms","undefined","set","element","document","querySelector","updateValidationState","useUpdate","useCallback","newValue","oldValues","getValidationMessage","getFieldValues","validationMessage","setCustomValidity","invalid","Boolean","onValidated","onChange","args","event","submitOnChange","valueFromEvent","getOutputValue","elementValue","apply","target","checkValidity","additionalValues","onBlur","submitOnBlur","onFocus","selectOnFocus","selectText","selectionStart","selectionEnd","length","setTimeout","onKeyDown","numeric","exec","key","includes","keyCode","preventDefault","passErrorProp","getValueProps","type","checked","defaultValue","valid","passThroughProps","valueProps","currentValue","numericProps","typeProps","errorProps","className","finalProps"],"sources":["../src/input.js"],"sourcesContent":["import { useCallback, useState, useEffect } from 'react'\nimport usePrevious from './usePrevious'\nimport useUpdate from './useUpdate'\nimport types from './inputTypes'\nimport createThrottled from './throttle'\n\nconst nextElementId = (id => () => `react-forms-${++id}`)(0)\n\nexport default (render, options = {}) => function Input(props) {\n if (!props.name) throw new Error(\"You must provide a name prop to form components\")\n if (!props.setFieldValue) throw new Error(\"Input components must be contained within a Form component\")\n\n const [fieldValidated, setFieldValidated] = useState(false)\n const [error, setError] = useState(false)\n const [id] = useState(props.id || nextElementId())\n const previousValueProp = usePrevious(props.value)\n\n // this is currently broken :-\\\n const { groups = [], throttle, onSubmit } = props\n const name = groups.map(group => group + '.') + props.name\n const submitHandler = (throttle && onSubmit) ? createThrottled(onSubmit, isNaN(throttle) ? 200 : throttle) : onSubmit\n\n useEffect(() => {\n const { getFieldValue, setFieldValue, registerFieldValidator } = props\n const { setInitialValue, applyValueTransforms } = types(props, options)\n\n // don't override values that were set from passing a values prop to the form\n if(getFieldValue(name) === undefined) {\n // TODO: change setter to a getter and return a private `UNSET` symbol to indicate not to call the field setter\n // this allows us to set the default value with useState above and not have an initial render cycle without the default value\n // BUT... to get the default value of a select list, we need to render it first? dilemma....\n\n setInitialValue({\n // pass a setter function - radio buttons do not always want to set a value!\n set: value => setFieldValue(name, applyValueTransforms(value)),\n element: document.querySelector(`#${id}`)\n })\n }\n registerFieldValidator(updateValidationState)\n\n // TODO: need to unregister in case of dynamic form elements\n }, [])\n\n // ensure form values are updated to reflect passed `value` prop\n // this probably introduces some redundancy with the onChange handler below\n useUpdate(() => {\n const { value, setFieldValue } = props\n const { applyValueTransforms } = types(props, options)\n\n if(value !== previousValueProp) {\n setFieldValue(name, applyValueTransforms(value))\n }\n }, [props])\n\n const updateValidationState = useCallback((newValue, oldValues) => {\n const { getValidationMessage, getFieldValue, getFieldValues } = props\n const element = document.querySelector(`#${id}`)\n const validationMessage = getValidationMessage && getValidationMessage(\n newValue === undefined ? getFieldValue(name) : newValue,\n oldValues || getFieldValues()\n )\n element.setCustomValidity(validationMessage || \"\")\n\n setFieldValidated(true)\n // this is a little hacky, but the simplest way I could think of to determine the\n // validity of the actual input element. :invalid is also not supported by enzyme\n const invalid = !!validationMessage || Boolean(document.querySelector(`#${id}:invalid`))\n setError(invalid)\n props.onValidated && props.onValidated(!invalid)\n }, [props])\n\n // TODO: refactor bubbling to prop pattern\n const onChange = useCallback((...args) => {\n const [event] = args\n const { setFieldValue, onChange, submitOnChange } = props\n const { valueFromEvent } = options\n const { getOutputValue, applyValueTransforms } = types(props, options)\n\n const elementValue = valueFromEvent\n ? valueFromEvent.apply(null, args)\n : getOutputValue({ event })\n\n setFieldValue(name, applyValueTransforms(elementValue))\n\n if(event && event.target && event.target.checkValidity) {\n event.target.checkValidity()\n updateValidationState(applyValueTransforms(elementValue))\n }\n\n if(onChange) {\n onChange.apply(event.target, args)\n }\n\n if(submitOnChange && submitHandler) {\n // the setFieldValue above sets state on the Form component, used in the onSubmit handler\n // setting state requires an additional render cycle - we need to pass in the new value so it's set correctly\n submitHandler(undefined, { additionalValues: { [name]: applyValueTransforms(elementValue) } })\n }\n }, [props.setFieldValue, props.onChange, props.submitOnChange, props.setFieldValue, updateValidationState])\n\n const onBlur = (...args) => {\n const { submitOnBlur, onSubmit, onBlur } = props\n const [event] = args\n\n if(submitOnBlur) {\n onSubmit()\n }\n if(onBlur) {\n onBlur.apply(event.target, args)\n }\n }\n\n const onFocus = (...args) => {\n const { selectOnFocus, onFocus } = props\n const [event] = args\n const element = event.target\n\n const selectText = () => {\n element.selectionStart = 0\n element.selectionEnd = element.value.length\n }\n\n if(selectOnFocus) {\n selectText()\n setTimeout(selectText)\n }\n if(onFocus) {\n onFocus.apply(element, args)\n }\n }\n\n const onKeyDown = (...args) => {\n const { onKeyDown } = props\n const [event] = args\n const element = event.target\n \n if(props.numeric && !/[0-9-]/.exec(event.key) && ![null, 0, 8, 9, 13, 27, 35, 36, 37, 39, 46].includes(event.keyCode)) {\n event.preventDefault()\n }\n\n if(onKeyDown) {\n onKeyDown.apply(element, args)\n }\n }\n\n /* render */ {\n const { passErrorProp } = options\n const { getValueProps } = types(props, options)\n\n const {\n type, value, checked, defaultValue, numeric, getValidationMessage,\n onSubmit, registerFieldValidator, setFieldValue, getFieldValue, getFieldValues,\n submitOnChange, submitOnBlur, selectOnFocus, throttle, valid, onValidated,\n ...passThroughProps\n } = props\n const valueProps = getValueProps({ currentValue: getFieldValue(name) })\n const numericProps = (numeric && { type: 'number' })\n const typeProps = (type && { type })\n const errorProps = (passErrorProp && { error })\n const className = ((fieldValidated ? 'validated ' : '') + (props.className || '') || undefined)\n\n const finalProps = {\n id, name, className,\n ...passThroughProps, ...valueProps, ...numericProps, ...typeProps, ...errorProps,\n onChange, onFocus, onBlur, onKeyDown\n }\n\n return render(finalProps)\n }\n}"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danderson00/react-forms",
3
- "version": "0.0.42",
3
+ "version": "0.0.43",
4
4
  "description": "Ultra simple, stateless, validated forms for use in React function components",
5
5
  "main": "dist/index.js",
6
6
  "module": "src/index.js",
@@ -24,8 +24,8 @@
24
24
  "babel-jest": "26.6.3",
25
25
  "enzyme": "^3.9.0",
26
26
  "jest": "26.6.3",
27
- "react": "^17.0.2",
28
- "react-dom": "^17.0.2"
27
+ "react": "^18.2.0",
28
+ "react-dom": "^18.2.0"
29
29
  },
30
30
  "jest": {
31
31
  "moduleNameMapper": {
package/src/Form.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createElement, createRef, useEffect, useReducer, useState } from 'react'
1
+ import { createElement, createRef, useCallback, useEffect, useReducer, useState } from 'react'
2
2
  import { get, set } from 'object-path-immutable'
3
3
 
4
4
  const Form = (ContextProvider, additionalContext = {}, ErrorMessage) => (
@@ -15,8 +15,8 @@ const Form = (ContextProvider, additionalContext = {}, ErrorMessage) => (
15
15
  }
16
16
  }, [form.current])
17
17
 
18
- const getFieldValue = path => get(fieldValues, path)
19
- const getFieldValues = () => fieldValues
18
+ const getFieldValue = useCallback(path => get(fieldValues, path), [fieldValues])
19
+ const getFieldValues = useCallback(() => fieldValues, [fieldValues])
20
20
  const mapFieldValues = target => Object.keys(target).reduce(
21
21
  (values, name) => set(values, name, target[name]),
22
22
  {}
@@ -29,9 +29,9 @@ const Form = (ContextProvider, additionalContext = {}, ErrorMessage) => (
29
29
  }
30
30
  }
31
31
 
32
- const onSubmit = (e, { additionalValues, validate } = {}) => {
32
+ const onSubmit = useCallback((e, { additionalValues, validate } = {}) => {
33
33
  if(validate !== false) {
34
- fieldValidators.forEach(setFieldValidated => setFieldValidated())
34
+ fieldValidators.forEach(setFieldValidated => setFieldValidated(undefined, fieldValues))
35
35
  }
36
36
 
37
37
  if((validate === false || form.current.checkValidity()) && props.onSubmit) {
@@ -73,7 +73,7 @@ const Form = (ContextProvider, additionalContext = {}, ErrorMessage) => (
73
73
 
74
74
  e && e.preventDefault && e.preventDefault()
75
75
  e && e.stopPropagation && e.stopPropagation()
76
- }
76
+ }, [props, fieldValues])
77
77
 
78
78
  const classNames = ['react-forms', props.className]
79
79
  if(row) {
package/src/input.js CHANGED
@@ -1,4 +1,4 @@
1
- import { useState, useEffect } from 'react'
1
+ import { useCallback, useState, useEffect } from 'react'
2
2
  import usePrevious from './usePrevious'
3
3
  import useUpdate from './useUpdate'
4
4
  import types from './inputTypes'
@@ -27,8 +27,8 @@ export default (render, options = {}) => function Input(props) {
27
27
  // don't override values that were set from passing a values prop to the form
28
28
  if(getFieldValue(name) === undefined) {
29
29
  // TODO: change setter to a getter and return a private `UNSET` symbol to indicate not to call the field setter
30
- // this allows us to set the default value with useState above and not have an initial render cycle without the default value
31
- // BUT... to get the default value of a select list, we need to render it first? dilemma....
30
+ // this allows us to set the default value with useState above and not have an initial render cycle without the default value
31
+ // BUT... to get the default value of a select list, we need to render it first? dilemma....
32
32
 
33
33
  setInitialValue({
34
34
  // pass a setter function - radio buttons do not always want to set a value!
@@ -43,17 +43,34 @@ export default (render, options = {}) => function Input(props) {
43
43
 
44
44
  // ensure form values are updated to reflect passed `value` prop
45
45
  // this probably introduces some redundancy with the onChange handler below
46
- const { type, checked, value, defaultValue, setFieldValue } = props
47
46
  useUpdate(() => {
48
- const { applyValueTransforms } = types({ type, checked, value, defaultValue, setFieldValue }, options)
47
+ const { value, setFieldValue } = props
48
+ const { applyValueTransforms } = types(props, options)
49
49
 
50
50
  if(value !== previousValueProp) {
51
51
  setFieldValue(name, applyValueTransforms(value))
52
52
  }
53
- }, [type, checked, value, defaultValue, setFieldValue])
53
+ }, [props])
54
+
55
+ const updateValidationState = useCallback((newValue, oldValues) => {
56
+ const { getValidationMessage, getFieldValue, getFieldValues } = props
57
+ const element = document.querySelector(`#${id}`)
58
+ const validationMessage = getValidationMessage && getValidationMessage(
59
+ newValue === undefined ? getFieldValue(name) : newValue,
60
+ oldValues || getFieldValues()
61
+ )
62
+ element.setCustomValidity(validationMessage || "")
63
+
64
+ setFieldValidated(true)
65
+ // this is a little hacky, but the simplest way I could think of to determine the
66
+ // validity of the actual input element. :invalid is also not supported by enzyme
67
+ const invalid = !!validationMessage || Boolean(document.querySelector(`#${id}:invalid`))
68
+ setError(invalid)
69
+ props.onValidated && props.onValidated(!invalid)
70
+ }, [props])
54
71
 
55
72
  // TODO: refactor bubbling to prop pattern
56
- const onChange = (...args) => {
73
+ const onChange = useCallback((...args) => {
57
74
  const [event] = args
58
75
  const { setFieldValue, onChange, submitOnChange } = props
59
76
  const { valueFromEvent } = options
@@ -67,7 +84,7 @@ export default (render, options = {}) => function Input(props) {
67
84
 
68
85
  if(event && event.target && event.target.checkValidity) {
69
86
  event.target.checkValidity()
70
- updateValidationState()
87
+ updateValidationState(applyValueTransforms(elementValue))
71
88
  }
72
89
 
73
90
  if(onChange) {
@@ -79,7 +96,7 @@ export default (render, options = {}) => function Input(props) {
79
96
  // setting state requires an additional render cycle - we need to pass in the new value so it's set correctly
80
97
  submitHandler(undefined, { additionalValues: { [name]: applyValueTransforms(elementValue) } })
81
98
  }
82
- }
99
+ }, [props.setFieldValue, props.onChange, props.submitOnChange, props.setFieldValue, updateValidationState])
83
100
 
84
101
  const onBlur = (...args) => {
85
102
  const { submitOnBlur, onSubmit, onBlur } = props
@@ -126,21 +143,12 @@ export default (render, options = {}) => function Input(props) {
126
143
  }
127
144
  }
128
145
 
129
- const updateValidationState = () => {
130
- setFieldValidated(true)
131
- // this is a little hacky, but the simplest way I could think of to determine the
132
- // validity of the actual input element. :invalid is also not supported by enzyme
133
- const invalid = Boolean(document.querySelector(`#${id}:invalid`))
134
- setError(invalid)
135
- props.onValidated && props.onValidated(!invalid)
136
- }
137
-
138
146
  /* render */ {
139
147
  const { passErrorProp } = options
140
148
  const { getValueProps } = types(props, options)
141
149
 
142
150
  const {
143
- type, value, checked, defaultValue, numeric,
151
+ type, value, checked, defaultValue, numeric, getValidationMessage,
144
152
  onSubmit, registerFieldValidator, setFieldValue, getFieldValue, getFieldValues,
145
153
  submitOnChange, submitOnBlur, selectOnFocus, throttle, valid, onValidated,
146
154
  ...passThroughProps
package/dist/fields.js DELETED
@@ -1,70 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.Text = exports.RadioButton = exports.Radio = exports.Checkbox = void 0;
7
-
8
- var _react = _interopRequireDefault(require("react"));
9
-
10
- var _index = require("./index");
11
-
12
- var _excluded = ["label", "className"],
13
- _excluded2 = ["values", "labels"];
14
-
15
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
16
-
17
- function _extends() { _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; }; return _extends.apply(this, arguments); }
18
-
19
- 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; }
20
-
21
- 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; }
22
-
23
- var base = function base(type, render) {
24
- return function (_ref) {
25
- var label = _ref.label,
26
- className = _ref.className,
27
- inputProps = _objectWithoutProperties(_ref, _excluded);
28
-
29
- return /*#__PURE__*/_react["default"].createElement("div", {
30
- className: "".concat(type, " ").concat(className)
31
- }, /*#__PURE__*/_react["default"].createElement("label", null, label), render(inputProps));
32
- };
33
- };
34
-
35
- var Text = base('Text', function (props) {
36
- return props.multiline ? /*#__PURE__*/_react["default"].createElement(_index.Textarea, props) : /*#__PURE__*/_react["default"].createElement(_index.Input, props);
37
- });
38
- exports.Text = Text;
39
- var Checkbox = base('Checkbox', function (props) {
40
- return /*#__PURE__*/_react["default"].createElement(_index.Input, _extends({}, props, {
41
- type: "checkbox"
42
- }));
43
- });
44
- exports.Checkbox = Checkbox;
45
- var RadioButton = base('RadioButton', function (props) {
46
- return /*#__PURE__*/_react["default"].createElement(_index.Input, _extends({}, props, {
47
- type: "radio"
48
- }));
49
- });
50
- exports.RadioButton = RadioButton;
51
- var Radio = base('Radio', function (_ref2) {
52
- var values = _ref2.values,
53
- labels = _ref2.labels,
54
- props = _objectWithoutProperties(_ref2, _excluded2);
55
-
56
- return values.map(function (value, index) {
57
- return /*#__PURE__*/_react["default"].createElement(RadioButton, _extends({}, props, {
58
- value: value,
59
- label: labels && labels[index] || value
60
- }));
61
- });
62
- }); //
63
- // export const Select = base('Select', ({ values, labels, ...props }) =>
64
- // <Select {...props}>
65
- // {values.map((value, index) => <option value={value}>{(labels && labels[index]) || value}</option>)}
66
- // </Select>
67
- // )
68
- //
69
-
70
- exports.Radio = Radio;