@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 +7 -7
- package/dist/Form.js.map +1 -1
- package/dist/input.js +32 -34
- package/dist/input.js.map +1 -1
- package/package.json +3 -3
- package/src/Form.js +6 -6
- package/src/input.js +27 -19
- package/dist/fields.js +0 -70
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
|
|
57
|
+
var getFieldValue = (0, _react.useCallback)(function (path) {
|
|
58
58
|
return (0, _objectPathImmutable.get)(fieldValues, path);
|
|
59
|
-
};
|
|
60
|
-
var getFieldValues = function
|
|
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
|
|
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":";;;;;;AAAA;AACA;AAAgD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEhD,IAAMA,IAAI,GAAG,SAAPA,IAAI,CAAIC,eAAe;EAAA,IAAEC,iBAAiB,uEAAG,CAAC,CAAC;EAAA,IAAEC,YAAY;EAAA,OACjE,gBAA2C;IAAA,IAAxCC,aAAa,QAAbA,aAAa;MAAEC,GAAG,QAAHA,GAAG;MAAEC,GAAG,QAAHA,GAAG;MAAKC,KAAK;IAClC,gBAAsC,IAAAC,eAAQ,EAACD,KAAK,CAACE,MAAM,IAAI,CAAC,CAAC,CAAC;MAAA;MAA3DC,WAAW;MAAEC,cAAc;IAClC,kBAAkD,IAAAC,iBAAU,EAAC,UAACC,UAAU,EAAEC,SAAS;QAAA,oCAASD,UAAU,IAAEC,SAAS;MAAA,CAAC,EAAE,EAAE,CAAC;MAAA;MAAhHC,eAAe;MAAEC,sBAAsB;IAC9C,iBAA0B,IAAAR,eAAQ,GAAE;MAAA;MAA7BS,KAAK;MAAEC,QAAQ;IACtB,iBAA0B,IAAAV,eAAQ,GAAE;MAAA;MAA7BW,KAAK;MAAEC,QAAQ;IACtB,IAAMC,IAAI,gBAAG,IAAAC,gBAAS,GAAE;IAExB,IAAAC,gBAAS,EAAC,YAAM;MACd,IAAGF,IAAI,CAACG,OAAO,EAAE;QACfJ,QAAQ,CAACC,IAAI,CAACG,OAAO,CAACC,aAAa,EAAE,CAAC;MACxC;IACF,CAAC,EAAE,CAACJ,IAAI,CAACG,OAAO,CAAC,CAAC;IAElB,IAAME,aAAa,GAAG,
|
|
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
|
-
//
|
|
69
|
-
//
|
|
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
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
}, [
|
|
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
|
|
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
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
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
|
-
|
|
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 =
|
|
224
|
-
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.
|
|
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": "^
|
|
28
|
-
"react-dom": "^
|
|
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
|
-
//
|
|
31
|
-
//
|
|
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 {
|
|
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
|
-
}, [
|
|
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;
|