@digigov/form 2.0.0-8e254888 → 2.0.0-a402a664

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 (320) hide show
  1. package/Field/FieldBase/index.js +6 -2
  2. package/Field/FieldBase.js.map +2 -2
  3. package/Field/FieldBaseContainer/index.js +5 -3
  4. package/Field/FieldBaseContainer.js.map +2 -2
  5. package/Field/FieldConditional/index.js +4 -0
  6. package/Field/FieldConditional.js.map +2 -2
  7. package/Field/index.js +10 -4
  8. package/Field/index.js.map +2 -2
  9. package/Field/types.d.ts +11 -3
  10. package/Field/utils/index.js +3 -1
  11. package/Field/utils/index.js.map +2 -2
  12. package/Field/utils/useField/index.js +8 -1
  13. package/Field/utils/useField.js.map +2 -2
  14. package/FieldArray/FormDialog/index.js +314 -196
  15. package/FieldArray/FormDialog.d.ts +20 -7
  16. package/FieldArray/FormDialog.js.map +3 -3
  17. package/FieldArray/__stories__/Default.d.ts +1 -1
  18. package/FieldArray/__stories__/WithExactLength.d.ts +1 -1
  19. package/FieldArray/__stories__/WithModal.d.ts +1 -1
  20. package/FieldArray/index.d.ts +1 -0
  21. package/FieldArray/index.js +12 -7
  22. package/FieldArray/index.js.map +2 -2
  23. package/FieldObject/index.d.ts +3 -0
  24. package/FieldObject/index.js +26 -15
  25. package/FieldObject/index.js.map +2 -2
  26. package/FormBuilder/FormBuilder.stories.d.ts +2 -0
  27. package/FormBuilder/__stories__/AutoErrorGrouping.d.ts +1 -1
  28. package/FormBuilder/__stories__/Default.d.ts +1 -1
  29. package/FormBuilder/__stories__/ErrorGrouping.d.ts +1 -1
  30. package/FormBuilder/index.d.ts +1 -1
  31. package/FormBuilder/index.js +11 -6
  32. package/FormBuilder/index.js.map +2 -2
  33. package/FormContext/index.js +6 -2
  34. package/FormContext.d.ts +1 -0
  35. package/FormContext.js.map +2 -2
  36. package/MultiplicityField/MultiplicityField.stories.d.ts +2 -0
  37. package/MultiplicityField/__stories__/Default.d.ts +1 -1
  38. package/MultiplicityField/__stories__/PreviewDisplay.d.ts +1 -1
  39. package/MultiplicityField/__stories__/WithExactLength.d.ts +1 -1
  40. package/MultiplicityField/__stories__/WithMaxLength.d.ts +1 -1
  41. package/MultiplicityField/__stories__/WithMinAndMaxLength.d.ts +1 -1
  42. package/MultiplicityField/__stories__/WithMinLength.d.ts +1 -1
  43. package/MultiplicityField/add-objects/index.js +2 -0
  44. package/MultiplicityField/add-objects.js.map +2 -2
  45. package/MultiplicityField/index.js +4 -1
  46. package/MultiplicityField/index.js.map +2 -2
  47. package/MultiplicityField/types.d.ts +1 -0
  48. package/Questions/Questions.stories.d.ts +2 -0
  49. package/Questions/__stories__/Default.d.ts +1 -1
  50. package/cjs/Field/FieldBase/index.js +6 -2
  51. package/cjs/Field/FieldBase.js.map +2 -2
  52. package/cjs/Field/FieldBaseContainer/index.js +4 -2
  53. package/cjs/Field/FieldBaseContainer.js.map +3 -3
  54. package/cjs/Field/FieldConditional/index.js +4 -0
  55. package/cjs/Field/FieldConditional.js.map +2 -2
  56. package/cjs/Field/index.js +10 -4
  57. package/cjs/Field/index.js.map +2 -2
  58. package/cjs/Field/types.js.map +1 -1
  59. package/cjs/Field/utils/index.js +3 -1
  60. package/cjs/Field/utils/index.js.map +2 -2
  61. package/cjs/Field/utils/useField/index.js +8 -1
  62. package/cjs/Field/utils/useField.js.map +2 -2
  63. package/cjs/FieldArray/FormDialog/index.js +309 -194
  64. package/cjs/FieldArray/FormDialog.js.map +3 -3
  65. package/cjs/FieldArray/index.js +12 -7
  66. package/cjs/FieldArray/index.js.map +2 -2
  67. package/cjs/FieldObject/index.js +26 -15
  68. package/cjs/FieldObject/index.js.map +2 -2
  69. package/cjs/FormBuilder/index.js +11 -6
  70. package/cjs/FormBuilder/index.js.map +2 -2
  71. package/cjs/FormContext/index.js +7 -2
  72. package/cjs/FormContext.js.map +2 -2
  73. package/cjs/MultiplicityField/add-objects/index.js +2 -0
  74. package/cjs/MultiplicityField/add-objects.js.map +2 -2
  75. package/cjs/MultiplicityField/index.js +4 -1
  76. package/cjs/MultiplicityField/index.js.map +2 -2
  77. package/cjs/MultiplicityField/types.js.map +1 -1
  78. package/cjs/inputs/Checkboxes/index.js +1 -1
  79. package/cjs/inputs/Checkboxes/index.js.map +2 -2
  80. package/cjs/inputs/DateInput/index.js +20 -8
  81. package/cjs/inputs/DateInput/index.js.map +2 -2
  82. package/cjs/inputs/DateTimeInput/index.js +23 -10
  83. package/cjs/inputs/DateTimeInput/index.js.map +2 -2
  84. package/cjs/inputs/FileInput/index.js +26 -21
  85. package/cjs/inputs/FileInput/index.js.map +2 -2
  86. package/cjs/inputs/ImageInput/__stories__/logo.d/index.js +1 -0
  87. package/cjs/inputs/ImageInput/__stories__/logo.d.js.map +7 -0
  88. package/cjs/inputs/ImageInput/index.js +41 -10
  89. package/cjs/inputs/ImageInput/index.js.map +2 -2
  90. package/cjs/inputs/Input/index.js +4 -4
  91. package/cjs/inputs/Input/index.js.map +2 -2
  92. package/cjs/inputs/Select/index.js +4 -3
  93. package/cjs/inputs/Select/index.js.map +2 -2
  94. package/cjs/inputs/inputsScenarios/index.js +2 -2
  95. package/cjs/inputs/inputsScenarios.js.map +2 -2
  96. package/cjs/lazy/index.js +2 -1
  97. package/cjs/lazy.js.map +2 -2
  98. package/cjs/registry/index.js +8 -8
  99. package/cjs/registry.js.map +2 -2
  100. package/cjs/types.js.map +1 -1
  101. package/cjs/utils/index.js +20 -6
  102. package/cjs/utils.js.map +2 -2
  103. package/cjs/validators/index.js +10 -5
  104. package/cjs/validators/index.js.map +2 -2
  105. package/cjs/validators/utils/amka/index.js +60 -0
  106. package/cjs/validators/utils/amka.js.map +7 -0
  107. package/cjs/validators/utils/file/index.js +30 -17
  108. package/cjs/validators/utils/file.js.map +2 -2
  109. package/cjs/validators/utils/index.js +5 -1
  110. package/cjs/validators/utils/index.js.map +2 -2
  111. package/index.js +1 -1
  112. package/inputs/AutoCompleteInput/AutoComplete.stories.d.ts +2 -0
  113. package/inputs/AutoCompleteInput/__stories__/Default.d.ts +1 -1
  114. package/inputs/AutoCompleteInput/__stories__/Multiple.d.ts +1 -1
  115. package/inputs/Checkboxes/Checkboxes.stories.d.ts +2 -0
  116. package/inputs/Checkboxes/__stories__/Conditional.d.ts +1 -1
  117. package/inputs/Checkboxes/__stories__/Default.d.ts +1 -1
  118. package/inputs/Checkboxes/__stories__/WithDivider.d.ts +1 -1
  119. package/inputs/Checkboxes/index.js +1 -1
  120. package/inputs/Checkboxes/index.js.map +2 -2
  121. package/inputs/DateInput/DateInput.stories.d.ts +2 -0
  122. package/inputs/DateInput/__stories__/Default.d.ts +1 -1
  123. package/inputs/DateInput/index.js +20 -8
  124. package/inputs/DateInput/index.js.map +2 -2
  125. package/inputs/DateTimeInput/DateTimeInput.stories.d.ts +2 -0
  126. package/inputs/DateTimeInput/__stories__/Default.d.ts +1 -1
  127. package/inputs/DateTimeInput/index.js +23 -10
  128. package/inputs/DateTimeInput/index.js.map +2 -2
  129. package/inputs/FileInput/FileInput.stories.d.ts +3 -0
  130. package/inputs/FileInput/__stories__/Default.d.ts +1 -1
  131. package/inputs/FileInput/__stories__/WithBorderAndLink.d.ts +3 -0
  132. package/inputs/FileInput/index.d.ts +6 -3
  133. package/inputs/FileInput/index.js +31 -23
  134. package/inputs/FileInput/index.js.map +2 -2
  135. package/inputs/ImageInput/ImageInput.stories.d.ts +4 -1
  136. package/inputs/ImageInput/__stories__/Default.d.ts +1 -1
  137. package/inputs/ImageInput/__stories__/MaxSize.d.ts +1 -1
  138. package/inputs/ImageInput/__stories__/WithInitialValues.d.ts +3 -0
  139. package/inputs/ImageInput/__stories__/WithInvalidImageDimension.d.ts +1 -1
  140. package/inputs/ImageInput/__stories__/logo.d/index.js +1 -0
  141. package/inputs/ImageInput/__stories__/logo.d/package.json +6 -0
  142. package/inputs/ImageInput/__stories__/logo.d.js.map +7 -0
  143. package/inputs/ImageInput/index.d.ts +9 -1
  144. package/inputs/ImageInput/index.js +42 -11
  145. package/inputs/ImageInput/index.js.map +2 -2
  146. package/inputs/Input/Input.stories.d.ts +4 -0
  147. package/inputs/Input/__stories__/AFM.d.ts +1 -1
  148. package/inputs/Input/__stories__/AMKA.d.ts +3 -0
  149. package/inputs/Input/__stories__/Boolean.d.ts +1 -1
  150. package/inputs/Input/__stories__/Email.d.ts +3 -0
  151. package/inputs/Input/__stories__/IBAN.d.ts +1 -1
  152. package/inputs/Input/__stories__/Integer.d.ts +1 -1
  153. package/inputs/Input/__stories__/LandlineNumber.d.ts +1 -1
  154. package/inputs/Input/__stories__/MobilePhone.d.ts +1 -1
  155. package/inputs/Input/__stories__/PhoneNumber.d.ts +1 -1
  156. package/inputs/Input/__stories__/PostalCode.d.ts +1 -1
  157. package/inputs/Input/__stories__/String.d.ts +1 -1
  158. package/inputs/Input/__stories__/StringWithTrimValidation.d.ts +1 -1
  159. package/inputs/Input/__stories__/TextWithLimit.d.ts +1 -1
  160. package/inputs/Input/index.d.ts +2 -1
  161. package/inputs/Input/index.js +4 -4
  162. package/inputs/Input/index.js.map +2 -2
  163. package/inputs/Label/Label.stories.d.ts +2 -0
  164. package/inputs/Label/__stories__/Default.d.ts +1 -1
  165. package/inputs/OtpInput/OtpInput.stories.d.ts +2 -0
  166. package/inputs/OtpInput/__stories__/Default.d.ts +1 -1
  167. package/inputs/Radio/Radio.stories.d.ts +2 -0
  168. package/inputs/Radio/__stories__/Conditional.d.ts +1 -1
  169. package/inputs/Radio/__stories__/Default.d.ts +1 -1
  170. package/inputs/Radio/__stories__/WithDivider.d.ts +1 -1
  171. package/inputs/Select/Select.stories.d.ts +2 -0
  172. package/inputs/Select/__stories__/Default.d.ts +1 -1
  173. package/inputs/Select/index.d.ts +2 -1
  174. package/inputs/Select/index.js +4 -3
  175. package/inputs/Select/index.js.map +2 -2
  176. package/inputs/inputsScenarios/index.js +2 -2
  177. package/inputs/inputsScenarios.d.ts +1 -1
  178. package/inputs/inputsScenarios.js.map +2 -2
  179. package/lazy/index.js +2 -1
  180. package/package.json +8 -8
  181. package/registry/index.js +8 -8
  182. package/src/Field/FieldBase.tsx +5 -1
  183. package/src/Field/FieldBaseContainer.tsx +8 -4
  184. package/src/Field/FieldConditional.tsx +4 -0
  185. package/src/Field/doc.mdx +202 -1
  186. package/src/Field/index.tsx +15 -5
  187. package/src/Field/types.tsx +12 -3
  188. package/src/Field/utils/index.ts +2 -0
  189. package/src/Field/utils/useField.ts +9 -1
  190. package/src/FieldArray/FormDialog.tsx +430 -243
  191. package/src/FieldArray/__stories__/Default.tsx +1 -1
  192. package/src/FieldArray/__stories__/WithExactLength.tsx +1 -1
  193. package/src/FieldArray/__stories__/WithModal.tsx +4 -3
  194. package/src/FieldArray/index.test.tsx +4 -0
  195. package/src/FieldArray/index.tsx +26 -30
  196. package/src/FieldObject/index.tsx +33 -18
  197. package/src/FormBuilder/FormBuilder.stories.js +3 -0
  198. package/src/FormBuilder/__stories__/AutoErrorGrouping.tsx +1 -1
  199. package/src/FormBuilder/__stories__/Default.tsx +1 -1
  200. package/src/FormBuilder/__stories__/ErrorGrouping.tsx +1 -1
  201. package/src/FormBuilder/doc.mdx +9 -4
  202. package/src/FormBuilder/index.test.tsx +4 -0
  203. package/src/FormBuilder/index.tsx +12 -6
  204. package/src/FormBuilder/interaction.test.tsx +8 -0
  205. package/src/FormBuilder/scenarios.test.tsx +7 -7
  206. package/src/FormContext.tsx +5 -1
  207. package/src/MultiplicityField/MultiplicityField.stories.js +3 -0
  208. package/src/MultiplicityField/__stories__/Default.tsx +1 -1
  209. package/src/MultiplicityField/__stories__/PreviewDisplay.tsx +1 -1
  210. package/src/MultiplicityField/__stories__/WithExactLength.tsx +1 -1
  211. package/src/MultiplicityField/__stories__/WithMaxLength.tsx +1 -1
  212. package/src/MultiplicityField/__stories__/WithMinAndMaxLength.tsx +1 -1
  213. package/src/MultiplicityField/__stories__/WithMinLength.tsx +1 -1
  214. package/src/MultiplicityField/add-objects.tsx +2 -0
  215. package/src/MultiplicityField/doc.mdx +101 -83
  216. package/src/MultiplicityField/index.test.tsx +4 -0
  217. package/src/MultiplicityField/index.tsx +3 -0
  218. package/src/MultiplicityField/types.ts +1 -0
  219. package/src/Questions/Questions.stories.js +3 -0
  220. package/src/Questions/__snapshots__/index.spec.tsx.snap +2 -1
  221. package/src/Questions/__stories__/Default.tsx +1 -1
  222. package/src/Questions/doc.mdx +21 -41
  223. package/src/Questions/index.test.tsx +4 -0
  224. package/src/doc.mdx +26 -11
  225. package/src/inputs/AutoCompleteInput/AutoComplete.stories.js +3 -0
  226. package/src/inputs/AutoCompleteInput/__stories__/Default.tsx +1 -1
  227. package/src/inputs/AutoCompleteInput/__stories__/Multiple.tsx +1 -1
  228. package/src/inputs/AutoCompleteInput/index.test.tsx +4 -0
  229. package/src/inputs/Checkboxes/Checkboxes.stories.js +3 -0
  230. package/src/inputs/Checkboxes/__stories__/Conditional.tsx +1 -1
  231. package/src/inputs/Checkboxes/__stories__/Default.tsx +1 -1
  232. package/src/inputs/Checkboxes/__stories__/WithDivider.tsx +1 -1
  233. package/src/inputs/Checkboxes/index.test.tsx +4 -0
  234. package/src/inputs/Checkboxes/index.tsx +1 -1
  235. package/src/inputs/DateInput/DateInput.stories.js +3 -0
  236. package/src/inputs/DateInput/__stories__/Default.tsx +1 -1
  237. package/src/inputs/DateInput/index.test.tsx +4 -0
  238. package/src/inputs/DateInput/index.tsx +21 -7
  239. package/src/inputs/DateTimeInput/DateTimeInput.stories.js +3 -0
  240. package/src/inputs/DateTimeInput/__stories__/Default.tsx +1 -1
  241. package/src/inputs/DateTimeInput/index.test.tsx +4 -0
  242. package/src/inputs/DateTimeInput/index.tsx +24 -9
  243. package/src/inputs/FileInput/FileInput.stories.js +4 -0
  244. package/src/inputs/FileInput/__stories__/Default.tsx +1 -1
  245. package/src/inputs/FileInput/__stories__/WithBorderAndLink.tsx +34 -0
  246. package/src/inputs/FileInput/index.test.tsx +8 -0
  247. package/src/inputs/FileInput/index.tsx +41 -30
  248. package/src/inputs/ImageInput/ImageInput.stories.js +5 -1
  249. package/src/inputs/ImageInput/__stories__/Default.tsx +1 -1
  250. package/src/inputs/ImageInput/__stories__/MaxSize.tsx +3 -2
  251. package/src/inputs/ImageInput/__stories__/{WithInvalidImageSize.tsx → WithInitialValues.tsx} +12 -3
  252. package/src/inputs/ImageInput/__stories__/WithInvalidImageDimension.tsx +1 -1
  253. package/src/inputs/ImageInput/__stories__/logo.d.ts +4 -0
  254. package/src/inputs/ImageInput/__stories__/logo.png +0 -0
  255. package/src/inputs/ImageInput/index.test.tsx +8 -4
  256. package/src/inputs/ImageInput/index.tsx +100 -48
  257. package/src/inputs/Input/Input.stories.js +5 -0
  258. package/src/inputs/Input/__stories__/AFM.tsx +1 -1
  259. package/src/inputs/Input/__stories__/AMKA.tsx +23 -0
  260. package/src/inputs/Input/__stories__/Boolean.tsx +1 -1
  261. package/src/inputs/Input/__stories__/Email.tsx +23 -0
  262. package/src/inputs/Input/__stories__/IBAN.tsx +1 -1
  263. package/src/inputs/Input/__stories__/Integer.tsx +1 -1
  264. package/src/inputs/Input/__stories__/LandlineNumber.tsx +1 -1
  265. package/src/inputs/Input/__stories__/MobilePhone.tsx +1 -1
  266. package/src/inputs/Input/__stories__/PhoneNumber.tsx +1 -1
  267. package/src/inputs/Input/__stories__/PostalCode.tsx +1 -1
  268. package/src/inputs/Input/__stories__/String.tsx +1 -1
  269. package/src/inputs/Input/__stories__/StringWithTrimValidation.tsx +1 -1
  270. package/src/inputs/Input/__stories__/TextWithLimit.tsx +1 -1
  271. package/src/inputs/Input/index.test.tsx +12 -0
  272. package/src/inputs/Input/index.tsx +5 -3
  273. package/src/inputs/Label/Label.stories.js +3 -0
  274. package/src/inputs/Label/__stories__/Default.tsx +1 -1
  275. package/src/inputs/Label/index.test.tsx +4 -0
  276. package/src/inputs/OtpInput/OtpInput.stories.js +3 -0
  277. package/src/inputs/OtpInput/__stories__/Default.tsx +1 -1
  278. package/src/inputs/OtpInput/index.test.tsx +4 -0
  279. package/src/inputs/Radio/Radio.stories.js +3 -0
  280. package/src/inputs/Radio/__stories__/Conditional.tsx +1 -1
  281. package/src/inputs/Radio/__stories__/Default.tsx +1 -1
  282. package/src/inputs/Radio/__stories__/WithDivider.tsx +1 -1
  283. package/src/inputs/Radio/index.test.tsx +4 -0
  284. package/src/inputs/Select/Select.stories.js +3 -0
  285. package/src/inputs/Select/__stories__/Default.tsx +1 -1
  286. package/src/inputs/Select/index.test.tsx +4 -0
  287. package/src/inputs/Select/index.tsx +7 -4
  288. package/src/inputs/inputsScenarios.ts +2 -2
  289. package/src/lazy.js +2 -1
  290. package/src/registry.js +8 -8
  291. package/src/types.tsx +2 -1
  292. package/src/utils.ts +27 -6
  293. package/src/validators/index.ts +16 -5
  294. package/src/validators/utils/amka.ts +39 -0
  295. package/src/validators/utils/file.ts +33 -19
  296. package/src/validators/utils/index.ts +4 -1
  297. package/types.d.ts +2 -1
  298. package/types.js.map +1 -1
  299. package/utils/index.js +20 -6
  300. package/utils.d.ts +2 -0
  301. package/utils.js.map +2 -2
  302. package/validators/index.d.ts +1 -1
  303. package/validators/index.js +11 -5
  304. package/validators/index.js.map +2 -2
  305. package/validators/utils/amka/index.js +36 -0
  306. package/{inputs/Input/inputsInputScenarios → validators/utils/amka}/package.json +1 -1
  307. package/validators/utils/amka.d.ts +6 -0
  308. package/validators/utils/amka.js.map +7 -0
  309. package/validators/utils/file/index.js +30 -17
  310. package/validators/utils/file.js.map +2 -2
  311. package/validators/utils/index.d.ts +1 -0
  312. package/validators/utils/index.js +4 -1
  313. package/validators/utils/index.js.map +2 -2
  314. package/cjs/inputs/Input/inputsInputScenarios/index.js +0 -439
  315. package/cjs/inputs/Input/inputsInputScenarios.js.map +0 -7
  316. package/inputs/ImageInput/__stories__/WithInvalidImageSize.d.ts +0 -3
  317. package/inputs/Input/inputsInputScenarios/index.js +0 -406
  318. package/inputs/Input/inputsInputScenarios.d.ts +0 -57
  319. package/inputs/Input/inputsInputScenarios.js.map +0 -7
  320. package/src/inputs/Input/inputsInputScenarios.ts +0 -404
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import FormBuilder, { Field } from '@digigov/form';
3
3
  import { Button } from '@digigov/ui/form/Button';
4
4
 
5
- export const PostalCode = () => (
5
+ export const PostalCode = (_: any) => (
6
6
  <FormBuilder
7
7
  onSubmit={(data) => {
8
8
  console.log(data);
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import FormBuilder, { Field } from '@digigov/form';
3
3
  import { Button } from '@digigov/ui/form/Button';
4
4
 
5
- export const String = () => (
5
+ export const String = (_: any) => (
6
6
  <FormBuilder
7
7
  onSubmit={(data) => {
8
8
  console.log(data);
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import FormBuilder, { Field } from '@digigov/form';
3
3
  import { Button } from '@digigov/ui/form/Button';
4
4
 
5
- export const StringWithTrimValidation = () => (
5
+ export const StringWithTrimValidation = (_: any) => (
6
6
  <FormBuilder
7
7
  onSubmit={(data) => {
8
8
  console.log(data);
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import FormBuilder, { Field } from '@digigov/form';
3
3
  import { Button } from '@digigov/ui/form';
4
4
 
5
- export const TextWithLimit = () => (
5
+ export const TextWithLimit = (_: any) => (
6
6
  <FormBuilder
7
7
  onSubmit={(data) => {
8
8
  console.log(data);
@@ -2,7 +2,9 @@ import React from 'react';
2
2
  import { test, expect } from '@playwright/experimental-ct-react';
3
3
  import TestVariant from '@digigov/ui/utils/TestVariant'
4
4
  import { AFM } from '@digigov/form/inputs/Input/__stories__/AFM';
5
+ import { AMKA } from '@digigov/form/inputs/Input/__stories__/AMKA';
5
6
  import { Boolean } from '@digigov/form/inputs/Input/__stories__/Boolean';
7
+ import { Email } from '@digigov/form/inputs/Input/__stories__/Email';
6
8
  import { IBAN } from '@digigov/form/inputs/Input/__stories__/IBAN';
7
9
  import { Integer } from '@digigov/form/inputs/Input/__stories__/Integer';
8
10
  import { LandlineNumber } from '@digigov/form/inputs/Input/__stories__/LandlineNumber';
@@ -20,9 +22,15 @@ test('renders the All Input variants', async ({ mount, page }) => {
20
22
  <TestVariant title="AFM">
21
23
  <AFM />
22
24
  </TestVariant>
25
+ <TestVariant title="AMKA">
26
+ <AMKA />
27
+ </TestVariant>
23
28
  <TestVariant title="Boolean">
24
29
  <Boolean />
25
30
  </TestVariant>
31
+ <TestVariant title="Email">
32
+ <Email />
33
+ </TestVariant>
26
34
  <TestVariant title="IBAN">
27
35
  <IBAN />
28
36
  </TestVariant>
@@ -54,6 +62,10 @@ test('renders the All Input variants', async ({ mount, page }) => {
54
62
  )
55
63
  await page.evaluate(() => document.fonts.ready);
56
64
 
65
+ // Move the mouse to the top-left corner to avoid random hover issues
66
+ await page.mouse.move(0, 0);
67
+
68
+
57
69
  const screenshot = await page.screenshot({ fullPage: true, animations: 'disabled' });
58
70
  expect(screenshot).toMatchSnapshot();
59
71
  });
@@ -8,12 +8,14 @@ import { Hint } from '@digigov/ui/typography/Hint';
8
8
 
9
9
  const TYPES_MAP = {
10
10
  string: 'text',
11
+ password: 'password',
11
12
  int: 'text',
12
13
  text: 'text',
13
14
  date: 'date',
14
15
  };
15
16
 
16
- export interface InputProps extends Omit<UncontrolledFieldProps, 'extra'> {
17
+ export interface InputProps
18
+ extends Omit<UncontrolledFieldProps, 'extra' | 'Field'> {
17
19
  extra?: {
18
20
  fullWidth?: boolean;
19
21
  multiline?: boolean;
@@ -25,10 +27,12 @@ export interface InputProps extends Omit<UncontrolledFieldProps, 'extra'> {
25
27
  max?: number;
26
28
  };
27
29
  };
30
+ Field?: UncontrolledFieldProps['Field'];
28
31
  }
29
32
 
30
33
  export const Input: React.ExoticComponent<InputProps> = React.forwardRef(
31
34
  function WrappedInput({ name, control, type, extra, ...props }, ref: never) {
35
+ delete props['Field'];
32
36
  // eslint-disable-next-line prefer-const
33
37
  let { multiline = false, rows, limit } = extra || {};
34
38
  const { className } = extra || {};
@@ -75,7 +79,6 @@ export const Input: React.ExoticComponent<InputProps> = React.forwardRef(
75
79
  reset: undefined,
76
80
  required: undefined,
77
81
  type: fieldType,
78
- Field: undefined,
79
82
  }}
80
83
  />
81
84
  {limit?.max && (
@@ -103,7 +106,6 @@ export const Input: React.ExoticComponent<InputProps> = React.forwardRef(
103
106
  ...props,
104
107
  reset: undefined,
105
108
  required: undefined,
106
- Field: undefined,
107
109
  }}
108
110
  />
109
111
  );
@@ -1,7 +1,10 @@
1
1
  import Label from '@digigov/form/inputs/Label';
2
+ import doc from './doc.mdx?raw';
2
3
  export default {
3
4
  title: 'Digigov Form/inputs/Label',
4
5
  component: Label,
6
+ tags: ['autodocs'],
7
+ markdown: doc,
5
8
  displayName: 'Label',
6
9
  };
7
10
  export { Default } from '@digigov/form/inputs/Label/__stories__/Default';
@@ -4,7 +4,7 @@ import Field from '@digigov/form/Field';
4
4
  import Label from '@digigov/form/inputs/Label';
5
5
  import { Button } from '@digigov/ui/form/Button';
6
6
 
7
- export const Default = () => (
7
+ export const Default = (_: any) => (
8
8
  <FormBuilder
9
9
  onSubmit={(data) => {
10
10
  console.log(data);
@@ -14,6 +14,10 @@ test('renders the All Label variants', async ({ mount, page }) => {
14
14
  )
15
15
  await page.evaluate(() => document.fonts.ready);
16
16
 
17
+ // Move the mouse to the top-left corner to avoid random hover issues
18
+ await page.mouse.move(0, 0);
19
+
20
+
17
21
  const screenshot = await page.screenshot({ fullPage: true, animations: 'disabled' });
18
22
  expect(screenshot).toMatchSnapshot();
19
23
  });
@@ -1,7 +1,10 @@
1
1
  import OtpInput from '@digigov/form/inputs/OtpInput';
2
+ import doc from './doc.mdx?raw';
2
3
  export default {
3
4
  title: 'Digigov Form/inputs/OtpInput',
4
5
  component: OtpInput,
6
+ tags: ['autodocs'],
7
+ markdown: doc,
5
8
  displayName: 'OtpInput',
6
9
  };
7
10
  export { Default } from '@digigov/form/inputs/OtpInput/__stories__/Default';
@@ -14,7 +14,7 @@ const FIELDS: FieldSpec[] = [
14
14
  },
15
15
  ];
16
16
 
17
- export const Default = () => (
17
+ export const Default = (_: any) => (
18
18
  <FormBuilder
19
19
  fields={FIELDS}
20
20
  onSubmit={(data) => {
@@ -14,6 +14,10 @@ test('renders the All OtpInput variants', async ({ mount, page }) => {
14
14
  )
15
15
  await page.evaluate(() => document.fonts.ready);
16
16
 
17
+ // Move the mouse to the top-left corner to avoid random hover issues
18
+ await page.mouse.move(0, 0);
19
+
20
+
17
21
  const screenshot = await page.screenshot({ fullPage: true, animations: 'disabled' });
18
22
  expect(screenshot).toMatchSnapshot();
19
23
  });
@@ -1,7 +1,10 @@
1
1
  import Radio from '@digigov/form/inputs/Radio';
2
+ import doc from './doc.mdx?raw';
2
3
  export default {
3
4
  title: 'Digigov Form/inputs/Radio',
4
5
  component: Radio,
6
+ tags: ['autodocs'],
7
+ markdown: doc,
5
8
  displayName: 'Radio',
6
9
  };
7
10
  export { Default } from '@digigov/form/inputs/Radio/__stories__/Default';
@@ -85,7 +85,7 @@ const fields: FieldSpec[] = [
85
85
  },
86
86
  ];
87
87
 
88
- export const Conditional = () => (
88
+ export const Conditional = (_: any) => (
89
89
  <FormBuilder
90
90
  onSubmit={(data) => {
91
91
  console.log(data);
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import FormBuilder, { Field } from '@digigov/form';
3
3
  import { Button } from '@digigov/ui/form/Button';
4
4
 
5
- export const Default = () => (
5
+ export const Default = (_: any) => (
6
6
  <FormBuilder
7
7
  onSubmit={(data) => {
8
8
  console.log(data);
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import FormBuilder, { Field } from '@digigov/form';
3
3
  import { Button } from '@digigov/ui/form/Button';
4
4
 
5
- export const WithDivider = () => (
5
+ export const WithDivider = (_: any) => (
6
6
  <FormBuilder
7
7
  onSubmit={(data) => {
8
8
  console.log(data);
@@ -22,6 +22,10 @@ test('renders the All Radio variants', async ({ mount, page }) => {
22
22
  )
23
23
  await page.evaluate(() => document.fonts.ready);
24
24
 
25
+ // Move the mouse to the top-left corner to avoid random hover issues
26
+ await page.mouse.move(0, 0);
27
+
28
+
25
29
  const screenshot = await page.screenshot({ fullPage: true, animations: 'disabled' });
26
30
  expect(screenshot).toMatchSnapshot();
27
31
  });
@@ -1,7 +1,10 @@
1
1
  import Select from '@digigov/form/inputs/Select';
2
+ import doc from './doc.mdx?raw';
2
3
  export default {
3
4
  title: 'Digigov Form/inputs/Select',
4
5
  component: Select,
6
+ tags: ['autodocs'],
7
+ markdown: doc,
5
8
  displayName: 'Select',
6
9
  };
7
10
  export { Default } from '@digigov/form/inputs/Select/__stories__/Default';
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import FormBuilder, { Field } from '@digigov/form';
3
3
  import { Button } from '@digigov/ui/form/Button';
4
4
 
5
- export const Default = () => (
5
+ export const Default = (_: any) => (
6
6
  <FormBuilder
7
7
  onSubmit={(data) => {
8
8
  console.log(data);
@@ -14,6 +14,10 @@ test('renders the All Select variants', async ({ mount, page }) => {
14
14
  )
15
15
  await page.evaluate(() => document.fonts.ready);
16
16
 
17
+ // Move the mouse to the top-left corner to avoid random hover issues
18
+ await page.mouse.move(0, 0);
19
+
20
+
17
21
  const screenshot = await page.screenshot({ fullPage: true, animations: 'disabled' });
18
22
  expect(screenshot).toMatchSnapshot();
19
23
  });
@@ -6,11 +6,13 @@ import {
6
6
  SelectOption,
7
7
  } from '@digigov/ui/form/SelectContainer';
8
8
 
9
- export interface SelectProps extends Omit<UncontrolledFieldProps, 'extra'> {
9
+ export interface SelectProps
10
+ extends Omit<UncontrolledFieldProps, 'extra' | 'Field'> {
10
11
  extra: {
11
12
  className?: string;
12
13
  options: FieldOptionProps[];
13
14
  };
15
+ Field?: UncontrolledFieldProps['Field'];
14
16
  }
15
17
 
16
18
  export const Select: React.ExoticComponent<SelectProps> = React.forwardRef(
@@ -18,6 +20,7 @@ export const Select: React.ExoticComponent<SelectProps> = React.forwardRef(
18
20
  { name, extra: { options, className }, disabled, ...props },
19
21
  ref: never
20
22
  ) {
23
+ delete props.Field;
21
24
  return (
22
25
  <SelectContainer
23
26
  className={className}
@@ -28,12 +31,12 @@ export const Select: React.ExoticComponent<SelectProps> = React.forwardRef(
28
31
  {...{
29
32
  ...props,
30
33
  reset: undefined,
34
+ error: undefined,
31
35
  required: undefined,
32
- Field: undefined,
33
36
  }}
34
37
  >
35
- {options.map(({ value, label }) => (
36
- <SelectOption key={value} value={value}>
38
+ {options.map(({ value, label }, index) => (
39
+ <SelectOption key={index} value={value}>
37
40
  {label && label.primary ? label.primary : value}
38
41
  </SelectOption>
39
42
  ))}
@@ -432,7 +432,7 @@ export const scenarios = [
432
432
  type: 'error',
433
433
  fieldKey: 'image',
434
434
  args: {
435
- maxSizeToMb: 0.0003,
435
+ maxSize: 0.0003,
436
436
  },
437
437
  text: el.form.error.file_size,
438
438
  },
@@ -440,7 +440,7 @@ export const scenarios = [
440
440
  type: 'error',
441
441
  fieldKey: 'file',
442
442
  args: {
443
- maxSizeToMb: 0.0003,
443
+ maxSize: 0.0003,
444
444
  },
445
445
  text: el.form.error.file_size,
446
446
  },
package/src/lazy.js CHANGED
@@ -9,12 +9,12 @@ export default {
9
9
  'FieldBase': lazy(() => import('@digigov/form/Field/FieldBase').then((module) => ({ default: module['FieldBase'] }))),
10
10
  'FieldBaseContainer': lazy(() => import('@digigov/form/Field/FieldBaseContainer').then((module) => ({ default: module['FieldBaseContainer'] }))),
11
11
  'FieldConditional': lazy(() => import('@digigov/form/Field/FieldConditional').then((module) => ({ default: module['FieldConditional'] }))),
12
- 'FieldObject': lazy(() => import('@digigov/form/FieldObject').then((module) => ({ default: module['FieldObject'] }))),
13
12
  'FormDialog': lazy(() => import('@digigov/form/FieldArray/FormDialog').then((module) => ({ default: module['FormDialog'] }))),
14
13
  'ArrayItemModal': lazy(() => import('@digigov/form/FieldArray/FormDialog').then((module) => ({ default: module['ArrayItemModal'] }))),
15
14
  'ArrayItemHeader': lazy(() => import('@digigov/form/FieldArray/FormDialog').then((module) => ({ default: module['ArrayItemHeader'] }))),
16
15
  'ArrayItemDisplay': lazy(() => import('@digigov/form/FieldArray/FormDialog').then((module) => ({ default: module['ArrayItemDisplay'] }))),
17
16
  'FieldArray': lazy(() => import('@digigov/form/FieldArray').then((module) => ({ default: module['FieldArray'] }))),
17
+ 'FieldObject': lazy(() => import('@digigov/form/FieldObject').then((module) => ({ default: module['FieldObject'] }))),
18
18
  'FieldsetWithContext': lazy(() => import('@digigov/form/Fieldset/FieldsetWithContext').then((module) => ({ default: module['FieldsetWithContext'] }))),
19
19
  'FieldsetLabel': lazy(() => import('@digigov/form/Fieldset').then((module) => ({ default: module['FieldsetLabel'] }))),
20
20
  'FieldsetCaption': lazy(() => import('@digigov/form/Fieldset').then((module) => ({ default: module['FieldsetCaption'] }))),
@@ -57,6 +57,7 @@ export default {
57
57
  'RadioButtonsGroup': lazy(() => import('@digigov/form/inputs/Radio').then((module) => ({ default: module['RadioButtonsGroup'] }))),
58
58
  'ControlledRadioButtonsGroup': lazy(() => import('@digigov/form/inputs/Radio').then((module) => ({ default: module['ControlledRadioButtonsGroup'] }))),
59
59
  'AFM_VALIDATOR': lazy(() => import('@digigov/form/validators/utils').then((module) => ({ default: module['AFM_VALIDATOR'] }))),
60
+ 'AMKA_VALIDATOR': lazy(() => import('@digigov/form/validators/utils').then((module) => ({ default: module['AMKA_VALIDATOR'] }))),
60
61
  'LATER_THAN_VALIDATOR': lazy(() => import('@digigov/form/validators/utils').then((module) => ({ default: module['LATER_THAN_VALIDATOR'] }))),
61
62
  'EARLIER_THAN_VALIDATOR': lazy(() => import('@digigov/form/validators/utils').then((module) => ({ default: module['EARLIER_THAN_VALIDATOR'] }))),
62
63
  'DATE_VALIDATOR': lazy(() => import('@digigov/form/validators/utils').then((module) => ({ default: module['DATE_VALIDATOR'] }))),
package/src/registry.js CHANGED
@@ -10,9 +10,9 @@ import * as _digigov_form_Field_FieldBaseContainer from "@digigov/form/Field/Fie
10
10
  import * as _digigov_form_Field_FieldConditional from "@digigov/form/Field/FieldConditional";
11
11
  import * as _digigov_form_Field from "@digigov/form/Field";
12
12
  import * as _digigov_form_Field_types from "@digigov/form/Field/types";
13
- import * as _digigov_form_FieldObject from "@digigov/form/FieldObject";
14
13
  import * as _digigov_form_FieldArray_FormDialog from "@digigov/form/FieldArray/FormDialog";
15
14
  import * as _digigov_form_FieldArray from "@digigov/form/FieldArray";
15
+ import * as _digigov_form_FieldObject from "@digigov/form/FieldObject";
16
16
  import * as _digigov_form_Fieldset_FieldsetWithContext from "@digigov/form/Fieldset/FieldsetWithContext";
17
17
  import * as _digigov_form_Fieldset from "@digigov/form/Fieldset";
18
18
  import * as _digigov_form_Fieldset_types from "@digigov/form/Fieldset/types";
@@ -45,19 +45,19 @@ import * as _digigov_form_Questions_Step_StepTitle from "@digigov/form/Questions
45
45
  import * as _digigov_form_Questions_Step_getAddMoreFields from "@digigov/form/Questions/Step/getAddMoreFields";
46
46
  import * as _digigov_form_Questions_Step from "@digigov/form/Questions/Step";
47
47
  import * as _digigov_form_Questions_Step_types from "@digigov/form/Questions/Step/types";
48
- import * as _digigov_form_inputs_AutoCompleteInput from "@digigov/form/inputs/AutoCompleteInput";
49
48
  import * as _digigov_form_inputs_Checkboxes from "@digigov/form/inputs/Checkboxes";
49
+ import * as _digigov_form_inputs_AutoCompleteInput from "@digigov/form/inputs/AutoCompleteInput";
50
50
  import * as _digigov_form_inputs_DateInput from "@digigov/form/inputs/DateInput";
51
- import * as _digigov_form_inputs_FileInput from "@digigov/form/inputs/FileInput";
52
51
  import * as _digigov_form_inputs_DateTimeInput from "@digigov/form/inputs/DateTimeInput";
52
+ import * as _digigov_form_inputs_FileInput from "@digigov/form/inputs/FileInput";
53
53
  import * as _digigov_form_inputs_ImageInput from "@digigov/form/inputs/ImageInput";
54
54
  import * as _digigov_form_inputs_Input from "@digigov/form/inputs/Input";
55
- import * as _digigov_form_inputs_Input_inputsInputScenarios from "@digigov/form/inputs/Input/inputsInputScenarios";
56
55
  import * as _digigov_form_inputs_Label from "@digigov/form/inputs/Label";
57
56
  import * as _digigov_form_inputs_OtpInput from "@digigov/form/inputs/OtpInput";
58
57
  import * as _digigov_form_inputs_Radio from "@digigov/form/inputs/Radio";
59
58
  import * as _digigov_form_inputs_Select from "@digigov/form/inputs/Select";
60
59
  import * as _digigov_form_validators_utils_afm from "@digigov/form/validators/utils/afm";
60
+ import * as _digigov_form_validators_utils_amka from "@digigov/form/validators/utils/amka";
61
61
  import * as _digigov_form_validators_utils_date from "@digigov/form/validators/utils/date";
62
62
  import * as _digigov_form_validators_utils_datetime from "@digigov/form/validators/utils/datetime";
63
63
  import * as _digigov_form_validators_utils_file from "@digigov/form/validators/utils/file";
@@ -101,9 +101,9 @@ export default {
101
101
  '@digigov/form/Field/FieldConditional': lazyImport(_digigov_form_Field_FieldConditional),
102
102
  '@digigov/form/Field': lazyImport(_digigov_form_Field),
103
103
  '@digigov/form/Field/types': lazyImport(_digigov_form_Field_types),
104
- '@digigov/form/FieldObject': lazyImport(_digigov_form_FieldObject),
105
104
  '@digigov/form/FieldArray/FormDialog': lazyImport(_digigov_form_FieldArray_FormDialog),
106
105
  '@digigov/form/FieldArray': lazyImport(_digigov_form_FieldArray),
106
+ '@digigov/form/FieldObject': lazyImport(_digigov_form_FieldObject),
107
107
  '@digigov/form/Fieldset/FieldsetWithContext': lazyImport(_digigov_form_Fieldset_FieldsetWithContext),
108
108
  '@digigov/form/Fieldset': lazyImport(_digigov_form_Fieldset),
109
109
  '@digigov/form/Fieldset/types': lazyImport(_digigov_form_Fieldset_types),
@@ -136,19 +136,19 @@ export default {
136
136
  '@digigov/form/Questions/Step/getAddMoreFields': lazyImport(_digigov_form_Questions_Step_getAddMoreFields),
137
137
  '@digigov/form/Questions/Step': lazyImport(_digigov_form_Questions_Step),
138
138
  '@digigov/form/Questions/Step/types': lazyImport(_digigov_form_Questions_Step_types),
139
- '@digigov/form/inputs/AutoCompleteInput': lazyImport(_digigov_form_inputs_AutoCompleteInput),
140
139
  '@digigov/form/inputs/Checkboxes': lazyImport(_digigov_form_inputs_Checkboxes),
140
+ '@digigov/form/inputs/AutoCompleteInput': lazyImport(_digigov_form_inputs_AutoCompleteInput),
141
141
  '@digigov/form/inputs/DateInput': lazyImport(_digigov_form_inputs_DateInput),
142
- '@digigov/form/inputs/FileInput': lazyImport(_digigov_form_inputs_FileInput),
143
142
  '@digigov/form/inputs/DateTimeInput': lazyImport(_digigov_form_inputs_DateTimeInput),
143
+ '@digigov/form/inputs/FileInput': lazyImport(_digigov_form_inputs_FileInput),
144
144
  '@digigov/form/inputs/ImageInput': lazyImport(_digigov_form_inputs_ImageInput),
145
145
  '@digigov/form/inputs/Input': lazyImport(_digigov_form_inputs_Input),
146
- '@digigov/form/inputs/Input/inputsInputScenarios': lazyImport(_digigov_form_inputs_Input_inputsInputScenarios),
147
146
  '@digigov/form/inputs/Label': lazyImport(_digigov_form_inputs_Label),
148
147
  '@digigov/form/inputs/OtpInput': lazyImport(_digigov_form_inputs_OtpInput),
149
148
  '@digigov/form/inputs/Radio': lazyImport(_digigov_form_inputs_Radio),
150
149
  '@digigov/form/inputs/Select': lazyImport(_digigov_form_inputs_Select),
151
150
  '@digigov/form/validators/utils/afm': lazyImport(_digigov_form_validators_utils_afm),
151
+ '@digigov/form/validators/utils/amka': lazyImport(_digigov_form_validators_utils_amka),
152
152
  '@digigov/form/validators/utils/date': lazyImport(_digigov_form_validators_utils_date),
153
153
  '@digigov/form/validators/utils/datetime': lazyImport(_digigov_form_validators_utils_datetime),
154
154
  '@digigov/form/validators/utils/file': lazyImport(_digigov_form_validators_utils_file),
package/src/types.tsx CHANGED
@@ -1,4 +1,4 @@
1
- import { UseFormReturn, UseFormProps } from 'react-hook-form';
1
+ import { UseFormReturn, UseFormProps, ErrorOption } from 'react-hook-form';
2
2
  import {
3
3
  FieldComponentRegistry,
4
4
  FieldLabelProps,
@@ -54,6 +54,7 @@ export interface FormBuilderProps {
54
54
  componentRegistry?: FieldComponentRegistry;
55
55
  grid?: boolean;
56
56
  controlledFieldsOnly?: boolean;
57
+ errors?: ErrorOption;
57
58
  }
58
59
 
59
60
  export interface FormBaseProps
package/src/utils.ts CHANGED
@@ -13,6 +13,7 @@ const parseErrorSchema = (
13
13
  return (error.inner || []).reduce<Record<string, FieldError>>(
14
14
  (previous, error) => {
15
15
  error.path = error.path?.replace(/\[([0-9]+)\]/g, '.$1');
16
+ // error.path = error.path?.replace(/\["(.*?)"\]/g, '$1');
16
17
  if (!previous[error.path!]) {
17
18
  previous[error.path!] = { message: error.message, type: error.type! };
18
19
  }
@@ -37,6 +38,26 @@ const parseErrorSchema = (
37
38
  {}
38
39
  );
39
40
  };
41
+ function isPlainObject(obj) {
42
+ return (
43
+ typeof obj === 'object' &&
44
+ obj !== null &&
45
+ Object.prototype.toString.call(obj) === '[object Object]'
46
+ );
47
+ }
48
+ function flattenObject(obj, prefix = '') {
49
+ return Object.keys(obj).reduce((acc, key) => {
50
+ const prefixedKey = prefix ? `${prefix}.${key}` : key;
51
+
52
+ if (isPlainObject(obj[key])) {
53
+ Object.assign(acc, flattenObject(obj[key], prefixedKey));
54
+ } else {
55
+ acc[prefixedKey] = obj[key];
56
+ }
57
+
58
+ return acc;
59
+ }, {});
60
+ }
40
61
 
41
62
  export const yupResolver =
42
63
  (schema: any, schemaOptions: any = {}, resolverOptions: any = {}) =>
@@ -51,7 +72,7 @@ export const yupResolver =
51
72
  const result = await schema[
52
73
  resolverOptions.mode === 'sync' ? 'validateSync' : 'validate'
53
74
  ](
54
- values,
75
+ flattenObject(values),
55
76
  Object.assign({ abortEarly: false }, schemaOptions, { context })
56
77
  );
57
78
 
@@ -67,13 +88,13 @@ export const yupResolver =
67
88
  throw e;
68
89
  }
69
90
 
70
- const parsed = parseErrorSchema(
71
- e,
72
- !options.shouldUseNativeValidation && options.criteriaMode === 'all'
73
- );
74
91
  return {
75
92
  values: {},
76
- errors: parsed,
93
+ errors: parseErrorSchema(
94
+ e,
95
+ !options.shouldUseNativeValidation && options.criteriaMode === 'all'
96
+ ),
97
+ options,
77
98
  };
78
99
  }
79
100
  };
@@ -11,6 +11,7 @@ import { ValidatorSchema } from '@digigov/form/validators/types';
11
11
  import {
12
12
  getYupObjectShape,
13
13
  AFM_VALIDATOR,
14
+ AMKA_VALIDATOR,
14
15
  FILE_MAX_SIZE_VALIDATOR,
15
16
  IBAN_VALIDATOR,
16
17
  OTP_VALIDATOR,
@@ -30,13 +31,15 @@ import {
30
31
  import { INT_VALIDATOR } from '@digigov/form/validators/utils/int';
31
32
  import { NUMBER_VALIDATOR } from '@digigov/form/validators/utils/number';
32
33
 
33
- export const getYUPTypeMap = (): Record<string, any> => {
34
+ export const getYUPTypeMap = (
35
+ validatorRegistry?: Record<string, any>
36
+ ): Record<string, any> => {
34
37
  const yupTypeMap = {
35
38
  file: (field): MixedSchema => {
36
39
  return yup
37
40
  .mixed()
38
41
  .transform((value) => {
39
- if (!value.length) {
42
+ if (!value || value.length === 0) {
40
43
  return null;
41
44
  }
42
45
  return value;
@@ -81,10 +84,13 @@ export const getYUPTypeMap = (): Record<string, any> => {
81
84
  if (typeof field.extra.of === 'object') {
82
85
  // else if the field is an object then it is a scalar type
83
86
  // eg. number, string etc.
87
+ if (field.required) {
88
+ field.extra.min = 1;
89
+ }
84
90
  let arrayValidator = yup
85
91
  .array()
86
- .of(yupTypeMap[field.extra.of.type](field.extra.of))
87
- .required(field.required);
92
+ .nullable()
93
+ .of(yupTypeMap[field.extra.of.type](field.extra.of));
88
94
  if (field.extra.length)
89
95
  arrayValidator = arrayValidator.length(field.extra.length, {
90
96
  key: 'form.error.array.length',
@@ -133,6 +139,10 @@ export const getYUPTypeMap = (): Record<string, any> => {
133
139
  field.trim
134
140
  ? yup.string().trim().test(AFM_VALIDATOR)
135
141
  : yup.string().test(AFM_VALIDATOR),
142
+ amka: (field): yup.StringSchema =>
143
+ field.trim
144
+ ? yup.string().trim().test(AMKA_VALIDATOR)
145
+ : yup.string().test(AMKA_VALIDATOR),
136
146
  uuid4: (field): yup.StringSchema =>
137
147
  field.trim
138
148
  ? yup.string().trim().test(UUID4_VALIDATOR)
@@ -215,6 +225,7 @@ export const getYUPTypeMap = (): Record<string, any> => {
215
225
  }
216
226
  return yup.string().test(DATETIME_VALIDATOR);
217
227
  },
228
+ ...validatorRegistry,
218
229
  };
219
230
  return yupTypeMap;
220
231
  };
@@ -226,7 +237,7 @@ export function useValidationSchema(
226
237
  validatorRegistry?: Record<string, ValidatorSchema[]>
227
238
  ): Lazy<any, unknown> | AnyObjectSchema | void {
228
239
  return useMemo(() => {
229
- const yupTypeMap = getYUPTypeMap();
240
+ const yupTypeMap = getYUPTypeMap(validatorRegistry);
230
241
  return getYupObjectShape(fields, yupTypeMap, validatorRegistry);
231
242
  }, []);
232
243
  }
@@ -0,0 +1,39 @@
1
+ function digitSum(number) {
2
+ const sum = number > 9 ? 1 : 0;
3
+ return sum + (number % 10);
4
+ }
5
+
6
+ export function validateAMKA(amka: string): boolean {
7
+ // Validate that the last digit is the correct check digit (created using the
8
+ // Luhn algorithm https://en.wikipedia.org/wiki/Luhn_algorithm).
9
+ amka = String(amka);
10
+ const checkDigitIndex = amka.length - 1;
11
+ let sum = 0;
12
+ amka
13
+ .substring(0, checkDigitIndex)
14
+ .split('')
15
+ .reverse()
16
+ .forEach(function (value, index) {
17
+ const weight = ((index + 1) % 2) + 1;
18
+ sum += digitSum(parseInt(value, 10) * weight);
19
+ });
20
+ const sumMod10 = sum % 10;
21
+ if (sumMod10 === 0) {
22
+ return amka.substring(checkDigitIndex) === '0';
23
+ } else {
24
+ return amka.substring(checkDigitIndex) === 10 - sumMod10 + '';
25
+ }
26
+ }
27
+
28
+ export const AMKA_VALIDATOR = {
29
+ name: 'amka-validator',
30
+ message: 'form.error.amka',
31
+ test: (value): boolean => {
32
+ if (!value) return true;
33
+ const AMKA_REGEX = /^[0-9]{11}$/;
34
+ if (!AMKA_REGEX.test(value) || value === '00000000000') {
35
+ return false;
36
+ }
37
+ return validateAMKA(value);
38
+ },
39
+ };