envoc-form 5.0.9 → 6.0.1-1

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 (352) hide show
  1. package/README.md +4930 -1645
  2. package/dist/index.cjs +25531 -0
  3. package/dist/index.d.ts +624 -0
  4. package/dist/index.js +25461 -0
  5. package/package.json +73 -77
  6. package/dist/css/envoc-form-styles.css +0 -3
  7. package/dist/css/envoc-form-styles.css.map +0 -1
  8. package/es/AddressInput/AddressInput.d.ts +0 -24
  9. package/es/AddressInput/AddressInput.js +0 -20
  10. package/es/AddressInput/UsStates.d.ts +0 -3
  11. package/es/AddressInput/UsStates.js +0 -53
  12. package/es/ConfirmBaseForm/ConfirmBaseForm.d.ts +0 -26
  13. package/es/ConfirmBaseForm/ConfirmBaseForm.js +0 -42
  14. package/es/ConfirmDeleteForm/ConfirmDeleteForm.d.ts +0 -24
  15. package/es/ConfirmDeleteForm/ConfirmDeleteForm.js +0 -60
  16. package/es/DatePicker/DatePickerGroup.d.ts +0 -13
  17. package/es/DatePicker/DatePickerGroup.js +0 -88
  18. package/es/DatePicker/DatePickerHelper.d.ts +0 -3
  19. package/es/DatePicker/DatePickerHelper.js +0 -1
  20. package/es/DatePicker/StringDateOnlyPickerGroup.d.ts +0 -9
  21. package/es/DatePicker/StringDateOnlyPickerGroup.js +0 -29
  22. package/es/DatePicker/StringDatePickerGroup.d.ts +0 -9
  23. package/es/DatePicker/StringDatePickerGroup.js +0 -24
  24. package/es/DateTimePicker/DateTimePickerGroup.d.ts +0 -12
  25. package/es/DateTimePicker/DateTimePickerGroup.js +0 -87
  26. package/es/DateTimePicker/DateTimePickerHelper.d.ts +0 -3
  27. package/es/DateTimePicker/DateTimePickerHelper.js +0 -1
  28. package/es/DateTimePicker/StringDateTimePickerGroup.d.ts +0 -9
  29. package/es/DateTimePicker/StringDateTimePickerGroup.js +0 -53
  30. package/es/Field/CustomFieldInputProps.d.ts +0 -7
  31. package/es/Field/CustomFieldInputProps.js +0 -1
  32. package/es/Field/CustomFieldMetaProps.d.ts +0 -4
  33. package/es/Field/CustomFieldMetaProps.js +0 -1
  34. package/es/Field/Field.d.ts +0 -29
  35. package/es/Field/Field.js +0 -59
  36. package/es/Field/FieldErrorScrollTarget.d.ts +0 -2
  37. package/es/Field/FieldErrorScrollTarget.js +0 -12
  38. package/es/Field/FieldNameContext.d.ts +0 -3
  39. package/es/Field/FieldNameContext.js +0 -3
  40. package/es/Field/FieldSection.d.ts +0 -7
  41. package/es/Field/FieldSection.js +0 -9
  42. package/es/Field/InjectedFieldProps.d.ts +0 -7
  43. package/es/Field/InjectedFieldProps.js +0 -1
  44. package/es/Field/StandAloneInput.d.ts +0 -13
  45. package/es/Field/StandAloneInput.js +0 -50
  46. package/es/Field/useStandardField.d.ts +0 -21
  47. package/es/Field/useStandardField.js +0 -92
  48. package/es/FieldArray/FieldArray.d.ts +0 -24
  49. package/es/FieldArray/FieldArray.js +0 -77
  50. package/es/File/FileGroup.d.ts +0 -10
  51. package/es/File/FileGroup.js +0 -53
  52. package/es/File/FileList.d.ts +0 -5
  53. package/es/File/FileList.js +0 -10
  54. package/es/File/humanFileSize.d.ts +0 -1
  55. package/es/File/humanFileSize.js +0 -6
  56. package/es/Form/FocusError.d.ts +0 -7
  57. package/es/Form/FocusError.js +0 -42
  58. package/es/Form/Form.d.ts +0 -33
  59. package/es/Form/Form.js +0 -141
  60. package/es/Form/FormBasedPreventNavigation.d.ts +0 -6
  61. package/es/Form/FormBasedPreventNavigation.js +0 -20
  62. package/es/Form/LegacyFormBasedPreventNavigation.d.ts +0 -17
  63. package/es/Form/LegacyFormBasedPreventNavigation.js +0 -69
  64. package/es/Form/NewFormBasedPreventNavigation.d.ts +0 -14
  65. package/es/Form/NewFormBasedPreventNavigation.js +0 -39
  66. package/es/Form/ServerErrorContext.d.ts +0 -11
  67. package/es/Form/ServerErrorContext.js +0 -9
  68. package/es/FormActions.d.ts +0 -12
  69. package/es/FormActions.js +0 -16
  70. package/es/FormDefaults.d.ts +0 -4
  71. package/es/FormDefaults.js +0 -2
  72. package/es/Group.d.ts +0 -16
  73. package/es/Group.js +0 -14
  74. package/es/Input/CheckboxGroup.d.ts +0 -6
  75. package/es/Input/CheckboxGroup.js +0 -14
  76. package/es/Input/CheckboxInputGroup.d.ts +0 -13
  77. package/es/Input/CheckboxInputGroup.js +0 -41
  78. package/es/Input/IconInputGroup.d.ts +0 -12
  79. package/es/Input/IconInputGroup.js +0 -43
  80. package/es/Input/InputGroup.d.ts +0 -12
  81. package/es/Input/InputGroup.js +0 -34
  82. package/es/Input/MoneyInputGroup.d.ts +0 -9
  83. package/es/Input/MoneyInputGroup.js +0 -43
  84. package/es/Input/NumberInputGroup.d.ts +0 -9
  85. package/es/Input/NumberInputGroup.js +0 -43
  86. package/es/Input/PhoneNumberInputGroup.d.ts +0 -10
  87. package/es/Input/PhoneNumberInputGroup.js +0 -47
  88. package/es/Input/StringInputGroup.d.ts +0 -8
  89. package/es/Input/StringInputGroup.js +0 -43
  90. package/es/Normalization/NormalizationFunction.d.ts +0 -4
  91. package/es/Normalization/NormalizationFunction.js +0 -1
  92. package/es/Normalization/normalizers.d.ts +0 -4
  93. package/es/Normalization/normalizers.js +0 -32
  94. package/es/Select/BooleanSelectGroup.d.ts +0 -7
  95. package/es/Select/BooleanSelectGroup.js +0 -28
  96. package/es/Select/NumberSelectGroup.d.ts +0 -9
  97. package/es/Select/NumberSelectGroup.js +0 -21
  98. package/es/Select/SelectGroup.d.ts +0 -29
  99. package/es/Select/SelectGroup.js +0 -65
  100. package/es/Select/SelectGroupPropsHelper.d.ts +0 -3
  101. package/es/Select/SelectGroupPropsHelper.js +0 -1
  102. package/es/Select/StringSelectGroup.d.ts +0 -9
  103. package/es/Select/StringSelectGroup.js +0 -21
  104. package/es/StandardFormActions.d.ts +0 -11
  105. package/es/StandardFormActions.js +0 -14
  106. package/es/SubmitFormButton.d.ts +0 -10
  107. package/es/SubmitFormButton.js +0 -40
  108. package/es/TextArea/TextAreaGroup.d.ts +0 -9
  109. package/es/TextArea/TextAreaGroup.js +0 -35
  110. package/es/Validation/ValidatedApiResult.d.ts +0 -6
  111. package/es/Validation/ValidatedApiResult.js +0 -1
  112. package/es/Validation/ValidationError.d.ts +0 -5
  113. package/es/Validation/ValidationError.js +0 -1
  114. package/es/Validation/ValidationFunction.d.ts +0 -4
  115. package/es/Validation/ValidationFunction.js +0 -1
  116. package/es/Validation/validators.d.ts +0 -18
  117. package/es/Validation/validators.js +0 -77
  118. package/es/index.d.ts +0 -81
  119. package/es/index.js +0 -55
  120. package/es/setupTests.d.ts +0 -1
  121. package/es/setupTests.js +0 -1
  122. package/es/utils/objectContainsNonSerializableProperty.d.ts +0 -1
  123. package/es/utils/objectContainsNonSerializableProperty.js +0 -14
  124. package/es/utils/objectToFormData.d.ts +0 -10
  125. package/es/utils/objectToFormData.js +0 -77
  126. package/es/utils/typeChecks.d.ts +0 -8
  127. package/es/utils/typeChecks.js +0 -18
  128. package/lib/AddressInput/AddressInput.d.ts +0 -24
  129. package/lib/AddressInput/AddressInput.js +0 -26
  130. package/lib/AddressInput/UsStates.d.ts +0 -3
  131. package/lib/AddressInput/UsStates.js +0 -55
  132. package/lib/ConfirmBaseForm/ConfirmBaseForm.d.ts +0 -26
  133. package/lib/ConfirmBaseForm/ConfirmBaseForm.js +0 -45
  134. package/lib/ConfirmDeleteForm/ConfirmDeleteForm.d.ts +0 -24
  135. package/lib/ConfirmDeleteForm/ConfirmDeleteForm.js +0 -66
  136. package/lib/DatePicker/DatePickerGroup.d.ts +0 -13
  137. package/lib/DatePicker/DatePickerGroup.js +0 -96
  138. package/lib/DatePicker/DatePickerHelper.d.ts +0 -3
  139. package/lib/DatePicker/DatePickerHelper.js +0 -2
  140. package/lib/DatePicker/StringDateOnlyPickerGroup.d.ts +0 -9
  141. package/lib/DatePicker/StringDateOnlyPickerGroup.js +0 -35
  142. package/lib/DatePicker/StringDatePickerGroup.d.ts +0 -9
  143. package/lib/DatePicker/StringDatePickerGroup.js +0 -30
  144. package/lib/DateTimePicker/DateTimePickerGroup.d.ts +0 -12
  145. package/lib/DateTimePicker/DateTimePickerGroup.js +0 -93
  146. package/lib/DateTimePicker/DateTimePickerHelper.d.ts +0 -3
  147. package/lib/DateTimePicker/DateTimePickerHelper.js +0 -2
  148. package/lib/DateTimePicker/StringDateTimePickerGroup.d.ts +0 -9
  149. package/lib/DateTimePicker/StringDateTimePickerGroup.js +0 -59
  150. package/lib/Field/CustomFieldInputProps.d.ts +0 -7
  151. package/lib/Field/CustomFieldInputProps.js +0 -2
  152. package/lib/Field/CustomFieldMetaProps.d.ts +0 -4
  153. package/lib/Field/CustomFieldMetaProps.js +0 -2
  154. package/lib/Field/Field.d.ts +0 -29
  155. package/lib/Field/Field.js +0 -64
  156. package/lib/Field/FieldErrorScrollTarget.d.ts +0 -2
  157. package/lib/Field/FieldErrorScrollTarget.js +0 -15
  158. package/lib/Field/FieldNameContext.d.ts +0 -3
  159. package/lib/Field/FieldNameContext.js +0 -9
  160. package/lib/Field/FieldSection.d.ts +0 -7
  161. package/lib/Field/FieldSection.js +0 -12
  162. package/lib/Field/InjectedFieldProps.d.ts +0 -7
  163. package/lib/Field/InjectedFieldProps.js +0 -2
  164. package/lib/Field/StandAloneInput.d.ts +0 -13
  165. package/lib/Field/StandAloneInput.js +0 -76
  166. package/lib/Field/useStandardField.d.ts +0 -21
  167. package/lib/Field/useStandardField.js +0 -95
  168. package/lib/FieldArray/FieldArray.d.ts +0 -24
  169. package/lib/FieldArray/FieldArray.js +0 -83
  170. package/lib/File/FileGroup.d.ts +0 -10
  171. package/lib/File/FileGroup.js +0 -58
  172. package/lib/File/FileList.d.ts +0 -5
  173. package/lib/File/FileList.js +0 -13
  174. package/lib/File/humanFileSize.d.ts +0 -1
  175. package/lib/File/humanFileSize.js +0 -10
  176. package/lib/Form/FocusError.d.ts +0 -7
  177. package/lib/Form/FocusError.js +0 -48
  178. package/lib/Form/Form.d.ts +0 -33
  179. package/lib/Form/Form.js +0 -147
  180. package/lib/Form/FormBasedPreventNavigation.d.ts +0 -6
  181. package/lib/Form/FormBasedPreventNavigation.js +0 -26
  182. package/lib/Form/LegacyFormBasedPreventNavigation.d.ts +0 -17
  183. package/lib/Form/LegacyFormBasedPreventNavigation.js +0 -72
  184. package/lib/Form/NewFormBasedPreventNavigation.d.ts +0 -14
  185. package/lib/Form/NewFormBasedPreventNavigation.js +0 -42
  186. package/lib/Form/ServerErrorContext.d.ts +0 -11
  187. package/lib/Form/ServerErrorContext.js +0 -15
  188. package/lib/FormActions.d.ts +0 -12
  189. package/lib/FormActions.js +0 -22
  190. package/lib/FormDefaults.d.ts +0 -4
  191. package/lib/FormDefaults.js +0 -5
  192. package/lib/Group.d.ts +0 -16
  193. package/lib/Group.js +0 -20
  194. package/lib/Input/CheckboxGroup.d.ts +0 -6
  195. package/lib/Input/CheckboxGroup.js +0 -20
  196. package/lib/Input/CheckboxInputGroup.d.ts +0 -13
  197. package/lib/Input/CheckboxInputGroup.js +0 -46
  198. package/lib/Input/IconInputGroup.d.ts +0 -12
  199. package/lib/Input/IconInputGroup.js +0 -48
  200. package/lib/Input/InputGroup.d.ts +0 -12
  201. package/lib/Input/InputGroup.js +0 -39
  202. package/lib/Input/MoneyInputGroup.d.ts +0 -9
  203. package/lib/Input/MoneyInputGroup.js +0 -48
  204. package/lib/Input/NumberInputGroup.d.ts +0 -9
  205. package/lib/Input/NumberInputGroup.js +0 -48
  206. package/lib/Input/PhoneNumberInputGroup.d.ts +0 -10
  207. package/lib/Input/PhoneNumberInputGroup.js +0 -52
  208. package/lib/Input/StringInputGroup.d.ts +0 -8
  209. package/lib/Input/StringInputGroup.js +0 -48
  210. package/lib/Normalization/NormalizationFunction.d.ts +0 -4
  211. package/lib/Normalization/NormalizationFunction.js +0 -2
  212. package/lib/Normalization/normalizers.d.ts +0 -4
  213. package/lib/Normalization/normalizers.js +0 -37
  214. package/lib/Select/BooleanSelectGroup.d.ts +0 -7
  215. package/lib/Select/BooleanSelectGroup.js +0 -35
  216. package/lib/Select/NumberSelectGroup.d.ts +0 -9
  217. package/lib/Select/NumberSelectGroup.js +0 -29
  218. package/lib/Select/SelectGroup.d.ts +0 -29
  219. package/lib/Select/SelectGroup.js +0 -71
  220. package/lib/Select/SelectGroupPropsHelper.d.ts +0 -3
  221. package/lib/Select/SelectGroupPropsHelper.js +0 -2
  222. package/lib/Select/StringSelectGroup.d.ts +0 -9
  223. package/lib/Select/StringSelectGroup.js +0 -29
  224. package/lib/StandardFormActions.d.ts +0 -11
  225. package/lib/StandardFormActions.js +0 -20
  226. package/lib/SubmitFormButton.d.ts +0 -10
  227. package/lib/SubmitFormButton.js +0 -45
  228. package/lib/TextArea/TextAreaGroup.d.ts +0 -9
  229. package/lib/TextArea/TextAreaGroup.js +0 -40
  230. package/lib/Validation/ValidatedApiResult.d.ts +0 -6
  231. package/lib/Validation/ValidatedApiResult.js +0 -2
  232. package/lib/Validation/ValidationError.d.ts +0 -5
  233. package/lib/Validation/ValidationError.js +0 -2
  234. package/lib/Validation/ValidationFunction.d.ts +0 -4
  235. package/lib/Validation/ValidationFunction.js +0 -2
  236. package/lib/Validation/validators.d.ts +0 -18
  237. package/lib/Validation/validators.js +0 -90
  238. package/lib/index.d.ts +0 -81
  239. package/lib/index.js +0 -126
  240. package/lib/setupTests.d.ts +0 -1
  241. package/lib/setupTests.js +0 -3
  242. package/lib/utils/objectContainsNonSerializableProperty.d.ts +0 -1
  243. package/lib/utils/objectContainsNonSerializableProperty.js +0 -17
  244. package/lib/utils/objectToFormData.d.ts +0 -10
  245. package/lib/utils/objectToFormData.js +0 -79
  246. package/lib/utils/typeChecks.d.ts +0 -8
  247. package/lib/utils/typeChecks.js +0 -29
  248. package/src/AddressInput/AddressInput.test.tsx +0 -27
  249. package/src/AddressInput/AddressInput.tsx +0 -82
  250. package/src/AddressInput/UsStates.ts +0 -55
  251. package/src/AddressInput/__snapshots__/AddressInput.test.tsx.snap +0 -183
  252. package/src/ConfirmBaseForm/ConfirmBaseForm.test.tsx +0 -24
  253. package/src/ConfirmBaseForm/ConfirmBaseForm.tsx +0 -74
  254. package/src/ConfirmBaseForm/__snapshots__/ConfirmBaseForm.test.tsx.snap +0 -23
  255. package/src/ConfirmDeleteForm/ConfirmDeleteForm.test.tsx +0 -24
  256. package/src/ConfirmDeleteForm/ConfirmDeleteForm.tsx +0 -87
  257. package/src/ConfirmDeleteForm/__snapshots__/ConfirmDeleteForm.test.tsx.snap +0 -25
  258. package/src/DatePicker/DatePicker.test.tsx +0 -48
  259. package/src/DatePicker/DatePickerGroup.tsx +0 -115
  260. package/src/DatePicker/DatePickerHelper.ts +0 -4
  261. package/src/DatePicker/StringDateOnlyPickerGroup.tsx +0 -28
  262. package/src/DatePicker/StringDatePickerGroup.tsx +0 -20
  263. package/src/DatePicker/__snapshots__/DatePicker.test.tsx.snap +0 -152
  264. package/src/DateTimePicker/DateTimePicker.test.tsx +0 -243
  265. package/src/DateTimePicker/DateTimePickerGroup.tsx +0 -116
  266. package/src/DateTimePicker/DateTimePickerHelper.ts +0 -4
  267. package/src/DateTimePicker/StringDateTimePickerGroup.tsx +0 -61
  268. package/src/DateTimePicker/__snapshots__/DateTimePicker.test.tsx.snap +0 -217
  269. package/src/Field/CustomFieldInputProps.ts +0 -10
  270. package/src/Field/CustomFieldMetaProps.ts +0 -5
  271. package/src/Field/Field.tsx +0 -127
  272. package/src/Field/FieldErrorScrollTarget.tsx +0 -12
  273. package/src/Field/FieldNameContext.ts +0 -6
  274. package/src/Field/FieldSection.tsx +0 -18
  275. package/src/Field/InjectedFieldProps.ts +0 -8
  276. package/src/Field/StandAloneInput.tsx +0 -55
  277. package/src/Field/useStandardField.ts +0 -125
  278. package/src/FieldArray/FieldArray.tsx +0 -154
  279. package/src/File/FileGroup.test.tsx +0 -35
  280. package/src/File/FileGroup.tsx +0 -82
  281. package/src/File/FileList.tsx +0 -21
  282. package/src/File/__snapshots__/FileGroup.test.tsx.snap +0 -34
  283. package/src/File/humanFileSize.ts +0 -8
  284. package/src/Form/FocusError.tsx +0 -55
  285. package/src/Form/Form.test.tsx +0 -14
  286. package/src/Form/Form.tsx +0 -234
  287. package/src/Form/FormBasedPreventNavigation.tsx +0 -56
  288. package/src/Form/LegacyFormBasedPreventNavigation.tsx +0 -77
  289. package/src/Form/NewFormBasedPreventNavigation.tsx +0 -59
  290. package/src/Form/ServerErrorContext.ts +0 -18
  291. package/src/Form/__snapshots__/Form.test.tsx.snap +0 -10
  292. package/src/FormActions.tsx +0 -47
  293. package/src/FormDefaults.ts +0 -2
  294. package/src/Group.tsx +0 -62
  295. package/src/Input/CheckboxGroup.tsx +0 -60
  296. package/src/Input/CheckboxInputGroup.tsx +0 -78
  297. package/src/Input/IconInputGroup.tsx +0 -54
  298. package/src/Input/InputGroup.tsx +0 -69
  299. package/src/Input/MoneyInputGroup.tsx +0 -47
  300. package/src/Input/NumberInputGroup.tsx +0 -45
  301. package/src/Input/PhoneNumberInputGroup.tsx +0 -45
  302. package/src/Input/StringInputGroup.tsx +0 -50
  303. package/src/Input/__Tests__/CheckboxInputGroup.test.tsx +0 -26
  304. package/src/Input/__Tests__/IconInputGroup.test.tsx +0 -35
  305. package/src/Input/__Tests__/MoneyInputGroup.test.tsx +0 -37
  306. package/src/Input/__Tests__/NumberInputGroup.test.tsx +0 -35
  307. package/src/Input/__Tests__/PhoneNumberInputGroup.test.tsx +0 -36
  308. package/src/Input/__Tests__/StringInputGroup.test.tsx +0 -27
  309. package/src/Input/__Tests__/__snapshots__/CheckboxInputGroup.test.tsx.snap +0 -33
  310. package/src/Input/__Tests__/__snapshots__/IconInputGroup.test.tsx.snap +0 -32
  311. package/src/Input/__Tests__/__snapshots__/MoneyInputGroup.test.tsx.snap +0 -34
  312. package/src/Input/__Tests__/__snapshots__/NumberInputGroup.test.tsx.snap +0 -32
  313. package/src/Input/__Tests__/__snapshots__/PhoneNumberInputGroup.test.tsx.snap +0 -33
  314. package/src/Input/__Tests__/__snapshots__/StringInputGroup.test.tsx.snap +0 -31
  315. package/src/Normalization/NormalizationFunction.ts +0 -4
  316. package/src/Normalization/normalizers.ts +0 -44
  317. package/src/Select/BooleanSelectGroup.tsx +0 -28
  318. package/src/Select/NumberSelectGroup.tsx +0 -16
  319. package/src/Select/SelectGroup.tsx +0 -132
  320. package/src/Select/SelectGroupPropsHelper.ts +0 -4
  321. package/src/Select/StringSelectGroup.tsx +0 -16
  322. package/src/Select/__tests__/BooleanSelectGroup.test.tsx +0 -35
  323. package/src/Select/__tests__/NumberSelectGroup.test.tsx +0 -87
  324. package/src/Select/__tests__/StringSelectGroup.test.tsx +0 -89
  325. package/src/Select/__tests__/__snapshots__/BooleanSelectGroup.test.tsx.snap +0 -99
  326. package/src/Select/__tests__/__snapshots__/NumberSelectGroup.test.tsx.snap +0 -197
  327. package/src/Select/__tests__/__snapshots__/StringSelectGroup.test.tsx.snap +0 -197
  328. package/src/StandardFormActions.tsx +0 -41
  329. package/src/SubmitFormButton.tsx +0 -54
  330. package/src/TextArea/TextAreaGroup.tsx +0 -64
  331. package/src/Validation/ValidatedApiResult.ts +0 -8
  332. package/src/Validation/ValidationError.ts +0 -6
  333. package/src/Validation/ValidationFunction.ts +0 -4
  334. package/src/Validation/validators.test.tsx +0 -81
  335. package/src/Validation/validators.ts +0 -97
  336. package/src/__Tests__/FormTestBase.tsx +0 -66
  337. package/src/__Tests__/RealisticForm.test.tsx +0 -82
  338. package/src/__Tests__/StandardFormActions.test.tsx +0 -17
  339. package/src/__Tests__/SubmitFormButton.test.tsx +0 -17
  340. package/src/__Tests__/__snapshots__/StandardFormActions.test.tsx.snap +0 -27
  341. package/src/__Tests__/__snapshots__/SubmitFormButton.test.tsx.snap +0 -20
  342. package/src/__Tests__/index.ts +0 -3
  343. package/src/_variables.scss +0 -11
  344. package/src/index.ts +0 -163
  345. package/src/react-app-env.d.ts +0 -1
  346. package/src/setupTests.ts +0 -1
  347. package/src/styles.scss +0 -0
  348. package/src/utils/objectContainsNonSerializableProperty.test.tsx +0 -49
  349. package/src/utils/objectContainsNonSerializableProperty.ts +0 -17
  350. package/src/utils/objectToFormData.test.tsx +0 -76
  351. package/src/utils/objectToFormData.ts +0 -105
  352. package/src/utils/typeChecks.ts +0 -18
@@ -1,154 +0,0 @@
1
- import { ElementType } from 'react';
2
- import { clsx } from 'clsx';
3
- import Field, { FieldProps } from '../Field/Field';
4
- import { FieldNameContext } from '../Field/FieldNameContext';
5
- import useStandardFormInput from '../Field/useStandardField';
6
- import { FormDefaults } from '../FormDefaults';
7
- import { ValidationFunction } from '../Validation/ValidationFunction';
8
-
9
- export type FieldArrayProps<
10
- TForm extends object,
11
- TProp extends keyof TForm
12
- > = TForm[TProp] extends Array<any> | undefined | null
13
- ? {
14
- /** Name of the field, used on submission. If using codegen this must be the provided dto. */
15
- name: TProp;
16
- /** Label of the field. */
17
- label?: string;
18
- /** Whether the field should be disabled. */
19
- disabled?: boolean;
20
- /** Function to validate the value. */
21
- validate?:
22
- | ValidationFunction<TForm[TProp]>
23
- | ValidationFunction<TForm[TProp]>[];
24
- children: (
25
- formBuilder: ArrayFormBuilderProp<TForm[TProp]>
26
- ) => JSX.Element;
27
- }
28
- : never;
29
-
30
- export type ArrayFormBuilderProp<TValue extends Array<any> | undefined | null> =
31
- TValue extends Array<infer TForm> | undefined | null
32
- ? TForm extends object
33
- ? {
34
- Field: <
35
- TProp extends keyof TForm,
36
- TRenderComponent extends ElementType
37
- >(
38
- props: FieldProps<TForm, TProp, TRenderComponent>
39
- ) => JSX.Element; // assumes this is never null - thought he final component may not render
40
-
41
- FieldArray: <TProp extends keyof TForm>(
42
- props: FieldArrayProps<TForm, TProp>
43
- ) => JSX.Element;
44
- }
45
- : never
46
- : never;
47
-
48
- /**
49
- * An array of fields that allows the user to add multiple instances of the same field.
50
- *
51
- * Includes "Add Item" and "Remove Item" buttons to allow the user to speicify the number of fields.
52
- */
53
- export default function FieldArray<
54
- TForm extends object,
55
- TProp extends keyof TForm
56
- >({
57
- name,
58
- label,
59
- validate,
60
- disabled,
61
- children,
62
- ...rest
63
- }: FieldArrayProps<TForm, TProp>) {
64
- const [input] = useStandardFormInput<TForm[TProp]>({
65
- name: String(name),
66
- validate: validate,
67
- disabled: disabled,
68
- });
69
-
70
- const values: any[] = !input.value
71
- ? []
72
- : Array.isArray(input.value)
73
- ? input.value
74
- : [];
75
-
76
- return (
77
- <div className={FormDefaults.cssClassPrefix + 'field-array'}>
78
- <div className={FormDefaults.cssClassPrefix + 'field-array-header'}>
79
- <div className={FormDefaults.cssClassPrefix + 'field-array-title'}>
80
- {label}
81
- </div>
82
- <button
83
- className={clsx(
84
- FormDefaults.cssClassPrefix + 'add-array-item-button',
85
- { [FormDefaults.cssClassPrefix + 'disabled']: disabled }
86
- )}
87
- title="Add Item"
88
- type="button"
89
- onClick={addItem}>
90
- +
91
- </button>
92
- </div>
93
- <div className={FormDefaults.cssClassPrefix + 'field-array-body'}>
94
- {values.map((value, index) => {
95
- const itemName = `${input.name}[${index}]`;
96
- return (
97
- <div
98
- key={
99
- (value && value['form-input-array-key']) ||
100
- (value && value['id']) ||
101
- itemName
102
- }
103
- className={clsx(
104
- FormDefaults.cssClassPrefix + 'field-array-item',
105
- {
106
- [FormDefaults.cssClassPrefix + 'removed']: value.isDeleted,
107
- }
108
- )}
109
- role="listitem">
110
- <FieldNameContext.Provider value={itemName}>
111
- {children({
112
- Field: Field,
113
- FieldArray: FieldArray,
114
- } as any)}
115
- </FieldNameContext.Provider>
116
- <button
117
- className={clsx(
118
- FormDefaults.cssClassPrefix + 'remove-array-item-button',
119
- { [FormDefaults.cssClassPrefix + 'disabled']: disabled }
120
- )}
121
- type="button"
122
- title="Remove Item"
123
- onClick={() => removeItem(value)}>
124
- -
125
- </button>
126
- </div>
127
- );
128
- })}
129
- </div>
130
- </div>
131
- );
132
-
133
- function addItem() {
134
- if (disabled) {
135
- return;
136
- }
137
- input.onChange([...values, {}] as any);
138
- }
139
-
140
- function removeItem(item: any) {
141
- if (disabled) {
142
- return;
143
- }
144
- // assumes anything from the server has an 'id' value sent
145
- if (!item.id) {
146
- input.onChange(values.filter((x) => x !== item) as any);
147
- return;
148
- }
149
- const mapped = values.map((x) =>
150
- x !== item ? x : Object.assign({}, x, { isDeleted: true })
151
- );
152
- input.onChange(mapped as any);
153
- }
154
- }
@@ -1,35 +0,0 @@
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
- });
@@ -1,82 +0,0 @@
1
- import React, { ComponentType, LegacyRef } from 'react';
2
- import { clsx } from 'clsx';
3
- import FileList from './FileList';
4
- import { InjectedFieldProps } from '../Field/InjectedFieldProps';
5
- import { FormDefaults } from '../FormDefaults';
6
- import Group, { GroupProps } from '../Group';
7
-
8
- export interface FileGroupProps
9
- // note: file props are of type "any" with the current type generation
10
- extends InjectedFieldProps<any | undefined | null>,
11
- Omit<GroupProps, keyof InjectedFieldProps<any> | 'children'>,
12
- Omit<
13
- React.HTMLProps<HTMLInputElement>,
14
- keyof InjectedFieldProps<any> | 'children' | 'className' | 'label'
15
- > {
16
- /** Allow multiple files to be uploaded. */
17
- multiple?: boolean | undefined;
18
- }
19
-
20
- function FileGroup(
21
- {
22
- input,
23
- meta,
24
- label,
25
- helpText,
26
- className,
27
- required,
28
- disabled,
29
- multiple,
30
- ...rest
31
- }: FileGroupProps,
32
- ref: LegacyRef<HTMLInputElement>
33
- ) {
34
- return (
35
- <Group
36
- input={input}
37
- meta={meta}
38
- label={label}
39
- helpText={helpText}
40
- className={clsx(
41
- className,
42
- { [FormDefaults.cssClassPrefix + 'multiple']: multiple },
43
- FormDefaults.cssClassPrefix + 'file-group'
44
- )}
45
- required={required}
46
- disabled={disabled}>
47
- <input
48
- {...input}
49
- {...rest}
50
- multiple={multiple}
51
- onChange={(e) => {
52
- if (!e?.target?.files?.length) {
53
- input.onChange(undefined);
54
- } else {
55
- const files: File[] = [];
56
- for (let i = 0; i < e.target.files.length; i++) {
57
- files.push(e.target.files[i]);
58
- }
59
- if (!multiple) {
60
- input.onChange(files[0]);
61
- } else {
62
- input.onChange(files);
63
- }
64
- }
65
- }}
66
- value={undefined}
67
- ref={ref}
68
- type="file"
69
- className={clsx(className, FormDefaults.cssClassPrefix + 'file-group')}
70
- />
71
- {/* Note: because input.value is any - due to how files are currently handled - type safeness isn't great here */}
72
- <FileList files={input.value} />
73
- </Group>
74
- );
75
- }
76
-
77
- /** File upload input group. */
78
- const FileGroupWithRef = React.forwardRef(
79
- FileGroup
80
- ) as ComponentType<FileGroupProps>;
81
-
82
- export default FileGroupWithRef;
@@ -1,21 +0,0 @@
1
- import { FormDefaults } from '../FormDefaults';
2
-
3
- export interface FileListProps {
4
- files?: File | File[] | undefined | null;
5
- rejectedFiles?: File | File[] | undefined | null;
6
- }
7
- export default function FileList({ files, rejectedFiles }: FileListProps) {
8
- return (
9
- <div className={FormDefaults.cssClassPrefix + 'file-list'}>
10
- {!files ? null : Array.isArray(files) ? (
11
- files.map((x, i) => <File file={x} key={i} />)
12
- ) : (
13
- <File file={files} />
14
- )}
15
- </div>
16
- );
17
- }
18
-
19
- function File({ file }: { file: File }) {
20
- return null;
21
- }
@@ -1,34 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`FileGroup has matching snapshot 1`] = `
4
- <DocumentFragment>
5
- <form
6
- action="#"
7
- class="envoc-form-form"
8
- >
9
- <div
10
- class="envoc-form-file-group envoc-form-group"
11
- >
12
- <div
13
- id="profileimage-error-scroll-target"
14
- style="display: none;"
15
- />
16
- <label
17
- for="profileImage"
18
- >
19
- Profile Image
20
- </label>
21
- <input
22
- class="envoc-form-file-group"
23
- id="profileImage"
24
- name="profileImage"
25
- type="file"
26
- value=""
27
- />
28
- <div
29
- class="envoc-form-file-list"
30
- />
31
- </div>
32
- </form>
33
- </DocumentFragment>
34
- `;
@@ -1,8 +0,0 @@
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,55 +0,0 @@
1
- import { useEffect } from 'react';
2
- import { useFormikContext } from 'formik';
3
- import smoothscroll from 'smoothscroll-polyfill';
4
- import { ServerErrorContextProps } from './ServerErrorContext';
5
-
6
- export interface FocusErrorProps {
7
- /** Validation errors that have been received from the server. */
8
- serverErrors: ServerErrorContextProps;
9
- }
10
-
11
- /** Function to scroll to the field that has an error. */
12
- export default function FocusError(props: FocusErrorProps) {
13
- const { errors, isSubmitting, isValidating } = useFormikContext();
14
- smoothscroll.polyfill();
15
- useEffect(() => {
16
- if (!isSubmitting || isValidating) {
17
- return;
18
- }
19
- //This block handles any front-end input validation errors
20
- //e.g. required fields, max characters, etc
21
- const keys = Object.keys(errors);
22
- if (keys.length > 0) {
23
- return scrollToErrorElement(keys);
24
- }
25
- //This block handles any input-specific server-side errors
26
- //e.g. improper email formatting, invalid phone number, etc.
27
- if (
28
- props.serverErrors.errors &&
29
- Object.values(props.serverErrors.errors).some((x) => !!x)
30
- ) {
31
- const names = Object.keys(props.serverErrors.errors);
32
- return scrollToErrorElement(names);
33
- }
34
- }, [errors, isSubmitting, isValidating, props]);
35
- return null;
36
- }
37
-
38
- const scrollToErrorElement = (keys: string[]) => {
39
- let firstErrorElement: HTMLElement | null = document.getElementById(
40
- `${keys[0].toLowerCase()}-error-scroll-target`
41
- );
42
- if (!firstErrorElement || !firstErrorElement.parentNode) {
43
- return;
44
- }
45
- firstErrorElement = firstErrorElement.parentNode as HTMLElement;
46
- const headerOffset = -110;
47
- const y =
48
- firstErrorElement.getBoundingClientRect().top +
49
- window.pageYOffset +
50
- headerOffset;
51
- window.scrollTo({ top: y, behavior: 'smooth' });
52
- setTimeout(() => {
53
- firstErrorElement?.focus();
54
- }, 500);
55
- };
@@ -1,14 +0,0 @@
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
- });
package/src/Form/Form.tsx DELETED
@@ -1,234 +0,0 @@
1
- import {
2
- CSSProperties,
3
- ElementType,
4
- useContext,
5
- useMemo,
6
- useState,
7
- } from 'react';
8
- import { clsx } from 'clsx';
9
- import {
10
- Form as FormikFormWrapper,
11
- Formik,
12
- FormikHelpers,
13
- useFormikContext,
14
- } from 'formik';
15
- import FocusError from './FocusError';
16
- import FormBasedPreventNavigation from './FormBasedPreventNavigation';
17
- import {
18
- ServerErrorContext,
19
- ServerErrorContextProps,
20
- ServerErrors,
21
- } from './ServerErrorContext';
22
- import Field, { FieldProps } from '../Field/Field';
23
- import FieldArray, { FieldArrayProps } from '../FieldArray/FieldArray';
24
- import { FormDefaults } from '../FormDefaults';
25
- import objectContainsNonSerializableProperty from '../utils/objectContainsNonSerializableProperty';
26
- import objectToFormData from '../utils/objectToFormData';
27
- import { ValidatedApiResult } from '../Validation/ValidatedApiResult';
28
- import { ValidationError } from '../Validation/ValidationError';
29
-
30
- // This exposes the builder that ensures only "name" values on the given TForm can be used
31
- // Further, each Field can then infer the proper type given the name
32
- export type FormBuilderProp<TForm extends object> = {
33
- // the first set of <> is a generic method signature - we don't split this off because we need the TForm closure
34
- Field: <TProp extends keyof TForm, TRenderComponent extends ElementType>(
35
- props: FieldProps<TForm, TProp, TRenderComponent>
36
- ) => JSX.Element; // assumes this is never null - thought he final component may not render
37
-
38
- FieldArray: <TProp extends keyof TForm>(
39
- props: FieldArrayProps<TForm, TProp>
40
- ) => JSX.Element;
41
- };
42
-
43
- export interface FullFormProps<TForm extends object> {
44
- /** The `<Field/>` and `<FieldArray/>` components. */
45
- children: (formBuilder: FormBuilderProp<TForm>) => JSX.Element;
46
- /** Submission handler */
47
- onSubmit: (
48
- formValues: TForm,
49
- formikBag: FormikHelpers<TForm>
50
- ) => Promise<ValidatedApiResult>;
51
- /** Submission handler for forms that use [FormData](https://developer.mozilla.org/en-US/docs/Web/API/FormData).*/
52
- onFormDataSubmit: (
53
- formValues: FormData,
54
- formikBag: FormikHelpers<TForm>
55
- ) => Promise<ValidatedApiResult>;
56
- className?: string;
57
- style?: CSSProperties;
58
- /** Prevent the user from leaving the form if they have edited any field. This is presented as a JS `alert()`. */
59
- ignoreLostChanges?: boolean;
60
- /** The intitial values of the form. */
61
- initialValues?: TForm;
62
- }
63
-
64
- type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<
65
- T,
66
- Exclude<keyof T, Keys>
67
- > &
68
- {
69
- [K in Keys]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<Keys, K>>>;
70
- }[Keys];
71
-
72
- export type FormProps<TForm extends object> = RequireAtLeastOne<
73
- FullFormProps<TForm>,
74
- 'onSubmit' | 'onFormDataSubmit'
75
- >;
76
-
77
- /** Define a form. Uses [formik](https://formik.org/docs/overview). Usually contains many `<Field/>` components. */
78
- export default function Form<TForm extends object>({
79
- children,
80
- className,
81
- style,
82
- ignoreLostChanges,
83
- onSubmit,
84
- onFormDataSubmit,
85
- initialValues,
86
- ...props
87
- }: FormProps<TForm>) {
88
- // formik resets all error on each blur (with our settings)
89
- // this means that ALL errors from the server disappear when any one field is blurred
90
- // So, we have to store server errors ourselves
91
- // Since we only use useStandardFormInput, that means there is only one consumer
92
- const [serverErrors, setServerErrors] = useState<ServerErrors>({});
93
- const serverErrorContextValue = useMemo<ServerErrorContextProps>(
94
- () => ({
95
- errors: serverErrors,
96
- getError: (path) => {
97
- const lowered = path.toLowerCase();
98
- return serverErrors && serverErrors[lowered];
99
- },
100
- setError: (path, errorMessage) => {
101
- const lowered = path.toLowerCase();
102
- setServerErrors(
103
- Object.assign({}, serverErrors, {
104
- [lowered]: !errorMessage ? undefined : errorMessage,
105
- })
106
- );
107
- },
108
- }),
109
- [serverErrors]
110
- );
111
-
112
- return (
113
- <Formik
114
- validateOnChange={false}
115
- validateOnBlur={true}
116
- validateOnMount={false}
117
- initialValues={initialValues || ({} as TForm)}
118
- onSubmit={handleSubmit}
119
- {...props}>
120
- <ServerErrorContext.Provider value={serverErrorContextValue}>
121
- <FormikFormWrapper
122
- className={clsx(className, FormDefaults.cssClassPrefix + 'form')}
123
- style={style}>
124
- <FocusError serverErrors={serverErrorContextValue} />
125
- <FormBasedPreventNavigation ignoreLostChanges={ignoreLostChanges} />
126
- {children({
127
- // hack for ref forwarding
128
- Field: Field as any,
129
- FieldArray: FieldArray as any,
130
- })}
131
- </FormikFormWrapper>
132
- </ServerErrorContext.Provider>
133
- </Formik>
134
- );
135
-
136
- function handleSubmit(values: TForm, formikBag: FormikHelpers<TForm>) {
137
- let formData: FormData | undefined = undefined;
138
- let submitFunc: () => Promise<ValidatedApiResult>;
139
- if (objectContainsNonSerializableProperty(values)) {
140
- formData = objectToFormData(values, {
141
- indices: true,
142
- dotNotation: true,
143
- allowEmptyArrays: true,
144
- noFileListBrackets: true,
145
- });
146
- if (onFormDataSubmit === undefined) {
147
- throw new Error(
148
- 'No onFormDataSubmit supplied for non-serializable properties.'
149
- );
150
- }
151
- submitFunc = () =>
152
- onFormDataSubmit(formData ?? new FormData(), formikBag);
153
- } else {
154
- if (onSubmit === undefined) {
155
- formData = objectToFormData(values, {
156
- indices: true,
157
- dotNotation: true,
158
- allowEmptyArrays: true,
159
- noFileListBrackets: true,
160
- });
161
- if (onFormDataSubmit === undefined) {
162
- // This error should never occur, as this case is covered by RequireAtLeastOne type safety
163
- throw new Error(
164
- 'No onFormDataSubmit supplied for non-serializable properties.'
165
- );
166
- }
167
- submitFunc = () =>
168
- onFormDataSubmit(formData ?? new FormData(), formikBag);
169
- } else {
170
- submitFunc = () => onSubmit(values, formikBag);
171
- }
172
- }
173
-
174
- return submitFunc()
175
- .then((response) => {
176
- return response;
177
- })
178
- .catch((err) => {
179
- //this is an http error
180
- if (
181
- err &&
182
- err.response &&
183
- err.response.data &&
184
- err.response.data.validationFailures
185
- ) {
186
- try {
187
- const serverErrors = err.response.data.validationFailures.reduce(
188
- (acc: ServerErrors, value: ValidationError) => {
189
- // for simplicity, just keep it to one server error at a time per path
190
- // don't care of the property name case changes
191
- const path = value.propertyName?.toLowerCase();
192
- if (!!path && !!value.errorMessage) {
193
- acc[path] = value.errorMessage;
194
- }
195
- return acc;
196
- },
197
- {} as ServerErrors
198
- );
199
- setServerErrors(serverErrors);
200
- } catch (err) {
201
- console.error('Failure to getErrorObject');
202
- console.error(err);
203
- throw err;
204
- }
205
- }
206
- throw err;
207
- });
208
- }
209
- }
210
-
211
- Form.DisplayFormState = DisplayFormState;
212
- function DisplayFormState() {
213
- const formState = useFormikContext();
214
- const serverErrorContext = useContext(ServerErrorContext);
215
- return (
216
- <div style={{ margin: '1rem 0' }}>
217
- <pre
218
- style={{
219
- background: '#f6f8fa',
220
- fontSize: '.65rem',
221
- padding: '.5rem',
222
- }}>
223
- {serverErrorContext && serverErrorContext.errors && (
224
- <div>
225
- <strong>serverErrors = </strong>
226
- {JSON.stringify(serverErrorContext.errors, null, 2)}
227
- </div>
228
- )}
229
- <strong>formState = </strong>
230
- {JSON.stringify(formState, null, 2)}
231
- </pre>
232
- </div>
233
- );
234
- }
@@ -1,56 +0,0 @@
1
- import type { History } from 'history';
2
- import { ContextType, useContext } from 'react';
3
- import {
4
- Navigator as BaseNavigator,
5
- UNSAFE_NavigationContext as NavigationContext,
6
- } from 'react-router-dom';
7
- import { useFormikContext } from 'formik';
8
- import LegacyFormBasedPreventNavigation from './LegacyFormBasedPreventNavigation';
9
- import NewFormBasedPreventNavigation from './NewFormBasedPreventNavigation';
10
-
11
- interface Navigator extends BaseNavigator {
12
- block?: History['block'];
13
- location: Location;
14
- }
15
-
16
- type NavigationContextWithBlock = ContextType<typeof NavigationContext> & {
17
- navigator: Navigator;
18
- };
19
-
20
- export interface FormBasedPreventNavigationProps {
21
- ignoreLostChanges?: boolean;
22
- promptMessage?: string;
23
- }
24
-
25
- /** Prevent the user from navigating away from a form if there are any changes. */
26
- export default function FormBasedPreventNavigation({
27
- ignoreLostChanges,
28
- promptMessage = 'Changes you made may not be saved.',
29
- }: FormBasedPreventNavigationProps) {
30
- const { dirty, isSubmitting } = useFormikContext();
31
- const preventNavigate = !ignoreLostChanges && dirty && !isSubmitting;
32
-
33
- const { navigator } = useContext(
34
- NavigationContext
35
- ) as NavigationContextWithBlock;
36
-
37
- const isUsingDataRouter = navigator.location === undefined;
38
-
39
- if (isUsingDataRouter) {
40
- return (
41
- <NewFormBasedPreventNavigation
42
- promptMessage={promptMessage}
43
- preventNavigate={preventNavigate}
44
- navigator={navigator}
45
- />
46
- );
47
- } else {
48
- return (
49
- <LegacyFormBasedPreventNavigation
50
- promptMessage={promptMessage}
51
- preventNavigate={preventNavigate}
52
- navigator={navigator}
53
- />
54
- );
55
- }
56
- }