envoc-form 4.0.1-9 → 5.0.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 (276) hide show
  1. package/README.md +5173 -12
  2. package/es/AddressInput/AddressInput.d.ts +24 -15
  3. package/es/AddressInput/AddressInput.js +20 -21
  4. package/es/AddressInput/UsStates.d.ts +3 -3
  5. package/es/AddressInput/UsStates.js +53 -53
  6. package/es/ConfirmBaseForm/ConfirmBaseForm.d.ts +26 -12
  7. package/es/ConfirmBaseForm/ConfirmBaseForm.js +42 -36
  8. package/es/ConfirmDeleteForm/ConfirmDeleteForm.d.ts +24 -11
  9. package/es/ConfirmDeleteForm/ConfirmDeleteForm.js +60 -55
  10. package/es/DatePicker/DatePickerGroup.d.ts +13 -9
  11. package/es/DatePicker/DatePickerGroup.js +87 -77
  12. package/es/DatePicker/DatePickerHelper.d.ts +3 -3
  13. package/es/DatePicker/DatePickerHelper.js +1 -1
  14. package/es/DatePicker/StringDateOnlyPickerGroup.d.ts +9 -5
  15. package/es/DatePicker/StringDateOnlyPickerGroup.js +29 -24
  16. package/es/DatePicker/StringDatePickerGroup.d.ts +9 -5
  17. package/es/DatePicker/StringDatePickerGroup.js +24 -19
  18. package/es/Field/CustomFieldInputProps.d.ts +7 -7
  19. package/es/Field/CustomFieldInputProps.js +1 -1
  20. package/es/Field/CustomFieldMetaProps.d.ts +4 -4
  21. package/es/Field/CustomFieldMetaProps.js +1 -1
  22. package/es/Field/Field.d.ts +28 -22
  23. package/es/Field/Field.js +51 -46
  24. package/es/Field/FieldErrorScrollTarget.d.ts +2 -2
  25. package/es/Field/FieldErrorScrollTarget.js +12 -11
  26. package/es/Field/FieldNameContext.d.ts +3 -3
  27. package/es/Field/FieldNameContext.js +3 -3
  28. package/es/Field/FieldSection.d.ts +7 -7
  29. package/es/Field/FieldSection.js +9 -20
  30. package/es/Field/InjectedFieldProps.d.ts +7 -7
  31. package/es/Field/InjectedFieldProps.js +1 -1
  32. package/es/Field/StandAloneInput.d.ts +13 -9
  33. package/es/Field/StandAloneInput.js +50 -49
  34. package/es/Field/useStandardField.d.ts +21 -15
  35. package/es/Field/useStandardField.js +92 -93
  36. package/es/FieldArray/FieldArray.d.ts +24 -15
  37. package/es/FieldArray/FieldArray.js +77 -83
  38. package/es/File/FileGroup.d.ts +10 -8
  39. package/es/File/FileGroup.js +53 -52
  40. package/es/File/FileList.d.ts +5 -6
  41. package/es/File/FileList.js +10 -21
  42. package/es/File/humanFileSize.d.ts +1 -1
  43. package/es/File/humanFileSize.js +6 -6
  44. package/es/Form/FocusError.d.ts +7 -5
  45. package/es/Form/FocusError.js +42 -41
  46. package/es/Form/Form.d.ts +33 -27
  47. package/es/Form/Form.js +141 -140
  48. package/es/Form/FormBasedPreventNavigation.d.ts +6 -5
  49. package/es/Form/FormBasedPreventNavigation.js +20 -53
  50. package/es/Form/LegacyFormBasedPreventNavigation.d.ts +17 -0
  51. package/es/Form/LegacyFormBasedPreventNavigation.js +69 -0
  52. package/es/Form/NewFormBasedPreventNavigation.d.ts +14 -0
  53. package/es/Form/NewFormBasedPreventNavigation.js +39 -0
  54. package/es/Form/ServerErrorContext.d.ts +11 -10
  55. package/es/Form/ServerErrorContext.js +9 -8
  56. package/es/FormActions.d.ts +12 -7
  57. package/es/FormActions.js +16 -26
  58. package/es/FormDefaults.d.ts +4 -3
  59. package/es/FormDefaults.js +2 -1
  60. package/es/Group.d.ts +16 -13
  61. package/es/Group.js +14 -24
  62. package/es/Input/IconInputGroup.d.ts +12 -9
  63. package/es/Input/IconInputGroup.js +43 -41
  64. package/es/Input/InputGroup.d.ts +12 -12
  65. package/es/Input/InputGroup.js +34 -34
  66. package/es/Input/MoneyInputGroup.d.ts +9 -7
  67. package/es/Input/MoneyInputGroup.js +43 -42
  68. package/es/Input/NumberInputGroup.d.ts +9 -7
  69. package/es/Input/NumberInputGroup.js +43 -42
  70. package/es/Input/StringInputGroup.d.ts +8 -7
  71. package/es/Input/StringInputGroup.js +43 -41
  72. package/es/Normalization/NormalizationFunction.d.ts +4 -4
  73. package/es/Normalization/NormalizationFunction.js +1 -1
  74. package/es/Normalization/normalizers.d.ts +4 -2
  75. package/es/Normalization/normalizers.js +32 -30
  76. package/es/Select/BooleanSelectGroup.d.ts +7 -7
  77. package/es/Select/BooleanSelectGroup.js +28 -27
  78. package/es/Select/NumberSelectGroup.d.ts +9 -8
  79. package/es/Select/NumberSelectGroup.js +21 -19
  80. package/es/Select/SelectGroup.d.ts +27 -22
  81. package/es/Select/SelectGroup.js +65 -64
  82. package/es/Select/SelectGroupPropsHelper.d.ts +3 -3
  83. package/es/Select/SelectGroupPropsHelper.js +1 -1
  84. package/es/Select/StringSelectGroup.d.ts +9 -8
  85. package/es/Select/StringSelectGroup.js +21 -19
  86. package/es/StandardFormActions.d.ts +11 -6
  87. package/es/StandardFormActions.js +14 -24
  88. package/es/SubmitFormButton.d.ts +10 -7
  89. package/es/SubmitFormButton.js +40 -39
  90. package/es/TextArea/TextAreaGroup.d.ts +9 -8
  91. package/es/TextArea/TextAreaGroup.js +35 -34
  92. package/es/Validation/ValidatedApiResult.d.ts +6 -6
  93. package/es/Validation/ValidatedApiResult.js +1 -1
  94. package/es/Validation/ValidationError.d.ts +5 -5
  95. package/es/Validation/ValidationError.js +1 -1
  96. package/es/Validation/ValidationFunction.d.ts +4 -4
  97. package/es/Validation/ValidationFunction.js +1 -1
  98. package/es/Validation/validators.d.ts +18 -15
  99. package/es/Validation/validators.js +77 -73
  100. package/es/index.d.ts +73 -73
  101. package/es/index.js +50 -50
  102. package/es/setupTests.d.ts +1 -0
  103. package/es/setupTests.js +1 -0
  104. package/es/utils/objectContainsNonSerializableProperty.d.ts +1 -1
  105. package/es/utils/objectContainsNonSerializableProperty.js +14 -14
  106. package/es/utils/objectToFormData.d.ts +10 -10
  107. package/es/utils/objectToFormData.js +77 -77
  108. package/es/utils/typeChecks.d.ts +8 -8
  109. package/es/utils/typeChecks.js +18 -18
  110. package/lib/AddressInput/AddressInput.d.ts +24 -15
  111. package/lib/AddressInput/AddressInput.js +26 -27
  112. package/lib/AddressInput/UsStates.d.ts +3 -3
  113. package/lib/AddressInput/UsStates.js +55 -55
  114. package/lib/ConfirmBaseForm/ConfirmBaseForm.d.ts +26 -12
  115. package/lib/ConfirmBaseForm/ConfirmBaseForm.js +48 -42
  116. package/lib/ConfirmDeleteForm/ConfirmDeleteForm.d.ts +24 -11
  117. package/lib/ConfirmDeleteForm/ConfirmDeleteForm.js +66 -61
  118. package/lib/DatePicker/DatePickerGroup.d.ts +13 -9
  119. package/lib/DatePicker/DatePickerGroup.js +95 -85
  120. package/lib/DatePicker/DatePickerHelper.d.ts +3 -3
  121. package/lib/DatePicker/DatePickerHelper.js +2 -2
  122. package/lib/DatePicker/StringDateOnlyPickerGroup.d.ts +9 -5
  123. package/lib/DatePicker/StringDateOnlyPickerGroup.js +35 -30
  124. package/lib/DatePicker/StringDatePickerGroup.d.ts +9 -5
  125. package/lib/DatePicker/StringDatePickerGroup.js +30 -25
  126. package/lib/Field/CustomFieldInputProps.d.ts +7 -7
  127. package/lib/Field/CustomFieldInputProps.js +2 -2
  128. package/lib/Field/CustomFieldMetaProps.d.ts +4 -4
  129. package/lib/Field/CustomFieldMetaProps.js +2 -2
  130. package/lib/Field/Field.d.ts +28 -22
  131. package/lib/Field/Field.js +56 -51
  132. package/lib/Field/FieldErrorScrollTarget.d.ts +2 -2
  133. package/lib/Field/FieldErrorScrollTarget.js +15 -14
  134. package/lib/Field/FieldNameContext.d.ts +3 -3
  135. package/lib/Field/FieldNameContext.js +9 -9
  136. package/lib/Field/FieldSection.d.ts +7 -7
  137. package/lib/Field/FieldSection.js +12 -23
  138. package/lib/Field/InjectedFieldProps.d.ts +7 -7
  139. package/lib/Field/InjectedFieldProps.js +2 -2
  140. package/lib/Field/StandAloneInput.d.ts +13 -9
  141. package/lib/Field/StandAloneInput.js +76 -75
  142. package/lib/Field/useStandardField.d.ts +21 -15
  143. package/lib/Field/useStandardField.js +95 -96
  144. package/lib/FieldArray/FieldArray.d.ts +24 -15
  145. package/lib/FieldArray/FieldArray.js +83 -89
  146. package/lib/File/FileGroup.d.ts +10 -8
  147. package/lib/File/FileGroup.js +58 -57
  148. package/lib/File/FileList.d.ts +5 -6
  149. package/lib/File/FileList.js +13 -24
  150. package/lib/File/humanFileSize.d.ts +1 -1
  151. package/lib/File/humanFileSize.js +10 -10
  152. package/lib/Form/FocusError.d.ts +7 -5
  153. package/lib/Form/FocusError.js +48 -47
  154. package/lib/Form/Form.d.ts +33 -27
  155. package/lib/Form/Form.js +147 -146
  156. package/lib/Form/FormBasedPreventNavigation.d.ts +6 -5
  157. package/lib/Form/FormBasedPreventNavigation.js +26 -56
  158. package/lib/Form/LegacyFormBasedPreventNavigation.d.ts +17 -0
  159. package/lib/Form/LegacyFormBasedPreventNavigation.js +72 -0
  160. package/lib/Form/NewFormBasedPreventNavigation.d.ts +14 -0
  161. package/lib/Form/NewFormBasedPreventNavigation.js +42 -0
  162. package/lib/Form/ServerErrorContext.d.ts +11 -10
  163. package/lib/Form/ServerErrorContext.js +15 -14
  164. package/lib/FormActions.d.ts +12 -7
  165. package/lib/FormActions.js +22 -32
  166. package/lib/FormDefaults.d.ts +4 -3
  167. package/lib/FormDefaults.js +5 -4
  168. package/lib/Group.d.ts +16 -13
  169. package/lib/Group.js +20 -30
  170. package/lib/Input/IconInputGroup.d.ts +12 -9
  171. package/lib/Input/IconInputGroup.js +48 -46
  172. package/lib/Input/InputGroup.d.ts +12 -12
  173. package/lib/Input/InputGroup.js +39 -39
  174. package/lib/Input/MoneyInputGroup.d.ts +9 -7
  175. package/lib/Input/MoneyInputGroup.js +48 -47
  176. package/lib/Input/NumberInputGroup.d.ts +9 -7
  177. package/lib/Input/NumberInputGroup.js +48 -47
  178. package/lib/Input/StringInputGroup.d.ts +8 -7
  179. package/lib/Input/StringInputGroup.js +48 -46
  180. package/lib/Normalization/NormalizationFunction.d.ts +4 -4
  181. package/lib/Normalization/NormalizationFunction.js +2 -2
  182. package/lib/Normalization/normalizers.d.ts +4 -2
  183. package/lib/Normalization/normalizers.js +37 -35
  184. package/lib/Select/BooleanSelectGroup.d.ts +7 -7
  185. package/lib/Select/BooleanSelectGroup.js +35 -34
  186. package/lib/Select/NumberSelectGroup.d.ts +9 -8
  187. package/lib/Select/NumberSelectGroup.js +29 -27
  188. package/lib/Select/SelectGroup.d.ts +27 -22
  189. package/lib/Select/SelectGroup.js +71 -70
  190. package/lib/Select/SelectGroupPropsHelper.d.ts +3 -3
  191. package/lib/Select/SelectGroupPropsHelper.js +2 -2
  192. package/lib/Select/StringSelectGroup.d.ts +9 -8
  193. package/lib/Select/StringSelectGroup.js +29 -27
  194. package/lib/StandardFormActions.d.ts +11 -6
  195. package/lib/StandardFormActions.js +20 -30
  196. package/lib/SubmitFormButton.d.ts +10 -7
  197. package/lib/SubmitFormButton.js +45 -44
  198. package/lib/TextArea/TextAreaGroup.d.ts +9 -8
  199. package/lib/TextArea/TextAreaGroup.js +40 -39
  200. package/lib/Validation/ValidatedApiResult.d.ts +6 -6
  201. package/lib/Validation/ValidatedApiResult.js +2 -2
  202. package/lib/Validation/ValidationError.d.ts +5 -5
  203. package/lib/Validation/ValidationError.js +2 -2
  204. package/lib/Validation/ValidationFunction.d.ts +4 -4
  205. package/lib/Validation/ValidationFunction.js +2 -2
  206. package/lib/Validation/validators.d.ts +18 -15
  207. package/lib/Validation/validators.js +90 -86
  208. package/lib/index.d.ts +73 -73
  209. package/lib/index.js +117 -117
  210. package/lib/setupTests.d.ts +1 -0
  211. package/lib/setupTests.js +3 -0
  212. package/lib/utils/objectContainsNonSerializableProperty.d.ts +1 -1
  213. package/lib/utils/objectContainsNonSerializableProperty.js +17 -17
  214. package/lib/utils/objectToFormData.d.ts +10 -10
  215. package/lib/utils/objectToFormData.js +79 -79
  216. package/lib/utils/typeChecks.d.ts +8 -8
  217. package/lib/utils/typeChecks.js +29 -29
  218. package/package.json +14 -11
  219. package/src/AddressInput/AddressInput.tsx +15 -5
  220. package/src/AddressInput/__snapshots__/AddressInput.test.tsx.snap +14 -12
  221. package/src/ConfirmBaseForm/ConfirmBaseForm.tsx +14 -0
  222. package/src/ConfirmDeleteForm/ConfirmDeleteForm.tsx +13 -0
  223. package/src/DatePicker/DatePicker.test.tsx +1 -1
  224. package/src/DatePicker/DatePickerGroup.tsx +18 -7
  225. package/src/DatePicker/StringDateOnlyPickerGroup.tsx +7 -2
  226. package/src/DatePicker/StringDatePickerGroup.tsx +7 -1
  227. package/src/Field/Field.tsx +20 -7
  228. package/src/Field/FieldErrorScrollTarget.tsx +1 -0
  229. package/src/Field/StandAloneInput.tsx +4 -0
  230. package/src/Field/useStandardField.ts +13 -9
  231. package/src/FieldArray/FieldArray.tsx +14 -5
  232. package/src/File/FileGroup.tsx +9 -3
  233. package/src/File/FileList.tsx +2 -2
  234. package/src/Form/FocusError.tsx +3 -0
  235. package/src/Form/Form.tsx +6 -0
  236. package/src/Form/FormBasedPreventNavigation.tsx +28 -46
  237. package/src/Form/LegacyFormBasedPreventNavigation.tsx +77 -0
  238. package/src/Form/NewFormBasedPreventNavigation.tsx +59 -0
  239. package/src/Form/ServerErrorContext.ts +1 -0
  240. package/src/FormActions.tsx +7 -0
  241. package/src/FormDefaults.ts +1 -0
  242. package/src/Group.tsx +12 -4
  243. package/src/Input/IconInputGroup.tsx +5 -2
  244. package/src/Input/InputGroup.tsx +13 -5
  245. package/src/Input/MoneyInputGroup.tsx +3 -1
  246. package/src/Input/NumberInputGroup.tsx +3 -1
  247. package/src/Input/StringInputGroup.tsx +3 -2
  248. package/src/Input/__Tests__/__snapshots__/IconInputGroup.test.tsx.snap +1 -0
  249. package/src/Input/__Tests__/__snapshots__/MoneyInputGroup.test.tsx.snap +1 -0
  250. package/src/Input/__Tests__/__snapshots__/NumberInputGroup.test.tsx.snap +1 -0
  251. package/src/Input/__Tests__/__snapshots__/StringInputGroup.test.tsx.snap +1 -0
  252. package/src/Normalization/normalizers.ts +4 -2
  253. package/src/Select/BooleanSelectGroup.tsx +2 -1
  254. package/src/Select/NumberSelectGroup.tsx +4 -2
  255. package/src/Select/SelectGroup.tsx +13 -2
  256. package/src/Select/StringSelectGroup.tsx +2 -0
  257. package/src/Select/__tests__/__snapshots__/BooleanSelectGroup.test.tsx.snap +6 -8
  258. package/src/Select/__tests__/__snapshots__/NumberSelectGroup.test.tsx.snap +12 -16
  259. package/src/Select/__tests__/__snapshots__/StringSelectGroup.test.tsx.snap +12 -16
  260. package/src/StandardFormActions.tsx +5 -0
  261. package/src/SubmitFormButton.tsx +5 -1
  262. package/src/TextArea/TextAreaGroup.tsx +6 -4
  263. package/src/Validation/validators.ts +19 -14
  264. package/src/__Tests__/FormTestBase.tsx +9 -8
  265. package/src/__Tests__/RealisticForm.test.tsx +82 -0
  266. package/src/index.ts +4 -4
  267. package/src/setupTests.ts +1 -0
  268. package/src/utils/objectToFormData.test.tsx +1 -1
  269. package/es/__Tests__/FormTestBase.d.ts +0 -27
  270. package/es/__Tests__/FormTestBase.js +0 -83
  271. package/es/__Tests__/index.d.ts +0 -2
  272. package/es/__Tests__/index.js +0 -2
  273. package/lib/__Tests__/FormTestBase.d.ts +0 -27
  274. package/lib/__Tests__/FormTestBase.js +0 -86
  275. package/lib/__Tests__/index.d.ts +0 -2
  276. package/lib/__Tests__/index.js +0 -8
@@ -32,28 +32,26 @@ exports[`BooleanSelectGroup has matching snapshot 1`] = `
32
32
  class="css-1f43avz-a11yText-A11yText"
33
33
  />
34
34
  <div
35
- class="react-select__control css-1s2u09g-control"
35
+ class="react-select__control css-13cymwt-control"
36
36
  >
37
37
  <div
38
- class="react-select__value-container css-dlobye-Component"
38
+ class="react-select__value-container css-16674sh-Component"
39
39
  >
40
40
  <div
41
- class="react-select__placeholder css-14el2xx-placeholder"
41
+ class="react-select__placeholder css-1jqq78o-placeholder"
42
42
  id="react-select-3-placeholder"
43
43
  >
44
44
  Select...
45
45
  </div>
46
46
  <div
47
- class="react-select__input-container css-1u4kn00-Component"
47
+ class="react-select__input-container css-d9r47t-Component"
48
48
  data-value=""
49
49
  >
50
50
  <input
51
51
  aria-autocomplete="list"
52
- aria-controls="react-select-3-listbox"
53
52
  aria-describedby="react-select-3-placeholder"
54
53
  aria-expanded="false"
55
54
  aria-haspopup="true"
56
- aria-owns="react-select-3-listbox"
57
55
  autocapitalize="none"
58
56
  autocomplete="off"
59
57
  autocorrect="off"
@@ -72,11 +70,11 @@ exports[`BooleanSelectGroup has matching snapshot 1`] = `
72
70
  class="react-select__indicators css-ny0e4k-Component"
73
71
  >
74
72
  <span
75
- class="react-select__indicator-separator css-1okebmr-indicatorSeparator"
73
+ class="react-select__indicator-separator css-1u9des2-indicatorSeparator"
76
74
  />
77
75
  <div
78
76
  aria-hidden="true"
79
- class="react-select__indicator react-select__dropdown-indicator css-tlfecz-indicatorContainer"
77
+ class="react-select__indicator react-select__dropdown-indicator css-1xc3v61-indicatorContainer"
80
78
  >
81
79
  <svg
82
80
  aria-hidden="true"
@@ -32,28 +32,26 @@ exports[`MultiNumberSelectGroup has matching snapshot 1`] = `
32
32
  class="css-1f43avz-a11yText-A11yText"
33
33
  />
34
34
  <div
35
- class="react-select__control css-1s2u09g-control"
35
+ class="react-select__control css-13cymwt-control"
36
36
  >
37
37
  <div
38
- class="react-select__value-container react-select__value-container--is-multi css-dlobye-Component"
38
+ class="react-select__value-container react-select__value-container--is-multi css-16674sh-Component"
39
39
  >
40
40
  <div
41
- class="react-select__placeholder css-14el2xx-placeholder"
41
+ class="react-select__placeholder css-1jqq78o-placeholder"
42
42
  id="react-select-5-placeholder"
43
43
  >
44
44
  Select...
45
45
  </div>
46
46
  <div
47
- class="react-select__input-container css-1u4kn00-Component"
47
+ class="react-select__input-container css-d9r47t-Component"
48
48
  data-value=""
49
49
  >
50
50
  <input
51
51
  aria-autocomplete="list"
52
- aria-controls="react-select-5-listbox"
53
52
  aria-describedby="react-select-5-placeholder"
54
53
  aria-expanded="false"
55
54
  aria-haspopup="true"
56
- aria-owns="react-select-5-listbox"
57
55
  autocapitalize="none"
58
56
  autocomplete="off"
59
57
  autocorrect="off"
@@ -72,11 +70,11 @@ exports[`MultiNumberSelectGroup has matching snapshot 1`] = `
72
70
  class="react-select__indicators css-ny0e4k-Component"
73
71
  >
74
72
  <span
75
- class="react-select__indicator-separator css-1okebmr-indicatorSeparator"
73
+ class="react-select__indicator-separator css-1u9des2-indicatorSeparator"
76
74
  />
77
75
  <div
78
76
  aria-hidden="true"
79
- class="react-select__indicator react-select__dropdown-indicator css-tlfecz-indicatorContainer"
77
+ class="react-select__indicator react-select__dropdown-indicator css-1xc3v61-indicatorContainer"
80
78
  >
81
79
  <svg
82
80
  aria-hidden="true"
@@ -131,28 +129,26 @@ exports[`SingleNumberSelectGroup has matching snapshot 1`] = `
131
129
  class="css-1f43avz-a11yText-A11yText"
132
130
  />
133
131
  <div
134
- class="react-select__control css-1s2u09g-control"
132
+ class="react-select__control css-13cymwt-control"
135
133
  >
136
134
  <div
137
- class="react-select__value-container css-dlobye-Component"
135
+ class="react-select__value-container css-16674sh-Component"
138
136
  >
139
137
  <div
140
- class="react-select__placeholder css-14el2xx-placeholder"
138
+ class="react-select__placeholder css-1jqq78o-placeholder"
141
139
  id="react-select-3-placeholder"
142
140
  >
143
141
  Select...
144
142
  </div>
145
143
  <div
146
- class="react-select__input-container css-1u4kn00-Component"
144
+ class="react-select__input-container css-d9r47t-Component"
147
145
  data-value=""
148
146
  >
149
147
  <input
150
148
  aria-autocomplete="list"
151
- aria-controls="react-select-3-listbox"
152
149
  aria-describedby="react-select-3-placeholder"
153
150
  aria-expanded="false"
154
151
  aria-haspopup="true"
155
- aria-owns="react-select-3-listbox"
156
152
  autocapitalize="none"
157
153
  autocomplete="off"
158
154
  autocorrect="off"
@@ -171,11 +167,11 @@ exports[`SingleNumberSelectGroup has matching snapshot 1`] = `
171
167
  class="react-select__indicators css-ny0e4k-Component"
172
168
  >
173
169
  <span
174
- class="react-select__indicator-separator css-1okebmr-indicatorSeparator"
170
+ class="react-select__indicator-separator css-1u9des2-indicatorSeparator"
175
171
  />
176
172
  <div
177
173
  aria-hidden="true"
178
- class="react-select__indicator react-select__dropdown-indicator css-tlfecz-indicatorContainer"
174
+ class="react-select__indicator react-select__dropdown-indicator css-1xc3v61-indicatorContainer"
179
175
  >
180
176
  <svg
181
177
  aria-hidden="true"
@@ -32,28 +32,26 @@ exports[`MultiStringSelectGroup has matching snapshot 1`] = `
32
32
  class="css-1f43avz-a11yText-A11yText"
33
33
  />
34
34
  <div
35
- class="react-select__control css-1s2u09g-control"
35
+ class="react-select__control css-13cymwt-control"
36
36
  >
37
37
  <div
38
- class="react-select__value-container react-select__value-container--is-multi css-dlobye-Component"
38
+ class="react-select__value-container react-select__value-container--is-multi css-16674sh-Component"
39
39
  >
40
40
  <div
41
- class="react-select__placeholder css-14el2xx-placeholder"
41
+ class="react-select__placeholder css-1jqq78o-placeholder"
42
42
  id="react-select-5-placeholder"
43
43
  >
44
44
  Select...
45
45
  </div>
46
46
  <div
47
- class="react-select__input-container css-1u4kn00-Component"
47
+ class="react-select__input-container css-d9r47t-Component"
48
48
  data-value=""
49
49
  >
50
50
  <input
51
51
  aria-autocomplete="list"
52
- aria-controls="react-select-5-listbox"
53
52
  aria-describedby="react-select-5-placeholder"
54
53
  aria-expanded="false"
55
54
  aria-haspopup="true"
56
- aria-owns="react-select-5-listbox"
57
55
  autocapitalize="none"
58
56
  autocomplete="off"
59
57
  autocorrect="off"
@@ -72,11 +70,11 @@ exports[`MultiStringSelectGroup has matching snapshot 1`] = `
72
70
  class="react-select__indicators css-ny0e4k-Component"
73
71
  >
74
72
  <span
75
- class="react-select__indicator-separator css-1okebmr-indicatorSeparator"
73
+ class="react-select__indicator-separator css-1u9des2-indicatorSeparator"
76
74
  />
77
75
  <div
78
76
  aria-hidden="true"
79
- class="react-select__indicator react-select__dropdown-indicator css-tlfecz-indicatorContainer"
77
+ class="react-select__indicator react-select__dropdown-indicator css-1xc3v61-indicatorContainer"
80
78
  >
81
79
  <svg
82
80
  aria-hidden="true"
@@ -131,28 +129,26 @@ exports[`SingleStringSelectGroup has matching snapshot 1`] = `
131
129
  class="css-1f43avz-a11yText-A11yText"
132
130
  />
133
131
  <div
134
- class="react-select__control css-1s2u09g-control"
132
+ class="react-select__control css-13cymwt-control"
135
133
  >
136
134
  <div
137
- class="react-select__value-container css-dlobye-Component"
135
+ class="react-select__value-container css-16674sh-Component"
138
136
  >
139
137
  <div
140
- class="react-select__placeholder css-14el2xx-placeholder"
138
+ class="react-select__placeholder css-1jqq78o-placeholder"
141
139
  id="react-select-3-placeholder"
142
140
  >
143
141
  Select...
144
142
  </div>
145
143
  <div
146
- class="react-select__input-container css-1u4kn00-Component"
144
+ class="react-select__input-container css-d9r47t-Component"
147
145
  data-value=""
148
146
  >
149
147
  <input
150
148
  aria-autocomplete="list"
151
- aria-controls="react-select-3-listbox"
152
149
  aria-describedby="react-select-3-placeholder"
153
150
  aria-expanded="false"
154
151
  aria-haspopup="true"
155
- aria-owns="react-select-3-listbox"
156
152
  autocapitalize="none"
157
153
  autocomplete="off"
158
154
  autocorrect="off"
@@ -171,11 +167,11 @@ exports[`SingleStringSelectGroup has matching snapshot 1`] = `
171
167
  class="react-select__indicators css-ny0e4k-Component"
172
168
  >
173
169
  <span
174
- class="react-select__indicator-separator css-1okebmr-indicatorSeparator"
170
+ class="react-select__indicator-separator css-1u9des2-indicatorSeparator"
175
171
  />
176
172
  <div
177
173
  aria-hidden="true"
178
- class="react-select__indicator react-select__dropdown-indicator css-tlfecz-indicatorContainer"
174
+ class="react-select__indicator react-select__dropdown-indicator css-1xc3v61-indicatorContainer"
179
175
  >
180
176
  <svg
181
177
  aria-hidden="true"
@@ -5,10 +5,15 @@ import SubmitFormButton from './SubmitFormButton';
5
5
  import { FormDefaults } from './FormDefaults';
6
6
 
7
7
  export interface StandardFormActionsProps {
8
+ /** Allow the form to be submitted without any changes. By default this is not allowed. */
8
9
  allowPristineSubmit?: boolean;
10
+ /** The cancel button's `onClick`.
11
+ * @defaultValue `window.history.back()`
12
+ */
9
13
  handleCancel?: MouseEventHandler<HTMLButtonElement>;
10
14
  }
11
15
 
16
+ /** Standard submit and cancel buttons. */
12
17
  export default function StandardFormActions({
13
18
  allowPristineSubmit,
14
19
  handleCancel,
@@ -5,9 +5,12 @@ import { FormDefaults } from './FormDefaults';
5
5
 
6
6
  export interface SubmitFormButtonProps
7
7
  extends Omit<React.HTMLProps<HTMLButtonElement>, 'type'> {
8
+ /** Allow the form to be submitted without any changes. By default this is not allowed. */
8
9
  allowPristineSubmit?: boolean;
10
+ /** Text to display on the button. Default text is 'Submit'. */
9
11
  children?: React.ReactNode;
10
12
  }
13
+
11
14
  function SubmitFormButton(
12
15
  {
13
16
  allowPristineSubmit,
@@ -45,6 +48,7 @@ function SubmitFormButton(
45
48
  );
46
49
  }
47
50
 
51
+ /** Generic submit button for forms. */
48
52
  export default React.forwardRef(
49
53
  SubmitFormButton
50
- ) as React.ComponentType<SubmitFormButtonProps>;
54
+ ) as React.FunctionComponent<SubmitFormButtonProps>;
@@ -1,11 +1,11 @@
1
1
  import React, { LegacyRef } from 'react';
2
2
  import classNames from 'classnames';
3
3
  import { InjectedFieldProps } from '../Field/InjectedFieldProps';
4
- import Group, { GroupProps } from '../Group';
5
4
  import { FormDefaults } from '../FormDefaults';
5
+ import Group, { GroupProps } from '../Group';
6
6
 
7
7
  export interface TextAreaGroupProps
8
- extends InjectedFieldProps<string | undefined>,
8
+ extends InjectedFieldProps<string | undefined | null>,
9
9
  Omit<
10
10
  React.HTMLProps<HTMLTextAreaElement>,
11
11
  keyof InjectedFieldProps<any> | 'children' | 'className' | 'label'
@@ -14,7 +14,6 @@ export interface TextAreaGroupProps
14
14
  icon?: React.ReactNode;
15
15
  }
16
16
 
17
- /** generic controlled <textarea/> wrapped by a Group */
18
17
  function TextAreaGroup(
19
18
  {
20
19
  input,
@@ -22,6 +21,7 @@ function TextAreaGroup(
22
21
  label,
23
22
  helpText,
24
23
  className,
24
+ required,
25
25
  disabled,
26
26
  icon,
27
27
  ...rest
@@ -32,6 +32,7 @@ function TextAreaGroup(
32
32
  <Group
33
33
  input={input}
34
34
  meta={meta}
35
+ required={required}
35
36
  disabled={disabled}
36
37
  label={label}
37
38
  helpText={helpText}
@@ -43,7 +44,7 @@ function TextAreaGroup(
43
44
  <textarea
44
45
  {...input}
45
46
  {...rest}
46
- value={input.value}
47
+ value={input.value ?? ''}
47
48
  onChange={(val) => input.onChange(val.target.value)}
48
49
  ref={ref}
49
50
  className={classNames(
@@ -55,6 +56,7 @@ function TextAreaGroup(
55
56
  );
56
57
  }
57
58
 
59
+ /** Generic controlled `<textarea/>` wrapped by a `<Group/>` */
58
60
  const TextAreaGroupWithRef = React.forwardRef(
59
61
  TextAreaGroup
60
62
  ) as React.ComponentType<TextAreaGroupProps>;
@@ -9,13 +9,14 @@ export const required = (value: any) =>
9
9
  ? undefined
10
10
  : 'Required';
11
11
 
12
- //asserts that the value is a certain number of characters. numbers are coerced to a string
13
- export const length = (len: number) => (value: string | number | undefined) => {
14
- const hasError = getLengthOfValue(value) !== len;
15
- return !hasError ? undefined : `Length must be ${len}`;
16
- };
12
+ /** Asserts that the value is a certain number of characters. numbers are coerced to a string */
13
+ export const length =
14
+ (len: number) => (value: string | number | undefined | null) => {
15
+ const hasError = getLengthOfValue(value) !== len;
16
+ return !hasError ? undefined : `Length must be ${len}`;
17
+ };
17
18
 
18
- export const integer = (val: string | number | undefined) => {
19
+ export const integer = (val: string | number | undefined | null) => {
19
20
  if (!val) {
20
21
  return undefined;
21
22
  }
@@ -25,41 +26,42 @@ export const integer = (val: string | number | undefined) => {
25
26
  };
26
27
 
27
28
  export const maxLength =
28
- (len: number) => (value: string | number | undefined) => {
29
+ (len: number) => (value: string | number | undefined | null) => {
29
30
  const hasError = getLengthOfValue(value) > len;
30
31
  return !hasError ? undefined : `Maximum length ${len} exceeded`;
31
32
  };
32
33
 
33
34
  export const maxCount =
34
- (count: number) => (value: { isDeleted?: boolean }[] | undefined) => {
35
+ (count: number) => (value: { isDeleted?: boolean }[] | undefined | null) => {
35
36
  const hasError =
36
37
  !!value && value.filter((x) => !x.isDeleted).length > count;
37
38
  return !hasError ? undefined : `Should not have more than ${count}`;
38
39
  };
39
40
 
40
41
  export const minCount =
41
- (count: number) => (value: { isDeleted?: boolean }[] | undefined) => {
42
+ (count: number) => (value: { isDeleted?: boolean }[] | undefined | null) => {
42
43
  const hasError = !value || value.filter((x) => !x.isDeleted).length < count;
43
44
  return !hasError ? undefined : `Should have at least ${count}`;
44
45
  };
45
46
 
46
- export const maxValue = (max: number) => (value: number | undefined) => {
47
+ export const maxValue = (max: number) => (value: number | undefined | null) => {
47
48
  const hasError = !!value && value > max;
48
49
  return !hasError ? undefined : `Maximum value ${max} exceeded`;
49
50
  };
50
51
 
51
- export const minValue = (min: number) => (value: number | undefined) => {
52
+ export const minValue = (min: number) => (value: number | undefined | null) => {
52
53
  const hasError = !value || value < min;
53
54
  return !hasError ? undefined : `Minimum value ${min} not met`;
54
55
  };
55
56
 
56
- export const zipCode = (value: string | undefined) => {
57
+ /** Validate for a ZIP Code. Accepts formats: ##### and #####-#### */
58
+ export const zipCode = (value: string | undefined | null) => {
57
59
  return value && !/^[0-9]{5}(?:-[0-9]{4})?$/.test(value)
58
60
  ? 'Invalid ZIP Code'
59
61
  : undefined;
60
62
  };
61
63
 
62
- //one of the validators provided must be true
64
+ /** One of the validators provided must be true. */
63
65
  export const any =
64
66
  <TValue>(validatorList: ValidationFunction<TValue>[]) =>
65
67
  (value: TValue) => {
@@ -73,7 +75,10 @@ export const any =
73
75
  );
74
76
  };
75
77
 
76
- function getLengthOfValue(value: string | number | undefined) {
78
+ function getLengthOfValue(value: string | number | undefined | null) {
79
+ if (value === null) {
80
+ return 0;
81
+ }
77
82
  switch (typeof value) {
78
83
  case 'undefined':
79
84
  return 0;
@@ -1,28 +1,29 @@
1
- import '@testing-library/jest-dom/extend-expect';
2
1
  import { HashRouter } from 'react-router-dom';
3
- import { ValidatedApiResult } from 'Validation/ValidatedApiResult';
4
- import { Form, FormBuilderProp } from '../../src';
2
+ import { Form, FormBuilderProp } from '../';
3
+ import { ValidatedApiResult } from '../Validation/ValidatedApiResult';
5
4
 
6
5
  interface FormTestBaseProps<TForm extends object> {
7
6
  children: (formBuilder: FormBuilderProp<TForm>) => JSX.Element;
8
7
  initialValues?: TForm;
8
+ handleSubmit?: (data: TForm | FormData) => Promise<ValidatedApiResult>;
9
9
  }
10
10
 
11
11
  export default function FormTestBase<TForm extends PersonDto>({
12
12
  children,
13
13
  initialValues,
14
+ handleSubmit,
14
15
  }: FormTestBaseProps<TForm>) {
15
16
  return (
16
17
  <HashRouter>
17
- <Form onSubmit={onSubmit} initialValues={initialValues}>
18
+ <Form
19
+ onSubmit={handleSubmit ? handleSubmit : onSubmit}
20
+ initialValues={initialValues}>
18
21
  {children}
19
22
  </Form>
20
23
  </HashRouter>
21
24
  );
22
25
 
23
- async function onSubmit(
24
- data: PersonDto | FormData
25
- ): Promise<ValidatedApiResult> {
26
+ async function onSubmit(data: TForm | FormData): Promise<ValidatedApiResult> {
26
27
  const isFormData = data instanceof FormData;
27
28
  const result = await fetch('/api/submit', {
28
29
  body: isFormData ? data : JSON.stringify(data),
@@ -43,7 +44,7 @@ export default function FormTestBase<TForm extends PersonDto>({
43
44
  }
44
45
  }
45
46
 
46
- interface PersonDto {
47
+ export interface PersonDto {
47
48
  name?: string | undefined;
48
49
  nameWithIcon?: string | undefined;
49
50
  numberOfArms?: number;
@@ -0,0 +1,82 @@
1
+ import { render, screen, waitFor } from '@testing-library/react';
2
+ import user from '@testing-library/user-event';
3
+ import FormTestBase from './FormTestBase';
4
+ import { Form, StringInputGroup, ValidatedApiResult } from '../';
5
+ import { PersonDto } from '../__Tests__/FormTestBase';
6
+ import StandardFormActions from '../StandardFormActions';
7
+ import { validators } from '../';
8
+
9
+ const handleSubmitMock = jest.fn((value: PersonDto | FormData) => {
10
+ //return value;
11
+ return new Promise<ValidatedApiResult>((res, rej) => {
12
+ setTimeout(() => {
13
+ res({});
14
+ }, 15);
15
+ });
16
+ });
17
+
18
+ describe('Realistic Form', () => {
19
+ it('Validates, resolves validation, submits values', async () => {
20
+ global.scrollTo = jest.fn();
21
+ const fullForm = (
22
+ <FormTestBase handleSubmit={handleSubmitMock}>
23
+ {({ Field }) => (
24
+ <>
25
+ <Field name="name" label="name" Component={StringInputGroup} />
26
+ <Field
27
+ name="nameWithIcon"
28
+ label="Name with Icon"
29
+ Component={StringInputGroup}
30
+ validate={validators.required}
31
+ />
32
+ <StandardFormActions />
33
+ <Form.DisplayFormState />
34
+ </>
35
+ )}
36
+ </FormTestBase>
37
+ );
38
+
39
+ render(fullForm);
40
+ const nameInput = screen.getByLabelText('name');
41
+ const formSubmitButton = screen.getByRole('button', {
42
+ name: 'Submit',
43
+ });
44
+ //The form should start off with the submit button disabled
45
+ expect(formSubmitButton).toBeDisabled();
46
+
47
+ //Enter a name into the name input
48
+ user.click(nameInput);
49
+ user.type(nameInput, 'Travis Overmier');
50
+ expect(nameInput).toHaveValue('Travis Overmier');
51
+
52
+ //Submit should be enabled, click submit
53
+ expect(formSubmitButton).toBeEnabled();
54
+ user.click(formSubmitButton);
55
+
56
+ //Submit should disable while 'submitting' then re-enable
57
+ expect(formSubmitButton).toBeDisabled();
58
+ await waitFor(() => {
59
+ expect(formSubmitButton).toBeEnabled();
60
+ });
61
+
62
+ //Validation message should appear
63
+ const nameWithIconInput = screen.getByLabelText('Name with Icon');
64
+ expect(nameWithIconInput).toHaveErrorMessage('Required');
65
+
66
+ //Fill in field, error message goes away
67
+ user.type(nameWithIconInput, 'Kyle Joiner');
68
+ user.tab();
69
+ await waitFor(() => {
70
+ expect(nameWithIconInput).not.toHaveErrorMessage();
71
+ });
72
+
73
+ //Click the submit button
74
+ user.click(formSubmitButton);
75
+ await waitFor(() => {
76
+ expect(handleSubmitMock).toHaveBeenCalled();
77
+ expect(JSON.stringify(handleSubmitMock.mock.calls[0][0])).toBe(
78
+ `{"name":"Travis Overmier","nameWithIcon":"Kyle Joiner"}`
79
+ );
80
+ });
81
+ });
82
+ });
package/src/index.ts CHANGED
@@ -16,7 +16,7 @@ export type { ConfirmDeleteFormProps } from './ConfirmDeleteForm/ConfirmDeleteFo
16
16
 
17
17
  // Date
18
18
  export { default as DatePickerGroup } from './DatePicker/DatePickerGroup';
19
- export type { DatePickerGroupProps as DatePickerGroupProps } from './DatePicker/DatePickerGroup';
19
+ export type { DatePickerGroupProps } from './DatePicker/DatePickerGroup';
20
20
  export { convertToTimeZoneInsensitiveISOString } from './DatePicker/DatePickerGroup';
21
21
 
22
22
  export type { DatePickerHelper } from './DatePicker/DatePickerHelper';
@@ -68,17 +68,17 @@ export type {
68
68
  } from './Form/ServerErrorContext';
69
69
 
70
70
  export { default as FormActions } from './FormActions';
71
- export type { FormActionsProps as FormActionsProps } from './FormActions';
71
+ export type { FormActionsProps } from './FormActions';
72
72
 
73
73
  export { default as StandardFormActions } from './StandardFormActions';
74
- export type { StandardFormActionsProps as StandardFormActionsProps } from './StandardFormActions';
74
+ export type { StandardFormActionsProps } from './StandardFormActions';
75
75
 
76
76
  // FormDefaults
77
77
  export { FormDefaults } from './FormDefaults';
78
78
 
79
79
  // Input
80
80
  export { default as Group } from './Group';
81
- export type { GroupProps as GroupProps } from './Group';
81
+ export type { GroupProps } from './Group';
82
82
 
83
83
  export { default as IconInputGroup } from './Input/IconInputGroup';
84
84
  export type { IconInputGroupProps } from './Input/IconInputGroup';
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom/extend-expect';
@@ -10,7 +10,7 @@ const options = {
10
10
  const formDataAppend = global.FormData.prototype.append;
11
11
 
12
12
  beforeEach(() => {
13
- global.FormData.prototype.append = jest.fn(formDataAppend);
13
+ global.FormData.prototype.append = jest.fn(formDataAppend) as any;
14
14
  });
15
15
 
16
16
  describe('Object To Form Data', () => {
@@ -1,27 +0,0 @@
1
- /// <reference types="react" />
2
- import '@testing-library/jest-dom/extend-expect';
3
- import { FormBuilderProp } from '../../src';
4
- interface FormTestBaseProps<TForm extends object> {
5
- children: (formBuilder: FormBuilderProp<TForm>) => JSX.Element;
6
- initialValues?: TForm;
7
- }
8
- export default function FormTestBase<TForm extends PersonDto>({ children, initialValues, }: FormTestBaseProps<TForm>): JSX.Element;
9
- interface PersonDto {
10
- name?: string | undefined;
11
- nameWithIcon?: string | undefined;
12
- numberOfArms?: number;
13
- phoneNumber?: string;
14
- yearlySalaryUSD?: number;
15
- isCool?: boolean;
16
- gradDate?: string;
17
- favoriteDate?: string;
18
- favoriteNumber?: number;
19
- favoriteColor?: string;
20
- favoriteColors?: string[];
21
- favoriteNames?: string[];
22
- allowLogin?: boolean;
23
- userRoles?: number[];
24
- profileImage?: any;
25
- favoritePictures?: any[];
26
- }
27
- export {};