@digigov/form 2.0.0-555d1027 → 2.0.0-5e7a6790

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 (396) hide show
  1. package/Field/ErrorGroup.d.ts +3 -3
  2. package/Field/ErrorGroup.js.map +1 -1
  3. package/Field/FieldBase/index.js +0 -1
  4. package/Field/FieldBase.d.ts +1 -1
  5. package/Field/FieldBase.js.map +2 -2
  6. package/Field/FieldBaseContainer/index.js +36 -34
  7. package/Field/FieldBaseContainer.d.ts +2 -2
  8. package/Field/FieldBaseContainer.js.map +2 -2
  9. package/Field/FieldConditional.d.ts +1 -1
  10. package/Field/FieldConditional.js.map +1 -1
  11. package/Field/index.d.ts +1 -1
  12. package/Field/index.js +15 -25
  13. package/Field/index.js.map +2 -2
  14. package/Field/types.d.ts +11 -10
  15. package/Field/utils/evaluateFieldWithConditions.d.ts +2 -2
  16. package/Field/utils/evaluateFieldWithConditions.js.map +2 -2
  17. package/Field/utils/resolveField/index.js +35 -0
  18. package/Field/utils/{calculateField → resolveField}/package.json +1 -1
  19. package/Field/utils/resolveField.d.ts +3 -0
  20. package/Field/utils/resolveField.js.map +7 -0
  21. package/Field/utils/useField/index.js +4 -2
  22. package/Field/utils/useField.d.ts +1 -1
  23. package/Field/utils/useField.js.map +2 -2
  24. package/FieldArray/BaseFieldArray/index.js +76 -0
  25. package/{inputs/inputsScenarios → FieldArray/BaseFieldArray}/package.json +1 -1
  26. package/FieldArray/BaseFieldArray.d.ts +5 -0
  27. package/FieldArray/BaseFieldArray.js.map +7 -0
  28. package/FieldArray/FormDialog/ArrayDisplay/ArrayDisplay.stories.d.ts +10 -0
  29. package/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay/index.js +97 -0
  30. package/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay/package.json +6 -0
  31. package/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay.d.ts +22 -0
  32. package/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay.js.map +7 -0
  33. package/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader/index.js +11 -0
  34. package/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader/package.json +6 -0
  35. package/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader.d.ts +5 -0
  36. package/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader.js.map +7 -0
  37. package/FieldArray/FormDialog/ArrayDisplay/__stories__/Default.d.ts +2 -0
  38. package/FieldArray/FormDialog/ArrayDisplay/__stories__/ReadOnly.d.ts +2 -0
  39. package/FieldArray/FormDialog/ArrayDisplay/__stories__/Sortable.d.ts +2 -0
  40. package/FieldArray/FormDialog/ArrayDisplay/index.d.ts +14 -0
  41. package/FieldArray/FormDialog/ArrayDisplay/index.js +51 -0
  42. package/FieldArray/FormDialog/ArrayDisplay/index.js.map +7 -0
  43. package/FieldArray/FormDialog/ArrayDisplay/package.json +6 -0
  44. package/FieldArray/FormDialog/ArrayEditModal/index.js +149 -0
  45. package/FieldArray/FormDialog/ArrayEditModal/package.json +6 -0
  46. package/FieldArray/FormDialog/ArrayEditModal.d.ts +26 -0
  47. package/FieldArray/FormDialog/ArrayEditModal.js.map +7 -0
  48. package/FieldArray/FormDialog/index.d.ts +19 -0
  49. package/FieldArray/FormDialog/index.js +139 -348
  50. package/FieldArray/FormDialog/index.js.map +7 -0
  51. package/FieldArray/index.d.ts +4 -2
  52. package/FieldArray/index.js +28 -54
  53. package/FieldArray/index.js.map +2 -2
  54. package/FieldObject/index.d.ts +4 -4
  55. package/FieldObject/index.js +5 -12
  56. package/FieldObject/index.js.map +2 -2
  57. package/Fieldset/FieldsetWithContext.js.map +1 -1
  58. package/Fieldset/index.d.ts +1 -1
  59. package/Fieldset/index.js.map +1 -1
  60. package/Fieldset/types.d.ts +2 -2
  61. package/FormBuilder/index.d.ts +1 -1
  62. package/FormBuilder/index.js +155 -130
  63. package/FormBuilder/index.js.map +2 -2
  64. package/FormContext.d.ts +2 -2
  65. package/FormContext.js.map +2 -2
  66. package/MultiplicityField/add-objects/index.js +10 -19
  67. package/MultiplicityField/add-objects.d.ts +1 -1
  68. package/MultiplicityField/add-objects.js.map +2 -2
  69. package/MultiplicityField/index.d.ts +2 -2
  70. package/MultiplicityField/index.js.map +2 -2
  71. package/MultiplicityField/types.d.ts +2 -2
  72. package/Questions/Questions.d.ts +1 -1
  73. package/Questions/Questions.js.map +1 -1
  74. package/Questions/QuestionsContext.d.ts +1 -1
  75. package/Questions/QuestionsContext.js.map +1 -1
  76. package/Questions/Step/Step.d.ts +1 -1
  77. package/Questions/Step/Step.js.map +1 -1
  78. package/Questions/Step/StepArrayReview.d.ts +1 -1
  79. package/Questions/Step/StepArrayReview.js.map +1 -1
  80. package/Questions/Step/StepContext.d.ts +1 -1
  81. package/Questions/Step/StepContext.js.map +1 -1
  82. package/Questions/Step/StepDescription.d.ts +1 -1
  83. package/Questions/Step/StepDescription.js.map +2 -2
  84. package/Questions/Step/StepForm.d.ts +2 -2
  85. package/Questions/Step/StepForm.js.map +1 -1
  86. package/Questions/Step/StepQuote.d.ts +1 -1
  87. package/Questions/Step/StepQuote.js.map +2 -2
  88. package/Questions/Step/StepTitle.d.ts +1 -1
  89. package/Questions/Step/StepTitle.js.map +2 -2
  90. package/Questions/Step/getAddMoreFields.d.ts +2 -2
  91. package/Questions/Step/getAddMoreFields.js.map +1 -1
  92. package/Questions/Step/types.d.ts +1 -1
  93. package/Questions/getNextStep.d.ts +1 -1
  94. package/Questions/getNextStep.js.map +1 -1
  95. package/Questions/types.d.ts +1 -1
  96. package/cjs/Field/ErrorGroup.js.map +1 -1
  97. package/cjs/Field/FieldBase/index.js +0 -1
  98. package/cjs/Field/FieldBase.js.map +2 -2
  99. package/cjs/Field/FieldBaseContainer/index.js +36 -34
  100. package/cjs/Field/FieldBaseContainer.js.map +2 -2
  101. package/cjs/Field/FieldConditional.js.map +1 -1
  102. package/cjs/Field/index.js +15 -22
  103. package/cjs/Field/index.js.map +2 -2
  104. package/cjs/Field/types.js.map +1 -1
  105. package/cjs/Field/utils/evaluateFieldWithConditions.js.map +2 -2
  106. package/cjs/Field/utils/resolveField/index.js +55 -0
  107. package/cjs/Field/utils/resolveField.js.map +7 -0
  108. package/cjs/Field/utils/useField/index.js +4 -2
  109. package/cjs/Field/utils/useField.js.map +2 -2
  110. package/cjs/FieldArray/BaseFieldArray/index.js +109 -0
  111. package/cjs/FieldArray/BaseFieldArray.js.map +7 -0
  112. package/cjs/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay/index.js +130 -0
  113. package/cjs/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay.js.map +7 -0
  114. package/cjs/{locales/el → FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader}/index.js +16 -7
  115. package/cjs/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader.js.map +7 -0
  116. package/cjs/FieldArray/FormDialog/ArrayDisplay/index.js +84 -0
  117. package/cjs/FieldArray/FormDialog/ArrayDisplay/index.js.map +7 -0
  118. package/cjs/FieldArray/FormDialog/ArrayEditModal/index.js +177 -0
  119. package/cjs/FieldArray/FormDialog/ArrayEditModal.js.map +7 -0
  120. package/cjs/FieldArray/FormDialog/index.js +130 -331
  121. package/cjs/FieldArray/FormDialog/index.js.map +7 -0
  122. package/cjs/FieldArray/index.js +27 -53
  123. package/cjs/FieldArray/index.js.map +3 -3
  124. package/cjs/FieldObject/index.js +5 -9
  125. package/cjs/FieldObject/index.js.map +2 -2
  126. package/cjs/Fieldset/FieldsetWithContext.js.map +1 -1
  127. package/cjs/Fieldset/index.js.map +1 -1
  128. package/cjs/Fieldset/types.js.map +1 -1
  129. package/cjs/FormBuilder/index.js +156 -131
  130. package/cjs/FormBuilder/index.js.map +3 -3
  131. package/cjs/FormContext.js.map +2 -2
  132. package/cjs/MultiplicityField/add-objects/index.js +9 -13
  133. package/cjs/MultiplicityField/add-objects.js.map +2 -2
  134. package/cjs/MultiplicityField/index.js.map +2 -2
  135. package/cjs/MultiplicityField/types.js.map +1 -1
  136. package/cjs/Questions/Questions.js.map +1 -1
  137. package/cjs/Questions/QuestionsContext.js.map +1 -1
  138. package/cjs/Questions/Step/Step.js.map +1 -1
  139. package/cjs/Questions/Step/StepArrayReview.js.map +1 -1
  140. package/cjs/Questions/Step/StepContext.js.map +1 -1
  141. package/cjs/Questions/Step/StepDescription.js.map +2 -2
  142. package/cjs/Questions/Step/StepForm.js.map +1 -1
  143. package/cjs/Questions/Step/StepQuote.js.map +2 -2
  144. package/cjs/Questions/Step/StepTitle.js.map +2 -2
  145. package/cjs/Questions/Step/getAddMoreFields.js.map +1 -1
  146. package/cjs/Questions/Step/types.js.map +1 -1
  147. package/cjs/Questions/getNextStep.js.map +1 -1
  148. package/cjs/Questions/types.js.map +1 -1
  149. package/cjs/hooks/useFieldFocusManager/index.js +135 -0
  150. package/cjs/hooks/useFieldFocusManager.js.map +7 -0
  151. package/cjs/hooks/utils/index.js +98 -0
  152. package/cjs/hooks/utils.js.map +7 -0
  153. package/cjs/inputs/AutoCompleteInput/index.js.map +2 -2
  154. package/cjs/inputs/Checkboxes/index.js +67 -63
  155. package/cjs/inputs/Checkboxes/index.js.map +2 -2
  156. package/cjs/inputs/DateInput/index.js +10 -5
  157. package/cjs/inputs/DateInput/index.js.map +2 -2
  158. package/cjs/inputs/DateTimeInput/index.js +10 -5
  159. package/cjs/inputs/DateTimeInput/index.js.map +2 -2
  160. package/cjs/inputs/FileInput/index.js.map +2 -2
  161. package/cjs/inputs/ImageInput/index.js.map +1 -1
  162. package/cjs/inputs/Input/index.js +54 -56
  163. package/cjs/inputs/Input/index.js.map +2 -2
  164. package/cjs/inputs/Label/index.js.map +1 -1
  165. package/cjs/inputs/OtpInput/index.js +36 -31
  166. package/cjs/inputs/OtpInput/index.js.map +2 -2
  167. package/cjs/inputs/Radio/index.js +5 -4
  168. package/cjs/inputs/Radio/index.js.map +3 -3
  169. package/cjs/inputs/Select/index.js.map +1 -1
  170. package/cjs/{Field/utils → inputs/registry}/index.js +4 -4
  171. package/cjs/inputs/registry.js.map +7 -0
  172. package/cjs/{lazy/index.js → lazy.js} +10 -9
  173. package/cjs/lazy.js.map +2 -2
  174. package/cjs/{registry/index.js → registry.js} +23 -13
  175. package/cjs/registry.js.map +2 -2
  176. package/cjs/types.js.map +1 -1
  177. package/cjs/utils.js.map +2 -2
  178. package/cjs/validators/index.js.map +2 -2
  179. package/cjs/validators/types.js.map +1 -1
  180. package/cjs/validators/utils/date/index.js +6 -1
  181. package/cjs/validators/utils/date.js.map +2 -2
  182. package/cjs/validators/utils/datetime/index.js +6 -1
  183. package/cjs/validators/utils/datetime.js.map +2 -2
  184. package/cjs/validators/utils/file.js.map +1 -1
  185. package/cjs/validators/utils/iban.js.map +1 -1
  186. package/cjs/validators/utils/image.js.map +1 -1
  187. package/cjs/validators/utils/index.js.map +1 -1
  188. package/cjs/validators/utils/int.js.map +1 -1
  189. package/cjs/validators/utils/number.js.map +1 -1
  190. package/cjs/validators/utils/otp.js.map +1 -1
  191. package/cjs/validators/utils/phone.js.map +1 -1
  192. package/cjs/validators/utils/postal_code.js.map +1 -1
  193. package/cjs/validators/utils/text_limit.js.map +1 -1
  194. package/hooks/useFieldFocusManager/index.js +116 -0
  195. package/hooks/useFieldFocusManager/package.json +6 -0
  196. package/hooks/useFieldFocusManager.d.ts +25 -0
  197. package/hooks/useFieldFocusManager.js.map +7 -0
  198. package/hooks/utils/index.js +73 -0
  199. package/{Field → hooks}/utils/package.json +1 -1
  200. package/hooks/utils.d.ts +18 -0
  201. package/hooks/utils.js.map +7 -0
  202. package/index.js +1 -1
  203. package/inputs/AutoCompleteInput/index.d.ts +3 -3
  204. package/inputs/AutoCompleteInput/index.js +1 -3
  205. package/inputs/AutoCompleteInput/index.js.map +2 -2
  206. package/inputs/Checkboxes/index.d.ts +3 -3
  207. package/inputs/Checkboxes/index.js +67 -63
  208. package/inputs/Checkboxes/index.js.map +2 -2
  209. package/inputs/DateInput/index.d.ts +2 -5
  210. package/inputs/DateInput/index.js +10 -5
  211. package/inputs/DateInput/index.js.map +2 -2
  212. package/inputs/DateTimeInput/index.d.ts +2 -5
  213. package/inputs/DateTimeInput/index.js +10 -5
  214. package/inputs/DateTimeInput/index.js.map +2 -2
  215. package/inputs/FileInput/index.d.ts +4 -4
  216. package/inputs/FileInput/index.js +1 -4
  217. package/inputs/FileInput/index.js.map +2 -2
  218. package/inputs/ImageInput/index.d.ts +2 -2
  219. package/inputs/ImageInput/index.js.map +1 -1
  220. package/inputs/Input/index.d.ts +2 -2
  221. package/inputs/Input/index.js +54 -56
  222. package/inputs/Input/index.js.map +2 -2
  223. package/inputs/Label/index.d.ts +1 -1
  224. package/inputs/Label/index.js.map +1 -1
  225. package/inputs/OtpInput/index.d.ts +1 -5
  226. package/inputs/OtpInput/index.js +36 -31
  227. package/inputs/OtpInput/index.js.map +2 -2
  228. package/inputs/Radio/index.d.ts +4 -4
  229. package/inputs/Radio/index.js +5 -4
  230. package/inputs/Radio/index.js.map +3 -3
  231. package/inputs/Select/index.d.ts +2 -2
  232. package/inputs/Select/index.js.map +1 -1
  233. package/{Field/utils → inputs/registry}/index.js +1 -1
  234. package/{locales/el → inputs/registry}/package.json +1 -1
  235. package/{Field/utils/index.d.ts → inputs/registry.d.ts} +2 -1
  236. package/inputs/registry.js.map +7 -0
  237. package/lazy/index.js +10 -9
  238. package/package.json +4 -4
  239. package/registry/index.js +23 -13
  240. package/src/Field/ErrorGroup.tsx +3 -3
  241. package/src/Field/FieldBase.tsx +1 -2
  242. package/src/Field/FieldBaseContainer.tsx +68 -58
  243. package/src/Field/FieldConditional.tsx +1 -1
  244. package/src/Field/index.tsx +15 -33
  245. package/src/Field/types.tsx +11 -12
  246. package/src/Field/utils/evaluateFieldWithConditions.ts +5 -2
  247. package/src/Field/utils/resolveField.ts +58 -0
  248. package/src/Field/utils/useField.ts +3 -1
  249. package/src/FieldArray/BaseFieldArray.tsx +97 -0
  250. package/src/FieldArray/FormDialog/ArrayDisplay/ArrayDisplay.stories.js +11 -0
  251. package/src/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay.tsx +165 -0
  252. package/src/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader.tsx +15 -0
  253. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/Default.tsx +93 -0
  254. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/ReadOnly.tsx +79 -0
  255. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/Sortable.tsx +93 -0
  256. package/src/FieldArray/FormDialog/ArrayDisplay/index.tsx +75 -0
  257. package/src/FieldArray/FormDialog/ArrayEditModal.tsx +233 -0
  258. package/src/FieldArray/FormDialog/index.tsx +247 -0
  259. package/src/FieldArray/__tests__/fieldset-multiplicity.spec.tsx +271 -0
  260. package/src/FieldArray/__tests__/multiplicity-attachment.spec.tsx +280 -0
  261. package/src/FieldArray/__tests__/multiplicity-required.spec.tsx +131 -0
  262. package/src/FieldArray/__tests__/nested-fieldset-multiplicity.spec.tsx +627 -0
  263. package/src/FieldArray/__tests__/preference-multiple-choice.spec.tsx +222 -0
  264. package/src/FieldArray/index.spec.tsx +355 -0
  265. package/src/FieldArray/index.tsx +34 -61
  266. package/src/FieldObject/index.tsx +9 -17
  267. package/src/Fieldset/FieldsetWithContext.tsx +1 -1
  268. package/src/Fieldset/index.tsx +1 -1
  269. package/src/Fieldset/types.tsx +2 -2
  270. package/src/FormBuilder/index.tsx +188 -142
  271. package/src/FormBuilder/scenarios.test.tsx +759 -1
  272. package/src/FormContext.tsx +3 -2
  273. package/src/MultiplicityField/add-objects.tsx +12 -21
  274. package/src/MultiplicityField/index.tsx +3 -2
  275. package/src/MultiplicityField/types.ts +5 -2
  276. package/src/Questions/Questions.tsx +2 -2
  277. package/src/Questions/QuestionsContext.tsx +1 -1
  278. package/src/Questions/Step/Step.tsx +1 -1
  279. package/src/Questions/Step/StepArrayReview.tsx +2 -2
  280. package/src/Questions/Step/StepContext.tsx +1 -1
  281. package/src/Questions/Step/StepDescription.tsx +2 -1
  282. package/src/Questions/Step/StepForm.tsx +2 -2
  283. package/src/Questions/Step/StepQuote.tsx +2 -1
  284. package/src/Questions/Step/StepTitle.tsx +2 -1
  285. package/src/Questions/Step/getAddMoreFields.tsx +2 -2
  286. package/src/Questions/Step/types.tsx +1 -1
  287. package/src/Questions/getNextStep.tsx +1 -1
  288. package/src/Questions/types.tsx +1 -1
  289. package/src/hooks/__tests__/useFieldFocusManager.spec.tsx +1079 -0
  290. package/src/hooks/__tests__/utils.spec.ts +568 -0
  291. package/src/hooks/useFieldFocusManager.ts +162 -0
  292. package/src/hooks/utils.ts +122 -0
  293. package/src/inputs/AutoCompleteInput/index.tsx +4 -6
  294. package/src/inputs/Checkboxes/index.tsx +95 -87
  295. package/src/inputs/DateInput/index.tsx +19 -6
  296. package/src/inputs/DateTimeInput/index.tsx +19 -6
  297. package/src/inputs/FileInput/index.tsx +9 -7
  298. package/src/inputs/ImageInput/index.tsx +2 -2
  299. package/src/inputs/Input/index.tsx +72 -71
  300. package/src/inputs/Label/index.tsx +1 -1
  301. package/src/inputs/OtpInput/index.tsx +43 -34
  302. package/src/inputs/Radio/index.tsx +29 -21
  303. package/src/inputs/Select/index.tsx +2 -2
  304. package/src/{Field/utils/index.ts → inputs/registry.ts} +3 -1
  305. package/src/lazy.js +10 -9
  306. package/src/registry.js +23 -13
  307. package/src/types.tsx +12 -5
  308. package/src/utils.ts +3 -2
  309. package/src/validators/index.ts +10 -9
  310. package/src/validators/types.ts +1 -1
  311. package/src/validators/utils/date.ts +8 -3
  312. package/src/validators/utils/datetime.ts +8 -3
  313. package/src/validators/utils/file.ts +2 -2
  314. package/src/validators/utils/iban.ts +2 -2
  315. package/src/validators/utils/image.ts +2 -2
  316. package/src/validators/utils/index.ts +2 -2
  317. package/src/validators/utils/int.ts +1 -1
  318. package/src/validators/utils/number.ts +1 -1
  319. package/src/validators/utils/otp.ts +2 -2
  320. package/src/validators/utils/phone.ts +2 -2
  321. package/src/validators/utils/postal_code.ts +2 -2
  322. package/src/validators/utils/text_limit.ts +2 -2
  323. package/types.d.ts +8 -4
  324. package/types.js.map +1 -1
  325. package/utils.d.ts +1 -1
  326. package/utils.js.map +2 -2
  327. package/validators/index.d.ts +5 -5
  328. package/validators/index.js.map +2 -2
  329. package/validators/types.d.ts +1 -1
  330. package/validators/utils/date/index.js +6 -1
  331. package/validators/utils/date.d.ts +2 -2
  332. package/validators/utils/date.js.map +2 -2
  333. package/validators/utils/datetime/index.js +6 -1
  334. package/validators/utils/datetime.d.ts +2 -2
  335. package/validators/utils/datetime.js.map +2 -2
  336. package/validators/utils/file.d.ts +2 -2
  337. package/validators/utils/file.js.map +1 -1
  338. package/validators/utils/iban.d.ts +2 -2
  339. package/validators/utils/iban.js.map +1 -1
  340. package/validators/utils/image.d.ts +2 -2
  341. package/validators/utils/image.js.map +1 -1
  342. package/validators/utils/index.d.ts +2 -2
  343. package/validators/utils/index.js.map +1 -1
  344. package/validators/utils/int.d.ts +1 -1
  345. package/validators/utils/int.js.map +1 -1
  346. package/validators/utils/number.d.ts +1 -1
  347. package/validators/utils/number.js.map +1 -1
  348. package/validators/utils/otp.d.ts +2 -2
  349. package/validators/utils/otp.js.map +1 -1
  350. package/validators/utils/phone.d.ts +2 -2
  351. package/validators/utils/phone.js.map +1 -1
  352. package/validators/utils/postal_code.d.ts +2 -2
  353. package/validators/utils/postal_code.js.map +1 -1
  354. package/validators/utils/text_limit.d.ts +2 -2
  355. package/validators/utils/text_limit.js.map +1 -1
  356. package/Field/utils/calculateField/index.js +0 -27
  357. package/Field/utils/calculateField.d.ts +0 -2
  358. package/Field/utils/calculateField.js.map +0 -7
  359. package/Field/utils/index.js.map +0 -7
  360. package/FieldArray/FormDialog.d.ts +0 -67
  361. package/FieldArray/FormDialog.js.map +0 -7
  362. package/FormBuilder/index.test.d.ts +0 -1
  363. package/FormBuilder/interaction.test.d.ts +0 -1
  364. package/FormBuilder/scenarios.test.d.ts +0 -88
  365. package/MultiplicityField/index.test.d.ts +0 -1
  366. package/Questions/index.spec.d.ts +0 -1
  367. package/Questions/index.test.d.ts +0 -1
  368. package/cjs/Field/utils/calculateField/index.js +0 -50
  369. package/cjs/Field/utils/calculateField.js.map +0 -7
  370. package/cjs/Field/utils/index.js.map +0 -7
  371. package/cjs/FieldArray/FormDialog.js.map +0 -7
  372. package/cjs/inputs/inputsScenarios/index.js +0 -533
  373. package/cjs/inputs/inputsScenarios.js.map +0 -7
  374. package/cjs/locales/el.js.map +0 -7
  375. package/inputs/AutoCompleteInput/index.test.d.ts +0 -1
  376. package/inputs/Checkboxes/index.test.d.ts +0 -1
  377. package/inputs/DateInput/index.test.d.ts +0 -1
  378. package/inputs/DateTimeInput/index.test.d.ts +0 -1
  379. package/inputs/FileInput/index.test.d.ts +0 -1
  380. package/inputs/ImageInput/index.test.d.ts +0 -1
  381. package/inputs/Input/index.test.d.ts +0 -1
  382. package/inputs/Label/index.test.d.ts +0 -1
  383. package/inputs/OtpInput/index.test.d.ts +0 -1
  384. package/inputs/Radio/index.test.d.ts +0 -1
  385. package/inputs/Select/index.test.d.ts +0 -1
  386. package/inputs/inputsScenarios/index.js +0 -499
  387. package/inputs/inputsScenarios.d.ts +0 -296
  388. package/inputs/inputsScenarios.js.map +0 -7
  389. package/locales/el/index.js +0 -6
  390. package/locales/el.d.ts +0 -2
  391. package/locales/el.js.map +0 -7
  392. package/src/Field/utils/calculateField.ts +0 -49
  393. package/src/FieldArray/FormDialog.tsx +0 -568
  394. package/src/inputs/inputsScenarios.ts +0 -496
  395. package/src/locales/el.ts +0 -3
  396. /package/{FieldArray/index.test.d.ts → hooks/__tests__/utils.spec.d.ts} +0 -0
@@ -0,0 +1,627 @@
1
+ import React from 'react';
2
+ import {
3
+ fireEvent,
4
+ render,
5
+ screen,
6
+ waitFor,
7
+ within,
8
+ } from '@testing-library/react';
9
+ import type { FieldSpec } from '@digigov/form';
10
+ import FormBuilder, { Field } from '@digigov/form';
11
+ import { Button } from '@digigov/ui/form/Button';
12
+
13
+ beforeAll(() => {
14
+ global.ResizeObserver = class ResizeObserver {
15
+ observe() {
16
+ // do nothing
17
+ }
18
+ unobserve() {
19
+ // do nothing
20
+ }
21
+ disconnect() {
22
+ // do nothing
23
+ }
24
+ };
25
+ });
26
+
27
+ const fieldSpec: FieldSpec = {
28
+ key: 'nested_fieldset_multiplicity',
29
+ type: 'array',
30
+ editable: true,
31
+ label: {
32
+ primary:
33
+ 'Fieldset με multiplicity που περιέχει πεδία με multiplicity (multiplinception)',
34
+ },
35
+ extra: {
36
+ noIndex: true,
37
+ tableCellActionsLabel: '',
38
+ border: true,
39
+ variant: 'dialog',
40
+ labelSize: 'md',
41
+ tableContainer: {
42
+ mb: 0,
43
+ },
44
+ stackProps: {
45
+ spacing: 2,
46
+ justifyContent: 'flex-end',
47
+ direction: 'row',
48
+ },
49
+ max: 5,
50
+ label: {
51
+ object: {
52
+ append: {
53
+ label: 'Αποθήκευση',
54
+ props: {
55
+ color: 'primary',
56
+ },
57
+ },
58
+ edit: {
59
+ label: 'Αποθήκευση',
60
+ props: {
61
+ color: 'primary',
62
+ },
63
+ },
64
+ cancel: {
65
+ label: 'Ακύρωση',
66
+ props: {
67
+ variant: 'button',
68
+ color: 'secondary',
69
+ },
70
+ },
71
+ add: 'Προσθήκη',
72
+ addButtonVariant: 'link',
73
+ delete: 'Αφαίρεση',
74
+ deleteButtonVariant: 'link',
75
+ nothing_added: 'Δεν έχουν προστεθεί στοιχεία',
76
+ nothing_added_props: {
77
+ style: {
78
+ color: 'var(--color-gray-600)',
79
+ },
80
+ margin: 0,
81
+ paddingLeft: 2,
82
+ },
83
+ },
84
+ },
85
+ of: {
86
+ type: 'object',
87
+ extra: {
88
+ fields: [
89
+ {
90
+ type: 'array',
91
+ key: 'nested_multiplicity_required',
92
+ name: 'nested_multiplicity_required',
93
+ label: {
94
+ primary: '"required" μέχρι 10',
95
+ secondary:
96
+ 'Ο χρήστης μπορεί να προσθέσει τιμές (σύνολο από 1 έως 10)',
97
+ },
98
+ extra: {
99
+ editVariant: 'required',
100
+ noIndex: true,
101
+ border: false,
102
+ noHeader: true,
103
+ variant: 'dialog',
104
+ min: 1,
105
+ max: 10,
106
+ tableContainer: {
107
+ mb: 0,
108
+ },
109
+ stackProps: {
110
+ spacing: 2,
111
+ justifyContent: 'flex-end',
112
+ direction: 'row',
113
+ },
114
+ label: {
115
+ object: {
116
+ append: {
117
+ label: 'Αποθήκευση',
118
+ props: {
119
+ color: 'primary',
120
+ },
121
+ },
122
+ edit: {
123
+ label: 'Αποθήκευση',
124
+ props: {
125
+ color: 'primary',
126
+ },
127
+ },
128
+ cancel: {
129
+ label: 'Ακύρωση',
130
+ props: {
131
+ variant: 'button',
132
+ color: 'secondary',
133
+ },
134
+ },
135
+ add: 'Προσθήκη',
136
+ addButtonVariant: 'link',
137
+ delete: 'Αφαίρεση',
138
+ deleteButtonVariant: 'link',
139
+ nothing_added: 'Δεν έχουν προστεθεί στοιχεία',
140
+ nothing_added_props: {
141
+ style: {
142
+ color: 'var(--color-gray-600)',
143
+ },
144
+ margin: 0,
145
+ paddingLeft: 2,
146
+ },
147
+ },
148
+ },
149
+ of: {
150
+ type: 'string',
151
+ label: {},
152
+ editable: true,
153
+ required: true,
154
+ layout: {},
155
+ },
156
+ },
157
+ required: true,
158
+ editable: true,
159
+ layout: {},
160
+ },
161
+ {
162
+ type: 'array',
163
+ key: 'nested_multiplicity_optional',
164
+ name: 'nested_multiplicity_optional',
165
+ label: {
166
+ primary: '"optional" μέχρι 10',
167
+ secondary:
168
+ 'Ο χρήστης μπορεί να προσθέσει τιμές (σύνολο από 1 έως 10)',
169
+ },
170
+ extra: {
171
+ editVariant: 'optional',
172
+ noIndex: true,
173
+ border: false,
174
+ noHeader: true,
175
+ variant: 'dialog',
176
+ min: 0,
177
+ max: 10,
178
+ tableContainer: {
179
+ mb: 0,
180
+ },
181
+ stackProps: {
182
+ spacing: 2,
183
+ justifyContent: 'flex-end',
184
+ direction: 'row',
185
+ },
186
+ label: {
187
+ object: {
188
+ append: {
189
+ label: 'Αποθήκευση',
190
+ props: {
191
+ color: 'primary',
192
+ },
193
+ },
194
+ edit: {
195
+ label: 'Αποθήκευση',
196
+ props: {
197
+ color: 'primary',
198
+ },
199
+ },
200
+ cancel: {
201
+ label: 'Ακύρωση',
202
+ props: {
203
+ variant: 'button',
204
+ color: 'secondary',
205
+ },
206
+ },
207
+ add: 'Προσθήκη',
208
+ addButtonVariant: 'link',
209
+ delete: 'Αφαίρεση',
210
+ deleteButtonVariant: 'link',
211
+ nothing_added: 'Δεν έχουν προστεθεί στοιχεία',
212
+ nothing_added_props: {
213
+ style: {
214
+ color: 'var(--color-gray-600)',
215
+ },
216
+ margin: 0,
217
+ paddingLeft: 2,
218
+ },
219
+ },
220
+ },
221
+ of: {
222
+ type: 'string',
223
+ label: {},
224
+ required: false,
225
+ editable: true,
226
+ layout: {},
227
+ },
228
+ },
229
+ required: false,
230
+ editable: true,
231
+ layout: {},
232
+ },
233
+ ],
234
+ },
235
+ },
236
+ },
237
+ };
238
+
239
+ describe('nested_fieldset_multiplicity case from dilosi', () => {
240
+ const submitHandler = vi.fn();
241
+
242
+ const TestForm = () => (
243
+ <FormBuilder onSubmit={submitHandler}>
244
+ <Field name="nested_fieldset_multiplicity" {...fieldSpec} />
245
+ <Button type="submit">Συνέχεια</Button>
246
+ </FormBuilder>
247
+ );
248
+
249
+ beforeEach(() => {
250
+ submitHandler.mockClear();
251
+ });
252
+
253
+ it('should render', async () => {
254
+ render(<TestForm />);
255
+ expect(
256
+ screen.getByText(
257
+ 'Fieldset με multiplicity που περιέχει πεδία με multiplicity (multiplinception)'
258
+ )
259
+ ).toBeInTheDocument();
260
+ const addButton = screen.getByRole('button', { name: 'Προσθήκη' });
261
+ expect(addButton).toBeInTheDocument();
262
+ });
263
+
264
+ it('should open dialog on "add" button click', async () => {
265
+ render(<TestForm />);
266
+ const addButton = screen.getByRole('button', { name: 'Προσθήκη' });
267
+ fireEvent.click(addButton);
268
+ expect(screen.getByRole('dialog')).toBeInTheDocument();
269
+ });
270
+
271
+ for (const fieldsetType of ['required', 'optional'] as const) {
272
+ it(`should open the nested_multiplicity_${fieldsetType} dialog on nested "add" button click`, async () => {
273
+ render(<TestForm />);
274
+ openMainDialog();
275
+ const nestedFieldset = getNestedFieldset(fieldsetType);
276
+ const nestedFieldsetAddButton = within(nestedFieldset!).getByRole(
277
+ 'button',
278
+ { name: 'Προσθήκη' }
279
+ );
280
+ fireEvent.click(nestedFieldsetAddButton);
281
+ expect(screen.getAllByRole('dialog').length).toBe(2);
282
+ const inputField = screen.getByRole('textbox');
283
+ expect(inputField).toBeInTheDocument();
284
+ expect(inputField).toHaveProperty(
285
+ 'name',
286
+ `nested_multiplicity_${fieldsetType}`
287
+ );
288
+ });
289
+ }
290
+
291
+ it('should validate nested_multiplicity_required', async () => {
292
+ render(<TestForm />);
293
+ openMainDialog();
294
+ const submitButton = screen.getByRole('button', {
295
+ name: 'Αποθήκευση',
296
+ });
297
+ fireEvent.click(submitButton);
298
+
299
+ expect(
300
+ await screen.findByText(
301
+ 'Το πεδίο πρέπει να έχει τουλάχιστον 1 εγγραφές. Προσθέστε μια ακόμα επιλέγοντας την απάντηση «Ναι» στην επόμενη ερώτηση.'
302
+ )
303
+ ).toBeInTheDocument();
304
+ });
305
+
306
+ it('should validate nested_multiplicity_required string field', async () => {
307
+ render(<TestForm />);
308
+ openMainDialog();
309
+ const nestedFieldset = getNestedFieldset('required');
310
+ const nestedFieldsetAddButton = within(nestedFieldset).getByRole('button', {
311
+ name: 'Προσθήκη',
312
+ });
313
+ fireEvent.click(nestedFieldsetAddButton);
314
+ expect(screen.getAllByRole('dialog').length).toBe(2);
315
+ const inputField = screen.getByRole('textbox');
316
+ expect(inputField).toHaveProperty('name', `nested_multiplicity_required`);
317
+ const submitButton = screen.getAllByRole('button', {
318
+ name: 'Αποθήκευση',
319
+ })[1];
320
+ fireEvent.click(submitButton);
321
+ await waitFor(() =>
322
+ expect(
323
+ screen.getByText('Το πεδίο είναι υποχρεωτικό.')
324
+ ).toBeInTheDocument()
325
+ );
326
+ });
327
+
328
+ it('should submit nested_multiplicity_required item added by nested form', async () => {
329
+ render(<TestForm />);
330
+ openMainDialog();
331
+ const nestedFieldset = getNestedFieldset('required');
332
+ const nestedFieldsetAddButton = within(nestedFieldset).getByRole('button', {
333
+ name: 'Προσθήκη',
334
+ });
335
+ fireEvent.click(nestedFieldsetAddButton);
336
+ expect(screen.getAllByRole('dialog').length).toBe(2);
337
+ const nestedFieldsetInput = screen.getByRole('textbox');
338
+ expect(nestedFieldsetInput).toBeInTheDocument();
339
+ expect(nestedFieldsetInput).toHaveProperty(
340
+ 'name',
341
+ `nested_multiplicity_required`
342
+ );
343
+ fireEvent.change(nestedFieldsetInput, {
344
+ target: { value: 'Test Value' },
345
+ });
346
+ expect(nestedFieldsetInput).toHaveValue('Test Value');
347
+ // There are two "Αποθήκευση" buttons, one for the nested dialog and one for the main dialog
348
+ const submitButton = screen.getAllByRole('button', {
349
+ name: 'Αποθήκευση',
350
+ })[1];
351
+ fireEvent.click(submitButton);
352
+ await waitFor(() => {
353
+ // Only one dialog should remain open (the main one)
354
+ expect(screen.getAllByRole('dialog').length).toBe(1);
355
+ });
356
+
357
+ expect(screen.getByText('Test Value')).toBeInTheDocument();
358
+ expect(submitHandler).not.toHaveBeenCalled();
359
+
360
+ const mainDialogSubmitButton = screen.getByRole('button', {
361
+ name: 'Αποθήκευση',
362
+ });
363
+ fireEvent.click(mainDialogSubmitButton);
364
+ await waitFor(() => {
365
+ expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
366
+ });
367
+ expect(screen.getByText('Test Value')).toBeInTheDocument();
368
+ const continueButton = screen.getByRole('button', { name: 'Συνέχεια' });
369
+ expect(continueButton).toBeInTheDocument();
370
+ fireEvent.click(continueButton);
371
+ await waitFor(() => {
372
+ expect(submitHandler).toHaveBeenCalledTimes(1);
373
+ });
374
+ expect(submitHandler).toHaveBeenCalledWith({
375
+ nested_fieldset_multiplicity: expect.arrayContaining([
376
+ {
377
+ nested_multiplicity_required: ['Test Value'],
378
+ nested_multiplicity_optional: [],
379
+ },
380
+ ]),
381
+ });
382
+ });
383
+
384
+ it('should submit both nested_multiplicity_required and nested_multiplicity_optional items added by nested forms', async () => {
385
+ render(<TestForm />);
386
+ openMainDialog();
387
+
388
+ // Add multiple nested_multiplicity_required items
389
+ const requiredNestedFieldset = getNestedFieldset('required');
390
+ const requiredNestedFieldsetAddButton = within(
391
+ requiredNestedFieldset
392
+ ).getByRole('button', {
393
+ name: 'Προσθήκη',
394
+ });
395
+ fireEvent.click(requiredNestedFieldsetAddButton);
396
+ expect(screen.getAllByRole('dialog').length).toBe(2);
397
+ const requiredNestedFieldsetInput = screen.getByRole('textbox');
398
+ expect(requiredNestedFieldsetInput).toBeInTheDocument();
399
+ expect(requiredNestedFieldsetInput).toHaveProperty(
400
+ 'name',
401
+ `nested_multiplicity_required`
402
+ );
403
+ fireEvent.change(requiredNestedFieldsetInput, {
404
+ target: { value: 'Required Test Value 1' },
405
+ });
406
+ expect(requiredNestedFieldsetInput).toHaveValue('Required Test Value 1');
407
+ // There are two "Αποθήκευση" buttons, one for the nested dialog and one for the main dialog
408
+ const requiredSubmitButton = screen.getAllByRole('button', {
409
+ name: 'Αποθήκευση',
410
+ })[1];
411
+ fireEvent.click(requiredSubmitButton);
412
+ await waitFor(() => {
413
+ // Only one dialog should remain open (the main one)
414
+ expect(screen.getAllByRole('dialog').length).toBe(1);
415
+ });
416
+
417
+ expect(screen.getByText('Required Test Value 1')).toBeInTheDocument();
418
+ expect(submitHandler).not.toHaveBeenCalled();
419
+ // Add a second required item
420
+ fireEvent.click(requiredNestedFieldsetAddButton);
421
+ expect(screen.getAllByRole('dialog').length).toBe(2);
422
+ const secondRequiredNestedFieldsetInput = screen.getByRole('textbox');
423
+ expect(secondRequiredNestedFieldsetInput).toBeInTheDocument();
424
+ expect(secondRequiredNestedFieldsetInput).toHaveProperty(
425
+ 'name',
426
+ `nested_multiplicity_required`
427
+ );
428
+ fireEvent.change(secondRequiredNestedFieldsetInput, {
429
+ target: { value: 'Required Test Value 2' },
430
+ });
431
+ expect(secondRequiredNestedFieldsetInput).toHaveValue(
432
+ 'Required Test Value 2'
433
+ );
434
+ const secondRequiredSubmitButton = screen.getAllByRole('button', {
435
+ name: 'Αποθήκευση',
436
+ })[1];
437
+ fireEvent.click(secondRequiredSubmitButton);
438
+ await waitFor(() => {
439
+ // Only one dialog should remain open (the main one)
440
+ expect(screen.getAllByRole('dialog').length).toBe(1);
441
+ });
442
+
443
+ expect(screen.getByText('Required Test Value 1')).toBeInTheDocument();
444
+ expect(submitHandler).not.toHaveBeenCalled();
445
+
446
+ // Add nested_multiplicity_optional item
447
+ const optionalNestedFieldset = getNestedFieldset('optional');
448
+ const optionalNestedFieldsetAddButton = within(
449
+ optionalNestedFieldset
450
+ ).getByRole('button', { name: 'Προσθήκη' });
451
+ fireEvent.click(optionalNestedFieldsetAddButton);
452
+ expect(screen.getAllByRole('dialog').length).toBe(2);
453
+ const optionalNestedFieldsetInput = screen.getByRole('textbox');
454
+ expect(optionalNestedFieldsetInput).toBeInTheDocument();
455
+ expect(optionalNestedFieldsetInput).toHaveProperty(
456
+ 'name',
457
+ `nested_multiplicity_optional`
458
+ );
459
+ fireEvent.change(optionalNestedFieldsetInput, {
460
+ target: { value: 'Optional Test Value' },
461
+ });
462
+ expect(optionalNestedFieldsetInput).toHaveValue('Optional Test Value');
463
+
464
+ // There are two "Αποθήκευση" buttons, one for the nested dialog and one for the main dialog
465
+ const optionalSubmitButton = screen.getAllByRole('button', {
466
+ name: 'Αποθήκευση',
467
+ })[1];
468
+ fireEvent.click(optionalSubmitButton);
469
+ await waitFor(() => {
470
+ // Only one dialog should remain open (the main one)
471
+ expect(screen.getAllByRole('dialog').length).toBe(1);
472
+ });
473
+
474
+ expect(screen.getByText('Optional Test Value')).toBeInTheDocument();
475
+ expect(submitHandler).not.toHaveBeenCalled();
476
+
477
+ const mainDialogSubmitButton = screen.getByRole('button', {
478
+ name: 'Αποθήκευση',
479
+ });
480
+ fireEvent.click(mainDialogSubmitButton);
481
+ await waitFor(() => {
482
+ expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
483
+ });
484
+ expect(screen.getByText('Optional Test Value')).toBeInTheDocument();
485
+ const continueButton = screen.getByRole('button', { name: 'Συνέχεια' });
486
+ expect(continueButton).toBeInTheDocument();
487
+ fireEvent.click(continueButton);
488
+ await waitFor(() => {
489
+ expect(submitHandler).toHaveBeenCalledTimes(1);
490
+ });
491
+ expect(submitHandler).toHaveBeenCalledWith({
492
+ nested_fieldset_multiplicity: expect.arrayContaining([
493
+ {
494
+ nested_multiplicity_required: [
495
+ 'Required Test Value 1',
496
+ 'Required Test Value 2',
497
+ ],
498
+ nested_multiplicity_optional: ['Optional Test Value'],
499
+ },
500
+ ]),
501
+ });
502
+ });
503
+
504
+ it('should submit multiple fieldset items added to main form', async () => {
505
+ render(<TestForm />);
506
+ openMainDialog();
507
+
508
+ // Add first item
509
+ const nestedFieldset = getNestedFieldset('required');
510
+ const nestedFieldsetAddButton = within(nestedFieldset).getByRole('button', {
511
+ name: 'Προσθήκη',
512
+ });
513
+ fireEvent.click(nestedFieldsetAddButton);
514
+ expect(screen.getAllByRole('dialog').length).toBe(2);
515
+ const nestedFieldsetInput = screen.getByRole('textbox');
516
+ expect(nestedFieldsetInput).toBeInTheDocument();
517
+ expect(nestedFieldsetInput).toHaveProperty(
518
+ 'name',
519
+ `nested_multiplicity_required`
520
+ );
521
+ fireEvent.change(nestedFieldsetInput, {
522
+ target: { value: 'Test Value 1' },
523
+ });
524
+ expect(nestedFieldsetInput).toHaveValue('Test Value 1');
525
+ // There are two "Αποθήκευση" buttons, one for the nested dialog and one for the main dialog
526
+ const submitButton = screen.getAllByRole('button', {
527
+ name: 'Αποθήκευση',
528
+ })[1];
529
+ fireEvent.click(submitButton);
530
+ await waitFor(() => {
531
+ // Only one dialog should remain open (the main one)
532
+ expect(screen.getAllByRole('dialog').length).toBe(1);
533
+ });
534
+ expect(screen.getByText('Test Value 1')).toBeInTheDocument();
535
+ expect(submitHandler).not.toHaveBeenCalled();
536
+
537
+ // Submit first item
538
+ const mainDialogSubmitButton = screen.getByRole('button', {
539
+ name: 'Αποθήκευση',
540
+ });
541
+ fireEvent.click(mainDialogSubmitButton);
542
+ await waitFor(() => {
543
+ expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
544
+ });
545
+ expect(screen.getByText('Test Value 1')).toBeInTheDocument();
546
+
547
+ // Add second item
548
+ openMainDialog();
549
+ const secondNestedFieldset = getNestedFieldset('required', true);
550
+ const secondNestedFieldsetAddButton = within(
551
+ secondNestedFieldset
552
+ ).getByRole('button', {
553
+ name: 'Προσθήκη',
554
+ });
555
+ fireEvent.click(secondNestedFieldsetAddButton);
556
+ expect(screen.getAllByRole('dialog').length).toBe(2);
557
+ const secondNestedFieldsetInput = screen.getByRole('textbox');
558
+ expect(secondNestedFieldsetInput).toBeInTheDocument();
559
+ expect(secondNestedFieldsetInput).toHaveProperty(
560
+ 'name',
561
+ `nested_multiplicity_required`
562
+ );
563
+ fireEvent.change(secondNestedFieldsetInput, {
564
+ target: { value: 'Test Value 2' },
565
+ });
566
+ expect(secondNestedFieldsetInput).toHaveValue('Test Value 2');
567
+ // There are two "Αποθήκευση" buttons, one for the nested dialog and one for the main dialog
568
+ const secondSubmitButton = screen.getAllByRole('button', {
569
+ name: 'Αποθήκευση',
570
+ })[1];
571
+ fireEvent.click(secondSubmitButton);
572
+ await waitFor(() => {
573
+ // Only one dialog should remain open (the main one)
574
+ expect(screen.getAllByRole('dialog').length).toBe(1);
575
+ });
576
+ expect(screen.getByText('Test Value 2')).toBeInTheDocument();
577
+ expect(submitHandler).not.toHaveBeenCalled();
578
+ // Submit second item
579
+ const secondMainDialogSubmitButton = screen.getByRole('button', {
580
+ name: 'Αποθήκευση',
581
+ });
582
+ fireEvent.click(secondMainDialogSubmitButton);
583
+ await waitFor(() => {
584
+ expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
585
+ });
586
+ expect(screen.getByText('Test Value 2')).toBeInTheDocument();
587
+
588
+ const continueButton = screen.getByRole('button', { name: 'Συνέχεια' });
589
+ expect(continueButton).toBeInTheDocument();
590
+ fireEvent.click(continueButton);
591
+ await waitFor(() => {
592
+ expect(submitHandler).toHaveBeenCalledTimes(1);
593
+ });
594
+ expect(submitHandler).toHaveBeenCalledWith({
595
+ nested_fieldset_multiplicity: expect.arrayContaining([
596
+ {
597
+ nested_multiplicity_required: ['Test Value 1'],
598
+ nested_multiplicity_optional: [],
599
+ },
600
+ {
601
+ nested_multiplicity_required: ['Test Value 2'],
602
+ nested_multiplicity_optional: [],
603
+ },
604
+ ]),
605
+ });
606
+ });
607
+ });
608
+
609
+ function openMainDialog() {
610
+ const addButton = screen.getByRole('button', { name: 'Προσθήκη' });
611
+ fireEvent.click(addButton);
612
+ expect(screen.getByRole('dialog')).toBeInTheDocument();
613
+ // Expect: The external "add" button + the required "add" button + the optional "add" button
614
+ expect(screen.getAllByRole('button', { name: 'Προσθήκη' }).length).toBe(3);
615
+ }
616
+
617
+ function getNestedFieldset(
618
+ type: 'required' | 'optional',
619
+ hasSubmittedOnce = false
620
+ ) {
621
+ const nestedFieldsetTitle = screen.getAllByText(
622
+ new RegExp(`"${type}" μέχρι 10`)
623
+ )[hasSubmittedOnce ? 1 : 0];
624
+ const nestedFieldset = nestedFieldsetTitle.closest('fieldset');
625
+ expect(nestedFieldset).toBeInTheDocument();
626
+ return nestedFieldset!;
627
+ }