@digigov/form 2.0.0-2a26e869 → 2.0.0-44e7106a

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 (333) hide show
  1. package/Field/FieldBase/index.js +6 -1
  2. package/Field/FieldBase.js.map +2 -2
  3. package/Field/FieldBaseContainer/index.js +6 -4
  4. package/Field/FieldBaseContainer.js.map +2 -2
  5. package/Field/FieldConditional/index.js +4 -0
  6. package/Field/FieldConditional.js.map +2 -2
  7. package/Field/index.js +15 -4
  8. package/Field/index.js.map +2 -2
  9. package/Field/types.d.ts +13 -3
  10. package/Field/utils/index.js +7 -0
  11. package/Field/utils/index.js.map +2 -2
  12. package/Field/utils/useField/index.js +14 -1
  13. package/Field/utils/useField.js.map +2 -2
  14. package/FieldArray/FieldArray.stories.d.ts +1 -0
  15. package/FieldArray/FormDialog/index.js +397 -0
  16. package/{inputs/Input/inputsInputScenarios → FieldArray/FormDialog}/package.json +1 -1
  17. package/FieldArray/FormDialog.d.ts +66 -0
  18. package/FieldArray/FormDialog.js.map +7 -0
  19. package/FieldArray/__stories__/Default.d.ts +1 -1
  20. package/FieldArray/__stories__/WithExactLength.d.ts +1 -1
  21. package/FieldArray/__stories__/WithModal.d.ts +2 -0
  22. package/FieldArray/index.d.ts +6 -0
  23. package/FieldArray/index.js +62 -23
  24. package/FieldArray/index.js.map +2 -2
  25. package/FieldObject/index.d.ts +5 -0
  26. package/FieldObject/index.js +30 -15
  27. package/FieldObject/index.js.map +2 -2
  28. package/FormBuilder/FormBuilder.stories.d.ts +2 -0
  29. package/FormBuilder/__stories__/AutoErrorGrouping.d.ts +1 -1
  30. package/FormBuilder/__stories__/Default.d.ts +1 -1
  31. package/FormBuilder/__stories__/ErrorGrouping.d.ts +1 -1
  32. package/FormBuilder/index.js +10 -2
  33. package/FormBuilder/index.js.map +2 -2
  34. package/MultiplicityField/MultiplicityField.stories.d.ts +2 -0
  35. package/MultiplicityField/__stories__/Default.d.ts +1 -1
  36. package/MultiplicityField/__stories__/PreviewDisplay.d.ts +1 -1
  37. package/MultiplicityField/__stories__/WithExactLength.d.ts +1 -1
  38. package/MultiplicityField/__stories__/WithMaxLength.d.ts +1 -1
  39. package/MultiplicityField/__stories__/WithMinAndMaxLength.d.ts +1 -1
  40. package/MultiplicityField/__stories__/WithMinLength.d.ts +1 -1
  41. package/MultiplicityField/add-objects/index.js +2 -0
  42. package/MultiplicityField/add-objects.js.map +2 -2
  43. package/MultiplicityField/index.js +4 -1
  44. package/MultiplicityField/index.js.map +2 -2
  45. package/MultiplicityField/types.d.ts +1 -0
  46. package/Questions/Questions.stories.d.ts +2 -0
  47. package/Questions/__stories__/Default.d.ts +1 -1
  48. package/cjs/Field/FieldBase/index.js +6 -1
  49. package/cjs/Field/FieldBase.js.map +2 -2
  50. package/cjs/Field/FieldBaseContainer/index.js +5 -3
  51. package/cjs/Field/FieldBaseContainer.js.map +3 -3
  52. package/cjs/Field/FieldConditional/index.js +4 -0
  53. package/cjs/Field/FieldConditional.js.map +2 -2
  54. package/cjs/Field/index.js +15 -4
  55. package/cjs/Field/index.js.map +2 -2
  56. package/cjs/Field/types.js.map +1 -1
  57. package/cjs/Field/utils/index.js +7 -0
  58. package/cjs/Field/utils/index.js.map +3 -3
  59. package/cjs/Field/utils/useField/index.js +14 -1
  60. package/cjs/Field/utils/useField.js.map +2 -2
  61. package/cjs/FieldArray/FormDialog/index.js +416 -0
  62. package/cjs/FieldArray/FormDialog.js.map +7 -0
  63. package/cjs/FieldArray/index.js +62 -23
  64. package/cjs/FieldArray/index.js.map +2 -2
  65. package/cjs/FieldObject/index.js +30 -15
  66. package/cjs/FieldObject/index.js.map +2 -2
  67. package/cjs/FormBuilder/index.js +9 -1
  68. package/cjs/FormBuilder/index.js.map +2 -2
  69. package/cjs/MultiplicityField/add-objects/index.js +2 -0
  70. package/cjs/MultiplicityField/add-objects.js.map +2 -2
  71. package/cjs/MultiplicityField/index.js +4 -1
  72. package/cjs/MultiplicityField/index.js.map +2 -2
  73. package/cjs/MultiplicityField/types.js.map +1 -1
  74. package/cjs/inputs/AutoCompleteInput/index.js +2 -1
  75. package/cjs/inputs/AutoCompleteInput/index.js.map +2 -2
  76. package/cjs/inputs/Checkboxes/index.js +2 -0
  77. package/cjs/inputs/Checkboxes/index.js.map +2 -2
  78. package/cjs/inputs/DateInput/index.js +23 -8
  79. package/cjs/inputs/DateInput/index.js.map +2 -2
  80. package/cjs/inputs/DateTimeInput/index.js +224 -0
  81. package/cjs/inputs/DateTimeInput/index.js.map +7 -0
  82. package/cjs/inputs/FileInput/index.js +51 -31
  83. package/cjs/inputs/FileInput/index.js.map +2 -2
  84. package/cjs/inputs/ImageInput/index.js +7 -1
  85. package/cjs/inputs/ImageInput/index.js.map +2 -2
  86. package/cjs/inputs/Input/index.js +7 -1
  87. package/cjs/inputs/Input/index.js.map +2 -2
  88. package/cjs/inputs/OtpInput/index.js +1 -0
  89. package/cjs/inputs/OtpInput/index.js.map +2 -2
  90. package/cjs/inputs/Radio/index.js +1 -0
  91. package/cjs/inputs/Radio/index.js.map +2 -2
  92. package/cjs/inputs/Select/index.js +9 -2
  93. package/cjs/inputs/Select/index.js.map +2 -2
  94. package/cjs/inputs/inputsScenarios/index.js +2 -2
  95. package/cjs/inputs/inputsScenarios.js.map +2 -2
  96. package/cjs/lazy/index.js +10 -1
  97. package/cjs/lazy.js.map +2 -2
  98. package/cjs/registry/index.js +12 -6
  99. package/cjs/registry.js.map +2 -2
  100. package/cjs/types.js.map +1 -1
  101. package/cjs/utils/index.js +20 -6
  102. package/cjs/utils.js.map +2 -2
  103. package/cjs/validators/index.js +20 -6
  104. package/cjs/validators/index.js.map +2 -2
  105. package/cjs/validators/utils/amka/index.js +60 -0
  106. package/cjs/validators/utils/amka.js.map +7 -0
  107. package/cjs/validators/utils/datetime/index.js +151 -0
  108. package/cjs/validators/utils/datetime.js.map +7 -0
  109. package/cjs/validators/utils/file/index.js +30 -17
  110. package/cjs/validators/utils/file.js.map +2 -2
  111. package/cjs/validators/utils/index.js +8 -2
  112. package/cjs/validators/utils/index.js.map +2 -2
  113. package/index.js +1 -1
  114. package/inputs/AutoCompleteInput/AutoComplete.stories.d.ts +2 -0
  115. package/inputs/AutoCompleteInput/__stories__/Default.d.ts +1 -1
  116. package/inputs/AutoCompleteInput/__stories__/Multiple.d.ts +1 -1
  117. package/inputs/AutoCompleteInput/index.js +2 -1
  118. package/inputs/AutoCompleteInput/index.js.map +2 -2
  119. package/inputs/Checkboxes/Checkboxes.stories.d.ts +2 -0
  120. package/inputs/Checkboxes/__stories__/Conditional.d.ts +1 -1
  121. package/inputs/Checkboxes/__stories__/Default.d.ts +1 -1
  122. package/inputs/Checkboxes/__stories__/WithDivider.d.ts +1 -1
  123. package/inputs/Checkboxes/index.js +2 -0
  124. package/inputs/Checkboxes/index.js.map +2 -2
  125. package/inputs/DateInput/DateInput.stories.d.ts +2 -0
  126. package/inputs/DateInput/__stories__/Default.d.ts +1 -1
  127. package/inputs/DateInput/index.js +23 -8
  128. package/inputs/DateInput/index.js.map +2 -2
  129. package/inputs/DateTimeInput/DateTimeInput.stories.d.ts +9 -0
  130. package/inputs/DateTimeInput/__stories__/Default.d.ts +3 -0
  131. package/inputs/DateTimeInput/index.d.ts +13 -0
  132. package/inputs/DateTimeInput/index.js +194 -0
  133. package/inputs/DateTimeInput/index.js.map +7 -0
  134. package/inputs/DateTimeInput/index.test.d.ts +1 -0
  135. package/inputs/DateTimeInput/package.json +6 -0
  136. package/inputs/FileInput/FileInput.stories.d.ts +3 -0
  137. package/inputs/FileInput/__stories__/Default.d.ts +1 -1
  138. package/inputs/FileInput/__stories__/WithBorderAndLink.d.ts +3 -0
  139. package/inputs/FileInput/index.d.ts +12 -0
  140. package/inputs/FileInput/index.js +56 -33
  141. package/inputs/FileInput/index.js.map +2 -2
  142. package/inputs/ImageInput/ImageInput.stories.d.ts +2 -0
  143. package/inputs/ImageInput/__stories__/Default.d.ts +1 -1
  144. package/inputs/ImageInput/__stories__/MaxSize.d.ts +1 -1
  145. package/inputs/ImageInput/__stories__/WithInvalidImageDimension.d.ts +1 -1
  146. package/inputs/ImageInput/index.js +7 -1
  147. package/inputs/ImageInput/index.js.map +2 -2
  148. package/inputs/Input/Input.stories.d.ts +4 -0
  149. package/inputs/Input/__stories__/AFM.d.ts +1 -1
  150. package/inputs/Input/__stories__/AMKA.d.ts +3 -0
  151. package/inputs/Input/__stories__/Boolean.d.ts +1 -1
  152. package/inputs/Input/__stories__/Email.d.ts +3 -0
  153. package/inputs/Input/__stories__/IBAN.d.ts +1 -1
  154. package/inputs/Input/__stories__/Integer.d.ts +1 -1
  155. package/inputs/Input/__stories__/LandlineNumber.d.ts +1 -1
  156. package/inputs/Input/__stories__/MobilePhone.d.ts +1 -1
  157. package/inputs/Input/__stories__/PhoneNumber.d.ts +1 -1
  158. package/inputs/Input/__stories__/PostalCode.d.ts +1 -1
  159. package/inputs/Input/__stories__/String.d.ts +1 -1
  160. package/inputs/Input/__stories__/StringWithTrimValidation.d.ts +1 -1
  161. package/inputs/Input/__stories__/TextWithLimit.d.ts +1 -1
  162. package/inputs/Input/index.d.ts +2 -1
  163. package/inputs/Input/index.js +7 -1
  164. package/inputs/Input/index.js.map +2 -2
  165. package/inputs/Label/Label.stories.d.ts +2 -0
  166. package/inputs/Label/__stories__/Default.d.ts +1 -1
  167. package/inputs/OtpInput/OtpInput.stories.d.ts +2 -0
  168. package/inputs/OtpInput/__stories__/Default.d.ts +1 -1
  169. package/inputs/OtpInput/index.js +1 -0
  170. package/inputs/OtpInput/index.js.map +2 -2
  171. package/inputs/Radio/Radio.stories.d.ts +2 -0
  172. package/inputs/Radio/__stories__/Conditional.d.ts +1 -1
  173. package/inputs/Radio/__stories__/Default.d.ts +1 -1
  174. package/inputs/Radio/__stories__/WithDivider.d.ts +1 -1
  175. package/inputs/Radio/index.js +1 -0
  176. package/inputs/Radio/index.js.map +2 -2
  177. package/inputs/Select/Select.stories.d.ts +2 -0
  178. package/inputs/Select/__stories__/Default.d.ts +1 -1
  179. package/inputs/Select/index.d.ts +2 -1
  180. package/inputs/Select/index.js +9 -2
  181. package/inputs/Select/index.js.map +2 -2
  182. package/inputs/inputsScenarios/index.js +2 -2
  183. package/inputs/inputsScenarios.d.ts +1 -1
  184. package/inputs/inputsScenarios.js.map +2 -2
  185. package/lazy/index.js +10 -1
  186. package/package.json +5 -5
  187. package/registry/index.js +12 -6
  188. package/src/Field/FieldBase.tsx +5 -0
  189. package/src/Field/FieldBaseContainer.tsx +10 -4
  190. package/src/Field/FieldConditional.tsx +4 -0
  191. package/src/Field/doc.mdx +202 -1
  192. package/src/Field/index.tsx +20 -5
  193. package/src/Field/types.tsx +15 -3
  194. package/src/Field/utils/index.ts +7 -0
  195. package/src/Field/utils/useField.ts +14 -2
  196. package/src/FieldArray/FieldArray.stories.js +1 -0
  197. package/src/FieldArray/FormDialog.tsx +565 -0
  198. package/src/FieldArray/__stories__/Default.tsx +2 -1
  199. package/src/FieldArray/__stories__/WithExactLength.tsx +2 -1
  200. package/src/FieldArray/__stories__/WithModal.tsx +160 -0
  201. package/src/FieldArray/index.test.tsx +8 -0
  202. package/src/FieldArray/index.tsx +85 -48
  203. package/src/FieldObject/index.tsx +39 -18
  204. package/src/FormBuilder/FormBuilder.stories.js +3 -0
  205. package/src/FormBuilder/__stories__/AutoErrorGrouping.tsx +1 -1
  206. package/src/FormBuilder/__stories__/Default.tsx +1 -1
  207. package/src/FormBuilder/__stories__/ErrorGrouping.tsx +1 -1
  208. package/src/FormBuilder/doc.mdx +9 -4
  209. package/src/FormBuilder/index.test.tsx +20 -17
  210. package/src/FormBuilder/index.tsx +11 -2
  211. package/src/FormBuilder/interaction.test.tsx +8 -0
  212. package/src/FormBuilder/scenarios.test.tsx +14 -7
  213. package/src/MultiplicityField/MultiplicityField.stories.js +3 -0
  214. package/src/MultiplicityField/__stories__/Default.tsx +1 -1
  215. package/src/MultiplicityField/__stories__/PreviewDisplay.tsx +1 -1
  216. package/src/MultiplicityField/__stories__/WithExactLength.tsx +1 -1
  217. package/src/MultiplicityField/__stories__/WithMaxLength.tsx +1 -1
  218. package/src/MultiplicityField/__stories__/WithMinAndMaxLength.tsx +1 -1
  219. package/src/MultiplicityField/__stories__/WithMinLength.tsx +1 -1
  220. package/src/MultiplicityField/add-objects.tsx +2 -0
  221. package/src/MultiplicityField/doc.mdx +101 -83
  222. package/src/MultiplicityField/index.test.tsx +4 -0
  223. package/src/MultiplicityField/index.tsx +3 -0
  224. package/src/MultiplicityField/types.ts +1 -0
  225. package/src/Questions/Questions.stories.js +3 -0
  226. package/src/Questions/__snapshots__/index.spec.tsx.snap +3 -1
  227. package/src/Questions/__stories__/Default.tsx +1 -1
  228. package/src/Questions/doc.mdx +21 -41
  229. package/src/Questions/index.test.tsx +4 -0
  230. package/src/doc.mdx +26 -11
  231. package/src/inputs/AutoCompleteInput/AutoComplete.stories.js +3 -0
  232. package/src/inputs/AutoCompleteInput/__stories__/Default.tsx +1 -1
  233. package/src/inputs/AutoCompleteInput/__stories__/Multiple.tsx +1 -1
  234. package/src/inputs/AutoCompleteInput/index.test.tsx +4 -0
  235. package/src/inputs/AutoCompleteInput/index.tsx +1 -0
  236. package/src/inputs/Checkboxes/Checkboxes.stories.js +3 -0
  237. package/src/inputs/Checkboxes/__stories__/Conditional.tsx +1 -1
  238. package/src/inputs/Checkboxes/__stories__/Default.tsx +1 -1
  239. package/src/inputs/Checkboxes/__stories__/WithDivider.tsx +1 -1
  240. package/src/inputs/Checkboxes/index.test.tsx +4 -0
  241. package/src/inputs/Checkboxes/index.tsx +2 -0
  242. package/src/inputs/DateInput/DateInput.stories.js +3 -0
  243. package/src/inputs/DateInput/__stories__/Default.tsx +1 -1
  244. package/src/inputs/DateInput/index.test.tsx +4 -0
  245. package/src/inputs/DateInput/index.tsx +24 -7
  246. package/src/inputs/DateTimeInput/DateTimeInput.stories.js +11 -0
  247. package/src/inputs/DateTimeInput/__stories__/Default.tsx +25 -0
  248. package/src/inputs/DateTimeInput/doc.mdx +16 -0
  249. package/src/inputs/DateTimeInput/index.test.tsx +24 -0
  250. package/src/inputs/DateTimeInput/index.tsx +209 -0
  251. package/src/inputs/FileInput/FileInput.stories.js +4 -0
  252. package/src/inputs/FileInput/__stories__/Default.tsx +1 -1
  253. package/src/inputs/FileInput/__stories__/WithBorderAndLink.tsx +34 -0
  254. package/src/inputs/FileInput/index.test.tsx +8 -0
  255. package/src/inputs/FileInput/index.tsx +57 -22
  256. package/src/inputs/ImageInput/ImageInput.stories.js +3 -0
  257. package/src/inputs/ImageInput/__stories__/Default.tsx +1 -1
  258. package/src/inputs/ImageInput/__stories__/MaxSize.tsx +1 -1
  259. package/src/inputs/ImageInput/__stories__/WithInvalidImageDimension.tsx +1 -1
  260. package/src/inputs/ImageInput/index.test.tsx +4 -4
  261. package/src/inputs/ImageInput/index.tsx +7 -1
  262. package/src/inputs/Input/Input.stories.js +5 -0
  263. package/src/inputs/Input/__stories__/AFM.tsx +1 -1
  264. package/src/inputs/Input/__stories__/AMKA.tsx +23 -0
  265. package/src/inputs/Input/__stories__/Boolean.tsx +1 -1
  266. package/src/inputs/Input/__stories__/Email.tsx +23 -0
  267. package/src/inputs/Input/__stories__/IBAN.tsx +1 -1
  268. package/src/inputs/Input/__stories__/Integer.tsx +1 -1
  269. package/src/inputs/Input/__stories__/LandlineNumber.tsx +1 -1
  270. package/src/inputs/Input/__stories__/MobilePhone.tsx +1 -1
  271. package/src/inputs/Input/__stories__/PhoneNumber.tsx +1 -1
  272. package/src/inputs/Input/__stories__/PostalCode.tsx +1 -1
  273. package/src/inputs/Input/__stories__/String.tsx +1 -1
  274. package/src/inputs/Input/__stories__/StringWithTrimValidation.tsx +1 -1
  275. package/src/inputs/Input/__stories__/TextWithLimit.tsx +1 -1
  276. package/src/inputs/Input/index.test.tsx +12 -0
  277. package/src/inputs/Input/index.tsx +10 -2
  278. package/src/inputs/Label/Label.stories.js +3 -0
  279. package/src/inputs/Label/__stories__/Default.tsx +1 -1
  280. package/src/inputs/Label/index.test.tsx +4 -0
  281. package/src/inputs/OtpInput/OtpInput.stories.js +3 -0
  282. package/src/inputs/OtpInput/__stories__/Default.tsx +1 -1
  283. package/src/inputs/OtpInput/index.test.tsx +4 -0
  284. package/src/inputs/OtpInput/index.tsx +1 -0
  285. package/src/inputs/Radio/Radio.stories.js +3 -0
  286. package/src/inputs/Radio/__stories__/Conditional.tsx +1 -1
  287. package/src/inputs/Radio/__stories__/Default.tsx +1 -1
  288. package/src/inputs/Radio/__stories__/WithDivider.tsx +1 -1
  289. package/src/inputs/Radio/index.test.tsx +4 -0
  290. package/src/inputs/Radio/index.tsx +1 -0
  291. package/src/inputs/Select/Select.stories.js +3 -0
  292. package/src/inputs/Select/__stories__/Default.tsx +1 -1
  293. package/src/inputs/Select/index.test.tsx +4 -0
  294. package/src/inputs/Select/index.tsx +13 -4
  295. package/src/inputs/inputsScenarios.ts +2 -2
  296. package/src/lazy.js +10 -1
  297. package/src/registry.js +12 -6
  298. package/src/types.tsx +2 -1
  299. package/src/utils.ts +27 -6
  300. package/src/validators/index.ts +29 -6
  301. package/src/validators/utils/amka.ts +39 -0
  302. package/src/validators/utils/datetime.ts +130 -0
  303. package/src/validators/utils/file.ts +33 -19
  304. package/src/validators/utils/index.ts +5 -1
  305. package/types.d.ts +2 -1
  306. package/types.js.map +1 -1
  307. package/utils/index.js +20 -6
  308. package/utils.d.ts +2 -0
  309. package/utils.js.map +2 -2
  310. package/validators/index.d.ts +1 -1
  311. package/validators/index.js +25 -7
  312. package/validators/index.js.map +2 -2
  313. package/validators/utils/amka/index.js +36 -0
  314. package/validators/utils/amka/package.json +6 -0
  315. package/validators/utils/amka.d.ts +6 -0
  316. package/validators/utils/amka.js.map +7 -0
  317. package/validators/utils/datetime/index.js +116 -0
  318. package/validators/utils/datetime/package.json +6 -0
  319. package/validators/utils/datetime.d.ts +9 -0
  320. package/validators/utils/datetime.js.map +7 -0
  321. package/validators/utils/file/index.js +30 -17
  322. package/validators/utils/file.js.map +2 -2
  323. package/validators/utils/index.d.ts +2 -0
  324. package/validators/utils/index.js +5 -1
  325. package/validators/utils/index.js.map +2 -2
  326. package/cjs/inputs/Input/inputsInputScenarios/index.js +0 -439
  327. package/cjs/inputs/Input/inputsInputScenarios.js.map +0 -7
  328. package/inputs/ImageInput/__stories__/WithInvalidImageSize.d.ts +0 -3
  329. package/inputs/Input/inputsInputScenarios/index.js +0 -406
  330. package/inputs/Input/inputsInputScenarios.d.ts +0 -57
  331. package/inputs/Input/inputsInputScenarios.js.map +0 -7
  332. package/src/inputs/ImageInput/__stories__/WithInvalidImageSize.tsx +0 -36
  333. package/src/inputs/Input/inputsInputScenarios.ts +0 -404
@@ -0,0 +1,160 @@
1
+ import React from 'react';
2
+ import FormBuilder, { Field, FieldSpec } from '@digigov/form';
3
+ import { Button } from '@digigov/ui/form/Button';
4
+
5
+ const fields = [
6
+ {
7
+ key: 'string',
8
+ type: 'string',
9
+ label: {
10
+ primary: 'Πεδίο κειμένου',
11
+ secondary:
12
+ 'Το multiplicity field είναι ένα πεδίο οπότε φαίνεται και είναι μέρος της φόρμας',
13
+ },
14
+ },
15
+ {
16
+ key: 'multiplicity',
17
+ editable: true,
18
+ required: true,
19
+ type: 'array',
20
+ label: {
21
+ primary: 'Συνυπογράφοντες',
22
+ secondary: 'Οι συνυπογράφοντες είναι άνθρωποι σαν και εμάς',
23
+ },
24
+ extra: {
25
+ noIndex: true,
26
+ border: false,
27
+ variant: 'dialog',
28
+ noHeader: false,
29
+ label: {
30
+ object: {
31
+ title: 'Συνυπογράφοντας',
32
+ title_added: 'Οι συνυπογράφοντες που έχετε προσθέσει',
33
+ add: 'Προσθήκη',
34
+ delete: 'Αφαίρεση συνυπογράφοντος',
35
+ append: {
36
+ label: 'Αποθήκευση',
37
+ props: {
38
+ color: 'primary',
39
+ },
40
+ },
41
+ edit: {
42
+ label: 'Αποθήκευση',
43
+ props: {
44
+ color: 'primary',
45
+ },
46
+ },
47
+ cancel: {
48
+ label: 'Ακύρωση',
49
+ props: {
50
+ variant: 'link',
51
+ },
52
+ },
53
+ },
54
+ question: {
55
+ title: 'Θέλετε να προσθέσετε επιπλέον συνυπογράφοντες;',
56
+ objectLabel: {
57
+ primary: 'Προσθήκη νέου συνυπογράφοντα',
58
+ secondary: 'Συμπληρώστε τα στοιχεία και μετά πατήστε «Προσθήκη»',
59
+ },
60
+ yes: 'Ναι',
61
+ no: 'Όχι',
62
+ },
63
+ },
64
+ min: 2,
65
+ // max: 4,
66
+ of: {
67
+ type: 'object',
68
+ extra: {
69
+ fields: [
70
+ {
71
+ key: 'firstName',
72
+ required: true,
73
+ type: 'string',
74
+ label: {
75
+ primary: 'Όνομα',
76
+ },
77
+ },
78
+ {
79
+ key: 'lastName',
80
+ required: true,
81
+ type: 'string',
82
+ label: {
83
+ primary: 'Επώνυμο',
84
+ },
85
+ },
86
+ ],
87
+ },
88
+ },
89
+ },
90
+ },
91
+ {
92
+ key: 'arrayofafm',
93
+ editable: true,
94
+ type: 'array',
95
+ label: {
96
+ primary: 'Συνυπογράφοντες',
97
+ secondary: 'Οι συνυπογράφοντες είναι άνθρωποι σαν και εμάς',
98
+ },
99
+ extra: {
100
+ variant: 'dialog',
101
+ noHeader: false,
102
+ label: {
103
+ object: {
104
+ title: 'Συνυπογράφοντας',
105
+ title_added: 'Οι συνυπογράφοντες που έχετε προσθέσει',
106
+ add: 'Προσθήκη',
107
+ delete: 'Αφαίρεση συνυπογράφοντος',
108
+ append: {
109
+ label: 'Αποθήκευση',
110
+ props: {
111
+ color: 'primary',
112
+ },
113
+ },
114
+ edit: {
115
+ label: 'Αποθήκευση',
116
+ props: {
117
+ color: 'primary',
118
+ },
119
+ },
120
+ cancel: {
121
+ label: 'Ακύρωση',
122
+ props: {
123
+ variant: 'link',
124
+ },
125
+ },
126
+ },
127
+ question: {
128
+ title: 'Θέλετε να προσθέσετε επιπλέον συνυπογράφοντες;',
129
+ objectLabel: {
130
+ primary: 'Προσθήκη νέου συνυπογράφοντα',
131
+ secondary: 'Συμπληρώστε τα στοιχεία και μετά πατήστε «Προσθήκη»',
132
+ },
133
+ yes: 'Ναι',
134
+ no: 'Όχι',
135
+ },
136
+ },
137
+ // min: 2,
138
+ // max: 4,
139
+ of: {
140
+ required: true,
141
+ type: 'afm',
142
+ label: {
143
+ primary: 'ΑΦΜ',
144
+ },
145
+ },
146
+ },
147
+ },
148
+ ] as FieldSpec[];
149
+
150
+ export const WithModal = (_: any) => (
151
+ <FormBuilder
152
+ onSubmit={(data) => {
153
+ console.log(data);
154
+ window.alert('Submit success');
155
+ }}
156
+ >
157
+ <Field name="multiplicity" {...fields[1]} />
158
+ <Button>Συνέχεια</Button>
159
+ </FormBuilder>
160
+ );
@@ -3,6 +3,7 @@ import { test, expect } from '@playwright/experimental-ct-react';
3
3
  import TestVariant from '@digigov/ui/utils/TestVariant'
4
4
  import { Default } from '@digigov/form/FieldArray/__stories__/Default';
5
5
  import { WithExactLength } from '@digigov/form/FieldArray/__stories__/WithExactLength';
6
+ import { WithModal } from '@digigov/form/FieldArray/__stories__/WithModal';
6
7
 
7
8
  test('renders the All FieldArray variants', async ({ mount, page }) => {
8
9
  await mount(
@@ -14,10 +15,17 @@ test('renders the All FieldArray variants', async ({ mount, page }) => {
14
15
  <TestVariant title="WithExactLength">
15
16
  <WithExactLength />
16
17
  </TestVariant>
18
+ <TestVariant title="WithModal">
19
+ <WithModal />
20
+ </TestVariant>
17
21
  </div>
18
22
  )
19
23
  await page.evaluate(() => document.fonts.ready);
20
24
 
25
+ // Move the mouse to the top-left corner to avoid random hover issues
26
+ await page.mouse.move(0, 0);
27
+
28
+
21
29
  const screenshot = await page.screenshot({ fullPage: true, animations: 'disabled' });
22
30
  expect(screenshot).toMatchSnapshot();
23
31
  });
@@ -2,92 +2,129 @@ import React from 'react';
2
2
  import { ErrorOption, useFieldArray, UseFormReturn } from 'react-hook-form';
3
3
  import { FieldBaseContainer } from '@digigov/form/Field/FieldBaseContainer';
4
4
  import { FieldProps } from '@digigov/form/Field/types';
5
+ import { FormDialog } from '@digigov/form/FieldArray/FormDialog';
5
6
  import { FieldObject } from '@digigov/form/FieldObject';
6
7
  import { FieldsetLabel, Fieldset } from '@digigov/form/Fieldset';
7
8
  import { Card } from '@digigov/ui/content/Card';
8
9
  import { Button } from '@digigov/ui/form/Button';
9
- import { Hint } from '@digigov/ui/typography/Hint';
10
10
 
11
11
  export interface FieldArrayProps extends FieldProps {
12
12
  control: UseFormReturn['control'];
13
+ trigger: UseFormReturn['trigger'];
13
14
  register: UseFormReturn['register'];
15
+ clearErrors: UseFormReturn['clearErrors'];
14
16
  formState: UseFormReturn['formState'];
15
17
  error?: ErrorOption;
18
+ getValues: UseFormReturn['getValues'];
19
+ setValue: UseFormReturn['setValue'];
20
+ reset: UseFormReturn['reset'];
21
+ resetField?: UseFormReturn['resetField'];
16
22
  Field: React.FC<FieldProps>;
17
23
  }
18
24
  export const FieldArray: React.FC<FieldArrayProps> = ({
19
25
  name,
26
+ trigger,
20
27
  register,
28
+ clearErrors,
21
29
  control,
22
30
  formState,
23
31
  error,
32
+ getValues,
33
+ setValue,
24
34
  layout,
35
+ reset,
36
+ resetField,
25
37
  label,
26
38
  Field,
27
39
  ...customField
28
40
  }) => {
29
- const { fields, append, remove } = useFieldArray({
41
+ const { append, remove } = useFieldArray({
30
42
  control,
31
43
  name,
32
44
  });
33
-
45
+ const fields = getValues(name) || [];
34
46
  return (
35
47
  <FieldBaseContainer
36
48
  label={label}
37
49
  layout={layout}
38
- error={
39
- formState.isSubmitted &&
40
- !formState.isSubmitting &&
41
- error?.message &&
42
- error
43
- ? error
44
- : undefined
45
- }
50
+ register={register}
51
+ error={error?.message && error ? error : undefined}
46
52
  hasError={formState.isSubmitted && !formState.isSubmitting && !!error}
47
53
  wrapper="fieldset"
48
54
  name={name}
55
+ labelSize={customField.extra?.labelSize}
56
+ controlled={true}
49
57
  >
50
- {fields.length === 0 && (
51
- <Hint>{customField.extra?.label.object?.nothing_added}</Hint>
52
- )}
53
- {fields.map((field, index) => (
54
- <Card variant="border" key={field.id}>
55
- <Fieldset>
56
- <FieldsetLabel>
57
- {customField.extra?.label.object.title} {index + 1}
58
- </FieldsetLabel>
59
- <FieldObject
60
- name={`${name}.${index}`}
61
- error={Array.isArray(error) && error[index]}
62
- formState={formState}
63
- register={register}
64
- control={control}
65
- {...customField.extra?.of}
66
- Field={Field}
67
- />
58
+ {customField.extra?.variant === 'dialog' ? (
59
+ <FormDialog
60
+ name={name}
61
+ trigger={trigger}
62
+ register={register}
63
+ clearErrors={clearErrors}
64
+ control={control}
65
+ formState={formState}
66
+ error={error}
67
+ getValues={getValues}
68
+ setValue={setValue}
69
+ layout={layout}
70
+ label={label}
71
+ Field={Field}
72
+ reset={reset}
73
+ resetField={resetField}
74
+ sortable={customField.extra.sortable}
75
+ {...customField}
76
+ />
77
+ ) : (
78
+ <>
79
+ {fields.map((field, index) => (
80
+ <Card
81
+ variant={customField.extra?.border ? 'border' : 'divider'}
82
+ key={field.id || index}
83
+ >
84
+ <Fieldset>
85
+ <FieldsetLabel>
86
+ {customField.extra?.label.object.title}{' '}
87
+ {!customField.extra?.noIndex && index + 1}
88
+ </FieldsetLabel>
89
+ <FieldObject
90
+ name={`${name}.${index}`}
91
+ error={Array.isArray(error) && error[index]}
92
+ formState={formState}
93
+ register={register}
94
+ control={control}
95
+ {...customField.extra?.of}
96
+ Field={Field}
97
+ />
98
+ <Button
99
+ name={`${name}-object-remove`}
100
+ variant={customField.extra?.label.object?.deleteButtonVariant}
101
+ type="button"
102
+ color="warning"
103
+ onClick={() => remove(index)}
104
+ disabled={!customField?.editable}
105
+ >
106
+ {customField.extra?.label.object?.delete}
107
+ </Button>
108
+ </Fieldset>
109
+ </Card>
110
+ ))}
111
+ {customField.editable && (
68
112
  <Button
69
- name={`${name}-object-remove`}
70
113
  type="button"
71
- color="warning"
72
- onClick={() => remove(index)}
114
+ name={`${name}-add-object`}
115
+ color="secondary"
116
+ variant={customField.extra?.label.object?.addButtonVariant}
117
+ onClick={(ev) => {
118
+ ev.preventDefault();
119
+ append({});
120
+ }}
121
+ disabled={!customField?.editable}
73
122
  >
74
- {customField.extra?.label.object?.delete}
123
+ {customField.extra?.label.object?.add}
75
124
  </Button>
76
- </Fieldset>
77
- </Card>
78
- ))}
79
-
80
- <Button
81
- type="button"
82
- name={`${name}-add-object`}
83
- color="secondary"
84
- onClick={(ev) => {
85
- ev.preventDefault();
86
- append({});
87
- }}
88
- >
89
- {customField.extra?.label.object?.add}
90
- </Button>
125
+ )}
126
+ </>
127
+ )}
91
128
  </FieldBaseContainer>
92
129
  );
93
130
  };
@@ -1,7 +1,7 @@
1
1
  import React, { useMemo } from 'react';
2
2
  import { ErrorOption, UseFormReturn } from 'react-hook-form';
3
3
  import { FieldBase } from '@digigov/form/Field/FieldBase';
4
- import { CalculatedField, FieldProps } from '@digigov/form/Field/types';
4
+ import { FieldProps, CalculatedField } from '@digigov/form/Field/types';
5
5
  import {
6
6
  FIELD_COMPONENTS,
7
7
  ALTERNATIVE_COMPONENTS,
@@ -16,8 +16,10 @@ export interface FieldObjectProps extends Omit<FieldProps, 'key'> {
16
16
  control: UseFormReturn['control'];
17
17
  register: UseFormReturn['register'];
18
18
  reset: UseFormReturn['reset'];
19
+ resetField: UseFormReturn['resetField'];
19
20
  formState: UseFormReturn['formState'];
20
21
  error?: ErrorOption;
22
+ defaultValue?: undefined;
21
23
  Field: React.FC<FieldProps>;
22
24
  }
23
25
 
@@ -28,8 +30,10 @@ export const FieldObject: React.FC<FieldObjectProps> = ({
28
30
  control,
29
31
  register,
30
32
  reset,
33
+ resetField,
31
34
  formState,
32
35
  error,
36
+ defaultValue,
33
37
  Field,
34
38
  }) => {
35
39
  const { t } = useTranslation();
@@ -37,21 +41,25 @@ export const FieldObject: React.FC<FieldObjectProps> = ({
37
41
  return (
38
42
  <Fieldset>
39
43
  {label?.primary && (
40
- <FieldsetLegend size="sm">{t(label.primary)}</FieldsetLegend>
44
+ <FieldsetLegend size="sm" marginBottom={3}>
45
+ {t(label.primary)}
46
+ </FieldsetLegend>
41
47
  )}
42
48
  {label?.secondary && (
43
- <FieldsetCaption>{t(label.secondary)}</FieldsetCaption>
49
+ <FieldsetCaption marginBottom={3}>{t(label.secondary)}</FieldsetCaption>
44
50
  )}
45
51
  {extra?.fields.map((field) => (
46
52
  <FieldObjectItem
47
- key={`${name}.${field.key}`}
48
- name={`${name}.${field.key}`}
53
+ key={`${name}${field.key ? `.${field.key}` : ''}`}
54
+ name={`${name}${field.key ? `.${field.key}` : ''}`}
49
55
  control={control}
50
56
  register={register}
51
57
  reset={reset}
58
+ resetField={resetField}
52
59
  field={field}
53
60
  error={error && error[field.key]}
54
61
  formState={formState}
62
+ defaultValue={defaultValue?.[field.key] || undefined}
55
63
  Field={Field}
56
64
  />
57
65
  ))}
@@ -60,14 +68,17 @@ export const FieldObject: React.FC<FieldObjectProps> = ({
60
68
  };
61
69
 
62
70
  export interface FieldObjectItemProps {
71
+ key: string;
63
72
  name: string;
64
73
  field: FieldSpec;
65
74
  control: UseFormReturn['control'];
66
75
  register: UseFormReturn['register'];
67
76
  reset: UseFormReturn['reset'];
77
+ resetField: UseFormReturn['resetField'];
68
78
  formState: UseFormReturn['formState'];
69
79
  error?: ErrorOption;
70
80
  children?: React.ReactNode;
81
+ defaultValue?: undefined;
71
82
  Field: React.FC<FieldProps>;
72
83
  }
73
84
 
@@ -79,7 +90,9 @@ const FieldObjectItem: React.FC<FieldObjectItemProps> = ({
79
90
  control,
80
91
  formState,
81
92
  reset,
93
+ resetField,
82
94
  register,
95
+ defaultValue,
83
96
  Field,
84
97
  }) => {
85
98
  const calculatedField: CalculatedField = useMemo(
@@ -87,19 +100,27 @@ const FieldObjectItem: React.FC<FieldObjectItemProps> = ({
87
100
  calculateField(children, field, FIELD_COMPONENTS, ALTERNATIVE_COMPONENTS),
88
101
  [field]
89
102
  );
90
-
91
- const customError = error ? error : formState?.errors[name];
92
- return (
93
- <FieldBase
94
- {...calculatedField}
95
- name={name}
96
- Field={Field}
97
- control={control}
98
- reset={reset}
99
- register={register}
100
- error={customError}
101
- />
102
- );
103
+ if (Field) {
104
+ if (!field.type) {
105
+ field.type = 'string';
106
+ }
107
+ return <Field {...field} name={name} />;
108
+ } else {
109
+ const customError = error ? error : formState?.errors[name];
110
+ return (
111
+ <FieldBase
112
+ {...calculatedField}
113
+ name={name}
114
+ Field={Field}
115
+ control={control}
116
+ reset={reset}
117
+ resetField={resetField}
118
+ register={register}
119
+ error={customError}
120
+ defaultValue={defaultValue}
121
+ />
122
+ );
123
+ }
103
124
  };
104
125
 
105
126
  export default FieldObject;
@@ -1,7 +1,10 @@
1
1
  import FormBuilder from '@digigov/form/FormBuilder';
2
+ import doc from './doc.mdx?raw';
2
3
  export default {
3
4
  title: 'Digigov Form/FormBuilder',
4
5
  component: FormBuilder,
6
+ tags: ['autodocs'],
7
+ markdown: doc,
5
8
  displayName: 'FormBuilder',
6
9
  };
7
10
  export { Default } from '@digigov/form/FormBuilder/__stories__/Default';
@@ -49,7 +49,7 @@ const FIELDS: FieldSpec[] = [
49
49
  },
50
50
  ];
51
51
 
52
- export const AutoErrorGrouping = () => (
52
+ export const AutoErrorGrouping = (_: any) => (
53
53
  <FormBuilder
54
54
  grid={true}
55
55
  auto={true}
@@ -6,7 +6,7 @@ const initialValues = {
6
6
  'business-title': null,
7
7
  };
8
8
 
9
- export const Default = () => (
9
+ export const Default = (_: any) => (
10
10
  <FormBuilder
11
11
  onSubmit={(data) => {
12
12
  console.log(data);
@@ -3,7 +3,7 @@ import FormBuilder, { Field } from '@digigov/form';
3
3
  import { ErrorGroup } from '@digigov/form/Field/ErrorGroup';
4
4
  import { Button } from '@digigov/ui/form/Button';
5
5
 
6
- export const ErrorGrouping = () => (
6
+ export const ErrorGrouping = (_: any) => (
7
7
  <FormBuilder
8
8
  grid={true}
9
9
  onSubmit={(data) => {
@@ -4,13 +4,14 @@ title: FormBuilder
4
4
  sidebar_label: FormBuilder
5
5
  ---
6
6
 
7
+ # FormBuilder
8
+
7
9
  `FormBuilder` is a React component that provides an easy way to efficiently create reusable form page. Forms are a flexible mechanism for collecting user input because there are suitable widgets for entering many different types of data, including text boxes, checkboxes, radio buttons, dropdowns and so on for submission to a server. Actually when we use `stepForm` for building step-forms all we do is to render `FormBuilder` component.
8
10
 
9
11
  `stepForm` component:
10
12
 
11
13
  <code src="@digigov/form/FormBuilder/__stories__/Default.tsx" />
12
14
 
13
-
14
15
  ### Importing and using FormBuilder Component
15
16
 
16
17
  To import `FormBuilder` component simply import it from `'@digigov/form`.
@@ -28,7 +29,7 @@ import BasicLayout, {
28
29
  Main,
29
30
  Bottom,
30
31
  } from '@digigov/ui/layouts/Basic';
31
- import {FormBuilder} from '@digigov/form';
32
+ import { FormBuilder } from '@digigov/form';
32
33
 
33
34
  export default function MyComponent({ props }) {
34
35
  return (
@@ -73,7 +74,7 @@ Below are demostrated some examples for each type of field
73
74
 
74
75
  ### FormBuilder implementation
75
76
 
76
- The examples above are implemented by using the code below
77
+ The example below are implemented by using the code above.
77
78
 
78
79
  ```jsx
79
80
  import React, { useState } from 'react';
@@ -83,7 +84,11 @@ import BasicLayout, {
83
84
  Main,
84
85
  Bottom,
85
86
  } from '@digigov/ui/layouts/Basic';
86
- import Header, { HeaderTitle, HeaderContent, HeaderSection } from '@digigov/ui/app/Header';
87
+ import Header, {
88
+ HeaderTitle,
89
+ HeaderContent,
90
+ HeaderSection,
91
+ } from '@digigov/ui/app/Header';
87
92
  import GovGRLogo from '@digigov/ui/govgr/GovGRLogo';
88
93
  import GovGRFooter from '@digigov/ui/govgr/Footer';
89
94
  import Button from '@digigov/ui/form/Button';
@@ -1,29 +1,32 @@
1
1
  import React from 'react';
2
2
  import { test, expect } from '@playwright/experimental-ct-react';
3
- import TestVariant from '@digigov/ui/utils/TestVariant';
3
+ import TestVariant from '@digigov/ui/utils/TestVariant'
4
4
  import { AutoErrorGrouping } from '@digigov/form/FormBuilder/__stories__/AutoErrorGrouping';
5
5
  import { Default } from '@digigov/form/FormBuilder/__stories__/Default';
6
6
  import { ErrorGrouping } from '@digigov/form/FormBuilder/__stories__/ErrorGrouping';
7
7
 
8
8
  test('renders the All FormBuilder variants', async ({ mount, page }) => {
9
9
  await mount(
10
- <div>
11
- <TestVariant title="AutoErrorGrouping">
12
- <AutoErrorGrouping />
13
- </TestVariant>
14
- <TestVariant title="Default">
15
- <Default />
16
- </TestVariant>
17
- <TestVariant title="ErrorGrouping">
18
- <ErrorGrouping />
19
- </TestVariant>
20
- </div>
21
- );
10
+
11
+ <div>
12
+ <TestVariant title="AutoErrorGrouping">
13
+ <AutoErrorGrouping />
14
+ </TestVariant>
15
+ <TestVariant title="Default">
16
+ <Default />
17
+ </TestVariant>
18
+ <TestVariant title="ErrorGrouping">
19
+ <ErrorGrouping />
20
+ </TestVariant>
21
+ </div>
22
+ )
22
23
  await page.evaluate(() => document.fonts.ready);
23
24
 
24
- const screenshot = await page.screenshot({
25
- fullPage: true,
26
- animations: 'disabled',
27
- });
25
+ // Move the mouse to the top-left corner to avoid random hover issues
26
+ await page.mouse.move(0, 0);
27
+
28
+
29
+ const screenshot = await page.screenshot({ fullPage: true, animations: 'disabled' });
28
30
  expect(screenshot).toMatchSnapshot();
29
31
  });
32
+
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useContext, useRef } from 'react';
1
+ import React, { useCallback, useContext, useEffect, useRef } from 'react';
2
2
  import { useForm } from 'react-hook-form';
3
3
  import { Field } from '@digigov/form/Field';
4
4
  import { ErrorGroup } from '@digigov/form/Field/ErrorGroup';
@@ -23,10 +23,11 @@ const FormBase = React.forwardRef(function FormBase(
23
23
  mode,
24
24
  initial,
25
25
  reValidateMode,
26
- shouldFocusError,
26
+ shouldFocusError = true,
27
27
  criteriaMode,
28
28
  componentRegistry,
29
29
  grid,
30
+ errors,
30
31
  ...props
31
32
  }: FormBaseProps,
32
33
  ref: React.Ref<HTMLFormElement>
@@ -49,6 +50,13 @@ const FormBase = React.forwardRef(function FormBase(
49
50
  },
50
51
  [onSubmit]
51
52
  );
53
+ useEffect(() => {
54
+ if (errors) {
55
+ for (const fieldName in errors) {
56
+ form.setError(fieldName, errors[fieldName]);
57
+ }
58
+ }
59
+ }, [errors]);
52
60
  const submit = form.handleSubmit(handleSubmit);
53
61
  const ctx = {
54
62
  fieldsMap,
@@ -72,6 +80,7 @@ const FormBase = React.forwardRef(function FormBase(
72
80
  formRef: ref,
73
81
  submit,
74
82
  };
83
+
75
84
  return (
76
85
  <FormContext.Provider value={ctx}>
77
86
  <Form grid={grid} onSubmit={submit} ref={ref} {...props}>