@danderson00/react-forms 0.0.48 → 0.0.49
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/README.md +203 -203
- package/TODO.md +2 -2
- package/dist/ErrorMessage.js +2 -4
- package/dist/ErrorMessage.js.map +1 -1
- package/dist/Form.js +5 -6
- package/dist/Form.js.map +1 -1
- package/dist/Group.js +4 -5
- package/dist/Group.js.map +1 -1
- package/dist/index.js +15 -27
- package/dist/index.js.map +1 -1
- package/dist/injectCss.js.map +1 -1
- package/dist/input.js +16 -11
- package/dist/input.js.map +1 -1
- package/dist/inputTypes.js +4 -5
- package/dist/inputTypes.js.map +1 -1
- package/dist/styles.js.map +1 -1
- package/dist/submit.js +7 -8
- package/dist/submit.js.map +1 -1
- package/dist/throttle.js +1 -2
- package/dist/throttle.js.map +1 -1
- package/dist/useForm.js +1 -2
- package/dist/useForm.js.map +1 -1
- package/dist/useFormValues.js +1 -2
- package/dist/useFormValues.js.map +1 -1
- package/dist/usePrevious.js.map +1 -1
- package/dist/useUpdate.js.map +1 -1
- package/package.json +59 -59
- package/src/ErrorMessage.js +11 -11
- package/src/Form.js +123 -123
- package/src/Group.js +14 -14
- package/src/index.js +40 -40
- package/src/injectCss.js +15 -15
- package/src/input.js +186 -174
- package/src/inputTypes.js +63 -63
- package/src/styles.js +20 -20
- package/src/submit.js +29 -29
- package/src/throttle.js +10 -10
- package/src/useForm.js +10 -10
- package/src/useFormValues.js +4 -4
- package/src/usePrevious.js +8 -8
- package/src/useUpdate.js +11 -11
package/dist/submit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submit.js","names":["_react","_interopRequireWildcard","require","_excluded","_getRequireWildcardCache","
|
|
1
|
+
{"version":3,"file":"submit.js","names":["_react","_interopRequireWildcard","require","_excluded","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","_typeof","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","ownKeys","keys","getOwnPropertySymbols","o","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","obj","key","value","_toPropertyKey","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","TypeError","Number","_slicedToArray","arr","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","minLen","_arrayLikeToArray","toString","slice","constructor","name","Array","from","test","len","arr2","l","iterator","f","next","done","isArray","_objectWithoutProperties","source","excluded","target","_objectWithoutPropertiesLoose","sourceSymbolKeys","indexOf","propertyIsEnumerable","sourceKeys","_default","exports","render","Submit","props","onSubmit","Error","registerFieldValidator","setFieldValue","getFieldValue","getFieldValues","valid","validate","disableInvalid","values","propsToPass","_useState","useState","_useState2","executing","setExecuting","onClick","result","additionalValues","finalProps","disabled"],"sources":["../src/submit.js"],"sourcesContent":["import React, { useState } from 'react'\n\nexport default render => function Submit(props) {\n if(!props.onSubmit) throw new Error('Button components must be contained within a Form component')\n\n const {\n onSubmit, registerFieldValidator, setFieldValue, getFieldValue, getFieldValues,\n valid, validate, disableInvalid, values, ...propsToPass\n } = props\n\n // TODO: set executing when form is triggered by enter key\n const [executing, setExecuting] = useState(false)\n\n const onClick = e => {\n const result = onSubmit(e, { validate, additionalValues: values })\n if(result && result.finally && typeof result.finally === 'function') {\n setExecuting(true)\n result.finally(() => setExecuting(false))\n }\n }\n\n const finalProps = {\n ...propsToPass,\n onClick,\n disabled: props.disabled || executing || (disableInvalid && !valid)\n }\n\n return render(finalProps)\n}\n"],"mappings":"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"}
|
package/dist/throttle.js
CHANGED
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports["default"] = void 0;
|
|
7
|
-
var _default = function _default(target) {
|
|
7
|
+
var _default = exports["default"] = function _default(target) {
|
|
8
8
|
var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;
|
|
9
9
|
var timeout;
|
|
10
10
|
return function () {
|
|
@@ -17,5 +17,4 @@ var _default = function _default(target) {
|
|
|
17
17
|
}, delay);
|
|
18
18
|
};
|
|
19
19
|
};
|
|
20
|
-
exports["default"] = _default;
|
|
21
20
|
//# sourceMappingURL=throttle.js.map
|
package/dist/throttle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"throttle.js","names":["_default","target","delay","arguments","length","undefined","timeout","_len","args","Array","_key","clearTimeout","setTimeout","apply"
|
|
1
|
+
{"version":3,"file":"throttle.js","names":["_default","target","delay","arguments","length","undefined","timeout","_len","args","Array","_key","clearTimeout","setTimeout","apply"],"sources":["../src/throttle.js"],"sourcesContent":["export default (target, delay = 200) => {\n let timeout\n\n return (...args) => {\n clearTimeout(timeout)\n timeout = setTimeout(\n () => target(...args),\n delay\n )\n }\n}"],"mappings":";;;;;;oCAAe,SAAAA,SAACC,MAAM,EAAkB;EAAA,IAAhBC,KAAK,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,GAAG;EACjC,IAAIG,OAAO;EAEX,OAAO,YAAa;IAAA,SAAAC,IAAA,GAAAJ,SAAA,CAAAC,MAAA,EAATI,IAAI,OAAAC,KAAA,CAAAF,IAAA,GAAAG,IAAA,MAAAA,IAAA,GAAAH,IAAA,EAAAG,IAAA;MAAJF,IAAI,CAAAE,IAAA,IAAAP,SAAA,CAAAO,IAAA;IAAA;IACbC,YAAY,CAACL,OAAO,CAAC;IACrBA,OAAO,GAAGM,UAAU,CAClB;MAAA,OAAMX,MAAM,CAAAY,KAAA,SAAIL,IAAI,CAAC;IAAA,GACrBN,KACF,CAAC;EACH,CAAC;AACH,CAAC"}
|
package/dist/useForm.js
CHANGED
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports["default"] = void 0;
|
|
7
7
|
var _react = require("react");
|
|
8
|
-
var _default = function _default(context) {
|
|
8
|
+
var _default = exports["default"] = function _default(context) {
|
|
9
9
|
return function useForm() {
|
|
10
10
|
var _useContext = (0, _react.useContext)(context),
|
|
11
11
|
onSubmit = _useContext.onSubmit,
|
|
@@ -22,5 +22,4 @@ var _default = function _default(context) {
|
|
|
22
22
|
};
|
|
23
23
|
};
|
|
24
24
|
};
|
|
25
|
-
exports["default"] = _default;
|
|
26
25
|
//# sourceMappingURL=useForm.js.map
|
package/dist/useForm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useForm.js","names":["_react","require","_default","context","useForm","_useContext","useContext","onSubmit","getFieldValues","setFieldValue","submit","options","undefined","values"
|
|
1
|
+
{"version":3,"file":"useForm.js","names":["_react","require","_default","exports","context","useForm","_useContext","useContext","onSubmit","getFieldValues","setFieldValue","submit","options","undefined","values"],"sources":["../src/useForm.js"],"sourcesContent":["import { useContext } from 'react'\n\nexport default context => function useForm() {\n const { onSubmit, getFieldValues, setFieldValue } = useContext(context)\n\n return {\n submit: options => onSubmit(undefined, options),\n values: () => getFieldValues(),\n setFieldValue\n }\n}"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAAkC,IAAAC,QAAA,GAAAC,OAAA,cAEnB,SAAAD,SAAAE,OAAO;EAAA,OAAI,SAASC,OAAOA,CAAA,EAAG;IAC3C,IAAAC,WAAA,GAAoD,IAAAC,iBAAU,EAACH,OAAO,CAAC;MAA/DI,QAAQ,GAAAF,WAAA,CAARE,QAAQ;MAAEC,cAAc,GAAAH,WAAA,CAAdG,cAAc;MAAEC,aAAa,GAAAJ,WAAA,CAAbI,aAAa;IAE/C,OAAO;MACLC,MAAM,EAAE,SAAAA,OAAAC,OAAO;QAAA,OAAIJ,QAAQ,CAACK,SAAS,EAAED,OAAO,CAAC;MAAA;MAC/CE,MAAM,EAAE,SAAAA,OAAA;QAAA,OAAML,cAAc,CAAC,CAAC;MAAA;MAC9BC,aAAa,EAAbA;IACF,CAAC;EACH,CAAC;AAAA"}
|
package/dist/useFormValues.js
CHANGED
|
@@ -5,10 +5,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports["default"] = void 0;
|
|
7
7
|
var _react = require("react");
|
|
8
|
-
var _default = function _default(context) {
|
|
8
|
+
var _default = exports["default"] = function _default(context) {
|
|
9
9
|
return function useFormValues() {
|
|
10
10
|
return (0, _react.useContext)(context).getFieldValues();
|
|
11
11
|
};
|
|
12
12
|
};
|
|
13
|
-
exports["default"] = _default;
|
|
14
13
|
//# sourceMappingURL=useFormValues.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFormValues.js","names":["_react","require","_default","context","useFormValues","useContext","getFieldValues"
|
|
1
|
+
{"version":3,"file":"useFormValues.js","names":["_react","require","_default","exports","context","useFormValues","useContext","getFieldValues"],"sources":["../src/useFormValues.js"],"sourcesContent":["import { useContext } from 'react'\n\nexport default context => function useFormValues() {\n return useContext(context).getFieldValues()\n}"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAAkC,IAAAC,QAAA,GAAAC,OAAA,cAEnB,SAAAD,SAAAE,OAAO;EAAA,OAAI,SAASC,aAAaA,CAAA,EAAG;IACjD,OAAO,IAAAC,iBAAU,EAACF,OAAO,CAAC,CAACG,cAAc,CAAC,CAAC;EAC7C,CAAC;AAAA"}
|
package/dist/usePrevious.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePrevious.js","names":["_react","require","usePrevious","value","ref","useRef","useEffect","current"],"sources":["../src/usePrevious.js"],"sourcesContent":["import { useRef, useEffect } from 'react'\
|
|
1
|
+
{"version":3,"file":"usePrevious.js","names":["_react","require","usePrevious","value","ref","useRef","useEffect","current"],"sources":["../src/usePrevious.js"],"sourcesContent":["import { useRef, useEffect } from 'react'\n\nexport default function usePrevious(value) {\n const ref = useRef()\n useEffect(() => {\n ref.current = value\n })\n return ref.current\n}"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEe,SAASC,WAAWA,CAACC,KAAK,EAAE;EACzC,IAAMC,GAAG,GAAG,IAAAC,aAAM,EAAC,CAAC;EACpB,IAAAC,gBAAS,EAAC,YAAM;IACdF,GAAG,CAACG,OAAO,GAAGJ,KAAK;EACrB,CAAC,CAAC;EACF,OAAOC,GAAG,CAACG,OAAO;AACpB"}
|
package/dist/useUpdate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUpdate.js","names":["_react","require","useUpdate","hook","inputs","didMountRef","useRef","useEffect","current"],"sources":["../src/useUpdate.js"],"sourcesContent":["import { useRef, useEffect } from 'react'\
|
|
1
|
+
{"version":3,"file":"useUpdate.js","names":["_react","require","useUpdate","hook","inputs","didMountRef","useRef","useEffect","current"],"sources":["../src/useUpdate.js"],"sourcesContent":["import { useRef, useEffect } from 'react'\n\nexport default function useUpdate(hook, inputs) {\n const didMountRef = useRef(false)\n\n useEffect(() => {\n if (didMountRef.current)\n hook()\n else\n didMountRef.current = true\n }, inputs)\n}"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEe,SAASC,SAASA,CAACC,IAAI,EAAEC,MAAM,EAAE;EAC9C,IAAMC,WAAW,GAAG,IAAAC,aAAM,EAAC,KAAK,CAAC;EAEjC,IAAAC,gBAAS,EAAC,YAAM;IACd,IAAIF,WAAW,CAACG,OAAO,EACrBL,IAAI,CAAC,CAAC,MAENE,WAAW,CAACG,OAAO,GAAG,IAAI;EAC9B,CAAC,EAAEJ,MAAM,CAAC;AACZ"}
|
package/package.json
CHANGED
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@danderson00/react-forms",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "Ultra simple, stateless, validated forms for use in React function components",
|
|
5
|
-
"main": "src/index.js",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"test": "jest",
|
|
8
|
-
"build": "babel src --source-maps --out-dir dist",
|
|
9
|
-
"prepare": "babel src --source-maps --out-dir dist"
|
|
10
|
-
},
|
|
11
|
-
"dependencies": {
|
|
12
|
-
"object-path-immutable": "^4.1.1"
|
|
13
|
-
},
|
|
14
|
-
"peerDependencies": {
|
|
15
|
-
"react": "*"
|
|
16
|
-
},
|
|
17
|
-
"devDependencies": {
|
|
18
|
-
"@babel/cli": "^7.4.4",
|
|
19
|
-
"@babel/core": "^7.4.4",
|
|
20
|
-
"@babel/preset-env": "^7.4.4",
|
|
21
|
-
"@babel/preset-react": "^7.0.0",
|
|
22
|
-
"@wojtekmaj/enzyme-adapter-react-17": "^0.6.1",
|
|
23
|
-
"babel-jest": "26.6.3",
|
|
24
|
-
"enzyme": "^3.9.0",
|
|
25
|
-
"jest": "26.6.3",
|
|
26
|
-
"react": "^18.2.0",
|
|
27
|
-
"react-dom": "^18.2.0"
|
|
28
|
-
},
|
|
29
|
-
"jest": {
|
|
30
|
-
"moduleNameMapper": {
|
|
31
|
-
"\\.css$": "<rootDir>/test/setup/styleMock.js"
|
|
32
|
-
},
|
|
33
|
-
"setupFilesAfterEnv": [
|
|
34
|
-
"<rootDir>test/setup/enzyme.js"
|
|
35
|
-
]
|
|
36
|
-
},
|
|
37
|
-
"babel": {
|
|
38
|
-
"presets": [
|
|
39
|
-
"@babel/preset-env",
|
|
40
|
-
"@babel/preset-react"
|
|
41
|
-
]
|
|
42
|
-
},
|
|
43
|
-
"keywords": [
|
|
44
|
-
"react",
|
|
45
|
-
"stateless",
|
|
46
|
-
"form",
|
|
47
|
-
"function",
|
|
48
|
-
"component"
|
|
49
|
-
],
|
|
50
|
-
"author": "danderson00",
|
|
51
|
-
"license": "MIT",
|
|
52
|
-
"publishConfig": {
|
|
53
|
-
"access": "public"
|
|
54
|
-
},
|
|
55
|
-
"repository": {
|
|
56
|
-
"type": "git",
|
|
57
|
-
"url": "git+https://gitlab.com/danderson00/react-forms.git"
|
|
58
|
-
}
|
|
59
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@danderson00/react-forms",
|
|
3
|
+
"version": "0.0.49",
|
|
4
|
+
"description": "Ultra simple, stateless, validated forms for use in React function components",
|
|
5
|
+
"main": "src/index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "jest",
|
|
8
|
+
"build": "babel src --source-maps --out-dir dist",
|
|
9
|
+
"prepare": "babel src --source-maps --out-dir dist"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"object-path-immutable": "^4.1.1"
|
|
13
|
+
},
|
|
14
|
+
"peerDependencies": {
|
|
15
|
+
"react": "*"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@babel/cli": "^7.4.4",
|
|
19
|
+
"@babel/core": "^7.4.4",
|
|
20
|
+
"@babel/preset-env": "^7.4.4",
|
|
21
|
+
"@babel/preset-react": "^7.0.0",
|
|
22
|
+
"@wojtekmaj/enzyme-adapter-react-17": "^0.6.1",
|
|
23
|
+
"babel-jest": "26.6.3",
|
|
24
|
+
"enzyme": "^3.9.0",
|
|
25
|
+
"jest": "26.6.3",
|
|
26
|
+
"react": "^18.2.0",
|
|
27
|
+
"react-dom": "^18.2.0"
|
|
28
|
+
},
|
|
29
|
+
"jest": {
|
|
30
|
+
"moduleNameMapper": {
|
|
31
|
+
"\\.css$": "<rootDir>/test/setup/styleMock.js"
|
|
32
|
+
},
|
|
33
|
+
"setupFilesAfterEnv": [
|
|
34
|
+
"<rootDir>test/setup/enzyme.js"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
"babel": {
|
|
38
|
+
"presets": [
|
|
39
|
+
"@babel/preset-env",
|
|
40
|
+
"@babel/preset-react"
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
"keywords": [
|
|
44
|
+
"react",
|
|
45
|
+
"stateless",
|
|
46
|
+
"form",
|
|
47
|
+
"function",
|
|
48
|
+
"component"
|
|
49
|
+
],
|
|
50
|
+
"author": "danderson00",
|
|
51
|
+
"license": "MIT",
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public"
|
|
54
|
+
},
|
|
55
|
+
"repository": {
|
|
56
|
+
"type": "git",
|
|
57
|
+
"url": "git+https://gitlab.com/danderson00/react-forms.git"
|
|
58
|
+
}
|
|
59
|
+
}
|
package/src/ErrorMessage.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { createElement } from 'react'
|
|
2
|
-
|
|
3
|
-
export const extractErrorMessage = error => error
|
|
4
|
-
? (error.hasOwnProperty('stack') || error.hasOwnProperty('message'))
|
|
5
|
-
? error.message || 'An error occurred'
|
|
6
|
-
: error
|
|
7
|
-
: 'An error occurred'
|
|
8
|
-
|
|
9
|
-
export default ({ error }) => createElement('div', {
|
|
10
|
-
className: 'react-forms-error',
|
|
11
|
-
children: extractErrorMessage(error)
|
|
1
|
+
import { createElement } from 'react'
|
|
2
|
+
|
|
3
|
+
export const extractErrorMessage = error => error
|
|
4
|
+
? (error.hasOwnProperty('stack') || error.hasOwnProperty('message'))
|
|
5
|
+
? error.message || 'An error occurred'
|
|
6
|
+
: error
|
|
7
|
+
: 'An error occurred'
|
|
8
|
+
|
|
9
|
+
export default ({ error }) => createElement('div', {
|
|
10
|
+
className: 'react-forms-error',
|
|
11
|
+
children: extractErrorMessage(error)
|
|
12
12
|
})
|
package/src/Form.js
CHANGED
|
@@ -1,124 +1,124 @@
|
|
|
1
|
-
import { createElement, createRef, useCallback, useEffect, useReducer, useState } from 'react'
|
|
2
|
-
import { get, set } from 'object-path-immutable'
|
|
3
|
-
|
|
4
|
-
const Form = (ContextProvider, additionalContext = {}, ErrorMessage) => (
|
|
5
|
-
({ resetOnSubmit, row, gap, values, ...props }) => {
|
|
6
|
-
const [fieldValues, setFieldValues] = useState(values || {})
|
|
7
|
-
const [fieldValidators, registerFieldValidator] = useReducer((validators, validator) => [...validators, validator], [])
|
|
8
|
-
const [error, setError] = useState()
|
|
9
|
-
const [valid, setValid] = useState()
|
|
10
|
-
const form = createRef()
|
|
11
|
-
|
|
12
|
-
useEffect(() => {
|
|
13
|
-
if(form.current) {
|
|
14
|
-
setValid(form.current.checkValidity())
|
|
15
|
-
}
|
|
16
|
-
}, [form.current])
|
|
17
|
-
|
|
18
|
-
const getFieldValue = useCallback(path => get(fieldValues, path), [fieldValues])
|
|
19
|
-
const getFieldValues = useCallback(() => fieldValues, [fieldValues])
|
|
20
|
-
const mapFieldValues = target => Object.keys(target).reduce(
|
|
21
|
-
(values, name) => set(values, name, target[name]),
|
|
22
|
-
{}
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
const setFieldValue = (path, value) => {
|
|
26
|
-
setFieldValues(previousValues => set(previousValues, path, value))
|
|
27
|
-
if(form.current) {
|
|
28
|
-
setValid(form.current.checkValidity())
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const onSubmit = useCallback((e, { additionalValues, validate } = {}) => {
|
|
33
|
-
if(validate !== false) {
|
|
34
|
-
fieldValidators.forEach(setFieldValidated => setFieldValidated(undefined, fieldValues))
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if((validate === false || form.current.checkValidity()) && props.onSubmit) {
|
|
38
|
-
setError(undefined)
|
|
39
|
-
|
|
40
|
-
const interactiveElements = form.current.querySelectorAll('input,button,textarea,select')
|
|
41
|
-
const setFormDisabled = disabled => interactiveElements.forEach(x => x.disabled = disabled)
|
|
42
|
-
|
|
43
|
-
const reset = () => {
|
|
44
|
-
if(resetOnSubmit) {
|
|
45
|
-
setFieldValues(values || {})
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
try {
|
|
50
|
-
const checkResultForError = result => {
|
|
51
|
-
if(result && (result.success === false || result.error)) {
|
|
52
|
-
setError(result.error || result.message || 'Form submission failed')
|
|
53
|
-
} else {
|
|
54
|
-
reset()
|
|
55
|
-
}
|
|
56
|
-
return result
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const result = props.onSubmit(mapFieldValues({ ...fieldValues, ...additionalValues }))
|
|
60
|
-
if(result && typeof result.then === 'function') {
|
|
61
|
-
setFormDisabled(true)
|
|
62
|
-
result
|
|
63
|
-
.then(checkResultForError)
|
|
64
|
-
.catch(setError)
|
|
65
|
-
.finally(() => setFormDisabled(false))
|
|
66
|
-
} else {
|
|
67
|
-
reset()
|
|
68
|
-
}
|
|
69
|
-
} catch(error) {
|
|
70
|
-
setError(error)
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
e && e.preventDefault && e.preventDefault()
|
|
75
|
-
e && e.stopPropagation && e.stopPropagation()
|
|
76
|
-
}, [props, fieldValues])
|
|
77
|
-
|
|
78
|
-
const classNames = ['react-forms', props.className]
|
|
79
|
-
if(row) {
|
|
80
|
-
classNames.push('react-forms-row')
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const mergedAdditionalContext = Object.keys(additionalContext).reduce(
|
|
84
|
-
(result, property) => ({ ...result, [property]: props[property] || additionalContext[property] }),
|
|
85
|
-
{}
|
|
86
|
-
)
|
|
87
|
-
|
|
88
|
-
return (
|
|
89
|
-
createElement('form', {
|
|
90
|
-
...props,
|
|
91
|
-
className: classNames.join(' '),
|
|
92
|
-
noValidate: true,
|
|
93
|
-
onSubmit: onSubmit,
|
|
94
|
-
ref: form,
|
|
95
|
-
...(gap && { style: { gap } }),
|
|
96
|
-
children: [
|
|
97
|
-
createElement(ContextProvider, {
|
|
98
|
-
...props,
|
|
99
|
-
key: 'context',
|
|
100
|
-
value: {
|
|
101
|
-
registerFieldValidator,
|
|
102
|
-
setFieldValue,
|
|
103
|
-
getFieldValue,
|
|
104
|
-
getFieldValues,
|
|
105
|
-
onSubmit,
|
|
106
|
-
valid,
|
|
107
|
-
...mergedAdditionalContext
|
|
108
|
-
}
|
|
109
|
-
}),
|
|
110
|
-
error && createElement(ErrorMessage, { key: 'error', error }),
|
|
111
|
-
createElement('input', {
|
|
112
|
-
key: 'submit',
|
|
113
|
-
type: 'submit',
|
|
114
|
-
style: {
|
|
115
|
-
visibility: 'hidden',
|
|
116
|
-
position: 'absolute'
|
|
117
|
-
}
|
|
118
|
-
}),
|
|
119
|
-
]
|
|
120
|
-
})
|
|
121
|
-
)
|
|
122
|
-
}
|
|
123
|
-
)
|
|
1
|
+
import { createElement, createRef, useCallback, useEffect, useReducer, useState } from 'react'
|
|
2
|
+
import { get, set } from 'object-path-immutable'
|
|
3
|
+
|
|
4
|
+
const Form = (ContextProvider, additionalContext = {}, ErrorMessage) => (
|
|
5
|
+
({ resetOnSubmit, row, gap, values, ...props }) => {
|
|
6
|
+
const [fieldValues, setFieldValues] = useState(values || {})
|
|
7
|
+
const [fieldValidators, registerFieldValidator] = useReducer((validators, validator) => [...validators, validator], [])
|
|
8
|
+
const [error, setError] = useState()
|
|
9
|
+
const [valid, setValid] = useState()
|
|
10
|
+
const form = createRef()
|
|
11
|
+
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if(form.current) {
|
|
14
|
+
setValid(form.current.checkValidity())
|
|
15
|
+
}
|
|
16
|
+
}, [form.current])
|
|
17
|
+
|
|
18
|
+
const getFieldValue = useCallback(path => get(fieldValues, path), [fieldValues])
|
|
19
|
+
const getFieldValues = useCallback(() => fieldValues, [fieldValues])
|
|
20
|
+
const mapFieldValues = target => Object.keys(target).reduce(
|
|
21
|
+
(values, name) => set(values, name, target[name]),
|
|
22
|
+
{}
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
const setFieldValue = (path, value) => {
|
|
26
|
+
setFieldValues(previousValues => set(previousValues, path, value))
|
|
27
|
+
if(form.current) {
|
|
28
|
+
setValid(form.current.checkValidity())
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const onSubmit = useCallback((e, { additionalValues, validate } = {}) => {
|
|
33
|
+
if(validate !== false) {
|
|
34
|
+
fieldValidators.forEach(setFieldValidated => setFieldValidated(undefined, fieldValues))
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if((validate === false || form.current.checkValidity()) && props.onSubmit) {
|
|
38
|
+
setError(undefined)
|
|
39
|
+
|
|
40
|
+
const interactiveElements = form.current.querySelectorAll('input,button,textarea,select')
|
|
41
|
+
const setFormDisabled = disabled => interactiveElements.forEach(x => x.disabled = disabled)
|
|
42
|
+
|
|
43
|
+
const reset = () => {
|
|
44
|
+
if(resetOnSubmit) {
|
|
45
|
+
setFieldValues(values || {})
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
const checkResultForError = result => {
|
|
51
|
+
if(result && (result.success === false || result.error)) {
|
|
52
|
+
setError(result.error || result.message || 'Form submission failed')
|
|
53
|
+
} else {
|
|
54
|
+
reset()
|
|
55
|
+
}
|
|
56
|
+
return result
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const result = props.onSubmit(mapFieldValues({ ...fieldValues, ...additionalValues }))
|
|
60
|
+
if(result && typeof result.then === 'function') {
|
|
61
|
+
setFormDisabled(true)
|
|
62
|
+
result
|
|
63
|
+
.then(checkResultForError)
|
|
64
|
+
.catch(setError)
|
|
65
|
+
.finally(() => setFormDisabled(false))
|
|
66
|
+
} else {
|
|
67
|
+
reset()
|
|
68
|
+
}
|
|
69
|
+
} catch(error) {
|
|
70
|
+
setError(error)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
e && e.preventDefault && e.preventDefault()
|
|
75
|
+
e && e.stopPropagation && e.stopPropagation()
|
|
76
|
+
}, [props, fieldValues])
|
|
77
|
+
|
|
78
|
+
const classNames = ['react-forms', props.className]
|
|
79
|
+
if(row) {
|
|
80
|
+
classNames.push('react-forms-row')
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const mergedAdditionalContext = Object.keys(additionalContext).reduce(
|
|
84
|
+
(result, property) => ({ ...result, [property]: props[property] || additionalContext[property] }),
|
|
85
|
+
{}
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
createElement('form', {
|
|
90
|
+
...props,
|
|
91
|
+
className: classNames.join(' '),
|
|
92
|
+
noValidate: true,
|
|
93
|
+
onSubmit: onSubmit,
|
|
94
|
+
ref: form,
|
|
95
|
+
...(gap && { style: { gap } }),
|
|
96
|
+
children: [
|
|
97
|
+
createElement(ContextProvider, {
|
|
98
|
+
...props,
|
|
99
|
+
key: 'context',
|
|
100
|
+
value: {
|
|
101
|
+
registerFieldValidator,
|
|
102
|
+
setFieldValue,
|
|
103
|
+
getFieldValue,
|
|
104
|
+
getFieldValues,
|
|
105
|
+
onSubmit,
|
|
106
|
+
valid,
|
|
107
|
+
...mergedAdditionalContext
|
|
108
|
+
}
|
|
109
|
+
}),
|
|
110
|
+
error && createElement(ErrorMessage, { key: 'error', error }),
|
|
111
|
+
createElement('input', {
|
|
112
|
+
key: 'submit',
|
|
113
|
+
type: 'submit',
|
|
114
|
+
style: {
|
|
115
|
+
visibility: 'hidden',
|
|
116
|
+
position: 'absolute'
|
|
117
|
+
}
|
|
118
|
+
}),
|
|
119
|
+
]
|
|
120
|
+
})
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
)
|
|
124
124
|
export default Form
|
package/src/Group.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { createElement, useContext } from 'react'
|
|
2
|
-
|
|
3
|
-
const Group = formContext => ({ name, ...props }) => {
|
|
4
|
-
if (!name) throw new Error("You must provide a name prop to form components")
|
|
5
|
-
const { groups = [], ...context } = useContext(formContext)
|
|
6
|
-
|
|
7
|
-
return createElement(formContext.Provider, {
|
|
8
|
-
...props,
|
|
9
|
-
value: {
|
|
10
|
-
...context,
|
|
11
|
-
groups: groups.concat(name)
|
|
12
|
-
}
|
|
13
|
-
})
|
|
14
|
-
}
|
|
1
|
+
import { createElement, useContext } from 'react'
|
|
2
|
+
|
|
3
|
+
const Group = formContext => ({ name, ...props }) => {
|
|
4
|
+
if (!name) throw new Error("You must provide a name prop to form components")
|
|
5
|
+
const { groups = [], ...context } = useContext(formContext)
|
|
6
|
+
|
|
7
|
+
return createElement(formContext.Provider, {
|
|
8
|
+
...props,
|
|
9
|
+
value: {
|
|
10
|
+
...context,
|
|
11
|
+
groups: groups.concat(name)
|
|
12
|
+
}
|
|
13
|
+
})
|
|
14
|
+
}
|
|
15
15
|
export default Group
|