@digigov/form 2.0.0-8e254888 → 2.0.0-a402a664

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 (320) hide show
  1. package/Field/FieldBase/index.js +6 -2
  2. package/Field/FieldBase.js.map +2 -2
  3. package/Field/FieldBaseContainer/index.js +5 -3
  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 +10 -4
  8. package/Field/index.js.map +2 -2
  9. package/Field/types.d.ts +11 -3
  10. package/Field/utils/index.js +3 -1
  11. package/Field/utils/index.js.map +2 -2
  12. package/Field/utils/useField/index.js +8 -1
  13. package/Field/utils/useField.js.map +2 -2
  14. package/FieldArray/FormDialog/index.js +314 -196
  15. package/FieldArray/FormDialog.d.ts +20 -7
  16. package/FieldArray/FormDialog.js.map +3 -3
  17. package/FieldArray/__stories__/Default.d.ts +1 -1
  18. package/FieldArray/__stories__/WithExactLength.d.ts +1 -1
  19. package/FieldArray/__stories__/WithModal.d.ts +1 -1
  20. package/FieldArray/index.d.ts +1 -0
  21. package/FieldArray/index.js +12 -7
  22. package/FieldArray/index.js.map +2 -2
  23. package/FieldObject/index.d.ts +3 -0
  24. package/FieldObject/index.js +26 -15
  25. package/FieldObject/index.js.map +2 -2
  26. package/FormBuilder/FormBuilder.stories.d.ts +2 -0
  27. package/FormBuilder/__stories__/AutoErrorGrouping.d.ts +1 -1
  28. package/FormBuilder/__stories__/Default.d.ts +1 -1
  29. package/FormBuilder/__stories__/ErrorGrouping.d.ts +1 -1
  30. package/FormBuilder/index.d.ts +1 -1
  31. package/FormBuilder/index.js +11 -6
  32. package/FormBuilder/index.js.map +2 -2
  33. package/FormContext/index.js +6 -2
  34. package/FormContext.d.ts +1 -0
  35. package/FormContext.js.map +2 -2
  36. package/MultiplicityField/MultiplicityField.stories.d.ts +2 -0
  37. package/MultiplicityField/__stories__/Default.d.ts +1 -1
  38. package/MultiplicityField/__stories__/PreviewDisplay.d.ts +1 -1
  39. package/MultiplicityField/__stories__/WithExactLength.d.ts +1 -1
  40. package/MultiplicityField/__stories__/WithMaxLength.d.ts +1 -1
  41. package/MultiplicityField/__stories__/WithMinAndMaxLength.d.ts +1 -1
  42. package/MultiplicityField/__stories__/WithMinLength.d.ts +1 -1
  43. package/MultiplicityField/add-objects/index.js +2 -0
  44. package/MultiplicityField/add-objects.js.map +2 -2
  45. package/MultiplicityField/index.js +4 -1
  46. package/MultiplicityField/index.js.map +2 -2
  47. package/MultiplicityField/types.d.ts +1 -0
  48. package/Questions/Questions.stories.d.ts +2 -0
  49. package/Questions/__stories__/Default.d.ts +1 -1
  50. package/cjs/Field/FieldBase/index.js +6 -2
  51. package/cjs/Field/FieldBase.js.map +2 -2
  52. package/cjs/Field/FieldBaseContainer/index.js +4 -2
  53. package/cjs/Field/FieldBaseContainer.js.map +3 -3
  54. package/cjs/Field/FieldConditional/index.js +4 -0
  55. package/cjs/Field/FieldConditional.js.map +2 -2
  56. package/cjs/Field/index.js +10 -4
  57. package/cjs/Field/index.js.map +2 -2
  58. package/cjs/Field/types.js.map +1 -1
  59. package/cjs/Field/utils/index.js +3 -1
  60. package/cjs/Field/utils/index.js.map +2 -2
  61. package/cjs/Field/utils/useField/index.js +8 -1
  62. package/cjs/Field/utils/useField.js.map +2 -2
  63. package/cjs/FieldArray/FormDialog/index.js +309 -194
  64. package/cjs/FieldArray/FormDialog.js.map +3 -3
  65. package/cjs/FieldArray/index.js +12 -7
  66. package/cjs/FieldArray/index.js.map +2 -2
  67. package/cjs/FieldObject/index.js +26 -15
  68. package/cjs/FieldObject/index.js.map +2 -2
  69. package/cjs/FormBuilder/index.js +11 -6
  70. package/cjs/FormBuilder/index.js.map +2 -2
  71. package/cjs/FormContext/index.js +7 -2
  72. package/cjs/FormContext.js.map +2 -2
  73. package/cjs/MultiplicityField/add-objects/index.js +2 -0
  74. package/cjs/MultiplicityField/add-objects.js.map +2 -2
  75. package/cjs/MultiplicityField/index.js +4 -1
  76. package/cjs/MultiplicityField/index.js.map +2 -2
  77. package/cjs/MultiplicityField/types.js.map +1 -1
  78. package/cjs/inputs/Checkboxes/index.js +1 -1
  79. package/cjs/inputs/Checkboxes/index.js.map +2 -2
  80. package/cjs/inputs/DateInput/index.js +20 -8
  81. package/cjs/inputs/DateInput/index.js.map +2 -2
  82. package/cjs/inputs/DateTimeInput/index.js +23 -10
  83. package/cjs/inputs/DateTimeInput/index.js.map +2 -2
  84. package/cjs/inputs/FileInput/index.js +26 -21
  85. package/cjs/inputs/FileInput/index.js.map +2 -2
  86. package/cjs/inputs/ImageInput/__stories__/logo.d/index.js +1 -0
  87. package/cjs/inputs/ImageInput/__stories__/logo.d.js.map +7 -0
  88. package/cjs/inputs/ImageInput/index.js +41 -10
  89. package/cjs/inputs/ImageInput/index.js.map +2 -2
  90. package/cjs/inputs/Input/index.js +4 -4
  91. package/cjs/inputs/Input/index.js.map +2 -2
  92. package/cjs/inputs/Select/index.js +4 -3
  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 +2 -1
  97. package/cjs/lazy.js.map +2 -2
  98. package/cjs/registry/index.js +8 -8
  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 +10 -5
  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/file/index.js +30 -17
  108. package/cjs/validators/utils/file.js.map +2 -2
  109. package/cjs/validators/utils/index.js +5 -1
  110. package/cjs/validators/utils/index.js.map +2 -2
  111. package/index.js +1 -1
  112. package/inputs/AutoCompleteInput/AutoComplete.stories.d.ts +2 -0
  113. package/inputs/AutoCompleteInput/__stories__/Default.d.ts +1 -1
  114. package/inputs/AutoCompleteInput/__stories__/Multiple.d.ts +1 -1
  115. package/inputs/Checkboxes/Checkboxes.stories.d.ts +2 -0
  116. package/inputs/Checkboxes/__stories__/Conditional.d.ts +1 -1
  117. package/inputs/Checkboxes/__stories__/Default.d.ts +1 -1
  118. package/inputs/Checkboxes/__stories__/WithDivider.d.ts +1 -1
  119. package/inputs/Checkboxes/index.js +1 -1
  120. package/inputs/Checkboxes/index.js.map +2 -2
  121. package/inputs/DateInput/DateInput.stories.d.ts +2 -0
  122. package/inputs/DateInput/__stories__/Default.d.ts +1 -1
  123. package/inputs/DateInput/index.js +20 -8
  124. package/inputs/DateInput/index.js.map +2 -2
  125. package/inputs/DateTimeInput/DateTimeInput.stories.d.ts +2 -0
  126. package/inputs/DateTimeInput/__stories__/Default.d.ts +1 -1
  127. package/inputs/DateTimeInput/index.js +23 -10
  128. package/inputs/DateTimeInput/index.js.map +2 -2
  129. package/inputs/FileInput/FileInput.stories.d.ts +3 -0
  130. package/inputs/FileInput/__stories__/Default.d.ts +1 -1
  131. package/inputs/FileInput/__stories__/WithBorderAndLink.d.ts +3 -0
  132. package/inputs/FileInput/index.d.ts +6 -3
  133. package/inputs/FileInput/index.js +31 -23
  134. package/inputs/FileInput/index.js.map +2 -2
  135. package/inputs/ImageInput/ImageInput.stories.d.ts +4 -1
  136. package/inputs/ImageInput/__stories__/Default.d.ts +1 -1
  137. package/inputs/ImageInput/__stories__/MaxSize.d.ts +1 -1
  138. package/inputs/ImageInput/__stories__/WithInitialValues.d.ts +3 -0
  139. package/inputs/ImageInput/__stories__/WithInvalidImageDimension.d.ts +1 -1
  140. package/inputs/ImageInput/__stories__/logo.d/index.js +1 -0
  141. package/inputs/ImageInput/__stories__/logo.d/package.json +6 -0
  142. package/inputs/ImageInput/__stories__/logo.d.js.map +7 -0
  143. package/inputs/ImageInput/index.d.ts +9 -1
  144. package/inputs/ImageInput/index.js +42 -11
  145. package/inputs/ImageInput/index.js.map +2 -2
  146. package/inputs/Input/Input.stories.d.ts +4 -0
  147. package/inputs/Input/__stories__/AFM.d.ts +1 -1
  148. package/inputs/Input/__stories__/AMKA.d.ts +3 -0
  149. package/inputs/Input/__stories__/Boolean.d.ts +1 -1
  150. package/inputs/Input/__stories__/Email.d.ts +3 -0
  151. package/inputs/Input/__stories__/IBAN.d.ts +1 -1
  152. package/inputs/Input/__stories__/Integer.d.ts +1 -1
  153. package/inputs/Input/__stories__/LandlineNumber.d.ts +1 -1
  154. package/inputs/Input/__stories__/MobilePhone.d.ts +1 -1
  155. package/inputs/Input/__stories__/PhoneNumber.d.ts +1 -1
  156. package/inputs/Input/__stories__/PostalCode.d.ts +1 -1
  157. package/inputs/Input/__stories__/String.d.ts +1 -1
  158. package/inputs/Input/__stories__/StringWithTrimValidation.d.ts +1 -1
  159. package/inputs/Input/__stories__/TextWithLimit.d.ts +1 -1
  160. package/inputs/Input/index.d.ts +2 -1
  161. package/inputs/Input/index.js +4 -4
  162. package/inputs/Input/index.js.map +2 -2
  163. package/inputs/Label/Label.stories.d.ts +2 -0
  164. package/inputs/Label/__stories__/Default.d.ts +1 -1
  165. package/inputs/OtpInput/OtpInput.stories.d.ts +2 -0
  166. package/inputs/OtpInput/__stories__/Default.d.ts +1 -1
  167. package/inputs/Radio/Radio.stories.d.ts +2 -0
  168. package/inputs/Radio/__stories__/Conditional.d.ts +1 -1
  169. package/inputs/Radio/__stories__/Default.d.ts +1 -1
  170. package/inputs/Radio/__stories__/WithDivider.d.ts +1 -1
  171. package/inputs/Select/Select.stories.d.ts +2 -0
  172. package/inputs/Select/__stories__/Default.d.ts +1 -1
  173. package/inputs/Select/index.d.ts +2 -1
  174. package/inputs/Select/index.js +4 -3
  175. package/inputs/Select/index.js.map +2 -2
  176. package/inputs/inputsScenarios/index.js +2 -2
  177. package/inputs/inputsScenarios.d.ts +1 -1
  178. package/inputs/inputsScenarios.js.map +2 -2
  179. package/lazy/index.js +2 -1
  180. package/package.json +8 -8
  181. package/registry/index.js +8 -8
  182. package/src/Field/FieldBase.tsx +5 -1
  183. package/src/Field/FieldBaseContainer.tsx +8 -4
  184. package/src/Field/FieldConditional.tsx +4 -0
  185. package/src/Field/doc.mdx +202 -1
  186. package/src/Field/index.tsx +15 -5
  187. package/src/Field/types.tsx +12 -3
  188. package/src/Field/utils/index.ts +2 -0
  189. package/src/Field/utils/useField.ts +9 -1
  190. package/src/FieldArray/FormDialog.tsx +430 -243
  191. package/src/FieldArray/__stories__/Default.tsx +1 -1
  192. package/src/FieldArray/__stories__/WithExactLength.tsx +1 -1
  193. package/src/FieldArray/__stories__/WithModal.tsx +4 -3
  194. package/src/FieldArray/index.test.tsx +4 -0
  195. package/src/FieldArray/index.tsx +26 -30
  196. package/src/FieldObject/index.tsx +33 -18
  197. package/src/FormBuilder/FormBuilder.stories.js +3 -0
  198. package/src/FormBuilder/__stories__/AutoErrorGrouping.tsx +1 -1
  199. package/src/FormBuilder/__stories__/Default.tsx +1 -1
  200. package/src/FormBuilder/__stories__/ErrorGrouping.tsx +1 -1
  201. package/src/FormBuilder/doc.mdx +9 -4
  202. package/src/FormBuilder/index.test.tsx +4 -0
  203. package/src/FormBuilder/index.tsx +12 -6
  204. package/src/FormBuilder/interaction.test.tsx +8 -0
  205. package/src/FormBuilder/scenarios.test.tsx +7 -7
  206. package/src/FormContext.tsx +5 -1
  207. package/src/MultiplicityField/MultiplicityField.stories.js +3 -0
  208. package/src/MultiplicityField/__stories__/Default.tsx +1 -1
  209. package/src/MultiplicityField/__stories__/PreviewDisplay.tsx +1 -1
  210. package/src/MultiplicityField/__stories__/WithExactLength.tsx +1 -1
  211. package/src/MultiplicityField/__stories__/WithMaxLength.tsx +1 -1
  212. package/src/MultiplicityField/__stories__/WithMinAndMaxLength.tsx +1 -1
  213. package/src/MultiplicityField/__stories__/WithMinLength.tsx +1 -1
  214. package/src/MultiplicityField/add-objects.tsx +2 -0
  215. package/src/MultiplicityField/doc.mdx +101 -83
  216. package/src/MultiplicityField/index.test.tsx +4 -0
  217. package/src/MultiplicityField/index.tsx +3 -0
  218. package/src/MultiplicityField/types.ts +1 -0
  219. package/src/Questions/Questions.stories.js +3 -0
  220. package/src/Questions/__snapshots__/index.spec.tsx.snap +2 -1
  221. package/src/Questions/__stories__/Default.tsx +1 -1
  222. package/src/Questions/doc.mdx +21 -41
  223. package/src/Questions/index.test.tsx +4 -0
  224. package/src/doc.mdx +26 -11
  225. package/src/inputs/AutoCompleteInput/AutoComplete.stories.js +3 -0
  226. package/src/inputs/AutoCompleteInput/__stories__/Default.tsx +1 -1
  227. package/src/inputs/AutoCompleteInput/__stories__/Multiple.tsx +1 -1
  228. package/src/inputs/AutoCompleteInput/index.test.tsx +4 -0
  229. package/src/inputs/Checkboxes/Checkboxes.stories.js +3 -0
  230. package/src/inputs/Checkboxes/__stories__/Conditional.tsx +1 -1
  231. package/src/inputs/Checkboxes/__stories__/Default.tsx +1 -1
  232. package/src/inputs/Checkboxes/__stories__/WithDivider.tsx +1 -1
  233. package/src/inputs/Checkboxes/index.test.tsx +4 -0
  234. package/src/inputs/Checkboxes/index.tsx +1 -1
  235. package/src/inputs/DateInput/DateInput.stories.js +3 -0
  236. package/src/inputs/DateInput/__stories__/Default.tsx +1 -1
  237. package/src/inputs/DateInput/index.test.tsx +4 -0
  238. package/src/inputs/DateInput/index.tsx +21 -7
  239. package/src/inputs/DateTimeInput/DateTimeInput.stories.js +3 -0
  240. package/src/inputs/DateTimeInput/__stories__/Default.tsx +1 -1
  241. package/src/inputs/DateTimeInput/index.test.tsx +4 -0
  242. package/src/inputs/DateTimeInput/index.tsx +24 -9
  243. package/src/inputs/FileInput/FileInput.stories.js +4 -0
  244. package/src/inputs/FileInput/__stories__/Default.tsx +1 -1
  245. package/src/inputs/FileInput/__stories__/WithBorderAndLink.tsx +34 -0
  246. package/src/inputs/FileInput/index.test.tsx +8 -0
  247. package/src/inputs/FileInput/index.tsx +41 -30
  248. package/src/inputs/ImageInput/ImageInput.stories.js +5 -1
  249. package/src/inputs/ImageInput/__stories__/Default.tsx +1 -1
  250. package/src/inputs/ImageInput/__stories__/MaxSize.tsx +3 -2
  251. package/src/inputs/ImageInput/__stories__/{WithInvalidImageSize.tsx → WithInitialValues.tsx} +12 -3
  252. package/src/inputs/ImageInput/__stories__/WithInvalidImageDimension.tsx +1 -1
  253. package/src/inputs/ImageInput/__stories__/logo.d.ts +4 -0
  254. package/src/inputs/ImageInput/__stories__/logo.png +0 -0
  255. package/src/inputs/ImageInput/index.test.tsx +8 -4
  256. package/src/inputs/ImageInput/index.tsx +100 -48
  257. package/src/inputs/Input/Input.stories.js +5 -0
  258. package/src/inputs/Input/__stories__/AFM.tsx +1 -1
  259. package/src/inputs/Input/__stories__/AMKA.tsx +23 -0
  260. package/src/inputs/Input/__stories__/Boolean.tsx +1 -1
  261. package/src/inputs/Input/__stories__/Email.tsx +23 -0
  262. package/src/inputs/Input/__stories__/IBAN.tsx +1 -1
  263. package/src/inputs/Input/__stories__/Integer.tsx +1 -1
  264. package/src/inputs/Input/__stories__/LandlineNumber.tsx +1 -1
  265. package/src/inputs/Input/__stories__/MobilePhone.tsx +1 -1
  266. package/src/inputs/Input/__stories__/PhoneNumber.tsx +1 -1
  267. package/src/inputs/Input/__stories__/PostalCode.tsx +1 -1
  268. package/src/inputs/Input/__stories__/String.tsx +1 -1
  269. package/src/inputs/Input/__stories__/StringWithTrimValidation.tsx +1 -1
  270. package/src/inputs/Input/__stories__/TextWithLimit.tsx +1 -1
  271. package/src/inputs/Input/index.test.tsx +12 -0
  272. package/src/inputs/Input/index.tsx +5 -3
  273. package/src/inputs/Label/Label.stories.js +3 -0
  274. package/src/inputs/Label/__stories__/Default.tsx +1 -1
  275. package/src/inputs/Label/index.test.tsx +4 -0
  276. package/src/inputs/OtpInput/OtpInput.stories.js +3 -0
  277. package/src/inputs/OtpInput/__stories__/Default.tsx +1 -1
  278. package/src/inputs/OtpInput/index.test.tsx +4 -0
  279. package/src/inputs/Radio/Radio.stories.js +3 -0
  280. package/src/inputs/Radio/__stories__/Conditional.tsx +1 -1
  281. package/src/inputs/Radio/__stories__/Default.tsx +1 -1
  282. package/src/inputs/Radio/__stories__/WithDivider.tsx +1 -1
  283. package/src/inputs/Radio/index.test.tsx +4 -0
  284. package/src/inputs/Select/Select.stories.js +3 -0
  285. package/src/inputs/Select/__stories__/Default.tsx +1 -1
  286. package/src/inputs/Select/index.test.tsx +4 -0
  287. package/src/inputs/Select/index.tsx +7 -4
  288. package/src/inputs/inputsScenarios.ts +2 -2
  289. package/src/lazy.js +2 -1
  290. package/src/registry.js +8 -8
  291. package/src/types.tsx +2 -1
  292. package/src/utils.ts +27 -6
  293. package/src/validators/index.ts +16 -5
  294. package/src/validators/utils/amka.ts +39 -0
  295. package/src/validators/utils/file.ts +33 -19
  296. package/src/validators/utils/index.ts +4 -1
  297. package/types.d.ts +2 -1
  298. package/types.js.map +1 -1
  299. package/utils/index.js +20 -6
  300. package/utils.d.ts +2 -0
  301. package/utils.js.map +2 -2
  302. package/validators/index.d.ts +1 -1
  303. package/validators/index.js +11 -5
  304. package/validators/index.js.map +2 -2
  305. package/validators/utils/amka/index.js +36 -0
  306. package/{inputs/Input/inputsInputScenarios → validators/utils/amka}/package.json +1 -1
  307. package/validators/utils/amka.d.ts +6 -0
  308. package/validators/utils/amka.js.map +7 -0
  309. package/validators/utils/file/index.js +30 -17
  310. package/validators/utils/file.js.map +2 -2
  311. package/validators/utils/index.d.ts +1 -0
  312. package/validators/utils/index.js +4 -1
  313. package/validators/utils/index.js.map +2 -2
  314. package/cjs/inputs/Input/inputsInputScenarios/index.js +0 -439
  315. package/cjs/inputs/Input/inputsInputScenarios.js.map +0 -7
  316. package/inputs/ImageInput/__stories__/WithInvalidImageSize.d.ts +0 -3
  317. package/inputs/Input/inputsInputScenarios/index.js +0 -406
  318. package/inputs/Input/inputsInputScenarios.d.ts +0 -57
  319. package/inputs/Input/inputsInputScenarios.js.map +0 -7
  320. package/src/inputs/Input/inputsInputScenarios.ts +0 -404
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+ import FormBuilder, { Field } from '@digigov/form';
3
+ import { Button } from '@digigov/ui/form/Button';
4
+
5
+ export const WithBorderAndLink = () => (
6
+ <FormBuilder
7
+ onSubmit={(data) => {
8
+ console.log(data);
9
+ }}
10
+ >
11
+ <Field
12
+ key={'string'}
13
+ name="file"
14
+ type="file"
15
+ required
16
+ extra={{
17
+ containerProps: {
18
+ variant: 'border',
19
+ },
20
+ uploadButtonProps: {
21
+ variant: 'link',
22
+ },
23
+ resetButtonProps: {
24
+ variant: 'link',
25
+ color: 'warning',
26
+ },
27
+ }}
28
+ label={{ primary: 'Βιογραφικό σημείωμα' }}
29
+ />
30
+ <Button>Συνέχεια</Button>
31
+ </FormBuilder>
32
+ );
33
+
34
+ export default WithBorderAndLink;
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  import { test, expect } from '@playwright/experimental-ct-react';
3
3
  import TestVariant from '@digigov/ui/utils/TestVariant'
4
4
  import { Default } from '@digigov/form/inputs/FileInput/__stories__/Default';
5
+ import { WithBorderAndLink } from '@digigov/form/inputs/FileInput/__stories__/WithBorderAndLink';
5
6
 
6
7
  test('renders the All FileInput variants', async ({ mount, page }) => {
7
8
  await mount(
@@ -10,10 +11,17 @@ test('renders the All FileInput variants', async ({ mount, page }) => {
10
11
  <TestVariant title="Default">
11
12
  <Default />
12
13
  </TestVariant>
14
+ <TestVariant title="WithBorderAndLink">
15
+ <WithBorderAndLink />
16
+ </TestVariant>
13
17
  </div>
14
18
  )
15
19
  await page.evaluate(() => document.fonts.ready);
16
20
 
21
+ // Move the mouse to the top-left corner to avoid random hover issues
22
+ await page.mouse.move(0, 0);
23
+
24
+
17
25
  const screenshot = await page.screenshot({ fullPage: true, animations: 'disabled' });
18
26
  expect(screenshot).toMatchSnapshot();
19
27
  });
@@ -1,10 +1,17 @@
1
- import React, { useState } from 'react';
1
+ import React, { useEffect, useState } from 'react';
2
+ import { useWatch } from 'react-hook-form';
2
3
  import { UncontrolledFieldProps } from '@digigov/form/Field/types';
3
- import { Button } from '@digigov/ui/form/Button';
4
- import { FileUpload, FileUploadContainer } from '@digigov/ui/form/FileUpload';
4
+ import { Button, ButtonProps } from '@digigov/ui/form/Button';
5
+ import {
6
+ FileUpload,
7
+ FileUploadContainer,
8
+ FileUploadContainerProps,
9
+ FileUploadProps,
10
+ } from '@digigov/ui/form/FileUpload';
5
11
  import { useTranslation } from '@digigov/ui/i18n';
6
12
  import { Hint } from '@digigov/ui/typography/Hint';
7
13
  import { Paragraph } from '@digigov/ui/typography/Paragraph';
14
+
8
15
  export interface FileInputProps extends Omit<UncontrolledFieldProps, 'extra'> {
9
16
  extra?: {
10
17
  className?: string;
@@ -13,9 +20,10 @@ export interface FileInputProps extends Omit<UncontrolledFieldProps, 'extra'> {
13
20
  limit: {
14
21
  maxSize?: number;
15
22
  };
16
- variant?: 'border' | 'none';
17
- buttonVariant?: 'link' | 'button';
18
- resetButtonColor?: 'primary' | 'secondary' | 'warning';
23
+ containerProps?: FileUploadContainerProps;
24
+ uploadButtonProps?: FileUploadProps;
25
+ noResetButton?: boolean;
26
+ resetButtonProps?: ButtonProps;
19
27
  locales?: {
20
28
  file?: string;
21
29
  chooseFile?: string;
@@ -25,30 +33,26 @@ export interface FileInputProps extends Omit<UncontrolledFieldProps, 'extra'> {
25
33
  };
26
34
  }
27
35
 
28
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
36
  export const FileInput: React.FC<any> = React.forwardRef(function FileInput(
30
- { name, disabled, reset, onChange, extra, ...props },
37
+ { name, disabled, resetField, extra, control, onChange, ...props },
31
38
  ref: any
32
39
  ) {
40
+ delete props.Field;
41
+ delete props.reset;
33
42
  const { t } = useTranslation();
34
- const variant = extra?.variant || 'none';
35
- const buttonVariant = extra?.buttonVariant;
36
- const resetButtonColor = extra?.resetButtonColor;
37
- const [files, setFiles] = useState<string[] | undefined>([]);
38
- const handleChange = (e) => {
39
- const target = e.target as HTMLInputElement;
40
- const selectedFiles = Array.from(
41
- target.files as ArrayLike<{ name: string }>
42
- ).map(({ name }) => name);
43
- setFiles(selectedFiles);
44
- // proceed calling the onChange provided
45
- // by react-hook-form
46
- onChange(e);
47
- };
43
+ const value: any = useWatch({ control, name });
44
+
45
+ const [files, setFiles] = useState<string[] | undefined>(
46
+ Object.values(value || {})?.map?.(({ name }) => name) || []
47
+ );
48
+ useEffect(() => {
49
+ setFiles(Object.values(value || {})?.map?.(({ name }) => name));
50
+ }, [value]);
51
+
48
52
  return (
49
53
  <>
50
54
  <FileUploadContainer
51
- variant={variant}
55
+ variant={extra?.containerProps?.variant || 'default'}
52
56
  hasFiles={files && files.length > 0}
53
57
  >
54
58
  {files?.length ? (
@@ -70,24 +74,31 @@ export const FileInput: React.FC<any> = React.forwardRef(function FileInput(
70
74
  ref={ref}
71
75
  hasFiles={!!files?.length}
72
76
  name={name}
73
- variant={buttonVariant}
77
+ variant={extra?.uploadButtonProps?.variant}
74
78
  disabled={disabled}
75
- onChange={handleChange}
76
79
  id={name}
77
- {...{ ...props, required: undefined, Field: undefined }}
80
+ onChange={(event) => {
81
+ event.preventDefault();
82
+ const target = event?.target as HTMLInputElement;
83
+ if (target?.files && target?.files.length > 0) {
84
+ setFiles(Object.values(target?.files)?.map?.(({ name }) => name));
85
+ }
86
+ onChange(event);
87
+ }}
88
+ {...{ ...props, required: undefined }}
78
89
  >
79
90
  {files?.length ? t('upload.change_file') : t('upload.choose_file')}
80
91
  </FileUpload>
81
- {files !== undefined && files.length > 0 && (
92
+ {files !== undefined && files?.length > 0 && !extra?.noResetButton && (
82
93
  <>
83
94
  <Button
84
- variant="link"
95
+ variant={extra?.resetButtonProps?.variant || 'link'}
85
96
  onClick={(event) => {
86
97
  event.preventDefault();
87
- reset({ [name]: '' });
98
+ resetField(name);
88
99
  setFiles(undefined);
89
100
  }}
90
- color={resetButtonColor}
101
+ color={extra?.resetButtonProps?.color || 'secondary'}
91
102
  >
92
103
  {t('upload.reset_file')}
93
104
  </Button>
@@ -1,9 +1,13 @@
1
1
  import ImageInput from '@digigov/form/inputs/ImageInput';
2
+ import doc from './doc.mdx?raw';
2
3
  export default {
3
4
  title: 'Digigov Form/inputs/ImageInput',
4
5
  component: ImageInput,
6
+ tags: ['autodocs'],
7
+ markdown: doc,
5
8
  displayName: 'ImageInput',
6
9
  };
7
10
  export { Default } from '@digigov/form/inputs/ImageInput/__stories__/Default';
8
- export { WithInvalidImageDimension } from '@digigov/form/inputs/ImageInput/__stories__/WithInvalidImageDimension';
9
11
  export { MaxSize } from '@digigov/form/inputs/ImageInput/__stories__/MaxSize';
12
+ export { WithInvalidImageDimension } from '@digigov/form/inputs/ImageInput/__stories__/WithInvalidImageDimension';
13
+ export { WithInitialValues } from '@digigov/form/inputs/ImageInput/__stories__/WithInitialValues';
@@ -13,7 +13,7 @@ const FIELDS: FieldSpec[] = [
13
13
  },
14
14
  ];
15
15
 
16
- export const Default = () => (
16
+ export const Default = (_: any) => (
17
17
  <FormBuilder
18
18
  fields={FIELDS}
19
19
  onSubmit={(data) => {
@@ -9,17 +9,18 @@ const FIELDS: FieldSpec[] = [
9
9
  required: true,
10
10
  label: {
11
11
  primary: 'Ανέβασμα φωτογραφίας',
12
- secondary: 'Μέγιστο μέγεθος φωτογραφίας: 10KB.',
12
+ secondary: 'Μέγιστο μέγεθος φωτογραφίας: 1KB.',
13
13
  },
14
14
  extra: {
15
15
  limit: {
16
+ // bytes
16
17
  maxSize: 1000,
17
18
  },
18
19
  },
19
20
  },
20
21
  ];
21
22
 
22
- export const MaxSize = () => (
23
+ export const MaxSize = (_: any) => (
23
24
  <FormBuilder
24
25
  fields={FIELDS}
25
26
  onSubmit={(data) => {
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import FormBuilder, { Field, Fieldset } from '@digigov/form';
3
+ import logo from '@digigov/form/inputs/ImageInput/__stories__/logo.png';
3
4
  import { FieldSpec } from '@digigov/form/types';
4
5
  import { Button } from '@digigov/ui/form/Button';
5
6
  const FIELDS: FieldSpec[] = [
@@ -9,18 +10,26 @@ const FIELDS: FieldSpec[] = [
9
10
  required: true,
10
11
  label: {
11
12
  primary: 'Ανέβασμα φωτογραφίας',
13
+ secondary:
14
+ 'Οι επιτρεπόμενες διαστάσεις είναι για το ύψος από 100 μέχρι 400 και για το πλάτος από 100 μέχρι 400.',
12
15
  },
13
16
  extra: {
14
17
  limit: {
15
- maxSize: 300,
18
+ maxHeight: 400,
19
+ maxWidth: 400,
20
+ minHeight: 100,
21
+ minWidth: 100,
16
22
  },
17
23
  },
18
24
  },
19
25
  ];
20
26
 
21
- export const WithInvalidImageSize = () => (
27
+ export const WithInitialValues = (_: any) => (
22
28
  <FormBuilder
23
29
  fields={FIELDS}
30
+ initial={{
31
+ image: { src: logo, filename: 'logo.png' },
32
+ }}
24
33
  onSubmit={(data) => {
25
34
  console.log(data);
26
35
  }}
@@ -33,4 +42,4 @@ export const WithInvalidImageSize = () => (
33
42
  <Button type="submit">Συνέχεια</Button>
34
43
  </FormBuilder>
35
44
  );
36
- export default WithInvalidImageSize;
45
+ export default WithInitialValues;
@@ -23,7 +23,7 @@ const FIELDS: FieldSpec[] = [
23
23
  },
24
24
  ];
25
25
 
26
- export const WithInvalidImageDimension = () => (
26
+ export const WithInvalidImageDimension = (_: any) => (
27
27
  <FormBuilder
28
28
  fields={FIELDS}
29
29
  onSubmit={(data) => {
@@ -0,0 +1,4 @@
1
+ declare module '*.png' {
2
+ const value: any;
3
+ export default value;
4
+ }
@@ -3,8 +3,8 @@ import { test, expect } from '@playwright/experimental-ct-react';
3
3
  import TestVariant from '@digigov/ui/utils/TestVariant'
4
4
  import { Default } from '@digigov/form/inputs/ImageInput/__stories__/Default';
5
5
  import { MaxSize } from '@digigov/form/inputs/ImageInput/__stories__/MaxSize';
6
+ import { WithInitialValues } from '@digigov/form/inputs/ImageInput/__stories__/WithInitialValues';
6
7
  import { WithInvalidImageDimension } from '@digigov/form/inputs/ImageInput/__stories__/WithInvalidImageDimension';
7
- import { WithInvalidImageSize } from '@digigov/form/inputs/ImageInput/__stories__/WithInvalidImageSize';
8
8
 
9
9
  test('renders the All ImageInput variants', async ({ mount, page }) => {
10
10
  await mount(
@@ -16,16 +16,20 @@ test('renders the All ImageInput variants', async ({ mount, page }) => {
16
16
  <TestVariant title="MaxSize">
17
17
  <MaxSize />
18
18
  </TestVariant>
19
+ <TestVariant title="WithInitialValues">
20
+ <WithInitialValues />
21
+ </TestVariant>
19
22
  <TestVariant title="WithInvalidImageDimension">
20
23
  <WithInvalidImageDimension />
21
24
  </TestVariant>
22
- <TestVariant title="WithInvalidImageSize">
23
- <WithInvalidImageSize />
24
- </TestVariant>
25
25
  </div>
26
26
  )
27
27
  await page.evaluate(() => document.fonts.ready);
28
28
 
29
+ // Move the mouse to the top-left corner to avoid random hover issues
30
+ await page.mouse.move(0, 0);
31
+
32
+
29
33
  const screenshot = await page.screenshot({ fullPage: true, animations: 'disabled' });
30
34
  expect(screenshot).toMatchSnapshot();
31
35
  });
@@ -1,4 +1,5 @@
1
- import React, { useState, useCallback } from 'react';
1
+ import React, { useRef, useState, useEffect, useCallback } from 'react';
2
+ import { UseFormReturn } from 'react-hook-form';
2
3
  import { UncontrolledFieldProps } from '@digigov/form/Field/types';
3
4
  import { Button, ButtonGroup } from '@digigov/ui/form/Button';
4
5
  import { FileUpload, FileUploadContainer } from '@digigov/ui/form/FileUpload';
@@ -7,7 +8,7 @@ import { Hint } from '@digigov/ui/typography/Hint';
7
8
  import { Paragraph } from '@digigov/ui/typography/Paragraph';
8
9
  import { Base } from '@digigov/ui/utils/Base';
9
10
  export interface ImageProps {
10
- src?: any;
11
+ src: string;
11
12
  }
12
13
 
13
14
  export interface Limit {
@@ -21,6 +22,18 @@ export interface Limit {
21
22
  export const Image: React.FC<ImageProps> = React.memo(function Image({ src }) {
22
23
  return <Base as="img" src={src} className="ds-image--ratio" />;
23
24
  });
25
+
26
+ interface ImageInputDefaultValue {
27
+ filename: string;
28
+ src: string;
29
+ }
30
+
31
+ const blobToFileList = (blob: Blob, fileName: string): FileList => {
32
+ const file = new File([blob], fileName, { type: 'image/jpeg' });
33
+ const dataTransfer = new DataTransfer();
34
+ dataTransfer.items.add(file);
35
+ return dataTransfer.files;
36
+ };
24
37
  export interface ImageInputProps extends Omit<UncontrolledFieldProps, 'extra'> {
25
38
  extra?: {
26
39
  className?: string;
@@ -29,25 +42,40 @@ export interface ImageInputProps extends Omit<UncontrolledFieldProps, 'extra'> {
29
42
  limit?: Limit;
30
43
  };
31
44
  reset: (values?: any) => void;
45
+ resetField: UseFormReturn['resetField'];
32
46
  onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
47
+ defaultValue?: ImageInputDefaultValue | null;
48
+ value: any;
33
49
  }
34
50
 
35
51
  export const ImageInput: React.FC<ImageInputProps> = React.forwardRef(
36
- function ImageInput({ name, disabled, onChange, reset, ...props }, ref: any) {
52
+ function ImageInput(
53
+ { name, disabled, onChange, resetField, defaultValue, value, ...props },
54
+ ref: any
55
+ ) {
56
+ const imageRef = useRef(ref?.current);
37
57
  const { t } = useTranslation();
38
- const [selectedImage, setSelectedImage] = useState<File | null>(null);
39
- const [imageUrl, setImageUrl] = useState<string | null>(null);
58
+ const currentValue: ImageInputDefaultValue | null =
59
+ defaultValue || value || null;
60
+ const [selectedImage, setSelectedImage] = useState<
61
+ File | ImageInputDefaultValue | null
62
+ >(currentValue);
63
+ const [imageUrl, setImageUrl] = useState<string | null>(
64
+ currentValue?.src || null
65
+ );
66
+
40
67
  const handleImageChange = useCallback(
41
68
  (e: React.ChangeEvent<HTMLInputElement>) => {
42
69
  e.preventDefault();
43
70
  const target = e.target as HTMLInputElement;
44
71
  const selectedFile = target.files?.[0];
45
-
46
72
  if (selectedFile) {
47
73
  setSelectedImage(selectedFile);
48
74
  setImageUrl(URL.createObjectURL(selectedFile));
49
75
  }
50
- onChange(e);
76
+ onChange(
77
+ target.files as unknown as React.ChangeEvent<HTMLInputElement>
78
+ );
51
79
  },
52
80
  [selectedImage]
53
81
  );
@@ -55,55 +83,79 @@ export const ImageInput: React.FC<ImageInputProps> = React.forwardRef(
55
83
  const handleDeleteImage = useCallback(
56
84
  (event) => {
57
85
  event.preventDefault();
58
- reset({ [name]: '' });
86
+ resetField(name);
59
87
  setSelectedImage(null);
60
- setImageUrl('');
88
+ setImageUrl(null);
61
89
  },
62
90
  [selectedImage]
63
91
  );
64
92
 
93
+ useEffect(() => {
94
+ // This is to fill the input with the default value (image)
95
+ if (defaultValue?.src && imageRef.current) {
96
+ fetch(defaultValue?.src)
97
+ .then((response) => response.blob())
98
+ .then((blob) => {
99
+ const fileList = blobToFileList(blob, defaultValue.filename);
100
+ imageRef.current.files = fileList;
101
+ const fileChangeEvent = new Event('change', { bubbles: true });
102
+ imageRef.current.dispatchEvent(fileChangeEvent);
103
+ return;
104
+ })
105
+ .catch((error) => console.error('Error fetching image:', error));
106
+ }
107
+ }, [defaultValue, imageRef]);
108
+
65
109
  return (
66
- <>
67
- <FileUploadContainer>
68
- {selectedImage !== null ? (
69
- <>
70
- <Paragraph>
71
- <Base as="b">{t('upload.image')}:</Base>{' '}
72
- {`${selectedImage?.name}`}
73
- </Paragraph>
74
- </>
75
- ) : (
76
- <Hint className="ds-dashed--border">{t('upload.no_image')}</Hint>
77
- )}
110
+ <FileUploadContainer>
111
+ {selectedImage !== null ? (
78
112
  <>
79
- {selectedImage !== null && <Image src={imageUrl} />}
80
- <ButtonGroup marginTop={2}>
81
- {selectedImage !== null && (
82
- <Button variant="link" onClick={handleDeleteImage}>
83
- {t('upload.reset_file')}
84
- </Button>
85
- )}
86
- <FileUpload
87
- ref={ref}
88
- hasFiles={selectedImage !== null}
89
- name={name}
90
- id={name}
91
- disabled={disabled}
92
- accept="image/*"
93
- onChange={handleImageChange}
94
- {...{
95
- ...props,
96
- required: undefined,
97
- Field: undefined,
98
- type: 'file',
99
- }}
100
- >
101
- {t('upload.choose_image')}
102
- </FileUpload>
103
- </ButtonGroup>
113
+ <Paragraph>
114
+ <Base as="b">{t('upload.image')}:</Base>{' '}
115
+ <em>
116
+ {`${(selectedImage as File)?.name || (selectedImage as ImageInputDefaultValue)?.filename}`}
117
+ </em>
118
+ </Paragraph>
104
119
  </>
105
- </FileUploadContainer>
106
- </>
120
+ ) : (
121
+ <Hint className="ds-dashed--border">{t('upload.no_image')}</Hint>
122
+ )}
123
+ {imageUrl !== null && selectedImage !== null && (
124
+ <Image src={imageUrl} />
125
+ )}
126
+ {!disabled && (
127
+ <ButtonGroup marginTop={2}>
128
+ <FileUpload
129
+ ref={imageRef}
130
+ hasFiles={selectedImage !== null}
131
+ name={name}
132
+ id={name}
133
+ disabled={disabled}
134
+ accept="image/*"
135
+ onChange={handleImageChange}
136
+ {...{
137
+ ...(props as any),
138
+ required: undefined,
139
+ Field: undefined,
140
+ type: 'file',
141
+ }}
142
+ >
143
+ {selectedImage
144
+ ? t('upload.change_image')
145
+ : t('upload.choose_image')}
146
+ </FileUpload>
147
+ {selectedImage !== null && (
148
+ <Button
149
+ color="warning"
150
+ variant="link"
151
+ onClick={handleDeleteImage}
152
+ >
153
+ {t('upload.reset_file')}
154
+ </Button>
155
+ )}
156
+ </ButtonGroup>
157
+ )}
158
+ </FileUploadContainer>
107
159
  );
108
160
  }
109
161
  );
@@ -1,7 +1,10 @@
1
1
  import Input from '@digigov/form/inputs/Input';
2
+ import doc from './doc.mdx?raw';
2
3
  export default {
3
4
  title: 'Digigov Form/inputs/Input',
4
5
  component: Input,
6
+ tags: ['autodocs'],
7
+ markdown: doc,
5
8
  displayName: 'Input',
6
9
  };
7
10
  export { String } from '@digigov/form/inputs/Input/__stories__/String';
@@ -12,6 +15,8 @@ export { PhoneNumber } from '@digigov/form/inputs/Input/__stories__/PhoneNumber'
12
15
  export { LandlineNumber } from '@digigov/form/inputs/Input/__stories__/LandlineNumber';
13
16
  export { MobilePhone } from '@digigov/form/inputs/Input/__stories__/MobilePhone';
14
17
  export { AFM } from '@digigov/form/inputs/Input/__stories__/AFM';
18
+ export { AMKA } from '@digigov/form/inputs/Input/__stories__/AMKA';
15
19
  export { IBAN } from '@digigov/form/inputs/Input/__stories__/IBAN';
20
+ export { Email } from '@digigov/form/inputs/Input/__stories__/Email';
16
21
  export { PostalCode } from '@digigov/form/inputs/Input/__stories__/PostalCode';
17
22
  export { TextWithLimit } from '@digigov/form/inputs/Input/__stories__/TextWithLimit';
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import FormBuilder, { Field } from '@digigov/form';
3
3
  import { Button } from '@digigov/ui/form/Button';
4
4
 
5
- export const AFM = () => (
5
+ export const AFM = (_: any) => (
6
6
  <FormBuilder
7
7
  onSubmit={(data) => {
8
8
  console.log(data);
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import FormBuilder, { Field } from '@digigov/form';
3
+ import { Button } from '@digigov/ui/form/Button';
4
+
5
+ export const AMKA = () => (
6
+ <FormBuilder
7
+ onSubmit={(data) => {
8
+ console.log(data);
9
+ }}
10
+ >
11
+ <Field
12
+ key="amka"
13
+ name="amka"
14
+ type="amka"
15
+ label={{
16
+ primary: 'Αριθμός μητρώου κοινωνικής ασφάλισης',
17
+ }}
18
+ required
19
+ />
20
+ <Button type="submit">Συνέχεια</Button>
21
+ </FormBuilder>
22
+ );
23
+ export default AMKA;
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import FormBuilder, { Field } from '@digigov/form';
3
3
  import { Button } from '@digigov/ui/form/Button';
4
4
 
5
- export const Boolean = () => (
5
+ export const Boolean = (_: any) => (
6
6
  <FormBuilder
7
7
  onSubmit={(data) => {
8
8
  console.log(data);
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import FormBuilder, { Field } from '@digigov/form';
3
+ import { Button } from '@digigov/ui/form/Button';
4
+
5
+ export const Email = (_: any) => (
6
+ <FormBuilder
7
+ onSubmit={(data) => {
8
+ console.log(data);
9
+ }}
10
+ >
11
+ <Field
12
+ key="email"
13
+ name="email"
14
+ type="email"
15
+ label={{
16
+ primary: 'Δ/νση Ηλεκτρ. Ταχυδρομείου (Ε-mail)',
17
+ }}
18
+ required
19
+ />
20
+ <Button type="submit">Συνέχεια</Button>
21
+ </FormBuilder>
22
+ );
23
+ export default Email;
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import FormBuilder, { Field } from '@digigov/form';
3
3
  import { Button } from '@digigov/ui/form/Button';
4
4
 
5
- export const IBAN = () => (
5
+ export const IBAN = (_: any) => (
6
6
  <FormBuilder
7
7
  onSubmit={(data) => {
8
8
  console.log(data);
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import FormBuilder, { Field } from '@digigov/form';
3
3
  import { Button } from '@digigov/ui/form/Button';
4
4
 
5
- export const Integer = () => {
5
+ export const Integer = (_: any) => {
6
6
  return (
7
7
  <FormBuilder
8
8
  onSubmit={(data) => {
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import FormBuilder, { Field } from '@digigov/form';
3
3
  import { Button } from '@digigov/ui/form/Button';
4
4
 
5
- export const LandlineNumber = () => (
5
+ export const LandlineNumber = (_: any) => (
6
6
  <FormBuilder
7
7
  onSubmit={(data) => {
8
8
  console.log(data);
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import FormBuilder, { Field } from '@digigov/form';
3
3
  import { Button } from '@digigov/ui/form/Button';
4
4
 
5
- export const MobilePhone = () => (
5
+ export const MobilePhone = (_: any) => (
6
6
  <FormBuilder
7
7
  onSubmit={(data) => {
8
8
  console.log(data);
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import FormBuilder, { Field } from '@digigov/form';
3
3
  import { Button } from '@digigov/ui/form/Button';
4
4
 
5
- export const PhoneNumber = () => (
5
+ export const PhoneNumber = (_: any) => (
6
6
  <FormBuilder
7
7
  onSubmit={(data) => {
8
8
  console.log(data);