envoc-form 3.1.0 → 4.0.1-0

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.
Files changed (422) hide show
  1. package/README.md +10 -1
  2. package/dist/css/envoc-form-styles.css +0 -113
  3. package/dist/css/envoc-form-styles.css.map +1 -1
  4. package/es/AddressInput/AddressInput.d.ts +15 -0
  5. package/es/AddressInput/AddressInput.js +21 -97
  6. package/es/AddressInput/UsStates.d.ts +3 -0
  7. package/es/AddressInput/UsStates.js +53 -152
  8. package/es/ConfirmBaseForm/ConfirmBaseForm.d.ts +10 -0
  9. package/es/ConfirmBaseForm/ConfirmBaseForm.js +35 -43
  10. package/es/ConfirmDeleteForm/ConfirmDeleteForm.d.ts +11 -0
  11. package/es/ConfirmDeleteForm/ConfirmDeleteForm.js +54 -40
  12. package/es/DatePickerInput/DatePickerInput.d.ts +14 -0
  13. package/es/DatePickerInput/DatePickerInput.js +63 -95
  14. package/es/Field/CustomFieldInputProps.d.ts +7 -0
  15. package/es/Field/CustomFieldInputProps.js +1 -0
  16. package/es/Field/CustomFieldMetaProps.d.ts +4 -0
  17. package/es/Field/CustomFieldMetaProps.js +1 -0
  18. package/es/Field/Field.d.ts +22 -0
  19. package/es/Field/Field.js +46 -0
  20. package/es/Field/FieldErrorScrollTarget.d.ts +2 -0
  21. package/es/Field/FieldErrorScrollTarget.js +11 -0
  22. package/es/Field/FieldNameContext.d.ts +3 -0
  23. package/es/Field/FieldNameContext.js +3 -0
  24. package/es/Field/FieldSection.d.ts +7 -0
  25. package/es/Field/FieldSection.js +20 -0
  26. package/es/Field/InjectedFieldProps.d.ts +7 -0
  27. package/es/Field/InjectedFieldProps.js +1 -0
  28. package/es/Field/useStandardField.d.ts +15 -0
  29. package/es/Field/useStandardField.js +93 -0
  30. package/es/FieldArray/FieldArray.d.ts +15 -0
  31. package/es/FieldArray/FieldArray.js +80 -0
  32. package/es/File/FileGroup.d.ts +8 -0
  33. package/es/File/FileGroup.js +50 -0
  34. package/es/File/FileList.d.ts +6 -0
  35. package/es/File/FileList.js +20 -0
  36. package/es/File/humanFileSize.d.ts +1 -0
  37. package/es/File/humanFileSize.js +6 -0
  38. package/es/Form/FocusError.d.ts +5 -0
  39. package/es/Form/FocusError.js +41 -53
  40. package/es/Form/Form.d.ts +22 -0
  41. package/es/Form/Form.js +111 -125
  42. package/es/Form/FormBasedPreventNavigation.d.ts +5 -0
  43. package/es/Form/FormBasedPreventNavigation.js +53 -30
  44. package/es/Form/ServerErrorContext.d.ts +10 -0
  45. package/es/Form/ServerErrorContext.js +8 -6
  46. package/es/FormActions.d.ts +7 -0
  47. package/es/FormActions.js +22 -0
  48. package/es/Group.d.ts +13 -0
  49. package/es/Group.js +22 -0
  50. package/es/Input/IconInputGroup.d.ts +9 -0
  51. package/es/Input/IconInputGroup.js +40 -0
  52. package/es/Input/InputGroup.d.ts +12 -0
  53. package/es/Input/InputGroup.js +33 -0
  54. package/es/Input/MoneyInputGroup.d.ts +7 -0
  55. package/es/Input/MoneyInputGroup.js +41 -0
  56. package/es/Input/NumberInputGroup.d.ts +7 -0
  57. package/es/Input/NumberInputGroup.js +41 -0
  58. package/es/Input/StringInputGroup.d.ts +7 -0
  59. package/es/Input/StringInputGroup.js +40 -0
  60. package/es/Normalization/NormalizationFunction.d.ts +4 -0
  61. package/es/Normalization/NormalizationFunction.js +1 -0
  62. package/es/Normalization/normalizers.d.ts +2 -0
  63. package/es/Normalization/normalizers.js +30 -0
  64. package/es/Select/BooleanSelectGroup.d.ts +7 -0
  65. package/es/Select/BooleanSelectGroup.js +27 -0
  66. package/es/Select/NumberSelectGroup.d.ts +8 -0
  67. package/es/Select/NumberSelectGroup.js +19 -0
  68. package/es/Select/SelectGroup.d.ts +22 -0
  69. package/es/Select/SelectGroup.js +59 -0
  70. package/es/Select/SelectGroupPropsHelper.d.ts +3 -0
  71. package/es/Select/SelectGroupPropsHelper.js +1 -0
  72. package/es/Select/StringSelectGroup.d.ts +8 -0
  73. package/es/Select/StringSelectGroup.js +19 -0
  74. package/es/StandardFormActions.d.ts +6 -0
  75. package/es/StandardFormActions.js +23 -24
  76. package/es/SubmitFormButton.d.ts +7 -0
  77. package/es/SubmitFormButton.js +37 -23
  78. package/es/Validation/ValidatedApiResult.d.ts +6 -0
  79. package/es/Validation/ValidatedApiResult.js +1 -0
  80. package/es/Validation/ValidationError.d.ts +5 -0
  81. package/es/Validation/ValidationError.js +1 -0
  82. package/es/Validation/ValidationFunction.d.ts +4 -0
  83. package/es/Validation/ValidationFunction.js +1 -0
  84. package/es/Validation/validators.d.ts +15 -0
  85. package/es/Validation/validators.js +73 -0
  86. package/es/__Tests__/FormTestBase.d.ts +27 -0
  87. package/es/__Tests__/FormTestBase.js +83 -12
  88. package/{src/__Tests__/index.js → es/__Tests__/index.d.ts} +0 -0
  89. package/es/__Tests__/index.js +2 -2
  90. package/es/index.d.ts +57 -0
  91. package/es/index.js +41 -20
  92. package/es/utils/objectContainsNonSerializableProperty.d.ts +1 -0
  93. package/es/utils/objectContainsNonSerializableProperty.js +14 -16
  94. package/es/utils/objectToFormData.d.ts +10 -0
  95. package/es/utils/objectToFormData.js +77 -65
  96. package/es/utils/typeChecks.d.ts +8 -0
  97. package/es/utils/typeChecks.js +18 -25
  98. package/lib/AddressInput/AddressInput.d.ts +15 -0
  99. package/lib/AddressInput/AddressInput.js +27 -123
  100. package/lib/AddressInput/UsStates.d.ts +3 -0
  101. package/lib/AddressInput/UsStates.js +55 -159
  102. package/lib/ConfirmBaseForm/ConfirmBaseForm.d.ts +10 -0
  103. package/lib/ConfirmBaseForm/ConfirmBaseForm.js +41 -57
  104. package/lib/ConfirmDeleteForm/ConfirmDeleteForm.d.ts +11 -0
  105. package/lib/ConfirmDeleteForm/ConfirmDeleteForm.js +60 -56
  106. package/lib/DatePickerInput/DatePickerInput.d.ts +14 -0
  107. package/lib/DatePickerInput/DatePickerInput.js +69 -113
  108. package/lib/Field/CustomFieldInputProps.d.ts +7 -0
  109. package/lib/Field/CustomFieldInputProps.js +2 -0
  110. package/lib/Field/CustomFieldMetaProps.d.ts +4 -0
  111. package/lib/Field/CustomFieldMetaProps.js +2 -0
  112. package/lib/Field/Field.d.ts +22 -0
  113. package/lib/Field/Field.js +51 -0
  114. package/lib/Field/FieldErrorScrollTarget.d.ts +2 -0
  115. package/lib/Field/FieldErrorScrollTarget.js +14 -0
  116. package/lib/Field/FieldNameContext.d.ts +3 -0
  117. package/lib/Field/FieldNameContext.js +9 -0
  118. package/lib/Field/FieldSection.d.ts +7 -0
  119. package/lib/Field/FieldSection.js +23 -0
  120. package/lib/Field/InjectedFieldProps.d.ts +7 -0
  121. package/lib/Field/InjectedFieldProps.js +2 -0
  122. package/lib/Field/useStandardField.d.ts +15 -0
  123. package/lib/Field/useStandardField.js +96 -0
  124. package/lib/FieldArray/FieldArray.d.ts +15 -0
  125. package/lib/FieldArray/FieldArray.js +86 -0
  126. package/lib/File/FileGroup.d.ts +8 -0
  127. package/lib/File/FileGroup.js +55 -0
  128. package/lib/File/FileList.d.ts +6 -0
  129. package/lib/File/FileList.js +23 -0
  130. package/lib/File/humanFileSize.d.ts +1 -0
  131. package/lib/File/humanFileSize.js +10 -0
  132. package/lib/Form/FocusError.d.ts +5 -0
  133. package/lib/Form/FocusError.js +47 -66
  134. package/lib/Form/Form.d.ts +22 -0
  135. package/lib/Form/Form.js +117 -153
  136. package/lib/Form/FormBasedPreventNavigation.d.ts +5 -0
  137. package/lib/Form/FormBasedPreventNavigation.js +56 -39
  138. package/lib/Form/ServerErrorContext.d.ts +10 -0
  139. package/lib/Form/ServerErrorContext.js +14 -18
  140. package/lib/FormActions.d.ts +7 -0
  141. package/lib/FormActions.js +28 -0
  142. package/lib/Group.d.ts +13 -0
  143. package/lib/Group.js +28 -0
  144. package/lib/Input/IconInputGroup.d.ts +9 -0
  145. package/lib/Input/IconInputGroup.js +45 -0
  146. package/lib/Input/InputGroup.d.ts +12 -0
  147. package/lib/Input/InputGroup.js +38 -0
  148. package/lib/Input/MoneyInputGroup.d.ts +7 -0
  149. package/lib/Input/MoneyInputGroup.js +46 -0
  150. package/lib/Input/NumberInputGroup.d.ts +7 -0
  151. package/lib/Input/NumberInputGroup.js +46 -0
  152. package/lib/Input/StringInputGroup.d.ts +7 -0
  153. package/lib/Input/StringInputGroup.js +45 -0
  154. package/lib/Normalization/NormalizationFunction.d.ts +4 -0
  155. package/lib/Normalization/NormalizationFunction.js +2 -0
  156. package/lib/Normalization/normalizers.d.ts +2 -0
  157. package/lib/Normalization/normalizers.js +35 -0
  158. package/lib/Select/BooleanSelectGroup.d.ts +7 -0
  159. package/lib/Select/BooleanSelectGroup.js +34 -0
  160. package/lib/Select/NumberSelectGroup.d.ts +8 -0
  161. package/lib/Select/NumberSelectGroup.js +27 -0
  162. package/lib/Select/SelectGroup.d.ts +22 -0
  163. package/lib/Select/SelectGroup.js +65 -0
  164. package/lib/Select/SelectGroupPropsHelper.d.ts +3 -0
  165. package/lib/Select/SelectGroupPropsHelper.js +2 -0
  166. package/lib/Select/StringSelectGroup.d.ts +8 -0
  167. package/lib/Select/StringSelectGroup.js +27 -0
  168. package/lib/StandardFormActions.d.ts +6 -0
  169. package/lib/StandardFormActions.js +29 -37
  170. package/lib/SubmitFormButton.d.ts +7 -0
  171. package/lib/SubmitFormButton.js +42 -38
  172. package/lib/Validation/ValidatedApiResult.d.ts +6 -0
  173. package/lib/Validation/ValidatedApiResult.js +2 -0
  174. package/lib/Validation/ValidationError.d.ts +5 -0
  175. package/lib/Validation/ValidationError.js +2 -0
  176. package/lib/Validation/ValidationFunction.d.ts +4 -0
  177. package/lib/Validation/ValidationFunction.js +2 -0
  178. package/lib/Validation/validators.d.ts +15 -0
  179. package/lib/Validation/validators.js +86 -0
  180. package/lib/__Tests__/FormTestBase.d.ts +27 -0
  181. package/lib/__Tests__/FormTestBase.js +86 -25
  182. package/lib/__Tests__/index.d.ts +2 -0
  183. package/lib/__Tests__/index.js +8 -15
  184. package/lib/index.d.ts +57 -0
  185. package/lib/index.js +101 -174
  186. package/lib/utils/objectContainsNonSerializableProperty.d.ts +1 -0
  187. package/lib/utils/objectContainsNonSerializableProperty.js +17 -24
  188. package/lib/utils/objectToFormData.d.ts +10 -0
  189. package/lib/utils/objectToFormData.js +79 -73
  190. package/lib/utils/typeChecks.d.ts +8 -0
  191. package/lib/utils/typeChecks.js +29 -58
  192. package/package.json +106 -100
  193. package/src/AddressInput/{AddesssInput.test.js → AddressInput.test.tsx} +7 -3
  194. package/src/AddressInput/AddressInput.tsx +72 -0
  195. package/src/AddressInput/{UsStates.js → UsStates.ts} +3 -1
  196. package/src/AddressInput/__snapshots__/AddressInput.test.tsx.snap +175 -0
  197. package/src/ConfirmBaseForm/ConfirmBaseForm.test.tsx +24 -0
  198. package/src/ConfirmBaseForm/ConfirmBaseForm.tsx +50 -0
  199. package/src/ConfirmBaseForm/__snapshots__/{ConfirmBaseForm.test.js.snap → ConfirmBaseForm.test.tsx.snap} +2 -2
  200. package/src/ConfirmDeleteForm/{ConfirmDeleteForm.test.js → ConfirmDeleteForm.test.tsx} +3 -3
  201. package/src/ConfirmDeleteForm/ConfirmDeleteForm.tsx +67 -0
  202. package/src/ConfirmDeleteForm/__snapshots__/{ConfirmDeleteForm.test.js.snap → ConfirmDeleteForm.test.tsx.snap} +2 -2
  203. package/src/DatePickerInput/DatePickerInput.test.tsx +48 -0
  204. package/src/DatePickerInput/DatePickerInput.tsx +85 -0
  205. package/src/DatePickerInput/__snapshots__/DatePickerInput.test.tsx.snap +151 -0
  206. package/src/Field/CustomFieldInputProps.ts +10 -0
  207. package/src/Field/CustomFieldMetaProps.ts +5 -0
  208. package/src/Field/Field.tsx +90 -0
  209. package/src/Field/FieldErrorScrollTarget.tsx +11 -0
  210. package/src/Field/FieldNameContext.ts +6 -0
  211. package/src/Field/FieldSection.tsx +18 -0
  212. package/src/Field/InjectedFieldProps.ts +8 -0
  213. package/src/Field/useStandardField.ts +121 -0
  214. package/src/FieldArray/FieldArray.tsx +133 -0
  215. package/src/File/FileGroup.test.tsx +35 -0
  216. package/src/File/FileGroup.tsx +71 -0
  217. package/src/File/FileList.tsx +19 -0
  218. package/src/File/__snapshots__/FileGroup.test.tsx.snap +32 -0
  219. package/src/File/humanFileSize.ts +8 -0
  220. package/src/Form/{FocusError.js → FocusError.tsx} +10 -6
  221. package/src/Form/Form.test.tsx +14 -0
  222. package/src/Form/{Form.js → Form.tsx} +71 -31
  223. package/src/Form/FormBasedPreventNavigation.tsx +74 -0
  224. package/src/Form/ServerErrorContext.ts +17 -0
  225. package/src/Form/__snapshots__/{Form.test.js.snap → Form.test.tsx.snap} +1 -1
  226. package/src/FormActions.tsx +34 -0
  227. package/src/Group.tsx +43 -0
  228. package/src/Input/IconInputGroup.tsx +48 -0
  229. package/src/Input/InputGroup.tsx +57 -0
  230. package/src/Input/MoneyInputGroup.tsx +44 -0
  231. package/src/Input/NumberInputGroup.tsx +42 -0
  232. package/src/Input/StringInputGroup.tsx +40 -0
  233. package/src/Input/__Tests__/IconInputGroup.test.tsx +35 -0
  234. package/src/Input/__Tests__/MoneyInputGroup.test.tsx +37 -0
  235. package/src/Input/__Tests__/NumberInputGroup.test.tsx +35 -0
  236. package/src/Input/__Tests__/StringInputGroup.test.tsx +27 -0
  237. package/src/Input/__Tests__/__snapshots__/IconInputGroup.test.tsx.snap +29 -0
  238. package/src/Input/__Tests__/__snapshots__/MoneyInputGroup.test.tsx.snap +31 -0
  239. package/src/Input/__Tests__/__snapshots__/NumberInputGroup.test.tsx.snap +29 -0
  240. package/src/Input/__Tests__/__snapshots__/StringInputGroup.test.tsx.snap +28 -0
  241. package/src/Normalization/NormalizationFunction.ts +4 -0
  242. package/src/{normalizers.js → Normalization/normalizers.ts} +5 -5
  243. package/src/Select/BooleanSelectGroup.tsx +27 -0
  244. package/src/Select/NumberSelectGroup.tsx +14 -0
  245. package/src/Select/SelectGroup.tsx +106 -0
  246. package/src/Select/SelectGroupPropsHelper.ts +4 -0
  247. package/src/Select/StringSelectGroup.tsx +14 -0
  248. package/src/Select/__tests__/BooleanSelectGroup.test.tsx +35 -0
  249. package/src/Select/__tests__/NumberSelectGroup.test.tsx +87 -0
  250. package/src/Select/__tests__/StringSelectGroup.test.tsx +89 -0
  251. package/src/Select/__tests__/__snapshots__/BooleanSelectGroup.test.tsx.snap +99 -0
  252. package/src/Select/__tests__/__snapshots__/NumberSelectGroup.test.tsx.snap +197 -0
  253. package/src/Select/__tests__/__snapshots__/StringSelectGroup.test.tsx.snap +197 -0
  254. package/src/{StandardFormActions.js → StandardFormActions.tsx} +12 -6
  255. package/src/SubmitFormButton.tsx +44 -0
  256. package/src/Validation/ValidatedApiResult.ts +8 -0
  257. package/src/Validation/ValidationError.ts +6 -0
  258. package/src/Validation/ValidationFunction.ts +4 -0
  259. package/src/{validators/validators.test.js → Validation/validators.test.tsx} +6 -4
  260. package/src/Validation/validators.ts +92 -0
  261. package/src/__Tests__/FormTestBase.tsx +63 -0
  262. package/src/__Tests__/{StandardFormActions.test.js → StandardFormActions.test.tsx} +2 -8
  263. package/src/__Tests__/{SubmitFormButton.test.js → SubmitFormButton.test.tsx} +2 -8
  264. package/src/__Tests__/__snapshots__/{StandardFormActions.test.js.snap → StandardFormActions.test.tsx.snap} +2 -2
  265. package/src/__Tests__/__snapshots__/{SubmitFormButton.test.js.snap → SubmitFormButton.test.tsx.snap} +1 -1
  266. package/src/__Tests__/index.ts +3 -0
  267. package/src/index.ts +114 -0
  268. package/src/react-app-env.d.ts +1 -0
  269. package/src/styles.scss +0 -7
  270. package/src/utils/{objectContainsNonSerializableProperty.test.js → objectContainsNonSerializableProperty.test.tsx} +0 -0
  271. package/src/utils/{objectContainsNonSerializableProperty.js → objectContainsNonSerializableProperty.ts} +4 -2
  272. package/src/utils/{objectToFormData.test.js → objectToFormData.test.tsx} +0 -0
  273. package/src/utils/{objectToFormData.js → objectToFormData.ts} +29 -13
  274. package/src/utils/typeChecks.ts +18 -0
  275. package/es/AddressInput/index.js +0 -2
  276. package/es/BoolInput/BoolInput.js +0 -10
  277. package/es/BoolInput/InlineBoolInput.js +0 -10
  278. package/es/BoolInput/boolOptions.js +0 -8
  279. package/es/BoolInput/index.js +0 -3
  280. package/es/ConfirmBaseForm/index.js +0 -2
  281. package/es/ConfirmDeleteForm/index.js +0 -2
  282. package/es/DatePickerInput/index.js +0 -2
  283. package/es/ErrorScrollTarget.js +0 -10
  284. package/es/FileInput/DefaultFileList.js +0 -36
  285. package/es/FileInput/DropzoneFileInput.js +0 -58
  286. package/es/FileInput/FileInput.js +0 -62
  287. package/es/FileInput/index.js +0 -3
  288. package/es/Form/index.js +0 -3
  289. package/es/FormGroup.js +0 -22
  290. package/es/FormGroupWrapper.js +0 -22
  291. package/es/FormInput/FormInput.js +0 -206
  292. package/es/FormInput/index.js +0 -2
  293. package/es/FormInputArray/FormInputArray.js +0 -225
  294. package/es/FormInputArray/index.js +0 -2
  295. package/es/FormSection.js +0 -11
  296. package/es/IconInput.js +0 -33
  297. package/es/InlineFormInput/InlineFormInput.js +0 -8
  298. package/es/InlineFormInput/index.js +0 -2
  299. package/es/MoneyInput/InlineMoneyInput.js +0 -7
  300. package/es/MoneyInput/MoneyInput.js +0 -7
  301. package/es/MoneyInput/index.js +0 -3
  302. package/es/MoneyInput/moneyInputProps.js +0 -13
  303. package/es/NestedFormFieldContext.js +0 -4
  304. package/es/ReactSelectField/ReactSelectField.js +0 -128
  305. package/es/ReactSelectField/index.js +0 -2
  306. package/es/normalizers.js +0 -39
  307. package/es/selectors.js +0 -6
  308. package/es/useStandardFormInput.js +0 -119
  309. package/es/utils/index.js +0 -3
  310. package/es/validators/index.js +0 -2
  311. package/es/validators/validators.js +0 -94
  312. package/lib/AddressInput/index.js +0 -13
  313. package/lib/BoolInput/BoolInput.js +0 -23
  314. package/lib/BoolInput/InlineBoolInput.js +0 -23
  315. package/lib/BoolInput/boolOptions.js +0 -15
  316. package/lib/BoolInput/index.js +0 -23
  317. package/lib/ConfirmBaseForm/index.js +0 -13
  318. package/lib/ConfirmDeleteForm/index.js +0 -13
  319. package/lib/DatePickerInput/index.js +0 -13
  320. package/lib/ErrorScrollTarget.js +0 -20
  321. package/lib/FileInput/DefaultFileList.js +0 -47
  322. package/lib/FileInput/DropzoneFileInput.js +0 -75
  323. package/lib/FileInput/FileInput.js +0 -82
  324. package/lib/FileInput/index.js +0 -23
  325. package/lib/Form/index.js +0 -23
  326. package/lib/FormGroup.js +0 -33
  327. package/lib/FormGroupWrapper.js +0 -37
  328. package/lib/FormInput/FormInput.js +0 -229
  329. package/lib/FormInput/index.js +0 -13
  330. package/lib/FormInputArray/FormInputArray.js +0 -248
  331. package/lib/FormInputArray/index.js +0 -13
  332. package/lib/FormSection.js +0 -28
  333. package/lib/IconInput.js +0 -51
  334. package/lib/InlineFormInput/InlineFormInput.js +0 -20
  335. package/lib/InlineFormInput/index.js +0 -13
  336. package/lib/MoneyInput/InlineMoneyInput.js +0 -20
  337. package/lib/MoneyInput/MoneyInput.js +0 -20
  338. package/lib/MoneyInput/index.js +0 -23
  339. package/lib/MoneyInput/moneyInputProps.js +0 -26
  340. package/lib/NestedFormFieldContext.js +0 -16
  341. package/lib/ReactSelectField/ReactSelectField.js +0 -152
  342. package/lib/ReactSelectField/index.js +0 -31
  343. package/lib/normalizers.js +0 -51
  344. package/lib/selectors.js +0 -18
  345. package/lib/useStandardFormInput.js +0 -135
  346. package/lib/utils/index.js +0 -23
  347. package/lib/validators/index.js +0 -17
  348. package/lib/validators/validators.js +0 -130
  349. package/src/AddressInput/AddressInput.js +0 -73
  350. package/src/AddressInput/__snapshots__/AddesssInput.test.js.snap +0 -207
  351. package/src/AddressInput/index.js +0 -2
  352. package/src/BoolInput/BoolInput.js +0 -7
  353. package/src/BoolInput/BoolInput.test.js +0 -23
  354. package/src/BoolInput/InlineBoolInput.js +0 -7
  355. package/src/BoolInput/__snapshots__/BoolInput.test.js.snap +0 -89
  356. package/src/BoolInput/boolOptions.js +0 -6
  357. package/src/BoolInput/index.js +0 -4
  358. package/src/ConfirmBaseForm/ConfirmBaseForm.js +0 -37
  359. package/src/ConfirmBaseForm/ConfirmBaseForm.test.js +0 -14
  360. package/src/ConfirmBaseForm/index.js +0 -2
  361. package/src/ConfirmDeleteForm/ConfirmDeleteForm.js +0 -39
  362. package/src/ConfirmDeleteForm/index.js +0 -2
  363. package/src/DatePickerInput/DatePickerInput.js +0 -49
  364. package/src/DatePickerInput/DatePickerInput.test.js +0 -74
  365. package/src/DatePickerInput/__snapshots__/DatePickerInput.test.js.snap +0 -134
  366. package/src/DatePickerInput/date-picker-input.scss +0 -42
  367. package/src/DatePickerInput/index.js +0 -3
  368. package/src/ErrorScrollTarget.js +0 -6
  369. package/src/FileInput/DefaultFileList.js +0 -39
  370. package/src/FileInput/DropzoneFileInput.js +0 -56
  371. package/src/FileInput/DropzoneFileInput.test.js +0 -24
  372. package/src/FileInput/FileInput.js +0 -77
  373. package/src/FileInput/FileInput.test.js +0 -24
  374. package/src/FileInput/__snapshots__/DropzoneFileInput.test.js.snap +0 -57
  375. package/src/FileInput/__snapshots__/FileInput.test.js.snap +0 -58
  376. package/src/FileInput/file-input.scss +0 -58
  377. package/src/FileInput/index.js +0 -4
  378. package/src/Form/Form.test.js +0 -23
  379. package/src/Form/FormBasedPreventNavigation.js +0 -25
  380. package/src/Form/ServerErrorContext.js +0 -7
  381. package/src/Form/index.js +0 -3
  382. package/src/FormGroup.js +0 -30
  383. package/src/FormGroupWrapper.js +0 -28
  384. package/src/FormInput/FormInput.js +0 -145
  385. package/src/FormInput/FormInput.test.js +0 -66
  386. package/src/FormInput/__snapshots__/FormInput.test.js.snap +0 -323
  387. package/src/FormInput/form-input.scss +0 -9
  388. package/src/FormInput/index.js +0 -2
  389. package/src/FormInputArray/FormInputArray.js +0 -224
  390. package/src/FormInputArray/FormInputArray.test.js +0 -108
  391. package/src/FormInputArray/__snapshots__/FormInputArray.test.js.snap +0 -52
  392. package/src/FormInputArray/form-input-array.scss +0 -13
  393. package/src/FormInputArray/index.js +0 -2
  394. package/src/FormSection.js +0 -13
  395. package/src/IconInput.js +0 -31
  396. package/src/InlineFormInput/InlineFormInput.js +0 -6
  397. package/src/InlineFormInput/InlineFormInput.test.js +0 -23
  398. package/src/InlineFormInput/__snapshots__/InlineFormInput.test.js.snap +0 -26
  399. package/src/InlineFormInput/index.js +0 -3
  400. package/src/InlineFormInput/inline-form-input.scss +0 -3
  401. package/src/MoneyInput/InlineMoneyInput.js +0 -7
  402. package/src/MoneyInput/MoneyInput.js +0 -7
  403. package/src/MoneyInput/MoneyInputs.test.js +0 -43
  404. package/src/MoneyInput/__snapshots__/MoneyInputs.test.js.snap +0 -81
  405. package/src/MoneyInput/index.js +0 -4
  406. package/src/MoneyInput/money-input.scss +0 -3
  407. package/src/MoneyInput/moneyInputProps.js +0 -12
  408. package/src/NestedFormFieldContext.js +0 -6
  409. package/src/ReactSelectField/ReactSelectField.js +0 -122
  410. package/src/ReactSelectField/index.js +0 -6
  411. package/src/ReactSelectField/react-select-field.scss +0 -5
  412. package/src/SubmitFormButton.js +0 -28
  413. package/src/__Tests__/FormTestBase.js +0 -14
  414. package/src/__Tests__/IconInput.test.js +0 -23
  415. package/src/__Tests__/__snapshots__/IconInput.test.js.snap +0 -38
  416. package/src/index.js +0 -45
  417. package/src/selectors.js +0 -3
  418. package/src/useStandardFormInput.js +0 -118
  419. package/src/utils/index.js +0 -3
  420. package/src/utils/typeChecks.js +0 -18
  421. package/src/validators/index.js +0 -2
  422. package/src/validators/validators.js +0 -93
@@ -0,0 +1,90 @@
1
+ import React, { ComponentProps, ElementType, LegacyRef } from 'react';
2
+ import { FieldNameContext } from './FieldNameContext';
3
+ import { InjectedFieldProps } from './InjectedFieldProps';
4
+ import useStandardFormInput from './useStandardField';
5
+ import { NormalizationFunction } from '../Normalization/NormalizationFunction';
6
+ import { ValidationFunction } from '../Validation/ValidationFunction';
7
+
8
+ // we attempted to support generic components but failed
9
+ // so, we assume the actual TRenderComponent has no generic arguments
10
+ // instead, any concrete TRenderComponent can utilize a TRenderComponent<TValue> as needed
11
+
12
+ type RenderComponent<TValue, TRenderComponent extends ElementType> = Partial<
13
+ ComponentProps<TRenderComponent>
14
+ > extends Partial<InjectedFieldProps<TValue>>
15
+ ? TRenderComponent
16
+ : never;
17
+
18
+ type RenderComponentProps<
19
+ TValue,
20
+ TRenderComponent extends ElementType
21
+ > = Partial<ComponentProps<TRenderComponent>> extends Partial<
22
+ InjectedFieldProps<TValue>
23
+ >
24
+ ? ComponentProps<TRenderComponent>
25
+ : never;
26
+
27
+ /** A specific Field instance to be rendered by the given TRenderComponent or by whatever default is reasonable */
28
+ export type FieldProps<
29
+ TForm extends object,
30
+ TProp extends keyof TForm,
31
+ TRenderComponent extends ElementType
32
+ > = {
33
+ name: TProp; // somewhat duplicated from useStandardFormInputProps but better for autocomplete
34
+ Component: RenderComponent<TForm[TProp], TRenderComponent>;
35
+
36
+ id?: string;
37
+ disabled?: boolean;
38
+ validate?:
39
+ | ValidationFunction<TForm[TProp]>
40
+ | ValidationFunction<TForm[TProp]>[];
41
+ normalize?: NormalizationFunction<TForm[TProp]>;
42
+ } & Omit<
43
+ RenderComponentProps<TForm[TProp], TRenderComponent>,
44
+ keyof InjectedFieldProps<TForm[TProp]>
45
+ >;
46
+
47
+ /**
48
+ * Renders whatever Component is passed - injecting the formik values needed to finish wiring up that individual field.
49
+ * Should no Component be used then the default will be provided by the default lookup based on typeof(TForm[TProp])
50
+ */
51
+ function Field<
52
+ TForm extends object,
53
+ TProp extends keyof TForm,
54
+ TRenderComponent extends ElementType
55
+ >(
56
+ {
57
+ name,
58
+ Component,
59
+ id,
60
+ normalize,
61
+ validate,
62
+ disabled,
63
+ ...rest
64
+ }: FieldProps<TForm, TProp, TRenderComponent>,
65
+ ref: LegacyRef<any>
66
+ ) {
67
+ const [input, meta] = useStandardFormInput<TForm[TProp]>({
68
+ name: String(name),
69
+ id: id,
70
+ normalize: normalize,
71
+ validate: validate,
72
+ disabled: disabled,
73
+ });
74
+
75
+ // a bit of a hack so JSX is happy with us
76
+ const Wrapped = Component as React.ComponentType<
77
+ InjectedFieldProps<TForm[TProp]>
78
+ >;
79
+
80
+ return (
81
+ <FieldNameContext.Provider value={input.name}>
82
+ <Wrapped {...rest} ref={ref} id={id} input={input} meta={meta} />
83
+ </FieldNameContext.Provider>
84
+ );
85
+ }
86
+
87
+ // hack to get forwarded refs to work
88
+ const FieldWithRef = React.forwardRef(Field as any);
89
+
90
+ export default FieldWithRef as typeof Field;
@@ -0,0 +1,11 @@
1
+ import { useContext } from 'react';
2
+ import { FieldNameContext } from './FieldNameContext';
3
+
4
+ export default function FieldErrorScrollTarget() {
5
+ const name = useContext(FieldNameContext);
6
+ if (!name) {
7
+ return null;
8
+ }
9
+ const divId = `${name.toLowerCase()}-error-scroll-target`;
10
+ return <div id={divId} style={{ display: 'none' }} />;
11
+ }
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+
3
+ /** provides the full, qualified name of the current field name - including nested fields, path/dot delimited */
4
+ export const FieldNameContext = React.createContext<string | undefined>(
5
+ undefined
6
+ );
@@ -0,0 +1,18 @@
1
+ import React, { useContext } from 'react';
2
+ import { FieldNameContext } from './FieldNameContext';
3
+
4
+ interface FieldSectionProps {
5
+ children: React.ReactNode;
6
+ name: string;
7
+ }
8
+
9
+ export default function FieldSection({ children, name }: FieldSectionProps) {
10
+ const parentContext = useContext(FieldNameContext);
11
+ const effectiveValue = parentContext ? `${parentContext}.${name}` : name;
12
+
13
+ return (
14
+ <FieldNameContext.Provider value={effectiveValue}>
15
+ {children}
16
+ </FieldNameContext.Provider>
17
+ );
18
+ }
@@ -0,0 +1,8 @@
1
+ import { CustomFieldInputProps } from './CustomFieldInputProps';
2
+ import { CustomFieldMetaProps } from './CustomFieldMetaProps';
3
+
4
+ /** Defines what is injected by a Field wrapper of some TRenderComponent */
5
+ export interface InjectedFieldProps<TValue> {
6
+ input: CustomFieldInputProps<TValue>;
7
+ meta: CustomFieldMetaProps<TValue>;
8
+ }
@@ -0,0 +1,121 @@
1
+ import { useContext, useEffect } from 'react';
2
+ import { useField, useFormikContext } from 'formik';
3
+ import { CustomFieldInputProps } from './CustomFieldInputProps';
4
+ import { CustomFieldMetaProps } from './CustomFieldMetaProps';
5
+ import { FieldNameContext } from './FieldNameContext';
6
+ import { ServerErrorContext } from '../Form/ServerErrorContext';
7
+ import { NormalizationFunction } from '../Normalization/NormalizationFunction';
8
+ import { ValidationFunction } from '../Validation/ValidationFunction';
9
+
10
+ export interface useStandardFieldProps<TValue> {
11
+ id?: string;
12
+ name: string;
13
+ disabled?: boolean;
14
+ validate?: ValidationFunction<TValue> | ValidationFunction<TValue>[];
15
+ normalize?: NormalizationFunction<TValue>;
16
+ }
17
+
18
+ // provides a consistent way to deal with all form fields (non array)
19
+ export default function useStandardField<TValue>({
20
+ id: providedId,
21
+ name: providedName,
22
+ disabled,
23
+ validate,
24
+ normalize,
25
+ }: useStandardFieldProps<TValue>): [
26
+ CustomFieldInputProps<TValue>,
27
+ CustomFieldMetaProps<TValue>
28
+ ] {
29
+ // because the formik errors are evaluated all at the same time we need to keep server errors separate
30
+ const { getError: getServerError, setError: setServerError } =
31
+ useContext(ServerErrorContext);
32
+
33
+ // ensure that form section values are obeyed, e.g. homeAddress.zipCode
34
+ const fieldNameContextValue = useContext(FieldNameContext);
35
+ const name = fieldNameContextValue
36
+ ? `${fieldNameContextValue}.${providedName}`
37
+ : providedName;
38
+
39
+ // ensure that nested contexts don't have duplicate id issues when an id is specified
40
+ const id = providedId
41
+ ? fieldNameContextValue
42
+ ? `${fieldNameContextValue}.${providedId}`
43
+ : providedId
44
+ : name;
45
+
46
+ // ensure that our custom validation rules are handled
47
+ // e.g. we allow arrays of validators
48
+ const [formikInput, formikMeta] = useField<TValue>({
49
+ name,
50
+ id: id ? id : name,
51
+ disabled: disabled,
52
+ validate: callAllValidators,
53
+ });
54
+ const { setFieldValue, isSubmitting } = useFormikContext();
55
+
56
+ const touched =
57
+ formikMeta.touched !== false && formikMeta.touched !== undefined;
58
+ useEffect(() => {
59
+ if (!touched && isSubmitting) {
60
+ // because we do not always register all fields up front.
61
+ // e.g. formik expects even a 'create' form to have all fields given, at least, blank values
62
+ // that seems to be how it touches on submit:
63
+ // see: https://codesandbox.io/s/formik-example-4n7n8 vs https://codesandbox.io/s/formik-example-kttk5
64
+ // note in particular the change in line 24
65
+ // thus, we manually touch all fields here by calling onBlur
66
+ // there is a "setFieldTouched" from useFormikContext but it doesn't appear to work on field arrays
67
+ handleBlur();
68
+ }
69
+ });
70
+
71
+ // these are the props we expect consumers of this hook to pass directly to the input (or other control)
72
+ const resultInput: CustomFieldInputProps<TValue> = {
73
+ name: formikInput.name,
74
+ // pass any direct from server props through normalize without making the form dirty (e.g. phone number)
75
+ value: normalize ? normalize(formikInput.value) : formikInput.value,
76
+ onChange: handleChange,
77
+ onBlur: handleBlur,
78
+ // extensions to formik
79
+ id: id,
80
+ };
81
+
82
+ const resultMeta: CustomFieldMetaProps<TValue> = {
83
+ ...formikMeta,
84
+ error: getServerError(name) || (touched ? formikMeta.error : undefined),
85
+ // extensions to formik
86
+ warning: undefined, // TODO - did this never work?
87
+ touched: touched,
88
+ };
89
+
90
+ return [resultInput, resultMeta];
91
+
92
+ function handleBlur() {
93
+ formikInput.onBlur({ target: { name: name } });
94
+ }
95
+
96
+ function handleChange(value: TValue) {
97
+ if (disabled) {
98
+ return;
99
+ }
100
+ const normalized = normalize ? normalize(value) : value;
101
+ setFieldValue(name, normalized);
102
+ setServerError(name, undefined);
103
+ }
104
+
105
+ function callAllValidators(value: TValue) {
106
+ if (disabled || !validate) {
107
+ return;
108
+ }
109
+
110
+ if (!Array.isArray(validate)) {
111
+ return validate(value);
112
+ }
113
+
114
+ for (let i = 0; i < validate.length; i++) {
115
+ const result = validate[i](value);
116
+ if (result) {
117
+ return result;
118
+ }
119
+ }
120
+ }
121
+ }
@@ -0,0 +1,133 @@
1
+ import { ElementType } from 'react';
2
+ import classNames from 'classnames';
3
+ import Field, { FieldProps } from '../Field/Field';
4
+ import { FieldNameContext } from '../Field/FieldNameContext';
5
+ import useStandardFormInput from '../Field/useStandardField';
6
+ import { ValidationFunction } from '../Validation/ValidationFunction';
7
+
8
+ export type FieldArrayProps<
9
+ TForm extends object,
10
+ TProp extends keyof TForm
11
+ > = TForm[TProp] extends Array<any> | undefined
12
+ ? {
13
+ name: TProp;
14
+ label?: string;
15
+ disabled?: boolean;
16
+ validate?:
17
+ | ValidationFunction<TForm[TProp]>
18
+ | ValidationFunction<TForm[TProp]>[];
19
+ children: (
20
+ formBuilder: ArrayFormBuilderProp<TForm[TProp]>
21
+ ) => JSX.Element;
22
+ }
23
+ : never;
24
+
25
+ export type ArrayFormBuilderProp<TValue extends Array<any> | undefined> =
26
+ TValue extends Array<infer TForm> | undefined
27
+ ? TForm extends object
28
+ ? {
29
+ Field: <
30
+ TProp extends keyof TForm,
31
+ TRenderComponent extends ElementType
32
+ >(
33
+ props: FieldProps<TForm, TProp, TRenderComponent>
34
+ ) => JSX.Element; // assumes this is never null - thought he final component may not render
35
+
36
+ FieldArray: <TProp extends keyof TForm>(
37
+ props: FieldArrayProps<TForm, TProp>
38
+ ) => JSX.Element;
39
+ }
40
+ : never
41
+ : never;
42
+
43
+ export default function FieldArray<
44
+ TForm extends object,
45
+ TProp extends keyof TForm
46
+ >({
47
+ name,
48
+ label,
49
+ validate,
50
+ disabled,
51
+ children,
52
+ ...rest
53
+ }: FieldArrayProps<TForm, TProp>) {
54
+ const [input, meta] = useStandardFormInput<TForm[TProp]>({
55
+ name: String(name),
56
+ validate: validate,
57
+ disabled: disabled,
58
+ });
59
+
60
+ const values: any[] = !input.value
61
+ ? []
62
+ : Array.isArray(input.value)
63
+ ? input.value
64
+ : [];
65
+
66
+ return (
67
+ <div className="field-array">
68
+ <div className="field-array-header">
69
+ <div className="field-array-title">{label}</div>
70
+ <button
71
+ className={classNames('add-array-item-button', { disabled })}
72
+ title="Add Item"
73
+ type="button"
74
+ onClick={addItem}>
75
+ +
76
+ </button>
77
+ </div>
78
+ <div className="field-array-body">
79
+ {values.map((value, index) => {
80
+ const itemName = `${input.name}[${index}]`;
81
+ return (
82
+ <div
83
+ key={
84
+ (value && value['form-input-array-key']) ||
85
+ (value && value['id']) ||
86
+ itemName
87
+ }
88
+ className={classNames('field-array-item', {
89
+ removed: value.isDeleted,
90
+ })}
91
+ role="listitem">
92
+ <FieldNameContext.Provider value={itemName}>
93
+ {children({
94
+ Field: Field,
95
+ FieldArray: FieldArray,
96
+ } as any)}
97
+ </FieldNameContext.Provider>
98
+ <button
99
+ className={classNames('remove-array-item-button', { disabled })}
100
+ type="button"
101
+ title="Remove Item"
102
+ onClick={() => removeItem(value)}>
103
+ -
104
+ </button>
105
+ </div>
106
+ );
107
+ })}
108
+ </div>
109
+ </div>
110
+ );
111
+
112
+ function addItem() {
113
+ if (disabled) {
114
+ return;
115
+ }
116
+ input.onChange([...values, {}] as any);
117
+ }
118
+
119
+ function removeItem(item: any) {
120
+ if (disabled) {
121
+ return;
122
+ }
123
+ // assumes anything from the server has an 'id' value sent
124
+ if (!item.id) {
125
+ input.onChange(values.filter((x) => x !== item) as any);
126
+ return;
127
+ }
128
+ const mapped = values.map((x) =>
129
+ x !== item ? x : Object.assign({}, x, { isDeleted: true })
130
+ );
131
+ input.onChange(mapped as any);
132
+ }
133
+ }
@@ -0,0 +1,35 @@
1
+ import React from 'react';
2
+ import { render } from '@testing-library/react';
3
+ import { FileGroup } from '../';
4
+ import FormTestBase from '../__Tests__/FormTestBase';
5
+
6
+ describe('FileGroup', () => {
7
+ it('renders without crashing', () => {
8
+ render(
9
+ <FormTestBase>
10
+ {({ Field }) => (
11
+ <Field
12
+ name="profileImage"
13
+ Component={FileGroup}
14
+ label="Profile Image"
15
+ />
16
+ )}
17
+ </FormTestBase>
18
+ );
19
+ });
20
+
21
+ it('has matching snapshot', () => {
22
+ const renderResult = render(
23
+ <FormTestBase>
24
+ {({ Field }) => (
25
+ <Field
26
+ name="profileImage"
27
+ Component={FileGroup}
28
+ label="Profile Image"
29
+ />
30
+ )}
31
+ </FormTestBase>
32
+ );
33
+ expect(renderResult.asFragment()).toMatchSnapshot();
34
+ });
35
+ });
@@ -0,0 +1,71 @@
1
+ import React, { ComponentType, LegacyRef } from 'react';
2
+ import classNames from 'classnames';
3
+ import FileList from './FileList';
4
+ import { InjectedFieldProps } from '../Field/InjectedFieldProps';
5
+ import Group, { GroupProps } from '../Group';
6
+
7
+ export interface FileGroupProps
8
+ // note: file props are of type "any" with the current type generation
9
+ extends InjectedFieldProps<any | undefined>,
10
+ Omit<GroupProps, keyof InjectedFieldProps<any> | 'children'>,
11
+ Omit<
12
+ React.HTMLProps<HTMLInputElement>,
13
+ keyof InjectedFieldProps<any> | 'children' | 'className' | 'label'
14
+ > {
15
+ multiple?: boolean | undefined;
16
+ }
17
+
18
+ function FileGroup(
19
+ {
20
+ input,
21
+ meta,
22
+ label,
23
+ helpText,
24
+ className,
25
+ multiple,
26
+ ...rest
27
+ }: FileGroupProps,
28
+ ref: LegacyRef<HTMLInputElement>
29
+ ) {
30
+ return (
31
+ <Group
32
+ input={input}
33
+ meta={meta}
34
+ label={label}
35
+ helpText={helpText}
36
+ className={classNames(className, { multiple }, 'file-group')}>
37
+ <input
38
+ {...input}
39
+ {...rest}
40
+ multiple={multiple}
41
+ onChange={(e) => {
42
+ if (!e?.target?.files?.length) {
43
+ input.onChange(undefined);
44
+ } else {
45
+ const files: File[] = [];
46
+ for (let i = 0; i < e.target.files.length; i++) {
47
+ files.push(e.target.files[i]);
48
+ }
49
+ if (!multiple) {
50
+ input.onChange(files[0]);
51
+ } else {
52
+ input.onChange(files);
53
+ }
54
+ }
55
+ }}
56
+ value={undefined}
57
+ ref={ref}
58
+ type="file"
59
+ className={classNames(className, 'file-group')}
60
+ />
61
+ {/* Note: because input.value is any - due to how files are currently handled - type safeness isn't great here */}
62
+ <FileList files={input.value} />
63
+ </Group>
64
+ );
65
+ }
66
+
67
+ const FileGroupWithRef = React.forwardRef(
68
+ FileGroup
69
+ ) as ComponentType<FileGroupProps>;
70
+
71
+ export default FileGroupWithRef;
@@ -0,0 +1,19 @@
1
+ export interface FileListProps {
2
+ files?: File | File[] | undefined;
3
+ rejectedFiles?: File | File[] | undefined;
4
+ }
5
+ export default function FileList({ files, rejectedFiles }: FileListProps) {
6
+ return (
7
+ <div className="file-list">
8
+ {!files ? null : Array.isArray(files) ? (
9
+ files.map((x, i) => <File file={x} key={i} />)
10
+ ) : (
11
+ <File file={files} />
12
+ )}
13
+ </div>
14
+ );
15
+ }
16
+
17
+ function File({ file }: { file: File }) {
18
+ return null;
19
+ }
@@ -0,0 +1,32 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`FileGroup has matching snapshot 1`] = `
4
+ <DocumentFragment>
5
+ <form
6
+ action="#"
7
+ >
8
+ <div
9
+ class="file-group group"
10
+ >
11
+ <div
12
+ id="profileimage-error-scroll-target"
13
+ style="display: none;"
14
+ />
15
+ <label
16
+ for="profileImage"
17
+ >
18
+ Profile Image
19
+ </label>
20
+ <input
21
+ class="file-group"
22
+ name="profileImage"
23
+ type="file"
24
+ value=""
25
+ />
26
+ <div
27
+ class="file-list"
28
+ />
29
+ </div>
30
+ </form>
31
+ </DocumentFragment>
32
+ `;
@@ -0,0 +1,8 @@
1
+ export function humanFileSize(size: number) {
2
+ const i = Math.floor(Math.log(size) / Math.log(1024));
3
+ return (
4
+ (size / Math.pow(1024, i)).toFixed(2) +
5
+ ' ' +
6
+ ['B', 'KB', 'MB', 'GB', 'TB'][i]
7
+ );
8
+ }
@@ -1,8 +1,12 @@
1
1
  import { useEffect } from 'react';
2
2
  import { useFormikContext } from 'formik';
3
3
  import smoothscroll from 'smoothscroll-polyfill';
4
+ import { ServerErrorContextProps } from './ServerErrorContext';
4
5
 
5
- export default function FocusError(props) {
6
+ export interface FocusErrorProps {
7
+ serverErrors: ServerErrorContextProps;
8
+ }
9
+ export default function FocusError(props: FocusErrorProps) {
6
10
  const { errors, isSubmitting, isValidating } = useFormikContext();
7
11
  smoothscroll.polyfill();
8
12
  useEffect(() => {
@@ -28,14 +32,14 @@ export default function FocusError(props) {
28
32
  return null;
29
33
  }
30
34
 
31
- const scrollToErrorElement = (keys) => {
32
- let firstErrorElement = document.getElementById(
35
+ const scrollToErrorElement = (keys: string[]) => {
36
+ let firstErrorElement: HTMLElement | null = document.getElementById(
33
37
  `${keys[0].toLowerCase()}-error-scroll-target`
34
38
  );
35
- if (firstErrorElement == null || firstErrorElement.parentNode == null) {
39
+ if (!firstErrorElement || !firstErrorElement.parentNode) {
36
40
  return;
37
41
  }
38
- firstErrorElement = firstErrorElement.parentNode;
42
+ firstErrorElement = firstErrorElement.parentNode as HTMLElement;
39
43
  const headerOffset = -110;
40
44
  const y =
41
45
  firstErrorElement.getBoundingClientRect().top +
@@ -43,6 +47,6 @@ const scrollToErrorElement = (keys) => {
43
47
  headerOffset;
44
48
  window.scrollTo({ top: y, behavior: 'smooth' });
45
49
  setTimeout(() => {
46
- firstErrorElement.focus();
50
+ firstErrorElement?.focus();
47
51
  }, 500);
48
52
  };
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import { render } from '@testing-library/react';
3
+ import FormTestBase from '../__Tests__/FormTestBase';
4
+
5
+ describe('FormTestBase', () => {
6
+ it('renders without crashing', () => {
7
+ render(<FormTestBase>{() => <></>}</FormTestBase>);
8
+ });
9
+
10
+ it('has matching snapshot', () => {
11
+ const renderResult = render(<FormTestBase>{() => <></>}</FormTestBase>);
12
+ expect(renderResult.asFragment()).toMatchSnapshot();
13
+ });
14
+ });