@digigov/form 0.10.8 → 0.10.10

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 (138) hide show
  1. package/CHANGELOG.md +8 -1
  2. package/Form.stories.playwright.json +0 -72
  3. package/FormBuilder/FormBuilder.mdx +1 -1
  4. package/MultiplicityField/__stories__/PreviewDisplay.js +6 -6
  5. package/Questions/__stories__/Default.js +2 -2
  6. package/Questions/index.mdx +1 -1
  7. package/es/Form.stories.playwright.json +0 -72
  8. package/es/FormBuilder/FormBuilder.mdx +1 -1
  9. package/es/MultiplicityField/__stories__/PreviewDisplay.js +6 -6
  10. package/es/Questions/__stories__/Default.js +1 -1
  11. package/es/Questions/index.mdx +1 -1
  12. package/esm/Form.stories.playwright.json +0 -72
  13. package/esm/FormBuilder/FormBuilder.mdx +1 -1
  14. package/esm/MultiplicityField/__stories__/PreviewDisplay.js +6 -6
  15. package/esm/Questions/__stories__/Default.js +1 -1
  16. package/esm/Questions/index.mdx +1 -1
  17. package/esm/index.js +1 -1
  18. package/package.json +4 -4
  19. package/src/Field/FieldBase.tsx +99 -0
  20. package/src/Field/FieldBaseContainer.tsx +57 -0
  21. package/src/Field/FieldConditional.tsx +75 -0
  22. package/src/Field/index.mdx +6 -0
  23. package/src/Field/index.tsx +92 -0
  24. package/src/Field/types.tsx +102 -0
  25. package/src/Field/utils.ts +164 -0
  26. package/src/FieldArray/FieldArray.stories.js +8 -0
  27. package/src/FieldArray/FieldArray.stories.playwright.json +353 -0
  28. package/src/FieldArray/__stories__/Default.tsx +95 -0
  29. package/src/FieldArray/__stories__/WithExactLength.tsx +95 -0
  30. package/src/FieldArray/index.tsx +83 -0
  31. package/src/FieldObject/index.tsx +92 -0
  32. package/src/Fieldset/FieldsetWithContext.tsx +41 -0
  33. package/src/Fieldset/index.tsx +40 -0
  34. package/src/Fieldset/types.tsx +6 -0
  35. package/src/Form.stories.js +5 -0
  36. package/src/Form.stories.playwright.json +71 -0
  37. package/src/FormBuilder/FormBuilder.mdx +271 -0
  38. package/src/FormBuilder/FormBuilder.stories.js +7 -0
  39. package/src/FormBuilder/FormBuilder.stories.playwright.json +52 -0
  40. package/src/FormBuilder/FormBuilder.tsx +165 -0
  41. package/src/FormBuilder/__stories__/Default.tsx +23 -0
  42. package/src/FormBuilder/index.tsx +3 -0
  43. package/src/FormContext.tsx +8 -0
  44. package/src/MultiplicityField/MultiplicityField.mdx +580 -0
  45. package/src/MultiplicityField/MultiplicityField.stories.js +12 -0
  46. package/src/MultiplicityField/MultiplicityField.stories.playwright.json +1370 -0
  47. package/src/MultiplicityField/__stories__/Default.tsx +100 -0
  48. package/src/MultiplicityField/__stories__/PreviewDisplay.tsx +160 -0
  49. package/src/MultiplicityField/__stories__/WithExactLength.tsx +99 -0
  50. package/src/MultiplicityField/__stories__/WithMaxLength.tsx +102 -0
  51. package/src/MultiplicityField/__stories__/WithMinAndMaxLength.tsx +103 -0
  52. package/src/MultiplicityField/__stories__/WithMinLength.tsx +102 -0
  53. package/src/MultiplicityField/add-objects.tsx +186 -0
  54. package/src/MultiplicityField/index.tsx +166 -0
  55. package/src/Questions/Questions.stories.js +7 -0
  56. package/src/Questions/Questions.tsx +74 -0
  57. package/src/Questions/QuestionsContext.tsx +9 -0
  58. package/src/Questions/Step/ReviewStep.tsx +63 -0
  59. package/src/Questions/Step/Step.tsx +67 -0
  60. package/src/Questions/Step/StepArrayReview.tsx +68 -0
  61. package/src/Questions/Step/StepContext.tsx +21 -0
  62. package/src/Questions/Step/StepDescription.tsx +33 -0
  63. package/src/Questions/Step/StepForm.tsx +60 -0
  64. package/src/Questions/Step/StepQuote.tsx +8 -0
  65. package/src/Questions/Step/StepTitle.tsx +60 -0
  66. package/src/Questions/Step/getAddMoreFields.tsx +28 -0
  67. package/src/Questions/Step/index.ts +13 -0
  68. package/src/Questions/Step/types.tsx +32 -0
  69. package/src/Questions/__snapshots__/index.spec.tsx.snap +887 -0
  70. package/src/Questions/__stories__/Default.tsx +130 -0
  71. package/src/Questions/getNextStep.tsx +24 -0
  72. package/src/Questions/index.mdx +418 -0
  73. package/src/Questions/index.spec.tsx +72 -0
  74. package/src/Questions/index.tsx +5 -0
  75. package/src/Questions/types.tsx +25 -0
  76. package/src/__stories__/AutoCompleteField.tsx +45 -0
  77. package/src/__stories__/IntField.tsx +38 -0
  78. package/src/create-simple-form.mdx +518 -0
  79. package/src/index.mdx +44 -0
  80. package/src/index.ts +3 -0
  81. package/src/inputs/AutoComplete/index.tsx +85 -0
  82. package/src/inputs/Checkboxes/Checkboxes.stories.js +7 -0
  83. package/src/inputs/Checkboxes/Checkboxes.stories.playwright.json +69 -0
  84. package/src/inputs/Checkboxes/__stories__/Default.tsx +39 -0
  85. package/src/inputs/Checkboxes/index.mdx +0 -0
  86. package/src/inputs/Checkboxes/index.tsx +77 -0
  87. package/src/inputs/DateInput/DateInput.stories.js +7 -0
  88. package/src/inputs/DateInput/DateInput.stories.playwright.json +72 -0
  89. package/src/inputs/DateInput/__stories__/Default.tsx +41 -0
  90. package/src/inputs/DateInput/index.tsx +130 -0
  91. package/src/inputs/FileInput/FileInput.stories.js +7 -0
  92. package/src/inputs/FileInput/FileInput.stories.playwright.json +75 -0
  93. package/src/inputs/FileInput/__stories__/Default.tsx +23 -0
  94. package/src/inputs/FileInput/index.tsx +76 -0
  95. package/src/inputs/Input/Input.stories.js +14 -0
  96. package/src/inputs/Input/Input.stories.playwright.json +376 -0
  97. package/src/inputs/Input/__stories__/AFM.tsx +24 -0
  98. package/src/inputs/Input/__stories__/Boolean.tsx +26 -0
  99. package/src/inputs/Input/__stories__/Default.tsx +25 -0
  100. package/src/inputs/Input/__stories__/IBAN.tsx +26 -0
  101. package/src/inputs/Input/__stories__/Integer.tsx +25 -0
  102. package/src/inputs/Input/__stories__/MobilePhone.tsx +24 -0
  103. package/src/inputs/Input/__stories__/PhoneNumber.tsx +24 -0
  104. package/src/inputs/Input/__stories__/PostalCode.tsx +25 -0
  105. package/src/inputs/Input/index.mdx +8 -0
  106. package/src/inputs/Input/index.tsx +62 -0
  107. package/src/inputs/Label/Label.stories.js +7 -0
  108. package/src/inputs/Label/Label.stories.playwright.json +40 -0
  109. package/src/inputs/Label/__stories__/Default.tsx +28 -0
  110. package/src/inputs/Label/index.mdx +0 -0
  111. package/src/inputs/Label/index.tsx +44 -0
  112. package/src/inputs/Radio/Radio.stories.js +7 -0
  113. package/src/inputs/Radio/Radio.stories.playwright.json +57 -0
  114. package/src/inputs/Radio/__stories__/Default.tsx +42 -0
  115. package/src/inputs/Radio/index.mdx +0 -0
  116. package/src/inputs/Radio/index.tsx +57 -0
  117. package/src/inputs/Select/Select.stories.js +7 -0
  118. package/src/inputs/Select/Select.stories.playwright.json +22 -0
  119. package/src/inputs/Select/__stories__/Default.tsx +47 -0
  120. package/src/inputs/Select/index.tsx +37 -0
  121. package/src/inputs/index.ts +7 -0
  122. package/src/installation.mdx +72 -0
  123. package/src/internal.ts +34 -0
  124. package/src/registry.js +134 -0
  125. package/src/types.tsx +110 -0
  126. package/src/utils.ts +78 -0
  127. package/src/validators/index.ts +203 -0
  128. package/src/validators/types.ts +2 -0
  129. package/src/validators/utils/afm.ts +37 -0
  130. package/src/validators/utils/file.ts +25 -0
  131. package/src/validators/utils/iban.ts +119 -0
  132. package/src/validators/utils/index.ts +94 -0
  133. package/src/validators/utils/int.ts +22 -0
  134. package/src/validators/utils/number.ts +18 -0
  135. package/src/validators/utils/phone.ts +120 -0
  136. package/src/validators/utils/postal_code.ts +33 -0
  137. package/src/validators/utils/uuid4.ts +21 -0
  138. package/src/validators/validators.spec.ts +122 -0
@@ -0,0 +1,353 @@
1
+ {
2
+ "version": "4",
3
+ "stories": {
4
+ "digigov-form-fieldarray--default": {
5
+ "actionSets": [
6
+ {
7
+ "actions": [
8
+ {
9
+ "name": "click",
10
+ "args": {
11
+ "selector": "text=Προσθήκη συνυπογράφοντα"
12
+ }
13
+ },
14
+ {
15
+ "name": "click",
16
+ "args": {
17
+ "selector": "text=Συνέχεια"
18
+ }
19
+ },
20
+ {
21
+ "name": "waitForSelector",
22
+ "args": {
23
+ "selector": "text=Το πεδίο πρέπει να έχει τουλάχιστον 2 εγγραφές. Προσθέστε μια ακόμα επιλέγοντας την απάντηση «Ναι» στην επόμενη ερώτηση.",
24
+ "options": {
25
+ "state": "visible"
26
+ }
27
+ }
28
+ },
29
+ {
30
+ "name": "click",
31
+ "args": {
32
+ "selector": "text=Προσθήκη συνυπογράφοντα",
33
+ "options": {
34
+ "clickCount": 2
35
+ }
36
+ }
37
+ },
38
+ {
39
+ "name": "click",
40
+ "args": {
41
+ "selector": "text=Συνέχεια"
42
+ }
43
+ },
44
+ {
45
+ "name": "waitForSelector",
46
+ "args": {
47
+ "selector": "text=Το πεδίο είναι υποχρεωτικό.",
48
+ "options": {
49
+ "state": "visible"
50
+ }
51
+ }
52
+ },
53
+ {
54
+ "name": "type",
55
+ "args": {
56
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(3)>label>input",
57
+ "text": "2107474274"
58
+ }
59
+ },
60
+ {
61
+ "name": "click",
62
+ "args": {
63
+ "selector": "html>body>div:nth-child(5)>form>button"
64
+ }
65
+ }
66
+ ],
67
+ "id": "iMmV-vvS4iNn",
68
+ "title": "Add new items to FieldArray"
69
+ },
70
+ {
71
+ "actions": [
72
+ {
73
+ "name": "click",
74
+ "args": {
75
+ "selector": "html>body>div:nth-child(5)>form>button"
76
+ }
77
+ }
78
+ ],
79
+ "id": "Lhj8o_MByws7",
80
+ "title": "Validation errors"
81
+ },
82
+ {
83
+ "actions": [
84
+ {
85
+ "name": "type",
86
+ "args": {
87
+ "selector": "html>body",
88
+ "text": "hello"
89
+ }
90
+ },
91
+ {
92
+ "name": "click",
93
+ "args": {
94
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>button"
95
+ }
96
+ },
97
+ {
98
+ "name": "type",
99
+ "args": {
100
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div>div>fieldset>fieldset>div:nth-child(1)>label>input",
101
+ "text": "150000496"
102
+ }
103
+ },
104
+ {
105
+ "name": "type",
106
+ "args": {
107
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div>div>fieldset>fieldset>div:nth-child(2)>label>input",
108
+ "text": "Jon"
109
+ }
110
+ },
111
+ {
112
+ "name": "type",
113
+ "args": {
114
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div>div>fieldset>fieldset>div:nth-child(3)>label>input",
115
+ "text": "Doe"
116
+ }
117
+ },
118
+ {
119
+ "name": "click",
120
+ "args": {
121
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>button"
122
+ }
123
+ },
124
+ {
125
+ "name": "type",
126
+ "args": {
127
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div:nth-child(4)>div>fieldset>fieldset>div:nth-child(1)>label>input",
128
+ "text": "150000496"
129
+ }
130
+ },
131
+ {
132
+ "name": "type",
133
+ "args": {
134
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div:nth-child(4)>div>fieldset>fieldset>div:nth-child(2)>label>input",
135
+ "text": "Mar"
136
+ }
137
+ },
138
+ {
139
+ "name": "type",
140
+ "args": {
141
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div:nth-child(4)>div>fieldset>fieldset>div:nth-child(3)>label>input",
142
+ "text": "P"
143
+ }
144
+ },
145
+ {
146
+ "name": "type",
147
+ "args": {
148
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(3)>label>input",
149
+ "text": "6977777777"
150
+ }
151
+ },
152
+ {
153
+ "name": "click",
154
+ "args": {
155
+ "selector": "html>body>div:nth-child(5)>form>button"
156
+ }
157
+ }
158
+ ],
159
+ "id": "OCWrR7oFA3YV",
160
+ "title": "add 2 items"
161
+ },
162
+ {
163
+ "actions": [
164
+ {
165
+ "name": "type",
166
+ "args": {
167
+ "selector": "html>body",
168
+ "text": "hello"
169
+ }
170
+ },
171
+ {
172
+ "name": "click",
173
+ "args": {
174
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>button"
175
+ }
176
+ },
177
+ {
178
+ "name": "type",
179
+ "args": {
180
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div>div>fieldset>fieldset>div:nth-child(1)>label>input",
181
+ "text": "150000496"
182
+ }
183
+ },
184
+ {
185
+ "name": "type",
186
+ "args": {
187
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div>div>fieldset>fieldset>div:nth-child(2)>label>input",
188
+ "text": "Jon"
189
+ }
190
+ },
191
+ {
192
+ "name": "type",
193
+ "args": {
194
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div>div>fieldset>fieldset>div:nth-child(3)>label>input",
195
+ "text": "Doe"
196
+ }
197
+ },
198
+ {
199
+ "name": "click",
200
+ "args": {
201
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>button"
202
+ }
203
+ },
204
+ {
205
+ "name": "type",
206
+ "args": {
207
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div:nth-child(4)>div>fieldset>fieldset>div:nth-child(1)>label>input",
208
+ "text": "150000496"
209
+ }
210
+ },
211
+ {
212
+ "name": "type",
213
+ "args": {
214
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div:nth-child(4)>div>fieldset>fieldset>div:nth-child(2)>label>input",
215
+ "text": "Mar"
216
+ }
217
+ },
218
+ {
219
+ "name": "type",
220
+ "args": {
221
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div:nth-child(4)>div>fieldset>fieldset>div:nth-child(3)>label>input",
222
+ "text": "P"
223
+ }
224
+ },
225
+ {
226
+ "name": "click",
227
+ "args": {
228
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div:nth-child(3)>div>fieldset>button"
229
+ }
230
+ },
231
+ {
232
+ "name": "type",
233
+ "args": {
234
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(3)>label>input",
235
+ "text": "6977777777"
236
+ }
237
+ },
238
+ {
239
+ "name": "click",
240
+ "args": {
241
+ "selector": "html>body>div:nth-child(5)>form>button"
242
+ }
243
+ }
244
+ ],
245
+ "id": "8ZxUUjo0Yxnr",
246
+ "title": "add 2 items and remove 1"
247
+ }
248
+ ]
249
+ },
250
+ "digigov-form-fieldarray--with-exact-length": {
251
+ "actionSets": [
252
+ {
253
+ "actions": [
254
+ {
255
+ "name": "click",
256
+ "args": {
257
+ "selector": "html>body>div:nth-child(5)>form>button"
258
+ }
259
+ },
260
+ {
261
+ "name": "click",
262
+ "args": {
263
+ "selector": "html>body>div:nth-child(5)>form>button"
264
+ }
265
+ }
266
+ ],
267
+ "id": "WG3dAbfXa-Sn",
268
+ "title": "validation errors"
269
+ },
270
+ {
271
+ "actions": [
272
+ {
273
+ "name": "type",
274
+ "args": {
275
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(1)>label>input",
276
+ "text": "Hello"
277
+ }
278
+ },
279
+ {
280
+ "name": "click",
281
+ "args": {
282
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>button"
283
+ }
284
+ },
285
+ {
286
+ "name": "type",
287
+ "args": {
288
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div>div>fieldset>fieldset>div:nth-child(1)>label>input",
289
+ "text": "150000496"
290
+ }
291
+ },
292
+ {
293
+ "name": "type",
294
+ "args": {
295
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div>div>fieldset>fieldset>div:nth-child(2)>label>input",
296
+ "text": "Μάρω"
297
+ }
298
+ },
299
+ {
300
+ "name": "type",
301
+ "args": {
302
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div>div>fieldset>fieldset>div:nth-child(3)>label>input",
303
+ "text": "Μενεξέ"
304
+ }
305
+ },
306
+ {
307
+ "name": "click",
308
+ "args": {
309
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>button"
310
+ }
311
+ },
312
+ {
313
+ "name": "type",
314
+ "args": {
315
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div:nth-child(4)>div>fieldset>fieldset>div:nth-child(1)>label>input",
316
+ "text": "150000496"
317
+ }
318
+ },
319
+ {
320
+ "name": "type",
321
+ "args": {
322
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div:nth-child(4)>div>fieldset>fieldset>div:nth-child(2)>label>input",
323
+ "text": "Ηλέκτρα"
324
+ }
325
+ },
326
+ {
327
+ "name": "type",
328
+ "args": {
329
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(2)>fieldset>div:nth-child(4)>div>fieldset>fieldset>div:nth-child(3)>label>input",
330
+ "text": "Αποστόλου"
331
+ }
332
+ },
333
+ {
334
+ "name": "type",
335
+ "args": {
336
+ "selector": "html>body>div:nth-child(5)>form>div:nth-child(3)>label>input",
337
+ "text": "6977654321"
338
+ }
339
+ },
340
+ {
341
+ "name": "click",
342
+ "args": {
343
+ "selector": "html>body>div:nth-child(5)>form>button"
344
+ }
345
+ }
346
+ ],
347
+ "id": "-U0EryxXC-g7",
348
+ "title": "add exact length of items"
349
+ }
350
+ ]
351
+ }
352
+ }
353
+ }
@@ -0,0 +1,95 @@
1
+ import React from 'react';
2
+ import FormBuilder, { Field, FieldSpec } from '@digigov/form';
3
+ import { Button } from '@digigov/ui/core';
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
+ type: 'array',
18
+ label: {
19
+ primary: 'Συνυπογράφοντες',
20
+ secondary: 'Οι συνυπογράφοντες είναι άνθρωποι σαν και εμάς',
21
+ },
22
+ extra: {
23
+ label: {
24
+ object: {
25
+ title: 'Συνυπογράφοντας',
26
+ add: 'Προσθήκη συνυπογράφοντα',
27
+ delete: 'Αφαίρεση συνυπογράφοντος',
28
+ },
29
+ question: {
30
+ title: 'Θέλετε να προσθέσετε επιπλέον συνυπογράφοντες;',
31
+ objectLabel: {
32
+ primary: 'Προσθήκη νέου συνυπογράφοντα',
33
+ secondary: 'Συμπληρώστε τα στοιχεία και μετά πατήστε «Προσθήκη»',
34
+ },
35
+ yes: 'Ναι',
36
+ no: 'Όχι',
37
+ },
38
+ },
39
+ min: 2,
40
+ max: 4,
41
+ of: {
42
+ type: 'object',
43
+ extra: {
44
+ fields: [
45
+ {
46
+ key: 'afm',
47
+ type: 'afm',
48
+ required: true,
49
+ label: { primary: 'ΑΦΜ' },
50
+ },
51
+ {
52
+ key: 'firstName',
53
+ required: true,
54
+ type: 'string',
55
+ label: {
56
+ primary: 'Όνομα',
57
+ },
58
+ },
59
+ {
60
+ key: 'lastName',
61
+ required: true,
62
+ type: 'string',
63
+ label: {
64
+ primary: 'Επώνυμο',
65
+ },
66
+ },
67
+ ],
68
+ },
69
+ },
70
+ },
71
+ },
72
+ {
73
+ key: 'phonenumber',
74
+ type: 'phone_number',
75
+ required: true,
76
+ label: {
77
+ primary: 'Σταθερό τηλέφωνο',
78
+ secondary: 'Συμπληρώστε τον αριθμό τηλεφώνου',
79
+ },
80
+ },
81
+ ] as FieldSpec[];
82
+
83
+ export const Default = () => (
84
+ <FormBuilder
85
+ onSubmit={(data) => {
86
+ debugger;
87
+ console.log(data);
88
+ }}
89
+ >
90
+ <Field name="string" {...fields[0]} />
91
+ <Field name="multiplicity" {...fields[1]} />
92
+ <Field name="phonenumber" {...fields[2]} />
93
+ <Button>Συνέχεια</Button>
94
+ </FormBuilder>
95
+ );
@@ -0,0 +1,95 @@
1
+ import React from 'react';
2
+ import FormBuilder, { Field, FieldSpec } from '@digigov/form';
3
+ import { Button } from '@digigov/ui/core';
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
+ type: 'array',
18
+ label: {
19
+ primary: 'Συνυπογράφοντες',
20
+ secondary: 'Οι συνυπογράφοντες είναι άνθρωποι σαν και εμάς',
21
+ },
22
+ extra: {
23
+ label: {
24
+ object: {
25
+ title: 'Συνυπογράφοντας',
26
+ title_added: 'Οι συνυπογράφοντες που έχετε προσθέσει',
27
+ add: 'Προσθήκη',
28
+ delete: 'Αφαίρεση συνυπογράφοντος',
29
+ },
30
+ question: {
31
+ title: 'Θέλετε να προσθέσετε επιπλέον συνυπογράφοντες;',
32
+ objectLabel: {
33
+ primary: 'Προσθήκη νέου συνυπογράφοντα',
34
+ secondary: 'Συμπληρώστε τα στοιχεία και μετά πατήστε «Προσθήκη»',
35
+ },
36
+ yes: 'Ναι',
37
+ no: 'Όχι',
38
+ },
39
+ },
40
+ length: 2,
41
+ of: {
42
+ type: 'object',
43
+ extra: {
44
+ fields: [
45
+ {
46
+ key: 'afm',
47
+ type: 'afm',
48
+ required: true,
49
+ label: { primary: 'ΑΦΜ' },
50
+ },
51
+ {
52
+ key: 'firstName',
53
+ required: true,
54
+ type: 'string',
55
+ label: {
56
+ primary: 'Όνομα',
57
+ },
58
+ },
59
+ {
60
+ key: 'lastName',
61
+ required: true,
62
+ type: 'string',
63
+ label: {
64
+ primary: 'Επώνυμο',
65
+ },
66
+ },
67
+ ],
68
+ },
69
+ },
70
+ },
71
+ },
72
+ {
73
+ key: 'phonenumber',
74
+ type: 'phone_number',
75
+ required: true,
76
+ label: {
77
+ primary: 'Σταθερό τηλέφωνο',
78
+ secondary: 'Συμπληρώστε τον αριθμό τηλεφώνου σας',
79
+ },
80
+ },
81
+ ] as FieldSpec[];
82
+
83
+ export const WithExactLength = () => (
84
+ <FormBuilder
85
+ onSubmit={(data) => {
86
+ debugger;
87
+ console.log(data);
88
+ }}
89
+ >
90
+ <Field name="string" {...fields[0]} />
91
+ <Field name="multiplicity" {...fields[1]} />
92
+ <Field name="phonenumber" {...fields[2]} />
93
+ <Button>Συνέχεια</Button>
94
+ </FormBuilder>
95
+ );
@@ -0,0 +1,83 @@
1
+ import React from 'react';
2
+ import { ErrorOption, useFieldArray, UseFormReturn } from 'react-hook-form';
3
+ import FieldObject from '@digigov/form/FieldObject';
4
+ import { Button, Card, Hint } from '@digigov/ui';
5
+ import { FieldsetLabel } from '@digigov/form/Fieldset';
6
+ import Fieldset from '@digigov/react-core/Fieldset';
7
+ import { FieldProps } from '@digigov/form/Field/types';
8
+ import FieldContainer from '@digigov/form/Field/FieldBaseContainer';
9
+ export interface FieldArrayProps extends FieldProps {
10
+ control: UseFormReturn['control'];
11
+ register: UseFormReturn['register'];
12
+ formState: UseFormReturn['formState'];
13
+ error?: ErrorOption;
14
+ }
15
+ export const FieldArray: React.FC<FieldArrayProps> = ({
16
+ name,
17
+ register,
18
+ control,
19
+ formState,
20
+ error,
21
+ layout,
22
+ label,
23
+ ...customField
24
+ }) => {
25
+ const { fields, append, remove } = useFieldArray({
26
+ control,
27
+ name,
28
+ });
29
+
30
+ return (
31
+ <FieldContainer
32
+ label={label}
33
+ layout={layout}
34
+ error={
35
+ formState.isSubmitted &&
36
+ !formState.isSubmitting &&
37
+ error?.message &&
38
+ error
39
+ ? error
40
+ : undefined
41
+ }
42
+ wrapper="fieldset"
43
+ name={name}
44
+ >
45
+ {fields.length === 0 && (
46
+ <Hint>{customField.extra?.label.object?.nothing_added}</Hint>
47
+ )}
48
+ {fields.map((field, index) => (
49
+ <Card variant="border" key={field.id}>
50
+ <Fieldset>
51
+ <FieldsetLabel>
52
+ {customField.extra?.label.object.title} {index + 1}
53
+ </FieldsetLabel>
54
+ <FieldObject
55
+ name={`${name}.${index}`}
56
+ error={Array.isArray(error) && error[index]}
57
+ formState={formState}
58
+ register={register}
59
+ control={control}
60
+ {...customField.extra?.of}
61
+ />
62
+ <Button type="button" color="warning" onClick={() => remove(index)}>
63
+ Remove
64
+ </Button>
65
+ </Fieldset>
66
+ </Card>
67
+ ))}
68
+
69
+ <Button
70
+ type="button"
71
+ color="secondary"
72
+ onClick={(ev) => {
73
+ ev.preventDefault();
74
+ append({});
75
+ }}
76
+ >
77
+ {customField.extra?.label.object?.add}
78
+ </Button>
79
+ </FieldContainer>
80
+ );
81
+ };
82
+
83
+ export default FieldArray;