@digigov/form 2.0.0-07ee8440 → 2.0.0-0b806366

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 (785) hide show
  1. package/Field/ErrorGroup.d.ts +4 -4
  2. package/Field/ErrorGroup.js +53 -0
  3. package/Field/FieldBase.d.ts +1 -1
  4. package/Field/FieldBase.js +77 -0
  5. package/Field/FieldBaseContainer.d.ts +2 -2
  6. package/Field/FieldBaseContainer.js +43 -0
  7. package/Field/FieldConditional.d.ts +1 -1
  8. package/Field/FieldConditional.js +45 -0
  9. package/Field/index.d.ts +1 -1
  10. package/Field/index.js +70 -112
  11. package/Field/types.d.ts +23 -12
  12. package/Field/types.js +0 -0
  13. package/Field/utils/evaluateFieldWithConditions.d.ts +2 -2
  14. package/Field/utils/evaluateFieldWithConditions.js +19 -0
  15. package/Field/utils/resolveField.d.ts +3 -0
  16. package/Field/utils/resolveField.js +32 -0
  17. package/Field/utils/useField.d.ts +1 -1
  18. package/Field/utils/useField.js +47 -0
  19. package/FieldArray/BaseFieldArray.d.ts +5 -0
  20. package/FieldArray/BaseFieldArray.js +46 -0
  21. package/FieldArray/FormDialog/ArrayDisplay/ArrayContainerDisplay.d.ts +9 -0
  22. package/FieldArray/FormDialog/ArrayDisplay/ArrayContainerDisplay.js +13 -0
  23. package/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay.d.ts +26 -0
  24. package/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay.js +117 -0
  25. package/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader.d.ts +5 -0
  26. package/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader.js +6 -0
  27. package/FieldArray/FormDialog/ArrayDisplay/index.d.ts +15 -0
  28. package/FieldArray/FormDialog/ArrayDisplay/index.js +32 -0
  29. package/FieldArray/FormDialog/ArrayEditModal.d.ts +24 -0
  30. package/FieldArray/FormDialog/ArrayEditModal.js +138 -0
  31. package/FieldArray/FormDialog/index.d.ts +19 -0
  32. package/FieldArray/FormDialog/index.js +191 -271
  33. package/FieldArray/index.d.ts +5 -2
  34. package/FieldArray/index.js +62 -106
  35. package/FieldObject/index.d.ts +7 -4
  36. package/FieldObject/index.js +51 -72
  37. package/Fieldset/FieldsetWithContext.js +27 -0
  38. package/Fieldset/index.d.ts +1 -1
  39. package/Fieldset/index.js +18 -30
  40. package/Fieldset/types.d.ts +2 -2
  41. package/Fieldset/types.js +0 -0
  42. package/FormBuilder/index.d.ts +2 -2
  43. package/FormBuilder/index.js +233 -231
  44. package/FormContext.d.ts +3 -2
  45. package/FormContext.js +7 -0
  46. package/MultiplicityField/add-objects.d.ts +2 -2
  47. package/MultiplicityField/add-objects.js +107 -0
  48. package/MultiplicityField/index.d.ts +2 -2
  49. package/MultiplicityField/index.js +81 -116
  50. package/MultiplicityField/types.d.ts +3 -2
  51. package/MultiplicityField/types.js +0 -0
  52. package/Questions/Questions.d.ts +1 -1
  53. package/Questions/Questions.js +48 -0
  54. package/Questions/QuestionsContext.d.ts +1 -1
  55. package/Questions/QuestionsContext.js +10 -0
  56. package/Questions/Step/ReviewStep.js +32 -0
  57. package/Questions/Step/Step.d.ts +1 -1
  58. package/Questions/Step/Step.js +39 -0
  59. package/Questions/Step/StepArrayReview.d.ts +1 -1
  60. package/Questions/Step/StepArrayReview.js +35 -0
  61. package/Questions/Step/StepContext.d.ts +1 -1
  62. package/Questions/Step/StepContext.js +28 -0
  63. package/Questions/Step/StepDescription.d.ts +1 -1
  64. package/Questions/Step/StepDescription.js +18 -0
  65. package/Questions/Step/StepForm.d.ts +2 -2
  66. package/Questions/Step/StepForm.js +29 -0
  67. package/Questions/Step/StepQuote.d.ts +1 -1
  68. package/Questions/Step/StepQuote.js +5 -0
  69. package/Questions/Step/StepTitle.d.ts +1 -1
  70. package/Questions/Step/StepTitle.js +25 -0
  71. package/Questions/Step/getAddMoreFields.d.ts +2 -2
  72. package/Questions/Step/getAddMoreFields.js +24 -0
  73. package/Questions/Step/index.d.ts +11 -11
  74. package/Questions/Step/index.js +13 -16
  75. package/Questions/Step/types.d.ts +1 -1
  76. package/Questions/Step/types.js +0 -0
  77. package/Questions/getNextStep.d.ts +1 -1
  78. package/Questions/getNextStep.js +13 -0
  79. package/Questions/index.d.ts +2 -2
  80. package/Questions/index.js +4 -7
  81. package/Questions/types.d.ts +1 -1
  82. package/Questions/types.js +0 -0
  83. package/hooks/useFieldFocusManager.d.ts +25 -0
  84. package/hooks/useFieldFocusManager.js +83 -0
  85. package/hooks/utils.d.ts +18 -0
  86. package/hooks/utils.js +60 -0
  87. package/index.d.ts +5 -5
  88. package/index.js +8 -13
  89. package/inputs/AutoCompleteInput/index.d.ts +3 -3
  90. package/inputs/AutoCompleteInput/index.js +38 -62
  91. package/inputs/Checkboxes/index.d.ts +5 -3
  92. package/inputs/Checkboxes/index.js +50 -77
  93. package/inputs/DateInput/index.d.ts +2 -5
  94. package/inputs/DateInput/index.js +125 -114
  95. package/inputs/DateTimeInput/index.d.ts +2 -5
  96. package/inputs/DateTimeInput/index.js +179 -165
  97. package/inputs/FileInput/index.d.ts +18 -2
  98. package/inputs/FileInput/index.js +59 -45
  99. package/inputs/ImageInput/index.d.ts +10 -2
  100. package/inputs/ImageInput/index.js +85 -53
  101. package/inputs/Input/index.d.ts +5 -2
  102. package/inputs/Input/index.js +60 -68
  103. package/inputs/Label/index.d.ts +1 -1
  104. package/inputs/Label/index.js +13 -16
  105. package/inputs/OtpInput/index.d.ts +1 -5
  106. package/inputs/OtpInput/index.js +117 -140
  107. package/inputs/Radio/index.d.ts +6 -4
  108. package/inputs/Radio/index.js +71 -102
  109. package/inputs/Select/index.d.ts +6 -3
  110. package/inputs/Select/index.js +24 -31
  111. package/inputs/index.d.ts +9 -9
  112. package/inputs/index.js +10 -21
  113. package/{Field/utils/index.d.ts → inputs/registry.d.ts} +2 -1
  114. package/inputs/registry.js +80 -0
  115. package/internal.d.ts +5 -5
  116. package/internal.js +6 -0
  117. package/lazy.d.ts +97 -0
  118. package/lazy.js +163 -0
  119. package/package.json +12 -12
  120. package/registry.d.ts +82 -0
  121. package/registry.js +170 -0
  122. package/src/Field/ErrorGroup.tsx +4 -4
  123. package/src/Field/FieldBase.tsx +9 -4
  124. package/src/Field/FieldBaseContainer.tsx +69 -48
  125. package/src/Field/FieldConditional.tsx +5 -1
  126. package/src/Field/doc.mdx +202 -1
  127. package/src/Field/index.tsx +27 -37
  128. package/src/Field/types.tsx +25 -14
  129. package/src/Field/utils/evaluateFieldWithConditions.ts +5 -2
  130. package/src/Field/utils/resolveField.ts +58 -0
  131. package/src/Field/utils/useField.ts +12 -2
  132. package/src/FieldArray/BaseFieldArray.tsx +97 -0
  133. package/src/FieldArray/FieldArray.stories.js +1 -0
  134. package/src/FieldArray/FormDialog/ArrayDisplay/ArrayContainerDisplay.tsx +45 -0
  135. package/src/FieldArray/FormDialog/ArrayDisplay/ArrayDisplay.stories.js +14 -0
  136. package/src/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay.tsx +337 -0
  137. package/src/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader.tsx +15 -0
  138. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/Cards.tsx +88 -0
  139. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/Default.tsx +93 -0
  140. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/ReadOnly.tsx +79 -0
  141. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/ReadOnlyCards.tsx +75 -0
  142. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/Sortable.tsx +93 -0
  143. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/SortableCards.tsx +88 -0
  144. package/src/FieldArray/FormDialog/ArrayDisplay/index.test.tsx +44 -0
  145. package/src/FieldArray/FormDialog/ArrayDisplay/index.tsx +67 -0
  146. package/src/FieldArray/FormDialog/ArrayEditModal.tsx +241 -0
  147. package/src/FieldArray/FormDialog/index.tsx +302 -0
  148. package/src/FieldArray/__stories__/CardsWithError.tsx +124 -0
  149. package/src/FieldArray/__stories__/Default.tsx +1 -1
  150. package/src/FieldArray/__stories__/WithExactLength.tsx +1 -1
  151. package/src/FieldArray/__stories__/WithModal.tsx +4 -3
  152. package/src/FieldArray/__tests__/fieldset-multiplicity.spec.tsx +271 -0
  153. package/src/FieldArray/__tests__/multiplicity-attachment.spec.tsx +280 -0
  154. package/src/FieldArray/__tests__/multiplicity-optional.spec.tsx +232 -0
  155. package/src/FieldArray/__tests__/multiplicity-required.spec.tsx +170 -0
  156. package/src/FieldArray/__tests__/nested-fieldset-multiplicity.spec.tsx +627 -0
  157. package/src/FieldArray/__tests__/preference-multiple-choice.spec.tsx +222 -0
  158. package/src/FieldArray/index.spec.tsx +355 -0
  159. package/src/FieldArray/index.test.tsx +8 -0
  160. package/src/FieldArray/index.tsx +49 -73
  161. package/src/FieldObject/index.tsx +40 -33
  162. package/src/Fieldset/FieldsetWithContext.tsx +1 -1
  163. package/src/Fieldset/index.tsx +1 -1
  164. package/src/Fieldset/types.tsx +2 -2
  165. package/src/FormBuilder/FormBuilder.stories.js +3 -0
  166. package/src/FormBuilder/__stories__/AutoErrorGrouping.tsx +1 -1
  167. package/src/FormBuilder/__stories__/Default.tsx +1 -1
  168. package/src/FormBuilder/__stories__/ErrorGrouping.tsx +1 -1
  169. package/src/FormBuilder/doc.mdx +10 -5
  170. package/src/FormBuilder/index.test.tsx +4 -0
  171. package/src/FormBuilder/index.tsx +197 -146
  172. package/src/FormBuilder/interaction.test.tsx +8 -0
  173. package/src/FormBuilder/scenarios.test.tsx +809 -12
  174. package/src/FormContext.tsx +7 -2
  175. package/src/MultiplicityField/MultiplicityField.stories.js +3 -0
  176. package/src/MultiplicityField/__stories__/Default.tsx +1 -1
  177. package/src/MultiplicityField/__stories__/PreviewDisplay.tsx +2 -4
  178. package/src/MultiplicityField/__stories__/WithExactLength.tsx +1 -1
  179. package/src/MultiplicityField/__stories__/WithMaxLength.tsx +1 -1
  180. package/src/MultiplicityField/__stories__/WithMinAndMaxLength.tsx +1 -1
  181. package/src/MultiplicityField/__stories__/WithMinLength.tsx +1 -1
  182. package/src/MultiplicityField/add-objects.tsx +14 -21
  183. package/src/MultiplicityField/doc.mdx +101 -83
  184. package/src/MultiplicityField/index.test.tsx +4 -0
  185. package/src/MultiplicityField/index.tsx +6 -2
  186. package/src/MultiplicityField/types.ts +6 -2
  187. package/src/Questions/Questions.stories.js +3 -0
  188. package/src/Questions/Questions.tsx +2 -2
  189. package/src/Questions/QuestionsContext.tsx +1 -1
  190. package/src/Questions/Step/Step.tsx +1 -1
  191. package/src/Questions/Step/StepArrayReview.tsx +2 -2
  192. package/src/Questions/Step/StepContext.tsx +1 -1
  193. package/src/Questions/Step/StepDescription.tsx +2 -1
  194. package/src/Questions/Step/StepForm.tsx +2 -2
  195. package/src/Questions/Step/StepQuote.tsx +2 -1
  196. package/src/Questions/Step/StepTitle.tsx +2 -1
  197. package/src/Questions/Step/getAddMoreFields.tsx +2 -2
  198. package/src/Questions/Step/types.tsx +1 -1
  199. package/src/Questions/__snapshots__/index.spec.tsx.snap +2 -1
  200. package/src/Questions/__stories__/Default.tsx +1 -1
  201. package/src/Questions/doc.mdx +21 -41
  202. package/src/Questions/getNextStep.tsx +1 -1
  203. package/src/Questions/index.test.tsx +4 -0
  204. package/src/Questions/types.tsx +1 -1
  205. package/src/doc.mdx +26 -11
  206. package/src/hooks/__tests__/useFieldFocusManager.spec.tsx +1079 -0
  207. package/src/hooks/__tests__/utils.spec.ts +568 -0
  208. package/src/hooks/useFieldFocusManager.ts +162 -0
  209. package/src/hooks/utils.ts +122 -0
  210. package/src/inputs/AutoCompleteInput/AutoComplete.stories.js +3 -0
  211. package/src/inputs/AutoCompleteInput/__stories__/Default.tsx +1 -1
  212. package/src/inputs/AutoCompleteInput/__stories__/Multiple.tsx +1 -1
  213. package/src/inputs/AutoCompleteInput/doc.mdx +2 -2
  214. package/src/inputs/AutoCompleteInput/index.test.tsx +4 -0
  215. package/src/inputs/AutoCompleteInput/index.tsx +4 -6
  216. package/src/inputs/Checkboxes/Checkboxes.stories.js +3 -0
  217. package/src/inputs/Checkboxes/__stories__/Conditional.tsx +1 -1
  218. package/src/inputs/Checkboxes/__stories__/Default.tsx +1 -1
  219. package/src/inputs/Checkboxes/__stories__/WithDivider.tsx +1 -1
  220. package/src/inputs/Checkboxes/doc.mdx +3 -3
  221. package/src/inputs/Checkboxes/index.test.tsx +4 -0
  222. package/src/inputs/Checkboxes/index.tsx +98 -90
  223. package/src/inputs/DateInput/DateInput.stories.js +7 -0
  224. package/src/inputs/DateInput/__stories__/Default.tsx +1 -1
  225. package/src/inputs/DateInput/__stories__/WithDefaultValue.tsx +26 -0
  226. package/src/inputs/DateInput/__stories__/WithInitialValue.tsx +28 -0
  227. package/src/inputs/DateInput/__stories__/WithWrongDefaultValue.tsx +26 -0
  228. package/src/inputs/DateInput/__stories__/WithWrongInitialValue.tsx +28 -0
  229. package/src/inputs/DateInput/doc.mdx +1 -1
  230. package/src/inputs/DateInput/index.test.tsx +20 -0
  231. package/src/inputs/DateInput/index.tsx +68 -20
  232. package/src/inputs/DateTimeInput/DateTimeInput.stories.js +12 -6
  233. package/src/inputs/DateTimeInput/__stories__/Default.tsx +1 -1
  234. package/src/inputs/DateTimeInput/__stories__/WithDefaultValue.tsx +26 -0
  235. package/src/inputs/DateTimeInput/__stories__/WithInitialValue.tsx +28 -0
  236. package/src/inputs/DateTimeInput/__stories__/WithWrongDefaultValue.tsx +26 -0
  237. package/src/inputs/DateTimeInput/__stories__/WithWrongInitialValue.tsx +28 -0
  238. package/src/inputs/DateTimeInput/doc.mdx +1 -1
  239. package/src/inputs/DateTimeInput/index.test.tsx +20 -0
  240. package/src/inputs/DateTimeInput/index.tsx +97 -40
  241. package/src/inputs/FileInput/FileInput.stories.js +4 -0
  242. package/src/inputs/FileInput/__stories__/Default.tsx +1 -1
  243. package/src/inputs/FileInput/__stories__/WithBorderAndLink.tsx +34 -0
  244. package/src/inputs/FileInput/doc.mdx +1 -1
  245. package/src/inputs/FileInput/index.test.tsx +8 -0
  246. package/src/inputs/FileInput/index.tsx +98 -38
  247. package/src/inputs/ImageInput/ImageInput.stories.js +5 -1
  248. package/src/inputs/ImageInput/__stories__/Default.tsx +1 -1
  249. package/src/inputs/ImageInput/__stories__/MaxSize.tsx +3 -2
  250. package/src/inputs/ImageInput/__stories__/{WithInvalidImageSize.tsx → WithInitialValues.tsx} +12 -3
  251. package/src/inputs/ImageInput/__stories__/WithInvalidImageDimension.tsx +1 -1
  252. package/src/inputs/ImageInput/__stories__/logo.d.ts +4 -0
  253. package/src/inputs/ImageInput/__stories__/logo.png +0 -0
  254. package/src/inputs/ImageInput/doc.mdx +3 -3
  255. package/src/inputs/ImageInput/index.test.tsx +8 -4
  256. package/src/inputs/ImageInput/index.tsx +102 -49
  257. package/src/inputs/Input/Input.stories.js +6 -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__/Rate.tsx +25 -0
  269. package/src/inputs/Input/__stories__/String.tsx +1 -1
  270. package/src/inputs/Input/__stories__/StringWithTrimValidation.tsx +1 -1
  271. package/src/inputs/Input/__stories__/TextWithLimit.tsx +1 -1
  272. package/src/inputs/Input/doc.mdx +10 -10
  273. package/src/inputs/Input/index.test.tsx +16 -0
  274. package/src/inputs/Input/index.tsx +20 -10
  275. package/src/inputs/Label/Label.stories.js +3 -0
  276. package/src/inputs/Label/__stories__/Default.tsx +1 -1
  277. package/src/inputs/Label/doc.mdx +1 -1
  278. package/src/inputs/Label/index.test.tsx +4 -0
  279. package/src/inputs/Label/index.tsx +1 -1
  280. package/src/inputs/OtpInput/OtpInput.stories.js +3 -0
  281. package/src/inputs/OtpInput/__stories__/Default.tsx +1 -1
  282. package/src/inputs/OtpInput/doc.mdx +1 -1
  283. package/src/inputs/OtpInput/index.test.tsx +4 -0
  284. package/src/inputs/OtpInput/index.tsx +43 -33
  285. package/src/inputs/Radio/Radio.stories.js +3 -0
  286. package/src/inputs/Radio/__stories__/Conditional.tsx +1 -1
  287. package/src/inputs/Radio/__stories__/Default.tsx +1 -1
  288. package/src/inputs/Radio/__stories__/WithDivider.tsx +1 -1
  289. package/src/inputs/Radio/doc.mdx +3 -3
  290. package/src/inputs/Radio/index.test.tsx +4 -0
  291. package/src/inputs/Radio/index.tsx +33 -22
  292. package/src/inputs/Select/Select.stories.js +3 -0
  293. package/src/inputs/Select/__stories__/Default.tsx +1 -1
  294. package/src/inputs/Select/doc.mdx +1 -1
  295. package/src/inputs/Select/index.test.tsx +4 -0
  296. package/src/inputs/Select/index.tsx +13 -7
  297. package/src/{Field/utils/index.ts → inputs/registry.ts} +5 -1
  298. package/{lazy/index.js → src/lazy.ts} +8 -29
  299. package/{registry/index.js → src/registry.ts} +33 -19
  300. package/src/types.tsx +14 -5
  301. package/src/utils.ts +41 -8
  302. package/src/validators/index.ts +50 -17
  303. package/src/validators/types.ts +1 -1
  304. package/src/validators/utils/amka.ts +39 -0
  305. package/src/validators/utils/date.ts +30 -6
  306. package/src/validators/utils/datetime.ts +123 -31
  307. package/src/validators/utils/email.ts +11 -0
  308. package/src/validators/utils/file.ts +35 -21
  309. package/src/validators/utils/iban.ts +2 -2
  310. package/src/validators/utils/image.ts +2 -2
  311. package/src/validators/utils/index.ts +13 -6
  312. package/src/validators/utils/int.ts +1 -1
  313. package/src/validators/utils/number.ts +1 -1
  314. package/src/validators/utils/otp.ts +2 -2
  315. package/src/validators/utils/phone.ts +2 -2
  316. package/src/validators/utils/postal_code.ts +2 -2
  317. package/src/validators/utils/text_limit.ts +2 -2
  318. package/types.d.ts +11 -5
  319. package/types.js +1 -0
  320. package/utils.d.ts +4 -1
  321. package/utils.js +56 -0
  322. package/validators/index.d.ts +6 -6
  323. package/validators/index.js +112 -139
  324. package/validators/types.d.ts +1 -1
  325. package/validators/types.js +0 -0
  326. package/validators/utils/afm.js +19 -0
  327. package/validators/utils/amka.d.ts +6 -0
  328. package/validators/utils/amka.js +27 -0
  329. package/validators/utils/date.d.ts +3 -3
  330. package/validators/utils/date.js +95 -0
  331. package/validators/utils/datetime.d.ts +3 -3
  332. package/validators/utils/datetime.js +121 -0
  333. package/validators/utils/email.d.ts +5 -0
  334. package/validators/utils/email.js +10 -0
  335. package/validators/utils/file.d.ts +2 -2
  336. package/validators/utils/file.js +31 -0
  337. package/validators/utils/iban.d.ts +2 -2
  338. package/validators/utils/iban.js +104 -0
  339. package/validators/utils/image.d.ts +2 -2
  340. package/validators/utils/image.js +65 -0
  341. package/validators/utils/index.d.ts +14 -13
  342. package/validators/utils/index.js +59 -90
  343. package/validators/utils/int.d.ts +1 -1
  344. package/validators/utils/int.js +13 -0
  345. package/validators/utils/number.d.ts +1 -1
  346. package/validators/utils/number.js +12 -0
  347. package/validators/utils/otp.d.ts +2 -2
  348. package/validators/utils/otp.js +21 -0
  349. package/validators/utils/phone.d.ts +2 -2
  350. package/validators/utils/phone.js +198 -0
  351. package/validators/utils/postal_code.d.ts +2 -2
  352. package/validators/utils/postal_code.js +18 -0
  353. package/validators/utils/text_limit.d.ts +2 -2
  354. package/validators/utils/text_limit.js +34 -0
  355. package/validators/utils/uuid4.js +14 -0
  356. package/Field/ErrorGroup/index.js +0 -48
  357. package/Field/ErrorGroup/package.json +0 -6
  358. package/Field/ErrorGroup.js.map +0 -7
  359. package/Field/FieldBase/index.js +0 -117
  360. package/Field/FieldBase/package.json +0 -6
  361. package/Field/FieldBase.js.map +0 -7
  362. package/Field/FieldBaseContainer/index.js +0 -33
  363. package/Field/FieldBaseContainer/package.json +0 -6
  364. package/Field/FieldBaseContainer.js.map +0 -7
  365. package/Field/FieldConditional/index.js +0 -85
  366. package/Field/FieldConditional/package.json +0 -6
  367. package/Field/FieldConditional.js.map +0 -7
  368. package/Field/index.js.map +0 -7
  369. package/Field/package.json +0 -6
  370. package/Field/types/index.js +0 -1
  371. package/Field/types/package.json +0 -6
  372. package/Field/types.js.map +0 -7
  373. package/Field/utils/calculateField/index.js +0 -27
  374. package/Field/utils/calculateField/package.json +0 -6
  375. package/Field/utils/calculateField.d.ts +0 -2
  376. package/Field/utils/calculateField.js.map +0 -7
  377. package/Field/utils/evaluateFieldWithConditions/index.js +0 -26
  378. package/Field/utils/evaluateFieldWithConditions/package.json +0 -6
  379. package/Field/utils/evaluateFieldWithConditions.js.map +0 -7
  380. package/Field/utils/index.js +0 -84
  381. package/Field/utils/index.js.map +0 -7
  382. package/Field/utils/package.json +0 -6
  383. package/Field/utils/useField/index.js +0 -57
  384. package/Field/utils/useField/package.json +0 -6
  385. package/Field/utils/useField.js.map +0 -7
  386. package/FieldArray/FieldArray.stories.d.ts +0 -10
  387. package/FieldArray/FormDialog/package.json +0 -6
  388. package/FieldArray/FormDialog.d.ts +0 -53
  389. package/FieldArray/FormDialog.js.map +0 -7
  390. package/FieldArray/__stories__/Default.d.ts +0 -2
  391. package/FieldArray/__stories__/WithExactLength.d.ts +0 -2
  392. package/FieldArray/__stories__/WithModal.d.ts +0 -2
  393. package/FieldArray/index.js.map +0 -7
  394. package/FieldArray/index.test.d.ts +0 -1
  395. package/FieldArray/package.json +0 -6
  396. package/FieldObject/index.js.map +0 -7
  397. package/FieldObject/package.json +0 -6
  398. package/Fieldset/FieldsetWithContext/index.js +0 -31
  399. package/Fieldset/FieldsetWithContext/package.json +0 -6
  400. package/Fieldset/FieldsetWithContext.js.map +0 -7
  401. package/Fieldset/index.js.map +0 -7
  402. package/Fieldset/package.json +0 -6
  403. package/Fieldset/types/index.js +0 -1
  404. package/Fieldset/types/package.json +0 -6
  405. package/Fieldset/types.js.map +0 -7
  406. package/Form.stories.d.ts +0 -4
  407. package/FormBuilder/FormBuilder.stories.d.ts +0 -10
  408. package/FormBuilder/__stories__/AutoErrorGrouping.d.ts +0 -3
  409. package/FormBuilder/__stories__/Default.d.ts +0 -3
  410. package/FormBuilder/__stories__/ErrorGrouping.d.ts +0 -3
  411. package/FormBuilder/index.js.map +0 -7
  412. package/FormBuilder/index.test.d.ts +0 -1
  413. package/FormBuilder/interaction.test.d.ts +0 -1
  414. package/FormBuilder/package.json +0 -6
  415. package/FormBuilder/scenarios.test.d.ts +0 -88
  416. package/FormContext/index.js +0 -9
  417. package/FormContext/package.json +0 -6
  418. package/FormContext.js.map +0 -7
  419. package/MultiplicityField/MultiplicityField.stories.d.ts +0 -13
  420. package/MultiplicityField/__stories__/Default.d.ts +0 -2
  421. package/MultiplicityField/__stories__/PreviewDisplay.d.ts +0 -2
  422. package/MultiplicityField/__stories__/WithExactLength.d.ts +0 -2
  423. package/MultiplicityField/__stories__/WithMaxLength.d.ts +0 -2
  424. package/MultiplicityField/__stories__/WithMinAndMaxLength.d.ts +0 -2
  425. package/MultiplicityField/__stories__/WithMinLength.d.ts +0 -2
  426. package/MultiplicityField/add-objects/index.js +0 -153
  427. package/MultiplicityField/add-objects/package.json +0 -6
  428. package/MultiplicityField/add-objects.js.map +0 -7
  429. package/MultiplicityField/index.js.map +0 -7
  430. package/MultiplicityField/index.test.d.ts +0 -1
  431. package/MultiplicityField/package.json +0 -6
  432. package/MultiplicityField/types/index.js +0 -1
  433. package/MultiplicityField/types/package.json +0 -6
  434. package/MultiplicityField/types.js.map +0 -7
  435. package/Questions/Questions/index.js +0 -67
  436. package/Questions/Questions/package.json +0 -6
  437. package/Questions/Questions.js.map +0 -7
  438. package/Questions/Questions.stories.d.ts +0 -8
  439. package/Questions/QuestionsContext/index.js +0 -11
  440. package/Questions/QuestionsContext/package.json +0 -6
  441. package/Questions/QuestionsContext.js.map +0 -7
  442. package/Questions/Step/ReviewStep/index.js +0 -38
  443. package/Questions/Step/ReviewStep/package.json +0 -6
  444. package/Questions/Step/ReviewStep.js.map +0 -7
  445. package/Questions/Step/Step/index.js +0 -54
  446. package/Questions/Step/Step/package.json +0 -6
  447. package/Questions/Step/Step.js.map +0 -7
  448. package/Questions/Step/StepArrayReview/index.js +0 -42
  449. package/Questions/Step/StepArrayReview/package.json +0 -6
  450. package/Questions/Step/StepArrayReview.js.map +0 -7
  451. package/Questions/Step/StepContext/index.js +0 -23
  452. package/Questions/Step/StepContext/package.json +0 -6
  453. package/Questions/Step/StepContext.js.map +0 -7
  454. package/Questions/Step/StepDescription/index.js +0 -24
  455. package/Questions/Step/StepDescription/package.json +0 -6
  456. package/Questions/Step/StepDescription.js.map +0 -7
  457. package/Questions/Step/StepForm/index.js +0 -34
  458. package/Questions/Step/StepForm/package.json +0 -6
  459. package/Questions/Step/StepForm.js.map +0 -7
  460. package/Questions/Step/StepQuote/index.js +0 -11
  461. package/Questions/Step/StepQuote/package.json +0 -6
  462. package/Questions/Step/StepQuote.js.map +0 -7
  463. package/Questions/Step/StepTitle/index.js +0 -44
  464. package/Questions/Step/StepTitle/package.json +0 -6
  465. package/Questions/Step/StepTitle.js.map +0 -7
  466. package/Questions/Step/getAddMoreFields/index.js +0 -29
  467. package/Questions/Step/getAddMoreFields/package.json +0 -6
  468. package/Questions/Step/getAddMoreFields.js.map +0 -7
  469. package/Questions/Step/index.js.map +0 -7
  470. package/Questions/Step/package.json +0 -6
  471. package/Questions/Step/types/index.js +0 -1
  472. package/Questions/Step/types/package.json +0 -6
  473. package/Questions/Step/types.js.map +0 -7
  474. package/Questions/__stories__/Default.d.ts +0 -3
  475. package/Questions/getNextStep/index.js +0 -22
  476. package/Questions/getNextStep/package.json +0 -6
  477. package/Questions/getNextStep.js.map +0 -7
  478. package/Questions/index.js.map +0 -7
  479. package/Questions/index.spec.d.ts +0 -1
  480. package/Questions/index.test.d.ts +0 -1
  481. package/Questions/package.json +0 -6
  482. package/Questions/types/index.js +0 -1
  483. package/Questions/types/package.json +0 -6
  484. package/Questions/types.js.map +0 -7
  485. package/cjs/Field/ErrorGroup/index.js +0 -82
  486. package/cjs/Field/ErrorGroup.js.map +0 -7
  487. package/cjs/Field/FieldBase/index.js +0 -150
  488. package/cjs/Field/FieldBase.js.map +0 -7
  489. package/cjs/Field/FieldBaseContainer/index.js +0 -66
  490. package/cjs/Field/FieldBaseContainer.js.map +0 -7
  491. package/cjs/Field/FieldConditional/index.js +0 -118
  492. package/cjs/Field/FieldConditional.js.map +0 -7
  493. package/cjs/Field/index.js +0 -144
  494. package/cjs/Field/index.js.map +0 -7
  495. package/cjs/Field/types/index.js +0 -16
  496. package/cjs/Field/types.js.map +0 -7
  497. package/cjs/Field/utils/calculateField/index.js +0 -50
  498. package/cjs/Field/utils/calculateField.js.map +0 -7
  499. package/cjs/Field/utils/evaluateFieldWithConditions/index.js +0 -49
  500. package/cjs/Field/utils/evaluateFieldWithConditions.js.map +0 -7
  501. package/cjs/Field/utils/index.js +0 -119
  502. package/cjs/Field/utils/index.js.map +0 -7
  503. package/cjs/Field/utils/useField/index.js +0 -80
  504. package/cjs/Field/utils/useField.js.map +0 -7
  505. package/cjs/FieldArray/FormDialog/index.js +0 -301
  506. package/cjs/FieldArray/FormDialog.js.map +0 -7
  507. package/cjs/FieldArray/index.js +0 -143
  508. package/cjs/FieldArray/index.js.map +0 -7
  509. package/cjs/FieldObject/index.js +0 -106
  510. package/cjs/FieldObject/index.js.map +0 -7
  511. package/cjs/Fieldset/FieldsetWithContext/index.js +0 -59
  512. package/cjs/Fieldset/FieldsetWithContext.js.map +0 -7
  513. package/cjs/Fieldset/index.js +0 -66
  514. package/cjs/Fieldset/index.js.map +0 -7
  515. package/cjs/Fieldset/types/index.js +0 -16
  516. package/cjs/Fieldset/types.js.map +0 -7
  517. package/cjs/FormBuilder/index.js +0 -273
  518. package/cjs/FormBuilder/index.js.map +0 -7
  519. package/cjs/FormContext/index.js +0 -32
  520. package/cjs/FormContext.js.map +0 -7
  521. package/cjs/MultiplicityField/add-objects/index.js +0 -181
  522. package/cjs/MultiplicityField/add-objects.js.map +0 -7
  523. package/cjs/MultiplicityField/index.js +0 -150
  524. package/cjs/MultiplicityField/index.js.map +0 -7
  525. package/cjs/MultiplicityField/types/index.js +0 -16
  526. package/cjs/MultiplicityField/types.js.map +0 -7
  527. package/cjs/Questions/Questions/index.js +0 -100
  528. package/cjs/Questions/Questions.js.map +0 -7
  529. package/cjs/Questions/QuestionsContext/index.js +0 -34
  530. package/cjs/Questions/QuestionsContext.js.map +0 -7
  531. package/cjs/Questions/Step/ReviewStep/index.js +0 -65
  532. package/cjs/Questions/Step/ReviewStep.js.map +0 -7
  533. package/cjs/Questions/Step/Step/index.js +0 -87
  534. package/cjs/Questions/Step/Step.js.map +0 -7
  535. package/cjs/Questions/Step/StepArrayReview/index.js +0 -67
  536. package/cjs/Questions/Step/StepArrayReview.js.map +0 -7
  537. package/cjs/Questions/Step/StepContext/index.js +0 -46
  538. package/cjs/Questions/Step/StepContext.js.map +0 -7
  539. package/cjs/Questions/Step/StepDescription/index.js +0 -58
  540. package/cjs/Questions/Step/StepDescription.js.map +0 -7
  541. package/cjs/Questions/Step/StepForm/index.js +0 -67
  542. package/cjs/Questions/Step/StepForm.js.map +0 -7
  543. package/cjs/Questions/Step/StepQuote/index.js +0 -44
  544. package/cjs/Questions/Step/StepQuote.js.map +0 -7
  545. package/cjs/Questions/Step/StepTitle/index.js +0 -76
  546. package/cjs/Questions/Step/StepTitle.js.map +0 -7
  547. package/cjs/Questions/Step/getAddMoreFields/index.js +0 -52
  548. package/cjs/Questions/Step/getAddMoreFields.js.map +0 -7
  549. package/cjs/Questions/Step/index.js +0 -59
  550. package/cjs/Questions/Step/index.js.map +0 -7
  551. package/cjs/Questions/Step/types/index.js +0 -16
  552. package/cjs/Questions/Step/types.js.map +0 -7
  553. package/cjs/Questions/getNextStep/index.js +0 -45
  554. package/cjs/Questions/getNextStep.js.map +0 -7
  555. package/cjs/Questions/index.js +0 -31
  556. package/cjs/Questions/index.js.map +0 -7
  557. package/cjs/Questions/types/index.js +0 -16
  558. package/cjs/Questions/types.js.map +0 -7
  559. package/cjs/index.js +0 -49
  560. package/cjs/index.js.map +0 -7
  561. package/cjs/inputs/AutoCompleteInput/index.js +0 -98
  562. package/cjs/inputs/AutoCompleteInput/index.js.map +0 -7
  563. package/cjs/inputs/Checkboxes/index.js +0 -106
  564. package/cjs/inputs/Checkboxes/index.js.map +0 -7
  565. package/cjs/inputs/DateInput/index.js +0 -153
  566. package/cjs/inputs/DateInput/index.js.map +0 -7
  567. package/cjs/inputs/DateTimeInput/index.js +0 -206
  568. package/cjs/inputs/DateTimeInput/index.js.map +0 -7
  569. package/cjs/inputs/FileInput/index.js +0 -80
  570. package/cjs/inputs/FileInput/index.js.map +0 -7
  571. package/cjs/inputs/ImageInput/index.js +0 -98
  572. package/cjs/inputs/ImageInput/index.js.map +0 -7
  573. package/cjs/inputs/Input/index.js +0 -110
  574. package/cjs/inputs/Input/index.js.map +0 -7
  575. package/cjs/inputs/Input/inputsInputScenarios/index.js +0 -439
  576. package/cjs/inputs/Input/inputsInputScenarios.js.map +0 -7
  577. package/cjs/inputs/Label/index.js +0 -50
  578. package/cjs/inputs/Label/index.js.map +0 -7
  579. package/cjs/inputs/OtpInput/index.js +0 -180
  580. package/cjs/inputs/OtpInput/index.js.map +0 -7
  581. package/cjs/inputs/Radio/index.js +0 -134
  582. package/cjs/inputs/Radio/index.js.map +0 -7
  583. package/cjs/inputs/Select/index.js +0 -61
  584. package/cjs/inputs/Select/index.js.map +0 -7
  585. package/cjs/inputs/index.js +0 -62
  586. package/cjs/inputs/index.js.map +0 -7
  587. package/cjs/inputs/inputsScenarios/index.js +0 -533
  588. package/cjs/inputs/inputsScenarios.js.map +0 -7
  589. package/cjs/internal/index.js +0 -38
  590. package/cjs/internal.js.map +0 -7
  591. package/cjs/lazy/index.js +0 -110
  592. package/cjs/lazy.js.map +0 -7
  593. package/cjs/locales/el/index.js +0 -35
  594. package/cjs/locales/el.js.map +0 -7
  595. package/cjs/registry/index.js +0 -195
  596. package/cjs/registry.js.map +0 -7
  597. package/cjs/types/index.js +0 -22
  598. package/cjs/types.js.map +0 -7
  599. package/cjs/utils/index.js +0 -83
  600. package/cjs/utils.js.map +0 -7
  601. package/cjs/validators/index.js +0 -160
  602. package/cjs/validators/index.js.map +0 -7
  603. package/cjs/validators/types/index.js +0 -16
  604. package/cjs/validators/types.js.map +0 -7
  605. package/cjs/validators/utils/afm/index.js +0 -55
  606. package/cjs/validators/utils/afm.js.map +0 -7
  607. package/cjs/validators/utils/date/index.js +0 -138
  608. package/cjs/validators/utils/date.js.map +0 -7
  609. package/cjs/validators/utils/datetime/index.js +0 -151
  610. package/cjs/validators/utils/datetime.js.map +0 -7
  611. package/cjs/validators/utils/file/index.js +0 -48
  612. package/cjs/validators/utils/file.js.map +0 -7
  613. package/cjs/validators/utils/iban/index.js +0 -142
  614. package/cjs/validators/utils/iban.js.map +0 -7
  615. package/cjs/validators/utils/image/index.js +0 -102
  616. package/cjs/validators/utils/image.js.map +0 -7
  617. package/cjs/validators/utils/index.js +0 -144
  618. package/cjs/validators/utils/index.js.map +0 -7
  619. package/cjs/validators/utils/int/index.js +0 -48
  620. package/cjs/validators/utils/int.js.map +0 -7
  621. package/cjs/validators/utils/number/index.js +0 -44
  622. package/cjs/validators/utils/number.js.map +0 -7
  623. package/cjs/validators/utils/otp/index.js +0 -54
  624. package/cjs/validators/utils/otp.js.map +0 -7
  625. package/cjs/validators/utils/phone/index.js +0 -198
  626. package/cjs/validators/utils/phone.js.map +0 -7
  627. package/cjs/validators/utils/postal_code/index.js +0 -54
  628. package/cjs/validators/utils/postal_code.js.map +0 -7
  629. package/cjs/validators/utils/text_limit/index.js +0 -69
  630. package/cjs/validators/utils/text_limit.js.map +0 -7
  631. package/cjs/validators/utils/uuid4/index.js +0 -46
  632. package/cjs/validators/utils/uuid4.js.map +0 -7
  633. package/index.js.map +0 -7
  634. package/inputs/AutoCompleteInput/AutoComplete.stories.d.ts +0 -9
  635. package/inputs/AutoCompleteInput/__stories__/Default.d.ts +0 -3
  636. package/inputs/AutoCompleteInput/__stories__/Multiple.d.ts +0 -3
  637. package/inputs/AutoCompleteInput/index.js.map +0 -7
  638. package/inputs/AutoCompleteInput/index.test.d.ts +0 -1
  639. package/inputs/AutoCompleteInput/package.json +0 -6
  640. package/inputs/Checkboxes/Checkboxes.stories.d.ts +0 -10
  641. package/inputs/Checkboxes/__stories__/Conditional.d.ts +0 -3
  642. package/inputs/Checkboxes/__stories__/Default.d.ts +0 -3
  643. package/inputs/Checkboxes/__stories__/WithDivider.d.ts +0 -3
  644. package/inputs/Checkboxes/index.js.map +0 -7
  645. package/inputs/Checkboxes/index.test.d.ts +0 -1
  646. package/inputs/Checkboxes/package.json +0 -6
  647. package/inputs/DateInput/DateInput.stories.d.ts +0 -8
  648. package/inputs/DateInput/__stories__/Default.d.ts +0 -3
  649. package/inputs/DateInput/index.js.map +0 -7
  650. package/inputs/DateInput/index.test.d.ts +0 -1
  651. package/inputs/DateInput/package.json +0 -6
  652. package/inputs/DateTimeInput/DateTimeInput.stories.d.ts +0 -7
  653. package/inputs/DateTimeInput/__stories__/Default.d.ts +0 -3
  654. package/inputs/DateTimeInput/index.js.map +0 -7
  655. package/inputs/DateTimeInput/index.test.d.ts +0 -1
  656. package/inputs/DateTimeInput/package.json +0 -6
  657. package/inputs/FileInput/FileInput.stories.d.ts +0 -8
  658. package/inputs/FileInput/__stories__/Default.d.ts +0 -3
  659. package/inputs/FileInput/index.js.map +0 -7
  660. package/inputs/FileInput/index.test.d.ts +0 -1
  661. package/inputs/FileInput/package.json +0 -6
  662. package/inputs/ImageInput/ImageInput.stories.d.ts +0 -10
  663. package/inputs/ImageInput/__stories__/Default.d.ts +0 -3
  664. package/inputs/ImageInput/__stories__/MaxSize.d.ts +0 -3
  665. package/inputs/ImageInput/__stories__/WithInvalidImageDimension.d.ts +0 -3
  666. package/inputs/ImageInput/__stories__/WithInvalidImageSize.d.ts +0 -3
  667. package/inputs/ImageInput/index.js.map +0 -7
  668. package/inputs/ImageInput/index.test.d.ts +0 -1
  669. package/inputs/ImageInput/package.json +0 -6
  670. package/inputs/Input/Input.stories.d.ts +0 -18
  671. package/inputs/Input/__stories__/AFM.d.ts +0 -3
  672. package/inputs/Input/__stories__/Boolean.d.ts +0 -3
  673. package/inputs/Input/__stories__/IBAN.d.ts +0 -3
  674. package/inputs/Input/__stories__/Integer.d.ts +0 -3
  675. package/inputs/Input/__stories__/LandlineNumber.d.ts +0 -3
  676. package/inputs/Input/__stories__/MobilePhone.d.ts +0 -3
  677. package/inputs/Input/__stories__/PhoneNumber.d.ts +0 -3
  678. package/inputs/Input/__stories__/PostalCode.d.ts +0 -3
  679. package/inputs/Input/__stories__/String.d.ts +0 -3
  680. package/inputs/Input/__stories__/StringWithTrimValidation.d.ts +0 -3
  681. package/inputs/Input/__stories__/TextWithLimit.d.ts +0 -3
  682. package/inputs/Input/index.js.map +0 -7
  683. package/inputs/Input/index.test.d.ts +0 -1
  684. package/inputs/Input/inputsInputScenarios/index.js +0 -406
  685. package/inputs/Input/inputsInputScenarios/package.json +0 -6
  686. package/inputs/Input/inputsInputScenarios.d.ts +0 -57
  687. package/inputs/Input/inputsInputScenarios.js.map +0 -7
  688. package/inputs/Input/package.json +0 -6
  689. package/inputs/Label/Label.stories.d.ts +0 -8
  690. package/inputs/Label/__stories__/Default.d.ts +0 -3
  691. package/inputs/Label/index.js.map +0 -7
  692. package/inputs/Label/index.test.d.ts +0 -1
  693. package/inputs/Label/package.json +0 -6
  694. package/inputs/OtpInput/OtpInput.stories.d.ts +0 -8
  695. package/inputs/OtpInput/__stories__/Default.d.ts +0 -3
  696. package/inputs/OtpInput/index.js.map +0 -7
  697. package/inputs/OtpInput/index.test.d.ts +0 -1
  698. package/inputs/OtpInput/package.json +0 -6
  699. package/inputs/Radio/Radio.stories.d.ts +0 -10
  700. package/inputs/Radio/__stories__/Conditional.d.ts +0 -3
  701. package/inputs/Radio/__stories__/Default.d.ts +0 -3
  702. package/inputs/Radio/__stories__/WithDivider.d.ts +0 -3
  703. package/inputs/Radio/index.js.map +0 -7
  704. package/inputs/Radio/index.test.d.ts +0 -1
  705. package/inputs/Radio/package.json +0 -6
  706. package/inputs/Select/Select.stories.d.ts +0 -8
  707. package/inputs/Select/__stories__/Default.d.ts +0 -3
  708. package/inputs/Select/index.js.map +0 -7
  709. package/inputs/Select/index.test.d.ts +0 -1
  710. package/inputs/Select/package.json +0 -6
  711. package/inputs/index.js.map +0 -7
  712. package/inputs/inputsScenarios/index.js +0 -499
  713. package/inputs/inputsScenarios/package.json +0 -6
  714. package/inputs/inputsScenarios.d.ts +0 -296
  715. package/inputs/inputsScenarios.js.map +0 -7
  716. package/inputs/package.json +0 -6
  717. package/internal/index.js +0 -10
  718. package/internal/package.json +0 -6
  719. package/internal.js.map +0 -7
  720. package/lazy/package.json +0 -6
  721. package/locales/el/index.js +0 -6
  722. package/locales/el/package.json +0 -6
  723. package/locales/el.d.ts +0 -2
  724. package/locales/el.js.map +0 -7
  725. package/registry/package.json +0 -6
  726. package/src/Field/utils/calculateField.ts +0 -49
  727. package/src/FieldArray/FormDialog.tsx +0 -378
  728. package/src/inputs/Input/inputsInputScenarios.ts +0 -404
  729. package/src/inputs/inputsScenarios.ts +0 -496
  730. package/src/lazy.js +0 -77
  731. package/src/locales/el.ts +0 -3
  732. package/src/registry.js +0 -165
  733. package/types/index.js +0 -2
  734. package/types/package.json +0 -6
  735. package/types.js.map +0 -7
  736. package/utils/index.js +0 -60
  737. package/utils/package.json +0 -6
  738. package/utils.js.map +0 -7
  739. package/validators/index.js.map +0 -7
  740. package/validators/package.json +0 -6
  741. package/validators/types/index.js +0 -1
  742. package/validators/types/package.json +0 -6
  743. package/validators/types.js.map +0 -7
  744. package/validators/utils/afm/index.js +0 -31
  745. package/validators/utils/afm/package.json +0 -6
  746. package/validators/utils/afm.js.map +0 -7
  747. package/validators/utils/date/index.js +0 -103
  748. package/validators/utils/date/package.json +0 -6
  749. package/validators/utils/date.js.map +0 -7
  750. package/validators/utils/datetime/index.js +0 -116
  751. package/validators/utils/datetime/package.json +0 -6
  752. package/validators/utils/datetime.js.map +0 -7
  753. package/validators/utils/file/index.js +0 -25
  754. package/validators/utils/file/package.json +0 -6
  755. package/validators/utils/file.js.map +0 -7
  756. package/validators/utils/iban/index.js +0 -118
  757. package/validators/utils/iban/package.json +0 -6
  758. package/validators/utils/iban.js.map +0 -7
  759. package/validators/utils/image/index.js +0 -79
  760. package/validators/utils/image/package.json +0 -6
  761. package/validators/utils/image.js.map +0 -7
  762. package/validators/utils/index.js.map +0 -7
  763. package/validators/utils/int/index.js +0 -24
  764. package/validators/utils/int/package.json +0 -6
  765. package/validators/utils/int.js.map +0 -7
  766. package/validators/utils/number/index.js +0 -20
  767. package/validators/utils/number/package.json +0 -6
  768. package/validators/utils/number.js.map +0 -7
  769. package/validators/utils/otp/index.js +0 -30
  770. package/validators/utils/otp/package.json +0 -6
  771. package/validators/utils/otp.js.map +0 -7
  772. package/validators/utils/package.json +0 -6
  773. package/validators/utils/phone/index.js +0 -172
  774. package/validators/utils/phone/package.json +0 -6
  775. package/validators/utils/phone.js.map +0 -7
  776. package/validators/utils/postal_code/index.js +0 -30
  777. package/validators/utils/postal_code/package.json +0 -6
  778. package/validators/utils/postal_code.js.map +0 -7
  779. package/validators/utils/text_limit/index.js +0 -45
  780. package/validators/utils/text_limit/package.json +0 -6
  781. package/validators/utils/text_limit.js.map +0 -7
  782. package/validators/utils/uuid4/index.js +0 -22
  783. package/validators/utils/uuid4/package.json +0 -6
  784. package/validators/utils/uuid4.js.map +0 -7
  785. package/validators/validators.spec.d.ts +0 -1
@@ -0,0 +1,1079 @@
1
+ import React from 'react';
2
+ import {
3
+ renderHook,
4
+ act,
5
+ render,
6
+ screen,
7
+ fireEvent,
8
+ waitFor,
9
+ } from '@testing-library/react';
10
+ import { useForm, useFieldArray } from 'react-hook-form';
11
+ import { expect } from 'vitest';
12
+
13
+ import { useFieldFocusManager } from '@digigov/form/hooks/useFieldFocusManager';
14
+
15
+ // Mock component that uses the hook
16
+ function TestFormComponent({
17
+ enabled = true,
18
+ onRegisterElement,
19
+ }: {
20
+ enabled?: boolean;
21
+ onRegisterElement?: (register: any) => void;
22
+ }) {
23
+ const form = useForm({
24
+ defaultValues: {
25
+ firstName: '',
26
+ lastName: '',
27
+ email: '',
28
+ },
29
+ shouldFocusError: false, // Disable default focus behavior for testing
30
+ });
31
+
32
+ const { registerCustomFocusableElement, focusOnError } = useFieldFocusManager(
33
+ {
34
+ enabled,
35
+ control: form.control,
36
+ subscribe: form.subscribe,
37
+ setFocus: form.setFocus,
38
+ }
39
+ );
40
+
41
+ // Expose register function for testing
42
+ React.useEffect(() => {
43
+ if (onRegisterElement) {
44
+ onRegisterElement(registerCustomFocusableElement);
45
+ }
46
+ }, [registerCustomFocusableElement, onRegisterElement]);
47
+
48
+ return (
49
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
50
+ <input
51
+ {...form.register('firstName', { required: 'First name is required' })}
52
+ data-testid="firstName"
53
+ placeholder="First Name"
54
+ />
55
+ <input
56
+ {...form.register('lastName', { required: 'Last name is required' })}
57
+ data-testid="lastName"
58
+ placeholder="Last Name"
59
+ />
60
+ <input
61
+ {...form.register('email', { required: 'Email is required' })}
62
+ data-testid="email"
63
+ placeholder="Email"
64
+ />
65
+ <button type="submit" data-testid="submit">
66
+ Submit
67
+ </button>
68
+ </form>
69
+ );
70
+ }
71
+
72
+ // FieldArray test component
73
+ function TestFieldArrayComponent({
74
+ enabled = true,
75
+ onRegisterElement,
76
+ }: {
77
+ enabled?: boolean;
78
+ onRegisterElement?: (register: any) => void;
79
+ }) {
80
+ const form = useForm({
81
+ defaultValues: {
82
+ users: [{ name: '', email: '' }],
83
+ items: [{ title: '', description: '' }],
84
+ },
85
+ shouldFocusError: false,
86
+ });
87
+
88
+ const { fields: userFields, append: appendUser } = useFieldArray({
89
+ control: form.control,
90
+ name: 'users',
91
+ });
92
+
93
+ const { fields: itemFields, append: appendItem } = useFieldArray({
94
+ control: form.control,
95
+ name: 'items',
96
+ });
97
+
98
+ const { registerCustomFocusableElement, focusOnError } = useFieldFocusManager(
99
+ {
100
+ enabled,
101
+ control: form.control,
102
+ subscribe: form.subscribe,
103
+ setFocus: form.setFocus,
104
+ }
105
+ );
106
+
107
+ React.useEffect(() => {
108
+ if (onRegisterElement) {
109
+ onRegisterElement(registerCustomFocusableElement);
110
+ }
111
+ }, [registerCustomFocusableElement, onRegisterElement]);
112
+
113
+ return (
114
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
115
+ <div data-testid="users-section">
116
+ {userFields.map((field, index) => (
117
+ <div key={field.id} data-testid={`user-${index}`}>
118
+ <input
119
+ {...form.register(`users.${index}.name`, {
120
+ required: 'Name is required',
121
+ })}
122
+ data-testid={`user-${index}-name`}
123
+ placeholder={`User ${index} Name`}
124
+ />
125
+ <input
126
+ {...form.register(`users.${index}.email`, {
127
+ required: 'Email is required',
128
+ })}
129
+ data-testid={`user-${index}-email`}
130
+ placeholder={`User ${index} Email`}
131
+ />
132
+ </div>
133
+ ))}
134
+ <button
135
+ type="button"
136
+ onClick={() => appendUser({ name: '', email: '' })}
137
+ data-testid="add-user"
138
+ >
139
+ Add User
140
+ </button>
141
+ </div>
142
+
143
+ <div data-testid="items-section">
144
+ {itemFields.map((field, index) => (
145
+ <div key={field.id} data-testid={`item-${index}`}>
146
+ <input
147
+ {...form.register(`items.${index}.title`, {
148
+ required: 'Title is required',
149
+ })}
150
+ data-testid={`item-${index}-title`}
151
+ placeholder={`Item ${index} Title`}
152
+ />
153
+ <input
154
+ {...form.register(`items.${index}.description`)}
155
+ data-testid={`item-${index}-description`}
156
+ placeholder={`Item ${index} Description`}
157
+ />
158
+ </div>
159
+ ))}
160
+ <button
161
+ type="button"
162
+ onClick={() => appendItem({ title: '', description: '' })}
163
+ data-testid="add-item"
164
+ >
165
+ Add Item
166
+ </button>
167
+ </div>
168
+
169
+ <button type="submit" data-testid="submit">
170
+ Submit
171
+ </button>
172
+ </form>
173
+ );
174
+ }
175
+
176
+ // Nested FieldArray component
177
+ function TestNestedFieldArrayComponent() {
178
+ const form = useForm({
179
+ defaultValues: {
180
+ projects: [
181
+ {
182
+ name: '',
183
+ tasks: [{ title: '', assignee: '' }],
184
+ },
185
+ ],
186
+ },
187
+ shouldFocusError: false,
188
+ });
189
+
190
+ const { fields: projectFields, append: appendProject } = useFieldArray({
191
+ control: form.control,
192
+ name: 'projects',
193
+ });
194
+
195
+ const { focusOnError } = useFieldFocusManager({
196
+ control: form.control,
197
+ subscribe: form.subscribe,
198
+ setFocus: form.setFocus,
199
+ });
200
+
201
+ return (
202
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
203
+ {projectFields.map((projectField, projectIndex) => (
204
+ <div key={projectField.id} data-testid={`project-${projectIndex}`}>
205
+ <input
206
+ {...form.register(`projects.${projectIndex}.name`, {
207
+ required: 'Project name is required',
208
+ })}
209
+ data-testid={`project-${projectIndex}-name`}
210
+ placeholder={`Project ${projectIndex} Name`}
211
+ />
212
+
213
+ <NestedTasksFieldArray
214
+ control={form.control}
215
+ register={form.register}
216
+ projectIndex={projectIndex}
217
+ />
218
+ </div>
219
+ ))}
220
+
221
+ <button
222
+ type="button"
223
+ onClick={() =>
224
+ appendProject({ name: '', tasks: [{ title: '', assignee: '' }] })
225
+ }
226
+ data-testid="add-project"
227
+ >
228
+ Add Project
229
+ </button>
230
+
231
+ <button type="submit" data-testid="submit">
232
+ Submit
233
+ </button>
234
+ </form>
235
+ );
236
+ }
237
+
238
+ function NestedTasksFieldArray({
239
+ control,
240
+ register,
241
+ projectIndex,
242
+ }: {
243
+ control: any;
244
+ register: any;
245
+ projectIndex: number;
246
+ }) {
247
+ const { fields: taskFields, append: appendTask } = useFieldArray({
248
+ control,
249
+ name: `projects.${projectIndex}.tasks`,
250
+ });
251
+
252
+ return (
253
+ <div data-testid={`project-${projectIndex}-tasks`}>
254
+ {taskFields.map((taskField, taskIndex) => (
255
+ <div
256
+ key={taskField.id}
257
+ data-testid={`project-${projectIndex}-task-${taskIndex}`}
258
+ >
259
+ <input
260
+ {...register(`projects.${projectIndex}.tasks.${taskIndex}.title`, {
261
+ required: 'Task title is required',
262
+ })}
263
+ data-testid={`project-${projectIndex}-task-${taskIndex}-title`}
264
+ placeholder={`Task ${taskIndex} Title`}
265
+ />
266
+ <input
267
+ {...register(
268
+ `projects.${projectIndex}.tasks.${taskIndex}.assignee`,
269
+ {
270
+ required: 'Assignee is required',
271
+ }
272
+ )}
273
+ data-testid={`project-${projectIndex}-task-${taskIndex}-assignee`}
274
+ placeholder={`Task ${taskIndex} Assignee`}
275
+ />
276
+ </div>
277
+ ))}
278
+
279
+ <button
280
+ type="button"
281
+ onClick={() => appendTask({ title: '', assignee: '' })}
282
+ data-testid={`add-task-${projectIndex}`}
283
+ >
284
+ Add Task
285
+ </button>
286
+ </div>
287
+ );
288
+ }
289
+
290
+ describe('useFieldFocusManager', () => {
291
+ beforeEach(() => {
292
+ vi.clearAllMocks();
293
+ });
294
+
295
+ describe('basic functionality', () => {
296
+ it('should return registerCustomFocusableElement function', () => {
297
+ const { result } = renderHook(() => {
298
+ const form = useForm();
299
+ return useFieldFocusManager({
300
+ control: form.control,
301
+ subscribe: form.subscribe,
302
+ setFocus: form.setFocus,
303
+ });
304
+ });
305
+
306
+ expect(result.current.registerCustomFocusableElement).toBeInstanceOf(
307
+ Function
308
+ );
309
+ });
310
+
311
+ it('should be enabled by default', () => {
312
+ const { result } = renderHook(() => {
313
+ const form = useForm();
314
+ return useFieldFocusManager({
315
+ control: form.control,
316
+ subscribe: form.subscribe,
317
+ setFocus: form.setFocus,
318
+ });
319
+ });
320
+
321
+ expect(result.current.registerCustomFocusableElement).toBeDefined();
322
+ });
323
+ });
324
+
325
+ describe('error focusing behavior', () => {
326
+ it('should focus the first field with an error in DOM order', async () => {
327
+ render(<TestFormComponent />);
328
+
329
+ const firstNameInput = screen.getByTestId('firstName');
330
+ const submitButton = screen.getByTestId('submit');
331
+
332
+ // Submit form to trigger validation errors
333
+ fireEvent.click(submitButton);
334
+
335
+ // First field in DOM order should be focused
336
+ await waitFor(() => expect(firstNameInput).toHaveFocus());
337
+ });
338
+
339
+ it('should focus the first field with error even if not the first field in form', async () => {
340
+ function TestForm() {
341
+ const form = useForm({
342
+ defaultValues: {
343
+ firstName: 'Valid',
344
+ lastName: '',
345
+ email: '',
346
+ },
347
+ shouldFocusError: false,
348
+ });
349
+
350
+ const { focusOnError } = useFieldFocusManager({
351
+ control: form.control,
352
+ subscribe: form.subscribe,
353
+ setFocus: form.setFocus,
354
+ });
355
+
356
+ return (
357
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
358
+ <input
359
+ {...form.register('firstName')}
360
+ data-testid="firstName"
361
+ placeholder="First Name"
362
+ />
363
+ <input
364
+ {...form.register('lastName', {
365
+ required: 'Last name is required',
366
+ })}
367
+ data-testid="lastName"
368
+ placeholder="Last Name"
369
+ />
370
+ <input
371
+ {...form.register('email', { required: 'Email is required' })}
372
+ data-testid="email"
373
+ placeholder="Email"
374
+ />
375
+ <button type="submit" data-testid="submit">
376
+ Submit
377
+ </button>
378
+ </form>
379
+ );
380
+ }
381
+
382
+ render(<TestForm />);
383
+
384
+ const lastNameInput = screen.getByTestId('lastName');
385
+ const submitButton = screen.getByTestId('submit');
386
+
387
+ // Submit form to trigger validation errors
388
+ fireEvent.click(submitButton);
389
+
390
+ // Wait for focus to be applied
391
+ await act(async () => {
392
+ await new Promise((resolve) => setTimeout(resolve, 50));
393
+ });
394
+
395
+ // lastName should be focused as it's the first field with an error
396
+ expect(lastNameInput).toHaveFocus();
397
+ });
398
+
399
+ it('should not focus any field when there are no errors', async () => {
400
+ function TestForm() {
401
+ const form = useForm({
402
+ defaultValues: {
403
+ firstName: 'John',
404
+ lastName: 'Doe',
405
+ email: 'john@example.com',
406
+ },
407
+ shouldFocusError: false,
408
+ });
409
+
410
+ const { focusOnError } = useFieldFocusManager({
411
+ control: form.control,
412
+ subscribe: form.subscribe,
413
+ setFocus: form.setFocus,
414
+ });
415
+
416
+ return (
417
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
418
+ <input
419
+ {...form.register('firstName', {
420
+ required: 'First name is required',
421
+ })}
422
+ data-testid="input"
423
+ placeholder="First Name"
424
+ />
425
+ <input
426
+ {...form.register('lastName', {
427
+ required: 'Last name is required',
428
+ })}
429
+ data-testid="input"
430
+ placeholder="Last Name"
431
+ />
432
+ <input
433
+ {...form.register('email', { required: 'Email is required' })}
434
+ data-testid="input"
435
+ placeholder="Email"
436
+ />
437
+ <button type="submit" data-testid="submit">
438
+ Submit
439
+ </button>
440
+ </form>
441
+ );
442
+ }
443
+
444
+ render(<TestForm />);
445
+
446
+ const submitButton = screen.getByTestId('submit');
447
+
448
+ // Submit form - should not trigger any focus since all fields are valid
449
+ fireEvent.click(submitButton);
450
+
451
+ // Wait for any potential focus changes
452
+ await act(async () => {
453
+ await new Promise((resolve) => setTimeout(resolve, 50));
454
+ });
455
+
456
+ // No input should be focused (submit button should retain focus)
457
+ for (const input of screen.getAllByTestId('input')) {
458
+ expect(input).not.toHaveFocus();
459
+ }
460
+ });
461
+
462
+ it('should focus fields in correct DOM order regardless of registration order', async () => {
463
+ function SimpleOrderTest() {
464
+ const form = useForm({
465
+ defaultValues: {
466
+ field1: 'valid',
467
+ field2: '',
468
+ field3: '',
469
+ },
470
+ shouldFocusError: false,
471
+ });
472
+
473
+ const { focusOnError } = useFieldFocusManager({
474
+ control: form.control,
475
+ subscribe: form.subscribe,
476
+ setFocus: form.setFocus,
477
+ });
478
+
479
+ return (
480
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
481
+ <input {...form.register('field1')} data-testid="field1" />
482
+ <input
483
+ {...form.register('field2', { required: 'Required' })}
484
+ data-testid="field2"
485
+ />
486
+ <input
487
+ {...form.register('field3', { required: 'Required' })}
488
+ data-testid="field3"
489
+ />
490
+ <button type="submit" data-testid="submit">
491
+ Submit
492
+ </button>
493
+ </form>
494
+ );
495
+ }
496
+
497
+ render(<SimpleOrderTest />);
498
+
499
+ const submitButton = screen.getByTestId('submit');
500
+ fireEvent.click(submitButton);
501
+
502
+ await act(async () => {
503
+ await new Promise((resolve) => setTimeout(resolve, 50));
504
+ });
505
+
506
+ // field2 should be focused as it's the first field with an error in DOM order
507
+ const field2Input = screen.getByTestId('field2');
508
+ expect(field2Input).toHaveFocus();
509
+ });
510
+ });
511
+
512
+ describe('FieldArray support', () => {
513
+ it('should focus first field array field with error', async () => {
514
+ render(<TestFieldArrayComponent />);
515
+
516
+ const submitButton = screen.getByTestId('submit');
517
+
518
+ // Submit form to trigger validation errors on the first user's name field
519
+ fireEvent.click(submitButton);
520
+
521
+ await act(async () => {
522
+ await new Promise((resolve) => setTimeout(resolve, 50));
523
+ });
524
+
525
+ // First field in first user should be focused (users.0.name)
526
+ const firstUserNameInput = screen.getByTestId('user-0-name');
527
+ expect(firstUserNameInput).toHaveFocus();
528
+ });
529
+
530
+ it('should focus field arrays in DOM order', async () => {
531
+ render(<TestFieldArrayComponent />);
532
+
533
+ const addUserButton = screen.getByTestId('add-user');
534
+
535
+ // Add another user (but don't add items yet)
536
+ fireEvent.click(addUserButton);
537
+
538
+ // Fill in the first user's fields to make them valid
539
+ const firstUserName = screen.getByTestId('user-0-name');
540
+ const firstUserEmail = screen.getByTestId('user-0-email');
541
+
542
+ fireEvent.change(firstUserName, { target: { value: 'John' } });
543
+ fireEvent.change(firstUserEmail, {
544
+ target: { value: 'john@example.com' },
545
+ });
546
+
547
+ // Also fill in the first item's title to make it valid
548
+ const firstItemTitle = screen.getByTestId('item-0-title');
549
+ fireEvent.change(firstItemTitle, { target: { value: 'Valid Title' } });
550
+
551
+ const submitButton = screen.getByTestId('submit');
552
+ fireEvent.click(submitButton);
553
+
554
+ await act(async () => {
555
+ await new Promise((resolve) => setTimeout(resolve, 50));
556
+ });
557
+
558
+ // Should focus the second user's name field (first error in DOM order)
559
+ const secondUserNameInput = screen.getByTestId('user-1-name');
560
+ expect(secondUserNameInput).toHaveFocus();
561
+ });
562
+
563
+ it('should handle dynamically added field array items', async () => {
564
+ render(<TestFieldArrayComponent />);
565
+
566
+ const addUserButton = screen.getByTestId('add-user');
567
+ const addItemButton = screen.getByTestId('add-item');
568
+
569
+ // Add multiple users and items
570
+ fireEvent.click(addUserButton);
571
+ fireEvent.click(addUserButton);
572
+ fireEvent.click(addItemButton);
573
+
574
+ // Verify elements were added
575
+ expect(screen.getByTestId('user-0-name')).toBeInTheDocument();
576
+ expect(screen.getByTestId('user-1-name')).toBeInTheDocument();
577
+ expect(screen.getByTestId('user-2-name')).toBeInTheDocument();
578
+ expect(screen.getByTestId('item-0-title')).toBeInTheDocument();
579
+
580
+ const submitButton = screen.getByTestId('submit');
581
+ fireEvent.click(submitButton);
582
+
583
+ await act(async () => {
584
+ await new Promise((resolve) => setTimeout(resolve, 50));
585
+ });
586
+
587
+ // Should focus the first field with an error (first user's name)
588
+ const firstUserNameInput = screen.getByTestId('user-0-name');
589
+ expect(firstUserNameInput).toHaveFocus();
590
+ });
591
+
592
+ it('should focus items array fields when users are valid', async () => {
593
+ render(<TestFieldArrayComponent />);
594
+
595
+ const addItemButton = screen.getByTestId('add-item');
596
+ fireEvent.click(addItemButton);
597
+
598
+ // Fill in user fields to make them valid
599
+ const userNameInput = screen.getByTestId('user-0-name');
600
+ const userEmailInput = screen.getByTestId('user-0-email');
601
+
602
+ fireEvent.change(userNameInput, { target: { value: 'John' } });
603
+ fireEvent.change(userEmailInput, {
604
+ target: { value: 'john@example.com' },
605
+ });
606
+
607
+ const submitButton = screen.getByTestId('submit');
608
+ fireEvent.click(submitButton);
609
+
610
+ await act(async () => {
611
+ await new Promise((resolve) => setTimeout(resolve, 50));
612
+ });
613
+
614
+ // Should focus the first item's title field (first error in items array)
615
+ const firstItemTitleInput = screen.getByTestId('item-0-title');
616
+ expect(firstItemTitleInput).toHaveFocus();
617
+ });
618
+
619
+ it('should handle mixed field array and regular field errors', async () => {
620
+ function MixedFieldsForm() {
621
+ const form = useForm({
622
+ defaultValues: {
623
+ regularField: '',
624
+ users: [{ name: '', email: '' }],
625
+ },
626
+ shouldFocusError: false,
627
+ });
628
+
629
+ const { fields } = useFieldArray({
630
+ control: form.control,
631
+ name: 'users',
632
+ });
633
+
634
+ const { focusOnError } = useFieldFocusManager({
635
+ control: form.control,
636
+ subscribe: form.subscribe,
637
+ setFocus: form.setFocus,
638
+ });
639
+
640
+ return (
641
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
642
+ <input
643
+ {...form.register('regularField', {
644
+ required: 'Regular field is required',
645
+ })}
646
+ data-testid="regular-field"
647
+ placeholder="Regular Field"
648
+ />
649
+
650
+ {fields.map((field, index) => (
651
+ <div key={field.id}>
652
+ <input
653
+ {...form.register(`users.${index}.name`, {
654
+ required: 'Name is required',
655
+ })}
656
+ data-testid={`user-${index}-name`}
657
+ placeholder={`User ${index} Name`}
658
+ />
659
+ </div>
660
+ ))}
661
+
662
+ <button type="submit" data-testid="submit">
663
+ Submit
664
+ </button>
665
+ </form>
666
+ );
667
+ }
668
+
669
+ render(<MixedFieldsForm />);
670
+
671
+ const submitButton = screen.getByTestId('submit');
672
+ fireEvent.click(submitButton);
673
+
674
+ await act(async () => {
675
+ await new Promise((resolve) => setTimeout(resolve, 50));
676
+ });
677
+
678
+ // Should focus the regular field first (appears first in DOM)
679
+ const regularFieldInput = screen.getByTestId('regular-field');
680
+ expect(regularFieldInput).toHaveFocus();
681
+ });
682
+ });
683
+
684
+ describe('nested FieldArrays', () => {
685
+ it('should focus nested field array fields', async () => {
686
+ render(<TestNestedFieldArrayComponent />);
687
+
688
+ const submitButton = screen.getByTestId('submit');
689
+ fireEvent.click(submitButton);
690
+
691
+ await act(async () => {
692
+ await new Promise((resolve) => setTimeout(resolve, 50));
693
+ });
694
+
695
+ // Should focus the project name field first
696
+ const projectNameInput = screen.getByTestId('project-0-name');
697
+ expect(projectNameInput).toHaveFocus();
698
+ });
699
+
700
+ it('should focus nested task fields when project name is valid', async () => {
701
+ render(<TestNestedFieldArrayComponent />);
702
+
703
+ // Fill in project name to make it valid
704
+ const projectNameInput = screen.getByTestId('project-0-name');
705
+ fireEvent.change(projectNameInput, { target: { value: 'Project 1' } });
706
+
707
+ const submitButton = screen.getByTestId('submit');
708
+ fireEvent.click(submitButton);
709
+
710
+ await act(async () => {
711
+ await new Promise((resolve) => setTimeout(resolve, 50));
712
+ });
713
+
714
+ // Should focus the first task's title field
715
+ const taskTitleInput = screen.getByTestId('project-0-task-0-title');
716
+ expect(taskTitleInput).toHaveFocus();
717
+ });
718
+
719
+ it('should handle adding nested field arrays dynamically', async () => {
720
+ render(<TestNestedFieldArrayComponent />);
721
+
722
+ const addProjectButton = screen.getByTestId('add-project');
723
+ const addTaskButton = screen.getByTestId('add-task-0');
724
+
725
+ // Add another project and task
726
+ fireEvent.click(addProjectButton);
727
+ fireEvent.click(addTaskButton);
728
+
729
+ // Verify elements were added
730
+ expect(screen.getByTestId('project-0-name')).toBeInTheDocument();
731
+ expect(screen.getByTestId('project-1-name')).toBeInTheDocument();
732
+ expect(screen.getByTestId('project-0-task-0-title')).toBeInTheDocument();
733
+ expect(screen.getByTestId('project-0-task-1-title')).toBeInTheDocument();
734
+
735
+ const submitButton = screen.getByTestId('submit');
736
+ fireEvent.click(submitButton);
737
+
738
+ await act(async () => {
739
+ await new Promise((resolve) => setTimeout(resolve, 50));
740
+ });
741
+
742
+ // Should focus the first project's name field
743
+ const firstProjectNameInput = screen.getByTestId('project-0-name');
744
+ expect(firstProjectNameInput).toHaveFocus();
745
+ });
746
+
747
+ it('should focus deeply nested fields in correct order', async () => {
748
+ render(<TestNestedFieldArrayComponent />);
749
+
750
+ // Fill in first project name and first task title to test deep nesting
751
+ const projectNameInput = screen.getByTestId('project-0-name');
752
+ const taskTitleInput = screen.getByTestId('project-0-task-0-title');
753
+
754
+ fireEvent.change(projectNameInput, { target: { value: 'Project 1' } });
755
+ fireEvent.change(taskTitleInput, { target: { value: 'Task 1' } });
756
+
757
+ const submitButton = screen.getByTestId('submit');
758
+ fireEvent.click(submitButton);
759
+
760
+ await act(async () => {
761
+ await new Promise((resolve) => setTimeout(resolve, 50));
762
+ });
763
+
764
+ // Should focus the first task's assignee field (next field with error)
765
+ const taskAssigneeInput = screen.getByTestId('project-0-task-0-assignee');
766
+ expect(taskAssigneeInput).toHaveFocus();
767
+ });
768
+ });
769
+
770
+ describe('custom focusable elements', () => {
771
+ it('should register and focus custom elements', async () => {
772
+ function TestForm() {
773
+ const form = useForm({
774
+ defaultValues: {
775
+ firstName: '',
776
+ },
777
+ shouldFocusError: false,
778
+ });
779
+
780
+ const { registerCustomFocusableElement, focusOnError } =
781
+ useFieldFocusManager({
782
+ control: form.control,
783
+ subscribe: form.subscribe,
784
+ setFocus: form.setFocus,
785
+ });
786
+
787
+ return (
788
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
789
+ <input
790
+ {...form.register('firstName', {
791
+ required: 'First name is required',
792
+ })}
793
+ data-testid="firstName"
794
+ placeholder="First Name"
795
+ />
796
+ <div
797
+ data-testid="custom-element"
798
+ tabIndex={0}
799
+ ref={(el) => {
800
+ if (el) {
801
+ registerCustomFocusableElement('customField', el);
802
+ }
803
+ }}
804
+ >
805
+ Custom focusable element
806
+ </div>
807
+ <button type="submit" data-testid="submit">
808
+ Submit
809
+ </button>
810
+ </form>
811
+ );
812
+ }
813
+
814
+ render(<TestForm />);
815
+
816
+ const submitButton = screen.getByTestId('submit');
817
+
818
+ // Submit form to trigger validation errors
819
+ fireEvent.click(submitButton);
820
+
821
+ // Wait for focus to be applied
822
+ await act(async () => {
823
+ await new Promise((resolve) => setTimeout(resolve, 50));
824
+ });
825
+
826
+ // First field should still be focused since it has an error
827
+ const firstNameInput = screen.getByTestId('firstName');
828
+ expect(firstNameInput).toHaveFocus();
829
+ });
830
+
831
+ it('should return an unregister function', () => {
832
+ let registerFunction: any;
833
+
834
+ render(
835
+ <TestFormComponent
836
+ onRegisterElement={(register) => {
837
+ registerFunction = register;
838
+ }}
839
+ />
840
+ );
841
+
842
+ const mockElement = document.createElement('div');
843
+ const unregister = registerFunction('testField', mockElement);
844
+
845
+ expect(unregister).toBeInstanceOf(Function);
846
+ });
847
+
848
+ it('should register custom elements for field array items', async () => {
849
+ function TestFormWithCustomElements() {
850
+ const form = useForm({
851
+ defaultValues: {
852
+ items: [{ customField: '' }],
853
+ },
854
+ shouldFocusError: false,
855
+ });
856
+
857
+ const { fields } = useFieldArray({
858
+ control: form.control,
859
+ name: 'items',
860
+ });
861
+
862
+ const { registerCustomFocusableElement, focusOnError } =
863
+ useFieldFocusManager({
864
+ control: form.control,
865
+ subscribe: form.subscribe,
866
+ setFocus: form.setFocus,
867
+ });
868
+
869
+ return (
870
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
871
+ {fields.map((field, index) => (
872
+ <div key={field.id}>
873
+ <div
874
+ data-testid={`custom-element-${index}`}
875
+ tabIndex={0}
876
+ ref={(el) => {
877
+ if (el) {
878
+ registerCustomFocusableElement(
879
+ `items.${index}.customField`,
880
+ el
881
+ );
882
+ }
883
+ }}
884
+ >
885
+ Custom element {index}
886
+ </div>
887
+ </div>
888
+ ))}
889
+ <button type="submit" data-testid="submit">
890
+ Submit
891
+ </button>
892
+ </form>
893
+ );
894
+ }
895
+
896
+ render(<TestFormWithCustomElements />);
897
+
898
+ const customElement = screen.getByTestId('custom-element-0');
899
+ expect(customElement).toBeInTheDocument();
900
+
901
+ // The custom element should be registered and available for focusing
902
+ expect(customElement.tabIndex).toBe(0);
903
+ });
904
+ });
905
+
906
+ describe('enabled/disabled behavior', () => {
907
+ it('should not focus fields when disabled', async () => {
908
+ render(<TestFormComponent enabled={false} />);
909
+
910
+ const firstNameInput = screen.getByTestId('firstName');
911
+ const submitButton = screen.getByTestId('submit');
912
+
913
+ // Submit form to trigger validation errors
914
+ fireEvent.click(submitButton);
915
+
916
+ // Wait for any potential focus changes
917
+ await act(async () => {
918
+ await new Promise((resolve) => setTimeout(resolve, 50));
919
+ });
920
+
921
+ // No field should be focused since the hook is disabled
922
+ expect(firstNameInput).not.toHaveFocus();
923
+ });
924
+
925
+ it('should not focus field array fields when disabled', async () => {
926
+ render(<TestFieldArrayComponent enabled={false} />);
927
+
928
+ const submitButton = screen.getByTestId('submit');
929
+ fireEvent.click(submitButton);
930
+
931
+ await act(async () => {
932
+ await new Promise((resolve) => setTimeout(resolve, 50));
933
+ });
934
+
935
+ // No field should be focused since the hook is disabled
936
+ const firstUserNameInput = screen.getByTestId('user-0-name');
937
+ expect(firstUserNameInput).not.toHaveFocus();
938
+ });
939
+ });
940
+
941
+ describe('edge cases', () => {
942
+ it('should handle form with no fields', () => {
943
+ function EmptyForm() {
944
+ const form = useForm();
945
+ useFieldFocusManager({
946
+ control: form.control,
947
+ subscribe: form.subscribe,
948
+ setFocus: form.setFocus,
949
+ });
950
+
951
+ return (
952
+ <form>
953
+ <button type="submit">Submit</button>
954
+ </form>
955
+ );
956
+ }
957
+
958
+ expect(() => render(<EmptyForm />)).not.toThrow();
959
+ });
960
+
961
+ it('should handle unregistering custom elements', () => {
962
+ let registerFunction: any;
963
+
964
+ render(
965
+ <TestFormComponent
966
+ onRegisterElement={(register) => {
967
+ registerFunction = register;
968
+ }}
969
+ />
970
+ );
971
+
972
+ const mockElement = document.createElement('div');
973
+ const unregister = registerFunction('testField', mockElement);
974
+
975
+ // Should not throw when unregistering
976
+ expect(() => unregister()).not.toThrow();
977
+ });
978
+
979
+ it('should handle empty field arrays', async () => {
980
+ function EmptyFieldArrayForm() {
981
+ const form = useForm({
982
+ defaultValues: {
983
+ items: [],
984
+ },
985
+ shouldFocusError: false,
986
+ });
987
+
988
+ const { fields } = useFieldArray({
989
+ control: form.control,
990
+ // @ts-expect-error it expects `never`
991
+ name: 'items',
992
+ });
993
+
994
+ useFieldFocusManager({
995
+ control: form.control,
996
+ subscribe: form.subscribe,
997
+ setFocus: form.setFocus,
998
+ });
999
+
1000
+ return (
1001
+ <form onSubmit={form.handleSubmit(() => {})}>
1002
+ {fields.map((field, index) => (
1003
+ <input
1004
+ key={field.id}
1005
+ {...form.register(`items.${index}.title` as any)}
1006
+ data-testid={`item-${index}-title`}
1007
+ />
1008
+ ))}
1009
+ <button type="submit" data-testid="submit">
1010
+ Submit
1011
+ </button>
1012
+ </form>
1013
+ );
1014
+ }
1015
+
1016
+ render(<EmptyFieldArrayForm />);
1017
+
1018
+ const submitButton = screen.getByTestId('submit');
1019
+
1020
+ // Should not throw when submitting form with empty field arrays
1021
+ expect(() => fireEvent.click(submitButton)).not.toThrow();
1022
+
1023
+ await act(async () => {
1024
+ await new Promise((resolve) => setTimeout(resolve, 50));
1025
+ });
1026
+
1027
+ // No errors should occur and no elements should be focused
1028
+ expect(screen.queryByTestId('item-0-title')).not.toBeInTheDocument();
1029
+ });
1030
+
1031
+ it('should handle field arrays with non-sequential indices', async () => {
1032
+ function NonSequentialFieldArrayForm() {
1033
+ const form = useForm({
1034
+ defaultValues: {
1035
+ items: { 0: { title: '' }, 2: { title: '' } },
1036
+ },
1037
+ shouldFocusError: false,
1038
+ });
1039
+
1040
+ const { focusOnError } = useFieldFocusManager({
1041
+ control: form.control,
1042
+ subscribe: form.subscribe,
1043
+ setFocus: form.setFocus,
1044
+ });
1045
+
1046
+ return (
1047
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
1048
+ <input
1049
+ {...form.register('items.0.title' as any, {
1050
+ required: 'Title required',
1051
+ })}
1052
+ data-testid="item-0-title"
1053
+ />
1054
+ <input
1055
+ {...form.register('items.2.title' as any, {
1056
+ required: 'Title required',
1057
+ })}
1058
+ data-testid="item-2-title"
1059
+ />
1060
+ <button type="submit" data-testid="submit">
1061
+ Submit
1062
+ </button>
1063
+ </form>
1064
+ );
1065
+ }
1066
+
1067
+ render(<NonSequentialFieldArrayForm />);
1068
+
1069
+ const submitButton = screen.getByTestId('submit');
1070
+ fireEvent.click(submitButton);
1071
+
1072
+ // Should focus the first field in DOM order
1073
+ await waitFor(() => {
1074
+ const firstItemInput = screen.getByTestId('item-0-title');
1075
+ expect(firstItemInput).toHaveFocus();
1076
+ });
1077
+ });
1078
+ });
1079
+ });