@digigov/form 2.0.0-16da9467 → 2.0.0-16fbe090

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 (711) 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 +1 -1
  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 -118
  11. package/Field/types.d.ts +14 -11
  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 +184 -382
  33. package/FieldArray/index.d.ts +4 -2
  34. package/FieldArray/index.js +61 -129
  35. package/FieldObject/index.d.ts +4 -4
  36. package/FieldObject/index.js +52 -84
  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 -235
  44. package/FormContext.d.ts +2 -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 -119
  50. package/MultiplicityField/types.d.ts +2 -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 -78
  93. package/inputs/DateInput/index.d.ts +2 -5
  94. package/inputs/DateInput/index.js +124 -143
  95. package/inputs/DateTimeInput/index.d.ts +2 -5
  96. package/inputs/DateTimeInput/index.js +178 -203
  97. package/inputs/FileInput/index.d.ts +4 -4
  98. package/inputs/FileInput/index.js +54 -81
  99. package/inputs/ImageInput/index.d.ts +2 -2
  100. package/inputs/ImageInput/index.js +74 -74
  101. package/inputs/Input/index.d.ts +3 -1
  102. package/inputs/Input/index.js +60 -69
  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 -141
  107. package/inputs/Radio/index.d.ts +6 -4
  108. package/inputs/Radio/index.js +71 -102
  109. package/inputs/Select/index.d.ts +4 -2
  110. package/inputs/Select/index.js +23 -32
  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 +8 -8
  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 +3 -2
  124. package/src/Field/FieldBaseContainer.tsx +3 -2
  125. package/src/Field/FieldConditional.tsx +1 -1
  126. package/src/Field/index.tsx +16 -36
  127. package/src/Field/types.tsx +14 -12
  128. package/src/Field/utils/evaluateFieldWithConditions.ts +5 -2
  129. package/src/Field/utils/resolveField.ts +58 -0
  130. package/src/Field/utils/useField.ts +3 -1
  131. package/src/FieldArray/BaseFieldArray.tsx +97 -0
  132. package/src/FieldArray/FieldArray.stories.js +1 -0
  133. package/src/FieldArray/FormDialog/ArrayDisplay/ArrayContainerDisplay.tsx +45 -0
  134. package/src/FieldArray/FormDialog/ArrayDisplay/ArrayDisplay.stories.js +14 -0
  135. package/src/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay.tsx +337 -0
  136. package/src/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader.tsx +15 -0
  137. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/Cards.tsx +88 -0
  138. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/Default.tsx +93 -0
  139. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/ReadOnly.tsx +79 -0
  140. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/ReadOnlyCards.tsx +75 -0
  141. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/Sortable.tsx +93 -0
  142. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/SortableCards.tsx +88 -0
  143. package/src/FieldArray/FormDialog/ArrayDisplay/index.test.tsx +44 -0
  144. package/src/FieldArray/FormDialog/ArrayDisplay/index.tsx +67 -0
  145. package/src/FieldArray/FormDialog/ArrayEditModal.tsx +241 -0
  146. package/src/FieldArray/FormDialog/index.tsx +302 -0
  147. package/src/FieldArray/__stories__/CardsWithError.tsx +124 -0
  148. package/src/FieldArray/__tests__/fieldset-multiplicity.spec.tsx +271 -0
  149. package/src/FieldArray/__tests__/multiplicity-attachment.spec.tsx +280 -0
  150. package/src/FieldArray/__tests__/multiplicity-optional.spec.tsx +232 -0
  151. package/src/FieldArray/__tests__/multiplicity-required.spec.tsx +170 -0
  152. package/src/FieldArray/__tests__/nested-fieldset-multiplicity.spec.tsx +627 -0
  153. package/src/FieldArray/__tests__/preference-multiple-choice.spec.tsx +222 -0
  154. package/src/FieldArray/index.spec.tsx +355 -0
  155. package/src/FieldArray/index.test.tsx +4 -0
  156. package/src/FieldArray/index.tsx +37 -84
  157. package/src/FieldObject/index.tsx +9 -17
  158. package/src/Fieldset/FieldsetWithContext.tsx +1 -1
  159. package/src/Fieldset/index.tsx +1 -1
  160. package/src/Fieldset/types.tsx +2 -2
  161. package/src/FormBuilder/doc.mdx +1 -1
  162. package/src/FormBuilder/index.tsx +190 -144
  163. package/src/FormBuilder/scenarios.test.tsx +43 -4
  164. package/src/FormContext.tsx +3 -2
  165. package/src/MultiplicityField/__stories__/PreviewDisplay.tsx +1 -3
  166. package/src/MultiplicityField/add-objects.tsx +12 -21
  167. package/src/MultiplicityField/index.tsx +3 -2
  168. package/src/MultiplicityField/types.ts +5 -2
  169. package/src/Questions/Questions.tsx +2 -2
  170. package/src/Questions/QuestionsContext.tsx +1 -1
  171. package/src/Questions/Step/Step.tsx +1 -1
  172. package/src/Questions/Step/StepArrayReview.tsx +2 -2
  173. package/src/Questions/Step/StepContext.tsx +1 -1
  174. package/src/Questions/Step/StepDescription.tsx +2 -1
  175. package/src/Questions/Step/StepForm.tsx +2 -2
  176. package/src/Questions/Step/StepQuote.tsx +2 -1
  177. package/src/Questions/Step/StepTitle.tsx +2 -1
  178. package/src/Questions/Step/getAddMoreFields.tsx +2 -2
  179. package/src/Questions/Step/types.tsx +1 -1
  180. package/src/Questions/getNextStep.tsx +1 -1
  181. package/src/Questions/types.tsx +1 -1
  182. package/src/hooks/__tests__/useFieldFocusManager.spec.tsx +1079 -0
  183. package/src/hooks/__tests__/utils.spec.ts +568 -0
  184. package/src/hooks/useFieldFocusManager.ts +162 -0
  185. package/src/hooks/utils.ts +122 -0
  186. package/src/inputs/AutoCompleteInput/doc.mdx +2 -2
  187. package/src/inputs/AutoCompleteInput/index.tsx +4 -6
  188. package/src/inputs/Checkboxes/doc.mdx +3 -3
  189. package/src/inputs/Checkboxes/index.tsx +98 -87
  190. package/src/inputs/DateInput/doc.mdx +1 -1
  191. package/src/inputs/DateInput/index.tsx +19 -6
  192. package/src/inputs/DateTimeInput/doc.mdx +1 -1
  193. package/src/inputs/DateTimeInput/index.tsx +19 -6
  194. package/src/inputs/FileInput/doc.mdx +1 -1
  195. package/src/inputs/FileInput/index.tsx +15 -21
  196. package/src/inputs/ImageInput/doc.mdx +3 -3
  197. package/src/inputs/ImageInput/index.tsx +6 -6
  198. package/src/inputs/Input/Input.stories.js +1 -0
  199. package/src/inputs/Input/__stories__/Rate.tsx +25 -0
  200. package/src/inputs/Input/doc.mdx +10 -10
  201. package/src/inputs/Input/index.test.tsx +4 -0
  202. package/src/inputs/Input/index.tsx +15 -8
  203. package/src/inputs/Label/doc.mdx +1 -1
  204. package/src/inputs/Label/index.tsx +1 -1
  205. package/src/inputs/OtpInput/doc.mdx +1 -1
  206. package/src/inputs/OtpInput/index.tsx +43 -34
  207. package/src/inputs/Radio/doc.mdx +3 -3
  208. package/src/inputs/Radio/index.tsx +33 -22
  209. package/src/inputs/Select/doc.mdx +1 -1
  210. package/src/inputs/Select/index.tsx +6 -4
  211. package/src/{Field/utils/index.ts → inputs/registry.ts} +3 -1
  212. package/src/{lazy.js → lazy.ts} +7 -29
  213. package/src/{registry.js → registry.ts} +29 -15
  214. package/src/types.tsx +13 -5
  215. package/src/utils.ts +14 -2
  216. package/src/validators/index.ts +33 -11
  217. package/src/validators/types.ts +1 -1
  218. package/src/validators/utils/date.ts +2 -2
  219. package/src/validators/utils/datetime.ts +2 -2
  220. package/src/validators/utils/email.ts +11 -0
  221. package/src/validators/utils/file.ts +2 -2
  222. package/src/validators/utils/iban.ts +2 -2
  223. package/src/validators/utils/image.ts +2 -2
  224. package/src/validators/utils/index.ts +9 -5
  225. package/src/validators/utils/int.ts +1 -1
  226. package/src/validators/utils/number.ts +1 -1
  227. package/src/validators/utils/otp.ts +2 -2
  228. package/src/validators/utils/phone.ts +2 -2
  229. package/src/validators/utils/postal_code.ts +2 -2
  230. package/src/validators/utils/text_limit.ts +2 -2
  231. package/types.d.ts +10 -5
  232. package/types.js +1 -0
  233. package/utils.d.ts +2 -1
  234. package/utils.js +56 -0
  235. package/validators/index.d.ts +5 -5
  236. package/validators/index.js +112 -145
  237. package/validators/types.d.ts +1 -1
  238. package/validators/types.js +0 -0
  239. package/validators/utils/afm.js +19 -0
  240. package/validators/utils/amka.js +27 -0
  241. package/validators/utils/date.d.ts +2 -2
  242. package/validators/utils/date.js +95 -0
  243. package/validators/utils/datetime.d.ts +2 -2
  244. package/validators/utils/datetime.js +121 -0
  245. package/validators/utils/email.d.ts +5 -0
  246. package/validators/utils/email.js +10 -0
  247. package/validators/utils/file.d.ts +2 -2
  248. package/validators/utils/file.js +31 -0
  249. package/validators/utils/iban.d.ts +2 -2
  250. package/validators/utils/iban.js +104 -0
  251. package/validators/utils/image.d.ts +2 -2
  252. package/validators/utils/image.js +65 -0
  253. package/validators/utils/index.d.ts +14 -14
  254. package/validators/utils/index.js +59 -93
  255. package/validators/utils/int.d.ts +1 -1
  256. package/validators/utils/int.js +13 -0
  257. package/validators/utils/number.d.ts +1 -1
  258. package/validators/utils/number.js +12 -0
  259. package/validators/utils/otp.d.ts +2 -2
  260. package/validators/utils/otp.js +21 -0
  261. package/validators/utils/phone.d.ts +2 -2
  262. package/validators/utils/phone.js +198 -0
  263. package/validators/utils/postal_code.d.ts +2 -2
  264. package/validators/utils/postal_code.js +18 -0
  265. package/validators/utils/text_limit.d.ts +2 -2
  266. package/validators/utils/text_limit.js +34 -0
  267. package/validators/utils/uuid4.js +14 -0
  268. package/Field/ErrorGroup/index.js +0 -48
  269. package/Field/ErrorGroup/package.json +0 -6
  270. package/Field/ErrorGroup.js.map +0 -7
  271. package/Field/FieldBase/index.js +0 -121
  272. package/Field/FieldBase/package.json +0 -6
  273. package/Field/FieldBase.js.map +0 -7
  274. package/Field/FieldBaseContainer/index.js +0 -52
  275. package/Field/FieldBaseContainer/package.json +0 -6
  276. package/Field/FieldBaseContainer.js.map +0 -7
  277. package/Field/FieldConditional/index.js +0 -89
  278. package/Field/FieldConditional/package.json +0 -6
  279. package/Field/FieldConditional.js.map +0 -7
  280. package/Field/index.js.map +0 -7
  281. package/Field/package.json +0 -6
  282. package/Field/types/index.js +0 -1
  283. package/Field/types/package.json +0 -6
  284. package/Field/types.js.map +0 -7
  285. package/Field/utils/calculateField/index.js +0 -27
  286. package/Field/utils/calculateField/package.json +0 -6
  287. package/Field/utils/calculateField.d.ts +0 -2
  288. package/Field/utils/calculateField.js.map +0 -7
  289. package/Field/utils/evaluateFieldWithConditions/index.js +0 -26
  290. package/Field/utils/evaluateFieldWithConditions/package.json +0 -6
  291. package/Field/utils/evaluateFieldWithConditions.js.map +0 -7
  292. package/Field/utils/index.js +0 -86
  293. package/Field/utils/index.js.map +0 -7
  294. package/Field/utils/package.json +0 -6
  295. package/Field/utils/useField/index.js +0 -64
  296. package/Field/utils/useField/package.json +0 -6
  297. package/Field/utils/useField.js.map +0 -7
  298. package/FieldArray/FieldArray.stories.d.ts +0 -10
  299. package/FieldArray/FormDialog/package.json +0 -6
  300. package/FieldArray/FormDialog.d.ts +0 -66
  301. package/FieldArray/FormDialog.js.map +0 -7
  302. package/FieldArray/__stories__/Default.d.ts +0 -2
  303. package/FieldArray/__stories__/WithExactLength.d.ts +0 -2
  304. package/FieldArray/__stories__/WithModal.d.ts +0 -2
  305. package/FieldArray/index.js.map +0 -7
  306. package/FieldArray/index.test.d.ts +0 -1
  307. package/FieldArray/package.json +0 -6
  308. package/FieldObject/index.js.map +0 -7
  309. package/FieldObject/package.json +0 -6
  310. package/Fieldset/FieldsetWithContext/index.js +0 -31
  311. package/Fieldset/FieldsetWithContext/package.json +0 -6
  312. package/Fieldset/FieldsetWithContext.js.map +0 -7
  313. package/Fieldset/index.js.map +0 -7
  314. package/Fieldset/package.json +0 -6
  315. package/Fieldset/types/index.js +0 -1
  316. package/Fieldset/types/package.json +0 -6
  317. package/Fieldset/types.js.map +0 -7
  318. package/Form.stories.d.ts +0 -4
  319. package/FormBuilder/FormBuilder.stories.d.ts +0 -12
  320. package/FormBuilder/__stories__/AutoErrorGrouping.d.ts +0 -3
  321. package/FormBuilder/__stories__/Default.d.ts +0 -3
  322. package/FormBuilder/__stories__/ErrorGrouping.d.ts +0 -3
  323. package/FormBuilder/index.js.map +0 -7
  324. package/FormBuilder/index.test.d.ts +0 -1
  325. package/FormBuilder/interaction.test.d.ts +0 -1
  326. package/FormBuilder/package.json +0 -6
  327. package/FormBuilder/scenarios.test.d.ts +0 -88
  328. package/FormContext/index.js +0 -13
  329. package/FormContext/package.json +0 -6
  330. package/FormContext.js.map +0 -7
  331. package/MultiplicityField/MultiplicityField.stories.d.ts +0 -15
  332. package/MultiplicityField/__stories__/Default.d.ts +0 -2
  333. package/MultiplicityField/__stories__/PreviewDisplay.d.ts +0 -2
  334. package/MultiplicityField/__stories__/WithExactLength.d.ts +0 -2
  335. package/MultiplicityField/__stories__/WithMaxLength.d.ts +0 -2
  336. package/MultiplicityField/__stories__/WithMinAndMaxLength.d.ts +0 -2
  337. package/MultiplicityField/__stories__/WithMinLength.d.ts +0 -2
  338. package/MultiplicityField/add-objects/index.js +0 -155
  339. package/MultiplicityField/add-objects/package.json +0 -6
  340. package/MultiplicityField/add-objects.js.map +0 -7
  341. package/MultiplicityField/index.js.map +0 -7
  342. package/MultiplicityField/index.test.d.ts +0 -1
  343. package/MultiplicityField/package.json +0 -6
  344. package/MultiplicityField/types/index.js +0 -1
  345. package/MultiplicityField/types/package.json +0 -6
  346. package/MultiplicityField/types.js.map +0 -7
  347. package/Questions/Questions/index.js +0 -67
  348. package/Questions/Questions/package.json +0 -6
  349. package/Questions/Questions.js.map +0 -7
  350. package/Questions/Questions.stories.d.ts +0 -10
  351. package/Questions/QuestionsContext/index.js +0 -11
  352. package/Questions/QuestionsContext/package.json +0 -6
  353. package/Questions/QuestionsContext.js.map +0 -7
  354. package/Questions/Step/ReviewStep/index.js +0 -38
  355. package/Questions/Step/ReviewStep/package.json +0 -6
  356. package/Questions/Step/ReviewStep.js.map +0 -7
  357. package/Questions/Step/Step/index.js +0 -54
  358. package/Questions/Step/Step/package.json +0 -6
  359. package/Questions/Step/Step.js.map +0 -7
  360. package/Questions/Step/StepArrayReview/index.js +0 -42
  361. package/Questions/Step/StepArrayReview/package.json +0 -6
  362. package/Questions/Step/StepArrayReview.js.map +0 -7
  363. package/Questions/Step/StepContext/index.js +0 -23
  364. package/Questions/Step/StepContext/package.json +0 -6
  365. package/Questions/Step/StepContext.js.map +0 -7
  366. package/Questions/Step/StepDescription/index.js +0 -24
  367. package/Questions/Step/StepDescription/package.json +0 -6
  368. package/Questions/Step/StepDescription.js.map +0 -7
  369. package/Questions/Step/StepForm/index.js +0 -34
  370. package/Questions/Step/StepForm/package.json +0 -6
  371. package/Questions/Step/StepForm.js.map +0 -7
  372. package/Questions/Step/StepQuote/index.js +0 -11
  373. package/Questions/Step/StepQuote/package.json +0 -6
  374. package/Questions/Step/StepQuote.js.map +0 -7
  375. package/Questions/Step/StepTitle/index.js +0 -44
  376. package/Questions/Step/StepTitle/package.json +0 -6
  377. package/Questions/Step/StepTitle.js.map +0 -7
  378. package/Questions/Step/getAddMoreFields/index.js +0 -29
  379. package/Questions/Step/getAddMoreFields/package.json +0 -6
  380. package/Questions/Step/getAddMoreFields.js.map +0 -7
  381. package/Questions/Step/index.js.map +0 -7
  382. package/Questions/Step/package.json +0 -6
  383. package/Questions/Step/types/index.js +0 -1
  384. package/Questions/Step/types/package.json +0 -6
  385. package/Questions/Step/types.js.map +0 -7
  386. package/Questions/__stories__/Default.d.ts +0 -3
  387. package/Questions/getNextStep/index.js +0 -22
  388. package/Questions/getNextStep/package.json +0 -6
  389. package/Questions/getNextStep.js.map +0 -7
  390. package/Questions/index.js.map +0 -7
  391. package/Questions/index.spec.d.ts +0 -1
  392. package/Questions/index.test.d.ts +0 -1
  393. package/Questions/package.json +0 -6
  394. package/Questions/types/index.js +0 -1
  395. package/Questions/types/package.json +0 -6
  396. package/Questions/types.js.map +0 -7
  397. package/cjs/Field/ErrorGroup/index.js +0 -82
  398. package/cjs/Field/ErrorGroup.js.map +0 -7
  399. package/cjs/Field/FieldBase/index.js +0 -154
  400. package/cjs/Field/FieldBase.js.map +0 -7
  401. package/cjs/Field/FieldBaseContainer/index.js +0 -85
  402. package/cjs/Field/FieldBaseContainer.js.map +0 -7
  403. package/cjs/Field/FieldConditional/index.js +0 -122
  404. package/cjs/Field/FieldConditional.js.map +0 -7
  405. package/cjs/Field/index.js +0 -150
  406. package/cjs/Field/index.js.map +0 -7
  407. package/cjs/Field/types/index.js +0 -16
  408. package/cjs/Field/types.js.map +0 -7
  409. package/cjs/Field/utils/calculateField/index.js +0 -50
  410. package/cjs/Field/utils/calculateField.js.map +0 -7
  411. package/cjs/Field/utils/evaluateFieldWithConditions/index.js +0 -49
  412. package/cjs/Field/utils/evaluateFieldWithConditions.js.map +0 -7
  413. package/cjs/Field/utils/index.js +0 -121
  414. package/cjs/Field/utils/index.js.map +0 -7
  415. package/cjs/Field/utils/useField/index.js +0 -87
  416. package/cjs/Field/utils/useField.js.map +0 -7
  417. package/cjs/FieldArray/FormDialog/index.js +0 -416
  418. package/cjs/FieldArray/FormDialog.js.map +0 -7
  419. package/cjs/FieldArray/index.js +0 -167
  420. package/cjs/FieldArray/index.js.map +0 -7
  421. package/cjs/FieldObject/index.js +0 -117
  422. package/cjs/FieldObject/index.js.map +0 -7
  423. package/cjs/Fieldset/FieldsetWithContext/index.js +0 -59
  424. package/cjs/Fieldset/FieldsetWithContext.js.map +0 -7
  425. package/cjs/Fieldset/index.js +0 -66
  426. package/cjs/Fieldset/index.js.map +0 -7
  427. package/cjs/Fieldset/types/index.js +0 -16
  428. package/cjs/Fieldset/types.js.map +0 -7
  429. package/cjs/FormBuilder/index.js +0 -277
  430. package/cjs/FormBuilder/index.js.map +0 -7
  431. package/cjs/FormContext/index.js +0 -37
  432. package/cjs/FormContext.js.map +0 -7
  433. package/cjs/MultiplicityField/add-objects/index.js +0 -183
  434. package/cjs/MultiplicityField/add-objects.js.map +0 -7
  435. package/cjs/MultiplicityField/index.js +0 -153
  436. package/cjs/MultiplicityField/index.js.map +0 -7
  437. package/cjs/MultiplicityField/types/index.js +0 -16
  438. package/cjs/MultiplicityField/types.js.map +0 -7
  439. package/cjs/Questions/Questions/index.js +0 -100
  440. package/cjs/Questions/Questions.js.map +0 -7
  441. package/cjs/Questions/QuestionsContext/index.js +0 -34
  442. package/cjs/Questions/QuestionsContext.js.map +0 -7
  443. package/cjs/Questions/Step/ReviewStep/index.js +0 -65
  444. package/cjs/Questions/Step/ReviewStep.js.map +0 -7
  445. package/cjs/Questions/Step/Step/index.js +0 -87
  446. package/cjs/Questions/Step/Step.js.map +0 -7
  447. package/cjs/Questions/Step/StepArrayReview/index.js +0 -67
  448. package/cjs/Questions/Step/StepArrayReview.js.map +0 -7
  449. package/cjs/Questions/Step/StepContext/index.js +0 -46
  450. package/cjs/Questions/Step/StepContext.js.map +0 -7
  451. package/cjs/Questions/Step/StepDescription/index.js +0 -58
  452. package/cjs/Questions/Step/StepDescription.js.map +0 -7
  453. package/cjs/Questions/Step/StepForm/index.js +0 -67
  454. package/cjs/Questions/Step/StepForm.js.map +0 -7
  455. package/cjs/Questions/Step/StepQuote/index.js +0 -44
  456. package/cjs/Questions/Step/StepQuote.js.map +0 -7
  457. package/cjs/Questions/Step/StepTitle/index.js +0 -76
  458. package/cjs/Questions/Step/StepTitle.js.map +0 -7
  459. package/cjs/Questions/Step/getAddMoreFields/index.js +0 -52
  460. package/cjs/Questions/Step/getAddMoreFields.js.map +0 -7
  461. package/cjs/Questions/Step/index.js +0 -59
  462. package/cjs/Questions/Step/index.js.map +0 -7
  463. package/cjs/Questions/Step/types/index.js +0 -16
  464. package/cjs/Questions/Step/types.js.map +0 -7
  465. package/cjs/Questions/getNextStep/index.js +0 -45
  466. package/cjs/Questions/getNextStep.js.map +0 -7
  467. package/cjs/Questions/index.js +0 -31
  468. package/cjs/Questions/index.js.map +0 -7
  469. package/cjs/Questions/types/index.js +0 -16
  470. package/cjs/Questions/types.js.map +0 -7
  471. package/cjs/index.js +0 -49
  472. package/cjs/index.js.map +0 -7
  473. package/cjs/inputs/AutoCompleteInput/index.js +0 -98
  474. package/cjs/inputs/AutoCompleteInput/index.js.map +0 -7
  475. package/cjs/inputs/Checkboxes/index.js +0 -107
  476. package/cjs/inputs/Checkboxes/index.js.map +0 -7
  477. package/cjs/inputs/DateInput/index.js +0 -183
  478. package/cjs/inputs/DateInput/index.js.map +0 -7
  479. package/cjs/inputs/DateTimeInput/index.js +0 -245
  480. package/cjs/inputs/DateTimeInput/index.js.map +0 -7
  481. package/cjs/inputs/FileInput/index.js +0 -118
  482. package/cjs/inputs/FileInput/index.js.map +0 -7
  483. package/cjs/inputs/ImageInput/__stories__/logo.d/index.js +0 -1
  484. package/cjs/inputs/ImageInput/__stories__/logo.d.js.map +0 -7
  485. package/cjs/inputs/ImageInput/index.js +0 -130
  486. package/cjs/inputs/ImageInput/index.js.map +0 -7
  487. package/cjs/inputs/Input/index.js +0 -111
  488. package/cjs/inputs/Input/index.js.map +0 -7
  489. package/cjs/inputs/Label/index.js +0 -50
  490. package/cjs/inputs/Label/index.js.map +0 -7
  491. package/cjs/inputs/OtpInput/index.js +0 -181
  492. package/cjs/inputs/OtpInput/index.js.map +0 -7
  493. package/cjs/inputs/Radio/index.js +0 -134
  494. package/cjs/inputs/Radio/index.js.map +0 -7
  495. package/cjs/inputs/Select/index.js +0 -63
  496. package/cjs/inputs/Select/index.js.map +0 -7
  497. package/cjs/inputs/index.js +0 -62
  498. package/cjs/inputs/index.js.map +0 -7
  499. package/cjs/inputs/inputsScenarios/index.js +0 -533
  500. package/cjs/inputs/inputsScenarios.js.map +0 -7
  501. package/cjs/internal/index.js +0 -38
  502. package/cjs/internal.js.map +0 -7
  503. package/cjs/lazy/index.js +0 -111
  504. package/cjs/lazy.js.map +0 -7
  505. package/cjs/locales/el/index.js +0 -35
  506. package/cjs/locales/el.js.map +0 -7
  507. package/cjs/registry/index.js +0 -195
  508. package/cjs/registry.js.map +0 -7
  509. package/cjs/types/index.js +0 -22
  510. package/cjs/types.js.map +0 -7
  511. package/cjs/utils/index.js +0 -97
  512. package/cjs/utils.js.map +0 -7
  513. package/cjs/validators/index.js +0 -165
  514. package/cjs/validators/index.js.map +0 -7
  515. package/cjs/validators/types/index.js +0 -16
  516. package/cjs/validators/types.js.map +0 -7
  517. package/cjs/validators/utils/afm/index.js +0 -55
  518. package/cjs/validators/utils/afm.js.map +0 -7
  519. package/cjs/validators/utils/amka/index.js +0 -60
  520. package/cjs/validators/utils/amka.js.map +0 -7
  521. package/cjs/validators/utils/date/index.js +0 -161
  522. package/cjs/validators/utils/date.js.map +0 -7
  523. package/cjs/validators/utils/datetime/index.js +0 -245
  524. package/cjs/validators/utils/datetime.js.map +0 -7
  525. package/cjs/validators/utils/file/index.js +0 -61
  526. package/cjs/validators/utils/file.js.map +0 -7
  527. package/cjs/validators/utils/iban/index.js +0 -142
  528. package/cjs/validators/utils/iban.js.map +0 -7
  529. package/cjs/validators/utils/image/index.js +0 -102
  530. package/cjs/validators/utils/image.js.map +0 -7
  531. package/cjs/validators/utils/index.js +0 -148
  532. package/cjs/validators/utils/index.js.map +0 -7
  533. package/cjs/validators/utils/int/index.js +0 -48
  534. package/cjs/validators/utils/int.js.map +0 -7
  535. package/cjs/validators/utils/number/index.js +0 -44
  536. package/cjs/validators/utils/number.js.map +0 -7
  537. package/cjs/validators/utils/otp/index.js +0 -54
  538. package/cjs/validators/utils/otp.js.map +0 -7
  539. package/cjs/validators/utils/phone/index.js +0 -198
  540. package/cjs/validators/utils/phone.js.map +0 -7
  541. package/cjs/validators/utils/postal_code/index.js +0 -54
  542. package/cjs/validators/utils/postal_code.js.map +0 -7
  543. package/cjs/validators/utils/text_limit/index.js +0 -69
  544. package/cjs/validators/utils/text_limit.js.map +0 -7
  545. package/cjs/validators/utils/uuid4/index.js +0 -46
  546. package/cjs/validators/utils/uuid4.js.map +0 -7
  547. package/index.js.map +0 -7
  548. package/inputs/AutoCompleteInput/AutoComplete.stories.d.ts +0 -11
  549. package/inputs/AutoCompleteInput/__stories__/Default.d.ts +0 -3
  550. package/inputs/AutoCompleteInput/__stories__/Multiple.d.ts +0 -3
  551. package/inputs/AutoCompleteInput/index.js.map +0 -7
  552. package/inputs/AutoCompleteInput/index.test.d.ts +0 -1
  553. package/inputs/AutoCompleteInput/package.json +0 -6
  554. package/inputs/Checkboxes/Checkboxes.stories.d.ts +0 -12
  555. package/inputs/Checkboxes/__stories__/Conditional.d.ts +0 -3
  556. package/inputs/Checkboxes/__stories__/Default.d.ts +0 -3
  557. package/inputs/Checkboxes/__stories__/WithDivider.d.ts +0 -3
  558. package/inputs/Checkboxes/index.js.map +0 -7
  559. package/inputs/Checkboxes/index.test.d.ts +0 -1
  560. package/inputs/Checkboxes/package.json +0 -6
  561. package/inputs/DateInput/DateInput.stories.d.ts +0 -14
  562. package/inputs/DateInput/__stories__/Default.d.ts +0 -3
  563. package/inputs/DateInput/__stories__/WithDefaultValue.d.ts +0 -3
  564. package/inputs/DateInput/__stories__/WithInitialValue.d.ts +0 -3
  565. package/inputs/DateInput/__stories__/WithWrongDefaultValue.d.ts +0 -3
  566. package/inputs/DateInput/__stories__/WithWrongInitialValue.d.ts +0 -3
  567. package/inputs/DateInput/index.js.map +0 -7
  568. package/inputs/DateInput/index.test.d.ts +0 -1
  569. package/inputs/DateInput/package.json +0 -6
  570. package/inputs/DateTimeInput/DateTimeInput.stories.d.ts +0 -14
  571. package/inputs/DateTimeInput/__stories__/Default.d.ts +0 -3
  572. package/inputs/DateTimeInput/__stories__/WithDefaultValue.d.ts +0 -3
  573. package/inputs/DateTimeInput/__stories__/WithInitialValue.d.ts +0 -3
  574. package/inputs/DateTimeInput/__stories__/WithWrongDefaultValue.d.ts +0 -3
  575. package/inputs/DateTimeInput/__stories__/WithWrongInitialValue.d.ts +0 -3
  576. package/inputs/DateTimeInput/index.js.map +0 -7
  577. package/inputs/DateTimeInput/index.test.d.ts +0 -1
  578. package/inputs/DateTimeInput/package.json +0 -6
  579. package/inputs/FileInput/FileInput.stories.d.ts +0 -11
  580. package/inputs/FileInput/__stories__/Default.d.ts +0 -3
  581. package/inputs/FileInput/__stories__/WithBorderAndLink.d.ts +0 -3
  582. package/inputs/FileInput/index.js.map +0 -7
  583. package/inputs/FileInput/index.test.d.ts +0 -1
  584. package/inputs/FileInput/package.json +0 -6
  585. package/inputs/ImageInput/ImageInput.stories.d.ts +0 -13
  586. package/inputs/ImageInput/__stories__/Default.d.ts +0 -3
  587. package/inputs/ImageInput/__stories__/MaxSize.d.ts +0 -3
  588. package/inputs/ImageInput/__stories__/WithInitialValues.d.ts +0 -3
  589. package/inputs/ImageInput/__stories__/WithInvalidImageDimension.d.ts +0 -3
  590. package/inputs/ImageInput/__stories__/logo.d/index.js +0 -1
  591. package/inputs/ImageInput/__stories__/logo.d/package.json +0 -6
  592. package/inputs/ImageInput/__stories__/logo.d.js.map +0 -7
  593. package/inputs/ImageInput/index.js.map +0 -7
  594. package/inputs/ImageInput/index.test.d.ts +0 -1
  595. package/inputs/ImageInput/package.json +0 -6
  596. package/inputs/Input/Input.stories.d.ts +0 -22
  597. package/inputs/Input/__stories__/AFM.d.ts +0 -3
  598. package/inputs/Input/__stories__/AMKA.d.ts +0 -3
  599. package/inputs/Input/__stories__/Boolean.d.ts +0 -3
  600. package/inputs/Input/__stories__/Email.d.ts +0 -3
  601. package/inputs/Input/__stories__/IBAN.d.ts +0 -3
  602. package/inputs/Input/__stories__/Integer.d.ts +0 -3
  603. package/inputs/Input/__stories__/LandlineNumber.d.ts +0 -3
  604. package/inputs/Input/__stories__/MobilePhone.d.ts +0 -3
  605. package/inputs/Input/__stories__/PhoneNumber.d.ts +0 -3
  606. package/inputs/Input/__stories__/PostalCode.d.ts +0 -3
  607. package/inputs/Input/__stories__/String.d.ts +0 -3
  608. package/inputs/Input/__stories__/StringWithTrimValidation.d.ts +0 -3
  609. package/inputs/Input/__stories__/TextWithLimit.d.ts +0 -3
  610. package/inputs/Input/index.js.map +0 -7
  611. package/inputs/Input/index.test.d.ts +0 -1
  612. package/inputs/Input/package.json +0 -6
  613. package/inputs/Label/Label.stories.d.ts +0 -10
  614. package/inputs/Label/__stories__/Default.d.ts +0 -3
  615. package/inputs/Label/index.js.map +0 -7
  616. package/inputs/Label/index.test.d.ts +0 -1
  617. package/inputs/Label/package.json +0 -6
  618. package/inputs/OtpInput/OtpInput.stories.d.ts +0 -10
  619. package/inputs/OtpInput/__stories__/Default.d.ts +0 -3
  620. package/inputs/OtpInput/index.js.map +0 -7
  621. package/inputs/OtpInput/index.test.d.ts +0 -1
  622. package/inputs/OtpInput/package.json +0 -6
  623. package/inputs/Radio/Radio.stories.d.ts +0 -12
  624. package/inputs/Radio/__stories__/Conditional.d.ts +0 -3
  625. package/inputs/Radio/__stories__/Default.d.ts +0 -3
  626. package/inputs/Radio/__stories__/WithDivider.d.ts +0 -3
  627. package/inputs/Radio/index.js.map +0 -7
  628. package/inputs/Radio/index.test.d.ts +0 -1
  629. package/inputs/Radio/package.json +0 -6
  630. package/inputs/Select/Select.stories.d.ts +0 -10
  631. package/inputs/Select/__stories__/Default.d.ts +0 -3
  632. package/inputs/Select/index.js.map +0 -7
  633. package/inputs/Select/index.test.d.ts +0 -1
  634. package/inputs/Select/package.json +0 -6
  635. package/inputs/index.js.map +0 -7
  636. package/inputs/inputsScenarios/index.js +0 -499
  637. package/inputs/inputsScenarios/package.json +0 -6
  638. package/inputs/inputsScenarios.d.ts +0 -296
  639. package/inputs/inputsScenarios.js.map +0 -7
  640. package/inputs/package.json +0 -6
  641. package/internal/index.js +0 -10
  642. package/internal/package.json +0 -6
  643. package/internal.js.map +0 -7
  644. package/lazy/index.js +0 -78
  645. package/lazy/package.json +0 -6
  646. package/locales/el/index.js +0 -6
  647. package/locales/el/package.json +0 -6
  648. package/locales/el.d.ts +0 -2
  649. package/locales/el.js.map +0 -7
  650. package/registry/index.js +0 -165
  651. package/registry/package.json +0 -6
  652. package/src/Field/utils/calculateField.ts +0 -49
  653. package/src/FieldArray/FormDialog.tsx +0 -565
  654. package/src/inputs/inputsScenarios.ts +0 -496
  655. package/src/locales/el.ts +0 -3
  656. package/types/index.js +0 -2
  657. package/types/package.json +0 -6
  658. package/types.js.map +0 -7
  659. package/utils/index.js +0 -74
  660. package/utils/package.json +0 -6
  661. package/utils.js.map +0 -7
  662. package/validators/index.js.map +0 -7
  663. package/validators/package.json +0 -6
  664. package/validators/types/index.js +0 -1
  665. package/validators/types/package.json +0 -6
  666. package/validators/types.js.map +0 -7
  667. package/validators/utils/afm/index.js +0 -31
  668. package/validators/utils/afm/package.json +0 -6
  669. package/validators/utils/afm.js.map +0 -7
  670. package/validators/utils/amka/index.js +0 -36
  671. package/validators/utils/amka/package.json +0 -6
  672. package/validators/utils/amka.js.map +0 -7
  673. package/validators/utils/date/index.js +0 -126
  674. package/validators/utils/date/package.json +0 -6
  675. package/validators/utils/date.js.map +0 -7
  676. package/validators/utils/datetime/index.js +0 -210
  677. package/validators/utils/datetime/package.json +0 -6
  678. package/validators/utils/datetime.js.map +0 -7
  679. package/validators/utils/file/index.js +0 -38
  680. package/validators/utils/file/package.json +0 -6
  681. package/validators/utils/file.js.map +0 -7
  682. package/validators/utils/iban/index.js +0 -118
  683. package/validators/utils/iban/package.json +0 -6
  684. package/validators/utils/iban.js.map +0 -7
  685. package/validators/utils/image/index.js +0 -79
  686. package/validators/utils/image/package.json +0 -6
  687. package/validators/utils/image.js.map +0 -7
  688. package/validators/utils/index.js.map +0 -7
  689. package/validators/utils/int/index.js +0 -24
  690. package/validators/utils/int/package.json +0 -6
  691. package/validators/utils/int.js.map +0 -7
  692. package/validators/utils/number/index.js +0 -20
  693. package/validators/utils/number/package.json +0 -6
  694. package/validators/utils/number.js.map +0 -7
  695. package/validators/utils/otp/index.js +0 -30
  696. package/validators/utils/otp/package.json +0 -6
  697. package/validators/utils/otp.js.map +0 -7
  698. package/validators/utils/package.json +0 -6
  699. package/validators/utils/phone/index.js +0 -172
  700. package/validators/utils/phone/package.json +0 -6
  701. package/validators/utils/phone.js.map +0 -7
  702. package/validators/utils/postal_code/index.js +0 -30
  703. package/validators/utils/postal_code/package.json +0 -6
  704. package/validators/utils/postal_code.js.map +0 -7
  705. package/validators/utils/text_limit/index.js +0 -45
  706. package/validators/utils/text_limit/package.json +0 -6
  707. package/validators/utils/text_limit.js.map +0 -7
  708. package/validators/utils/uuid4/index.js +0 -22
  709. package/validators/utils/uuid4/package.json +0 -6
  710. package/validators/utils/uuid4.js.map +0 -7
  711. package/validators/validators.spec.d.ts +0 -1
@@ -0,0 +1,162 @@
1
+ import { useCallback, useEffect, useRef } from 'react';
2
+ import type { Control, FieldValues, Ref, UseFormReturn } from 'react-hook-form';
3
+ import {
4
+ extractFieldEntries,
5
+ mapElementsToFields,
6
+ sortElementsByPosition,
7
+ } from '@digigov/form/hooks/utils';
8
+
9
+ export interface UseFieldFocusManagerProps<T extends FieldValues> {
10
+ enabled?: boolean;
11
+ control: Control<T>;
12
+ subscribe: UseFormReturn['subscribe'];
13
+ setFocus: UseFormReturn['setFocus'];
14
+ }
15
+
16
+ /**
17
+ * Custom hook to manage focus on form fields.
18
+ *
19
+ * It collects all focusable elements from the form fields and sorts them according to their position in the DOM.
20
+ */
21
+ export function useFieldFocusManager<T extends FieldValues>({
22
+ enabled = true,
23
+ control,
24
+ subscribe,
25
+ setFocus,
26
+ }: UseFieldFocusManagerProps<T>) {
27
+ /** Array to hold any external focusable elements registered by the user */
28
+ const customFocusableElements = useRef(new Map<string, HTMLElement>());
29
+ /** Map to hold focusable elements by field name */
30
+ const focusableElements = useRef(new Map<string, Ref>());
31
+
32
+ // When disabled, clear custom focusable elements and focusable elements map
33
+ useEffect(() => {
34
+ if (!enabled) {
35
+ customFocusableElements.current.clear();
36
+ focusableElements.current.clear();
37
+ return;
38
+ }
39
+ }, [enabled]);
40
+
41
+ const updateFocusableElements = useCallback(() => {
42
+ // Clear existing focusable elements
43
+ focusableElements.current.clear();
44
+ // Extract from form fields
45
+ const formElements = extractFieldEntries(control._fields);
46
+ // Extract from custom elements (convert to FieldRefs format first)
47
+ const customFieldRefs = mapElementsToFields(
48
+ customFocusableElements.current
49
+ );
50
+ const customElements = extractFieldEntries(customFieldRefs);
51
+
52
+ // Combine both maps
53
+ const combinedElements = new Map(formElements);
54
+ customElements.forEach((element, fieldName) => {
55
+ combinedElements.set(fieldName, element);
56
+ });
57
+
58
+ // Sort once by DOM position
59
+ focusableElements.current = sortElementsByPosition(combinedElements);
60
+ }, [control._fields]);
61
+
62
+ // Register / unregister custom focusable elements
63
+ const registerCustomFocusableElement = useCallback(
64
+ (fieldName: string, element: HTMLElement) => {
65
+ if (fieldName && element) {
66
+ customFocusableElements.current.set(fieldName, element);
67
+ updateFocusableElements();
68
+ }
69
+
70
+ return function unregister() {
71
+ customFocusableElements.current.delete(fieldName);
72
+ updateFocusableElements();
73
+ };
74
+ },
75
+ [updateFocusableElements]
76
+ );
77
+
78
+ // Collect focusable elements when fields change
79
+ useEffect(() => {
80
+ if (!enabled || !subscribe) return;
81
+ const callback = subscribe({
82
+ formState: {
83
+ errors: true,
84
+ // Subscribe to any form state change that might indicate field structure changes
85
+ },
86
+ callback: () => {
87
+ // Defer to next tick to ensure DOM is updated
88
+ setTimeout(updateFocusableElements, 0);
89
+ },
90
+ });
91
+
92
+ // Initial update
93
+ updateFocusableElements();
94
+
95
+ return () => callback();
96
+ }, [enabled, updateFocusableElements, subscribe]);
97
+
98
+ // Subscribe to errors and focus the first field (according to the DOM) with an error
99
+ const focusOnError = useCallback(
100
+ (errors: Record<string, any>) => {
101
+ if (!enabled) return;
102
+ if (!errors || Object.keys(errors).length === 0) return;
103
+ for (const [fieldName, element] of Array.from(
104
+ focusableElements.current
105
+ )) {
106
+ if (hasFieldError(errors, fieldName)) {
107
+ if (element && typeof element.focus === 'function') {
108
+ element.focus(); // Focus the element directly
109
+ return;
110
+ } else if (element && element.name) {
111
+ setFocus(fieldName); // Field is registered with react-hook-form
112
+ return;
113
+ }
114
+ }
115
+ }
116
+ },
117
+ [enabled, setFocus]
118
+ );
119
+
120
+ return {
121
+ /**
122
+ * Registers a custom focusable element with the given field name.
123
+ *
124
+ * Returns a callback function to unregister the element by field name.
125
+ *
126
+ * @param fieldName - The name of the field to associate with the element.
127
+ * @param element - The HTML element to register as focusable.
128
+ */
129
+ registerCustomFocusableElement,
130
+ focusOnError,
131
+ };
132
+ }
133
+
134
+ // Helper function to check for nested field errors
135
+ function hasFieldError(
136
+ errors: Record<string, any>,
137
+ fieldName: string
138
+ ): boolean {
139
+ if (!errors || typeof errors !== 'object') return false;
140
+
141
+ // Handle direct field names first
142
+ if (errors[fieldName]) {
143
+ return true;
144
+ }
145
+
146
+ // Split the field name and traverse the error object
147
+ const keys = fieldName.split(/[.[\]]+/).filter(Boolean);
148
+ let current = errors;
149
+
150
+ for (const key of keys) {
151
+ if (current && typeof current === 'object') {
152
+ current = current[key];
153
+ } else {
154
+ return false;
155
+ }
156
+ }
157
+
158
+ // Check if we found a truthy error value
159
+ return !!current;
160
+ }
161
+
162
+ export default useFieldFocusManager;
@@ -0,0 +1,122 @@
1
+ import type { Field, FieldRefs, Ref } from 'react-hook-form';
2
+
3
+ /**
4
+ * Recursively extracts field entries from nested form field structure.
5
+ * Handles both regular nested objects and array-like structures.
6
+ */
7
+ export function extractFieldEntries(
8
+ fields: FieldRefs,
9
+ prefix = ''
10
+ ): Map<string, Ref> {
11
+ const elementMap = new Map<string, Ref>();
12
+
13
+ const fieldEntries = Object.entries(fields);
14
+ if (fieldEntries.length === 0) return elementMap;
15
+
16
+ Object.entries(fields).forEach(([fieldName, field]) => {
17
+ if (!field) return;
18
+ const fullFieldName = prefix ? `${prefix}.${fieldName}` : fieldName;
19
+
20
+ // Handle direct field with ref
21
+ if (isField(field)) {
22
+ const element = field._f.ref;
23
+ if (element) {
24
+ elementMap.set(fullFieldName, element);
25
+ }
26
+ }
27
+
28
+ // Handle array fields (numeric keys indicate array indices)
29
+ else if (isFieldRefs(field)) {
30
+ // Check if any keys are numeric (indicating an array structure)
31
+ // Filter out non-numeric keys like '_f' which contains field metadata
32
+ const keys = Object.keys(field);
33
+ const numericKeys = keys.filter((key) => /^\d+$/.test(key));
34
+ const hasNumericKeys = numericKeys.length > 0;
35
+
36
+ if (hasNumericKeys) {
37
+ // Process only the numeric array indices, ignore metadata keys like '_f'
38
+ numericKeys.forEach((index) => {
39
+ const arrayItem = field[index];
40
+ if (arrayItem && isFieldRefs(arrayItem)) {
41
+ const nestedEntries = extractFieldEntries(
42
+ arrayItem,
43
+ `${fullFieldName}.${index}`
44
+ );
45
+ // Merge nested entries into main map
46
+ nestedEntries.forEach((element, fieldName) => {
47
+ elementMap.set(fieldName, element);
48
+ });
49
+ }
50
+ });
51
+ } else {
52
+ // Handle regular nested objects
53
+ const nestedEntries = extractFieldEntries(field, fullFieldName);
54
+ // Merge nested entries into main map
55
+ nestedEntries.forEach((element, fieldName) => {
56
+ elementMap.set(fieldName, element);
57
+ });
58
+ }
59
+ }
60
+ });
61
+
62
+ return elementMap;
63
+ }
64
+
65
+ /** Type guard to check if a ref is a Field object */
66
+ const isField = (fieldRef: FieldRefs[keyof FieldRefs]): fieldRef is Field =>
67
+ Boolean(
68
+ fieldRef &&
69
+ typeof fieldRef === 'object' &&
70
+ '_f' in fieldRef &&
71
+ fieldRef._f &&
72
+ 'ref' in fieldRef._f
73
+ );
74
+
75
+ /** Type guard to check if a ref is a FieldRefs object (nested fields) */
76
+ const isFieldRefs = (
77
+ fieldRef: FieldRefs[keyof FieldRefs]
78
+ ): fieldRef is FieldRefs =>
79
+ Boolean(fieldRef && typeof fieldRef === 'object' && !isField(fieldRef));
80
+
81
+ /**
82
+ * Sorts a map of HTML elements by their position in the DOM.
83
+ * Elements appearing earlier in the document order come first.
84
+ */
85
+ export function sortElementsByPosition(
86
+ elements: Map<string, Ref>
87
+ ): Map<string, Ref> {
88
+ const sortedEntries = Array.from(elements.entries()).sort(([, a], [, b]) => {
89
+ if (isActualHTMLElement(a) && isActualHTMLElement(b)) {
90
+ const aPosition = a.compareDocumentPosition(b);
91
+ if (aPosition & Node.DOCUMENT_POSITION_FOLLOWING) return -1;
92
+ if (aPosition & Node.DOCUMENT_POSITION_PRECEDING) return 1;
93
+ }
94
+ return 0; // keep original order
95
+ });
96
+ return new Map(sortedEntries);
97
+ }
98
+
99
+ /** Type guard to check if a ref is an actual HTML element */
100
+ const isActualHTMLElement = (ref: Ref): ref is Ref & HTMLElement =>
101
+ ref instanceof HTMLElement && typeof ref.focus === 'function';
102
+
103
+ /**
104
+ * Maps a collection of HTML elements to a FieldRefs structure.
105
+ *
106
+ * It's not a direct conversion, but rather a way to create a simple FieldRefs
107
+ * structure that can be used with React Hook Form.
108
+ */
109
+ export function mapElementsToFields(
110
+ elements: Map<string, HTMLElement>
111
+ ): Record<string, Field> {
112
+ const fields = {};
113
+ elements.forEach((element, fieldName) => {
114
+ fields[fieldName] = {
115
+ _f: {
116
+ ref: element,
117
+ name: fieldName,
118
+ },
119
+ };
120
+ });
121
+ return fields;
122
+ }
@@ -11,8 +11,8 @@ options as the users type and also let them select an option from the list.
11
11
 
12
12
  ### Default
13
13
 
14
- <code src="@digigov/form/inputs/AutoCompleteInput/__stories__/Default.tsx" />
14
+ <code src="@digigov/form/src/inputs/AutoCompleteInput/__stories__/Default.tsx" />
15
15
 
16
16
  ### Display multiple values
17
17
 
18
- <code src="@digigov/form/inputs/AutoCompleteInput/__stories__/Multiple.tsx" />
18
+ <code src="@digigov/form/src/inputs/AutoCompleteInput/__stories__/Multiple.tsx" />
@@ -1,10 +1,8 @@
1
1
  import React, { useCallback } from 'react';
2
- import { ControlledFieldProps } from '@digigov/form/Field/types';
3
- import { FieldOptionProps } from '@digigov/form/inputs/Label';
4
- import {
5
- AutoComplete,
6
- AutoCompleteProps as UIAutoCompleteProps,
7
- } from '@digigov/ui/form/AutoComplete';
2
+ import type { ControlledFieldProps } from '@digigov/form/Field/types';
3
+ import type { FieldOptionProps } from '@digigov/form/inputs/Label';
4
+ import type { AutoCompleteProps as UIAutoCompleteProps } from '@digigov/ui/form/AutoComplete';
5
+ import { AutoComplete } from '@digigov/ui/form/AutoComplete';
8
6
  import { Hint } from '@digigov/ui/typography/Hint';
9
7
  import { Base } from '@digigov/ui/utils/Base';
10
8
  export interface AutoCompleteInputExtra
@@ -10,14 +10,14 @@ Checkboxes are used to let a user select one or more options of a limited number
10
10
 
11
11
  ### Default
12
12
 
13
- <code src="@digigov/form/inputs/Checkboxes/__stories__/Default.tsx" />
13
+ <code src="@digigov/form/src/inputs/Checkboxes/__stories__/Default.tsx" />
14
14
 
15
15
 
16
16
  ### Conditional
17
17
 
18
- <code src="@digigov/form/inputs/Checkboxes/__stories__/Conditional.tsx" />
18
+ <code src="@digigov/form/src/inputs/Checkboxes/__stories__/Conditional.tsx" />
19
19
 
20
20
 
21
21
  ### With divider
22
22
 
23
- <code src="@digigov/form/inputs/Checkboxes/__stories__/WithDivider.tsx" />
23
+ <code src="@digigov/form/src/inputs/Checkboxes/__stories__/WithDivider.tsx" />
@@ -1,6 +1,8 @@
1
1
  import React, { useState } from 'react';
2
- import { ControlledFieldProps } from '@digigov/form/Field/types';
3
- import { FieldOptionProps } from '@digigov/form/inputs/Label';
2
+ import type { UseFormReturn } from 'react-hook-form';
3
+ import type { ControlledFieldProps } from '@digigov/form/Field/types';
4
+ import type { FieldOptionProps } from '@digigov/form/inputs/Label';
5
+ import { omit } from '@digigov/form/utils';
4
6
  import {
5
7
  Checkbox,
6
8
  CheckboxItem,
@@ -17,94 +19,103 @@ export interface CheckboxesProps
17
19
  options: FieldOptionProps[];
18
20
  };
19
21
  fieldComponent: React.FC<Omit<ControlledFieldProps, 'value' | 'onChange'>>;
22
+ resetField: UseFormReturn['resetField'];
20
23
  }
21
24
 
22
- export const Checkboxes: React.FC<CheckboxesProps> = ({
23
- name,
24
- onChange,
25
- value,
26
- extra: { options, className },
27
- disabled,
28
- Field,
29
- ...props
30
- }) => {
31
- if (!value) value = [];
32
- const handleChange =
33
- (optionValue, idx, show) =>
34
- (evt): void => {
35
- let newValue: any = [];
36
- if (evt.currentTarget.checked) {
37
- newValue = value.concat([optionValue]);
38
- } else {
39
- newValue = value.filter((val) => val !== optionValue);
40
- }
41
- if (show && show.length > 0) {
42
- setChecked((items) =>
43
- items.map((item, index) => (index === idx ? !item : item))
44
- );
45
- }
25
+ export const Checkboxes = React.forwardRef<HTMLInputElement, CheckboxesProps>(
26
+ (
27
+ {
28
+ name,
29
+ onChange,
30
+ value,
31
+ extra: { options, className },
32
+ disabled,
33
+ Field,
34
+ ...props
35
+ },
36
+ ref
37
+ ) => {
38
+ if (!value) value = [];
39
+ const handleChange =
40
+ (optionValue, idx, show) =>
41
+ (evt): void => {
42
+ let newValue: any = [];
43
+ if (evt.currentTarget.checked) {
44
+ newValue = value.concat([optionValue]);
45
+ } else {
46
+ newValue = value.filter((val) => val !== optionValue);
47
+ }
48
+ if (show && show.length > 0) {
49
+ setChecked((items) =>
50
+ items.map((item, index) => (index === idx ? !item : item))
51
+ );
52
+ }
46
53
 
47
- // reset value to undefined instead of an empty array
48
- // so the error state mechanism can throw validation errors
49
- if (newValue.length === 0) newValue = undefined;
50
- onChange(newValue);
51
- };
52
- const { t } = useTranslation();
53
- const [checked, setChecked] = useState(
54
- Array<boolean>(options.length).fill(false)
55
- );
56
- return (
57
- <Checkbox className={className}>
58
- {options.map(
59
- (
60
- {
61
- label,
62
- value: v,
63
- show,
64
- disabled: optionDisabled,
65
- selected,
66
- ...option
67
- },
68
- index
69
- ) => (
70
- <React.Fragment key={index}>
71
- <CheckboxItem
72
- key={`${name}.${index}`}
73
- name={`${name}.${v}`}
74
- id={`${name}.${v}`}
75
- value={v}
76
- disabled={disabled || optionDisabled}
77
- checked={value?.includes(v)}
78
- onChange={handleChange(v, index, show)}
79
- {...option}
80
- {...{
81
- ...props,
82
- reset: undefined,
83
- defaultValue: undefined,
84
- error: undefined,
85
- onBlur: undefined,
86
- required: undefined,
87
- 'aria-describedby': undefined,
88
- type: 'checkbox',
89
- }}
90
- >
91
- {(label && label.primary && t(label.primary)) || value}
92
- {label && label.secondary && <Hint>{t(label.secondary)}</Hint>}
93
- </CheckboxItem>
54
+ // reset value to undefined instead of an empty array
55
+ // so the error state mechanism can throw validation errors
56
+ if (newValue.length === 0) newValue = undefined;
57
+ onChange(newValue);
58
+ };
59
+ const { t } = useTranslation();
60
+ const [checked, setChecked] = useState(
61
+ Array<boolean>(options.length).fill(false)
62
+ );
63
+ return (
64
+ <Checkbox className={className}>
65
+ {options.map(
66
+ (
67
+ {
68
+ label,
69
+ value: v,
70
+ show,
71
+ disabled: optionDisabled,
72
+ selected,
73
+ ...option
74
+ },
75
+ index
76
+ ) => (
77
+ <React.Fragment key={index}>
78
+ <CheckboxItem
79
+ ref={index === 0 ? ref : undefined}
80
+ key={`${name}.${index}`}
81
+ name={`${name}.${v}`}
82
+ id={`${name}.${v}`}
83
+ value={v}
84
+ disabled={disabled || optionDisabled}
85
+ checked={value?.includes(v)}
86
+ onChange={handleChange(v, index, show)}
87
+ {...option}
88
+ {...{
89
+ ...omit(props, ['resetField']),
90
+ reset: undefined,
91
+ defaultValue: undefined,
92
+ error: undefined,
93
+ onBlur: undefined,
94
+ required: undefined,
95
+ 'aria-describedby': undefined,
96
+ type: 'checkbox',
97
+ }}
98
+ >
99
+ {(label && label.primary && t(label.primary)) || value}
100
+ {label && label.secondary && <Hint>{t(label.secondary)}</Hint>}
101
+ </CheckboxItem>
94
102
 
95
- {!!checked[index] && show && Field && (
96
- <CheckboxConditional>
97
- {show.map((fieldName) => (
98
- <Field name={fieldName} key={fieldName} />
99
- ))}
100
- </CheckboxConditional>
101
- )}
102
- {selected && selected()}
103
- </React.Fragment>
104
- )
105
- )}
106
- </Checkbox>
107
- );
108
- };
103
+ {!!checked[index] && show && Field && (
104
+ <CheckboxConditional>
105
+ {show.map((fieldName) => (
106
+ <Field name={fieldName} key={fieldName} />
107
+ ))}
108
+ </CheckboxConditional>
109
+ )}
110
+ {selected && selected()}
111
+ </React.Fragment>
112
+ )
113
+ )}
114
+ </Checkbox>
115
+ );
116
+ }
117
+ );
118
+
119
+ Checkboxes.displayName = 'Checkboxes';
109
120
 
110
121
  export default Checkboxes;
@@ -13,4 +13,4 @@ either with a textbox that validates the input or a special date picker interfac
13
13
 
14
14
  ### Default
15
15
 
16
- <code src="@digigov/form/inputs/DateInput/__stories__/Default.tsx" />
16
+ <code src="@digigov/form/src/inputs/DateInput/__stories__/Default.tsx" />
@@ -1,7 +1,7 @@
1
1
  import React, { useMemo, useEffect } from 'react';
2
2
  import dayjs from 'dayjs';
3
3
  import customParseFormat from 'dayjs/plugin/customParseFormat';
4
- import { UncontrolledFieldProps } from '@digigov/form/Field/types';
4
+ import type { UncontrolledFieldProps } from '@digigov/form/Field/types';
5
5
  import { useFormContext } from '@digigov/form/FormContext';
6
6
  import {
7
7
  DateInputContainer,
@@ -87,11 +87,21 @@ const makeDate = (val) => {
87
87
  return '';
88
88
  };
89
89
 
90
- const DatePart = ({ label, ...props }) => {
91
- return <DateInputItem {...props}>{label}</DateInputItem>;
92
- };
90
+ const DatePart = React.forwardRef<HTMLInputElement, Record<string, any>>(
91
+ ({ label, ...props }, ref) => {
92
+ return (
93
+ <DateInputItem {...props} ref={ref}>
94
+ {label}
95
+ </DateInputItem>
96
+ );
97
+ }
98
+ );
99
+ DatePart.displayName = 'DatePart';
93
100
 
94
- export const DateInput = ({ name, ...props }) => {
101
+ export const DateInput = React.forwardRef<
102
+ HTMLInputElement,
103
+ Record<string, any>
104
+ >(({ name, ...props }, ref) => {
95
105
  const { t } = useTranslation();
96
106
  const form = useFormContext();
97
107
 
@@ -116,6 +126,7 @@ export const DateInput = ({ name, ...props }) => {
116
126
  return (
117
127
  <DateInputContainer>
118
128
  <DatePart
129
+ ref={ref}
119
130
  label={t('form.label.day')}
120
131
  onChange={date.setDay}
121
132
  onBlur={(e) => {
@@ -166,6 +177,8 @@ export const DateInput = ({ name, ...props }) => {
166
177
  />
167
178
  </DateInputContainer>
168
179
  );
169
- };
180
+ });
181
+
182
+ DateInput.displayName = 'DateInput';
170
183
 
171
184
  export default DateInput;
@@ -13,4 +13,4 @@ either with a textbox that validates the input or a special date picker interfac
13
13
 
14
14
  ### Default
15
15
 
16
- <code src="@digigov/form/inputs/DateTimeInput/__stories__/Default.tsx" />
16
+ <code src="@digigov/form/src/inputs/DateTimeInput/__stories__/Default.tsx" />
@@ -1,7 +1,7 @@
1
1
  import React, { useMemo, useEffect } from 'react';
2
2
  import dayjs from 'dayjs';
3
3
  import customParseFormat from 'dayjs/plugin/customParseFormat';
4
- import { UncontrolledFieldProps } from '@digigov/form/Field/types';
4
+ import type { UncontrolledFieldProps } from '@digigov/form/Field/types';
5
5
  import { useFormContext } from '@digigov/form/FormContext';
6
6
  import {
7
7
  DateInputContainer,
@@ -113,11 +113,21 @@ const makeDateTime = (val) => {
113
113
  return '';
114
114
  };
115
115
 
116
- const DateTimePart = ({ label, ...props }) => {
117
- return <DateInputItem {...props}>{label}</DateInputItem>;
118
- };
116
+ const DateTimePart = React.forwardRef<HTMLInputElement, Record<string, any>>(
117
+ ({ label, ...props }, ref) => {
118
+ return (
119
+ <DateInputItem {...props} ref={ref}>
120
+ {label}
121
+ </DateInputItem>
122
+ );
123
+ }
124
+ );
125
+ DateTimePart.displayName = 'DateTimePart';
119
126
 
120
- export const DateTimeInput = ({ name, ...props }) => {
127
+ export const DateTimeInput = React.forwardRef<
128
+ HTMLInputElement,
129
+ Record<string, any>
130
+ >(({ name, ...props }, ref) => {
121
131
  const { t } = useTranslation();
122
132
  const form = useFormContext();
123
133
 
@@ -142,6 +152,7 @@ export const DateTimeInput = ({ name, ...props }) => {
142
152
  return (
143
153
  <DateInputContainer>
144
154
  <DateTimePart
155
+ ref={ref}
145
156
  label={t('form.label.day')}
146
157
  onChange={dateTime.setDay}
147
158
  onBlur={(e) => {
@@ -228,6 +239,8 @@ export const DateTimeInput = ({ name, ...props }) => {
228
239
  />
229
240
  </DateInputContainer>
230
241
  );
231
- };
242
+ });
243
+
244
+ DateTimeInput.displayName = 'DateTimeInput';
232
245
 
233
246
  export default DateTimeInput;
@@ -12,4 +12,4 @@ Input element of type `file` let the user choose one or more files from their de
12
12
 
13
13
  ### Default
14
14
 
15
- <code src="@digigov/form/inputs/FileInput/__stories__/Default.tsx" />
15
+ <code src="@digigov/form/src/inputs/FileInput/__stories__/Default.tsx" />