@digigov/form 2.0.0-49de50c4 → 2.0.0-555d1027

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 (272) hide show
  1. package/Field/FieldBase/index.js +3 -4
  2. package/Field/FieldBase.js.map +2 -2
  3. package/Field/FieldBaseContainer/index.js +18 -2
  4. package/Field/FieldBaseContainer.js.map +2 -2
  5. package/Field/FieldConditional/index.js +1 -1
  6. package/Field/FieldConditional.js.map +1 -1
  7. package/Field/index.js +2 -1
  8. package/Field/index.js.map +2 -2
  9. package/Field/types.d.ts +2 -2
  10. package/Field/utils/index.js +4 -3
  11. package/Field/utils/index.js.map +2 -2
  12. package/FieldArray/FormDialog/index.js +5 -8
  13. package/FieldArray/FormDialog.d.ts +4 -4
  14. package/FieldArray/FormDialog.js.map +2 -2
  15. package/FieldArray/__stories__/Default.d.ts +1 -1
  16. package/FieldArray/__stories__/WithExactLength.d.ts +1 -1
  17. package/FieldArray/__stories__/WithModal.d.ts +1 -1
  18. package/FieldArray/index.d.ts +1 -1
  19. package/FieldArray/index.js +75 -87
  20. package/FieldArray/index.js.map +3 -3
  21. package/FormBuilder/FormBuilder.stories.d.ts +2 -0
  22. package/FormBuilder/__stories__/AutoErrorGrouping.d.ts +1 -1
  23. package/FormBuilder/__stories__/Default.d.ts +1 -1
  24. package/FormBuilder/__stories__/ErrorGrouping.d.ts +1 -1
  25. package/FormBuilder/index.d.ts +1 -1
  26. package/FormBuilder/index.js +3 -7
  27. package/FormBuilder/index.js.map +2 -2
  28. package/FormContext/index.js +6 -2
  29. package/FormContext.d.ts +1 -0
  30. package/FormContext.js.map +2 -2
  31. package/MultiplicityField/MultiplicityField.stories.d.ts +2 -0
  32. package/MultiplicityField/__stories__/Default.d.ts +1 -1
  33. package/MultiplicityField/__stories__/PreviewDisplay.d.ts +1 -1
  34. package/MultiplicityField/__stories__/WithExactLength.d.ts +1 -1
  35. package/MultiplicityField/__stories__/WithMaxLength.d.ts +1 -1
  36. package/MultiplicityField/__stories__/WithMinAndMaxLength.d.ts +1 -1
  37. package/MultiplicityField/__stories__/WithMinLength.d.ts +1 -1
  38. package/MultiplicityField/add-objects/index.js +1 -1
  39. package/MultiplicityField/add-objects.js.map +2 -2
  40. package/MultiplicityField/index.js +4 -2
  41. package/MultiplicityField/index.js.map +2 -2
  42. package/MultiplicityField/types.d.ts +1 -0
  43. package/Questions/Questions.stories.d.ts +2 -0
  44. package/Questions/__stories__/Default.d.ts +1 -1
  45. package/cjs/Field/FieldBase/index.js +3 -4
  46. package/cjs/Field/FieldBase.js.map +2 -2
  47. package/cjs/Field/FieldBaseContainer/index.js +17 -1
  48. package/cjs/Field/FieldBaseContainer.js.map +3 -3
  49. package/cjs/Field/FieldConditional/index.js +1 -1
  50. package/cjs/Field/FieldConditional.js.map +1 -1
  51. package/cjs/Field/index.js +2 -1
  52. package/cjs/Field/index.js.map +2 -2
  53. package/cjs/Field/types.js.map +1 -1
  54. package/cjs/Field/utils/index.js +4 -3
  55. package/cjs/Field/utils/index.js.map +2 -2
  56. package/cjs/FieldArray/FormDialog/index.js +5 -8
  57. package/cjs/FieldArray/FormDialog.js.map +2 -2
  58. package/cjs/FieldArray/index.js +74 -83
  59. package/cjs/FieldArray/index.js.map +3 -3
  60. package/cjs/FormBuilder/index.js +3 -7
  61. package/cjs/FormBuilder/index.js.map +2 -2
  62. package/cjs/FormContext/index.js +7 -2
  63. package/cjs/FormContext.js.map +2 -2
  64. package/cjs/MultiplicityField/add-objects/index.js +1 -1
  65. package/cjs/MultiplicityField/add-objects.js.map +2 -2
  66. package/cjs/MultiplicityField/index.js +4 -2
  67. package/cjs/MultiplicityField/index.js.map +2 -2
  68. package/cjs/MultiplicityField/types.js.map +1 -1
  69. package/cjs/inputs/Checkboxes/index.js +2 -1
  70. package/cjs/inputs/Checkboxes/index.js.map +2 -2
  71. package/cjs/inputs/DateInput/index.js +27 -12
  72. package/cjs/inputs/DateInput/index.js.map +2 -2
  73. package/cjs/inputs/DateTimeInput/index.js +55 -34
  74. package/cjs/inputs/DateTimeInput/index.js.map +2 -2
  75. package/cjs/inputs/FileInput/index.js +45 -26
  76. package/cjs/inputs/FileInput/index.js.map +2 -2
  77. package/cjs/inputs/ImageInput/__stories__/logo.d/index.js +1 -0
  78. package/cjs/inputs/ImageInput/__stories__/logo.d.js.map +7 -0
  79. package/cjs/inputs/ImageInput/index.js +41 -10
  80. package/cjs/inputs/ImageInput/index.js.map +2 -2
  81. package/cjs/inputs/Input/index.js +1 -0
  82. package/cjs/inputs/Input/index.js.map +2 -2
  83. package/cjs/lazy/index.js +1 -1
  84. package/cjs/lazy.js.map +2 -2
  85. package/cjs/registry/index.js +4 -6
  86. package/cjs/registry.js.map +2 -2
  87. package/cjs/validators/index.js +8 -10
  88. package/cjs/validators/index.js.map +2 -2
  89. package/cjs/validators/utils/date/index.js +21 -3
  90. package/cjs/validators/utils/date.js.map +2 -2
  91. package/cjs/validators/utils/datetime/index.js +113 -24
  92. package/cjs/validators/utils/datetime.js.map +2 -2
  93. package/index.js +1 -1
  94. package/inputs/AutoCompleteInput/AutoComplete.stories.d.ts +2 -0
  95. package/inputs/AutoCompleteInput/__stories__/Default.d.ts +1 -1
  96. package/inputs/AutoCompleteInput/__stories__/Multiple.d.ts +1 -1
  97. package/inputs/Checkboxes/Checkboxes.stories.d.ts +2 -0
  98. package/inputs/Checkboxes/__stories__/Conditional.d.ts +1 -1
  99. package/inputs/Checkboxes/__stories__/Default.d.ts +1 -1
  100. package/inputs/Checkboxes/__stories__/WithDivider.d.ts +1 -1
  101. package/inputs/Checkboxes/index.js +2 -1
  102. package/inputs/Checkboxes/index.js.map +2 -2
  103. package/inputs/DateInput/DateInput.stories.d.ts +6 -0
  104. package/inputs/DateInput/__stories__/Default.d.ts +1 -1
  105. package/inputs/DateInput/__stories__/WithDefaultValue.d.ts +3 -0
  106. package/inputs/DateInput/__stories__/WithInitialValue.d.ts +3 -0
  107. package/inputs/DateInput/__stories__/WithWrongDefaultValue.d.ts +3 -0
  108. package/inputs/DateInput/__stories__/WithWrongInitialValue.d.ts +3 -0
  109. package/inputs/DateInput/index.js +28 -13
  110. package/inputs/DateInput/index.js.map +2 -2
  111. package/inputs/DateTimeInput/DateTimeInput.stories.d.ts +10 -3
  112. package/inputs/DateTimeInput/__stories__/Default.d.ts +1 -1
  113. package/inputs/DateTimeInput/__stories__/WithDefaultValue.d.ts +3 -0
  114. package/inputs/DateTimeInput/__stories__/WithInitialValue.d.ts +3 -0
  115. package/inputs/DateTimeInput/__stories__/WithWrongDefaultValue.d.ts +3 -0
  116. package/inputs/DateTimeInput/__stories__/WithWrongInitialValue.d.ts +3 -0
  117. package/inputs/DateTimeInput/index.js +56 -35
  118. package/inputs/DateTimeInput/index.js.map +2 -2
  119. package/inputs/FileInput/FileInput.stories.d.ts +2 -0
  120. package/inputs/FileInput/__stories__/Default.d.ts +1 -1
  121. package/inputs/FileInput/index.d.ts +5 -1
  122. package/inputs/FileInput/index.js +46 -27
  123. package/inputs/FileInput/index.js.map +2 -2
  124. package/inputs/ImageInput/ImageInput.stories.d.ts +4 -1
  125. package/inputs/ImageInput/__stories__/Default.d.ts +1 -1
  126. package/inputs/ImageInput/__stories__/MaxSize.d.ts +1 -1
  127. package/inputs/ImageInput/__stories__/WithInitialValues.d.ts +3 -0
  128. package/inputs/ImageInput/__stories__/WithInvalidImageDimension.d.ts +1 -1
  129. package/inputs/ImageInput/__stories__/logo.d/index.js +1 -0
  130. package/inputs/{Input/inputsInputScenarios → ImageInput/__stories__/logo.d}/package.json +1 -1
  131. package/inputs/ImageInput/__stories__/logo.d.js.map +7 -0
  132. package/inputs/ImageInput/index.d.ts +9 -1
  133. package/inputs/ImageInput/index.js +42 -11
  134. package/inputs/ImageInput/index.js.map +2 -2
  135. package/inputs/Input/Input.stories.d.ts +3 -0
  136. package/inputs/Input/__stories__/AFM.d.ts +1 -1
  137. package/inputs/Input/__stories__/Boolean.d.ts +1 -1
  138. package/inputs/Input/__stories__/Email.d.ts +3 -0
  139. package/inputs/Input/__stories__/IBAN.d.ts +1 -1
  140. package/inputs/Input/__stories__/Integer.d.ts +1 -1
  141. package/inputs/Input/__stories__/LandlineNumber.d.ts +1 -1
  142. package/inputs/Input/__stories__/MobilePhone.d.ts +1 -1
  143. package/inputs/Input/__stories__/PhoneNumber.d.ts +1 -1
  144. package/inputs/Input/__stories__/PostalCode.d.ts +1 -1
  145. package/inputs/Input/__stories__/String.d.ts +1 -1
  146. package/inputs/Input/__stories__/StringWithTrimValidation.d.ts +1 -1
  147. package/inputs/Input/__stories__/TextWithLimit.d.ts +1 -1
  148. package/inputs/Input/index.js +1 -0
  149. package/inputs/Input/index.js.map +2 -2
  150. package/inputs/Label/Label.stories.d.ts +2 -0
  151. package/inputs/Label/__stories__/Default.d.ts +1 -1
  152. package/inputs/OtpInput/OtpInput.stories.d.ts +2 -0
  153. package/inputs/OtpInput/__stories__/Default.d.ts +1 -1
  154. package/inputs/Radio/Radio.stories.d.ts +2 -0
  155. package/inputs/Radio/__stories__/Conditional.d.ts +1 -1
  156. package/inputs/Radio/__stories__/Default.d.ts +1 -1
  157. package/inputs/Radio/__stories__/WithDivider.d.ts +1 -1
  158. package/inputs/Select/Select.stories.d.ts +2 -0
  159. package/inputs/Select/__stories__/Default.d.ts +1 -1
  160. package/lazy/index.js +1 -1
  161. package/package.json +8 -8
  162. package/registry/index.js +4 -6
  163. package/src/Field/FieldBase.tsx +14 -18
  164. package/src/Field/FieldBaseContainer.tsx +13 -5
  165. package/src/Field/FieldConditional.tsx +1 -1
  166. package/src/Field/index.tsx +2 -1
  167. package/src/Field/types.tsx +2 -2
  168. package/src/Field/utils/index.ts +2 -1
  169. package/src/FieldArray/FormDialog.tsx +7 -13
  170. package/src/FieldArray/__stories__/Default.tsx +1 -1
  171. package/src/FieldArray/__stories__/WithExactLength.tsx +1 -1
  172. package/src/FieldArray/__stories__/WithModal.tsx +1 -1
  173. package/src/FieldArray/index.tsx +83 -102
  174. package/src/FormBuilder/FormBuilder.stories.js +3 -0
  175. package/src/FormBuilder/__stories__/AutoErrorGrouping.tsx +1 -1
  176. package/src/FormBuilder/__stories__/Default.tsx +1 -1
  177. package/src/FormBuilder/__stories__/ErrorGrouping.tsx +1 -1
  178. package/src/FormBuilder/index.tsx +3 -7
  179. package/src/FormBuilder/scenarios.test.tsx +1 -1
  180. package/src/FormContext.tsx +5 -1
  181. package/src/MultiplicityField/MultiplicityField.stories.js +3 -0
  182. package/src/MultiplicityField/__stories__/Default.tsx +1 -1
  183. package/src/MultiplicityField/__stories__/PreviewDisplay.tsx +1 -1
  184. package/src/MultiplicityField/__stories__/WithExactLength.tsx +1 -1
  185. package/src/MultiplicityField/__stories__/WithMaxLength.tsx +1 -1
  186. package/src/MultiplicityField/__stories__/WithMinAndMaxLength.tsx +1 -1
  187. package/src/MultiplicityField/__stories__/WithMinLength.tsx +1 -1
  188. package/src/MultiplicityField/add-objects.tsx +1 -1
  189. package/src/MultiplicityField/index.tsx +3 -1
  190. package/src/MultiplicityField/types.ts +1 -0
  191. package/src/Questions/Questions.stories.js +3 -0
  192. package/src/Questions/__stories__/Default.tsx +1 -1
  193. package/src/inputs/AutoCompleteInput/AutoComplete.stories.js +3 -0
  194. package/src/inputs/AutoCompleteInput/__stories__/Default.tsx +1 -1
  195. package/src/inputs/AutoCompleteInput/__stories__/Multiple.tsx +1 -1
  196. package/src/inputs/Checkboxes/Checkboxes.stories.js +3 -0
  197. package/src/inputs/Checkboxes/__stories__/Conditional.tsx +1 -1
  198. package/src/inputs/Checkboxes/__stories__/Default.tsx +1 -1
  199. package/src/inputs/Checkboxes/__stories__/WithDivider.tsx +1 -1
  200. package/src/inputs/Checkboxes/index.tsx +4 -5
  201. package/src/inputs/DateInput/DateInput.stories.js +7 -0
  202. package/src/inputs/DateInput/__stories__/Default.tsx +1 -1
  203. package/src/inputs/DateInput/__stories__/WithDefaultValue.tsx +26 -0
  204. package/src/inputs/DateInput/__stories__/WithInitialValue.tsx +28 -0
  205. package/src/inputs/DateInput/__stories__/WithWrongDefaultValue.tsx +26 -0
  206. package/src/inputs/DateInput/__stories__/WithWrongInitialValue.tsx +28 -0
  207. package/src/inputs/DateInput/index.test.tsx +16 -0
  208. package/src/inputs/DateInput/index.tsx +31 -13
  209. package/src/inputs/DateTimeInput/DateTimeInput.stories.js +12 -6
  210. package/src/inputs/DateTimeInput/__stories__/Default.tsx +1 -1
  211. package/src/inputs/DateTimeInput/__stories__/WithDefaultValue.tsx +26 -0
  212. package/src/inputs/DateTimeInput/__stories__/WithInitialValue.tsx +28 -0
  213. package/src/inputs/DateTimeInput/__stories__/WithWrongDefaultValue.tsx +26 -0
  214. package/src/inputs/DateTimeInput/__stories__/WithWrongInitialValue.tsx +28 -0
  215. package/src/inputs/DateTimeInput/index.test.tsx +16 -0
  216. package/src/inputs/DateTimeInput/index.tsx +59 -35
  217. package/src/inputs/FileInput/FileInput.stories.js +3 -0
  218. package/src/inputs/FileInput/__stories__/Default.tsx +1 -1
  219. package/src/inputs/FileInput/index.tsx +72 -39
  220. package/src/inputs/ImageInput/ImageInput.stories.js +5 -1
  221. package/src/inputs/ImageInput/__stories__/Default.tsx +1 -1
  222. package/src/inputs/ImageInput/__stories__/MaxSize.tsx +3 -2
  223. package/src/inputs/ImageInput/__stories__/WithInitialValues.tsx +45 -0
  224. package/src/inputs/ImageInput/__stories__/WithInvalidImageDimension.tsx +1 -1
  225. package/src/inputs/ImageInput/__stories__/logo.d.ts +4 -0
  226. package/src/inputs/ImageInput/__stories__/logo.png +0 -0
  227. package/src/inputs/ImageInput/index.test.tsx +4 -0
  228. package/src/inputs/ImageInput/index.tsx +100 -48
  229. package/src/inputs/Input/Input.stories.js +4 -0
  230. package/src/inputs/Input/__stories__/AFM.tsx +1 -1
  231. package/src/inputs/Input/__stories__/Boolean.tsx +1 -1
  232. package/src/inputs/Input/__stories__/Email.tsx +23 -0
  233. package/src/inputs/Input/__stories__/IBAN.tsx +1 -1
  234. package/src/inputs/Input/__stories__/Integer.tsx +1 -1
  235. package/src/inputs/Input/__stories__/LandlineNumber.tsx +1 -1
  236. package/src/inputs/Input/__stories__/MobilePhone.tsx +1 -1
  237. package/src/inputs/Input/__stories__/PhoneNumber.tsx +1 -1
  238. package/src/inputs/Input/__stories__/PostalCode.tsx +1 -1
  239. package/src/inputs/Input/__stories__/String.tsx +1 -1
  240. package/src/inputs/Input/__stories__/StringWithTrimValidation.tsx +1 -1
  241. package/src/inputs/Input/__stories__/TextWithLimit.tsx +1 -1
  242. package/src/inputs/Input/index.test.tsx +8 -0
  243. package/src/inputs/Input/index.tsx +1 -0
  244. package/src/inputs/Label/Label.stories.js +3 -0
  245. package/src/inputs/Label/__stories__/Default.tsx +1 -1
  246. package/src/inputs/OtpInput/OtpInput.stories.js +3 -0
  247. package/src/inputs/OtpInput/__stories__/Default.tsx +1 -1
  248. package/src/inputs/Radio/Radio.stories.js +3 -0
  249. package/src/inputs/Radio/__stories__/Conditional.tsx +1 -1
  250. package/src/inputs/Radio/__stories__/Default.tsx +1 -1
  251. package/src/inputs/Radio/__stories__/WithDivider.tsx +1 -1
  252. package/src/inputs/Select/Select.stories.js +3 -0
  253. package/src/inputs/Select/__stories__/Default.tsx +1 -1
  254. package/src/lazy.js +1 -1
  255. package/src/registry.js +4 -6
  256. package/src/validators/index.ts +13 -13
  257. package/src/validators/utils/date.ts +23 -4
  258. package/src/validators/utils/datetime.ts +116 -29
  259. package/validators/index.js +8 -10
  260. package/validators/index.js.map +2 -2
  261. package/validators/utils/date/index.js +21 -3
  262. package/validators/utils/date.d.ts +1 -1
  263. package/validators/utils/date.js.map +2 -2
  264. package/validators/utils/datetime/index.js +113 -24
  265. package/validators/utils/datetime.d.ts +1 -1
  266. package/validators/utils/datetime.js.map +2 -2
  267. package/cjs/inputs/Input/inputsInputScenarios/index.js +0 -439
  268. package/cjs/inputs/Input/inputsInputScenarios.js.map +0 -7
  269. package/inputs/Input/inputsInputScenarios/index.js +0 -406
  270. package/inputs/Input/inputsInputScenarios.d.ts +0 -57
  271. package/inputs/Input/inputsInputScenarios.js.map +0 -7
  272. package/src/inputs/Input/inputsInputScenarios.ts +0 -404
@@ -1,4 +1,5 @@
1
- import React, { useEffect, useState } from 'react';
1
+ import React, { ComponentRef, useCallback, useEffect, useState } from 'react';
2
+ import { UseFormReturn, useWatch } from 'react-hook-form';
2
3
  import { UncontrolledFieldProps } from '@digigov/form/Field/types';
3
4
  import { Button, ButtonProps } from '@digigov/ui/form/Button';
4
5
  import {
@@ -10,6 +11,7 @@ import {
10
11
  import { useTranslation } from '@digigov/ui/i18n';
11
12
  import { Hint } from '@digigov/ui/typography/Hint';
12
13
  import { Paragraph } from '@digigov/ui/typography/Paragraph';
14
+
13
15
  export interface FileInputProps extends Omit<UncontrolledFieldProps, 'extra'> {
14
16
  extra?: {
15
17
  className?: string;
@@ -29,32 +31,72 @@ export interface FileInputProps extends Omit<UncontrolledFieldProps, 'extra'> {
29
31
  resetFile?: string;
30
32
  };
31
33
  };
34
+ reset: (values?: FileList) => void;
35
+ resetField: UseFormReturn['resetField'];
36
+ onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
32
37
  }
33
38
 
34
- export const FileInput: React.FC<any> = React.forwardRef(function FileInput(
35
- { name, disabled, resetField, extra, onChange, value, ...props },
36
- ref: any
39
+ export const FileInput = React.forwardRef<
40
+ ComponentRef<typeof FileUpload>,
41
+ FileInputProps
42
+ >(function FileInput(
43
+ {
44
+ name,
45
+ disabled,
46
+ resetField,
47
+ extra,
48
+ control,
49
+ onChange,
50
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
51
+ Field,
52
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
53
+ reset,
54
+ ...props
55
+ },
56
+ ref
37
57
  ) {
38
- delete props.Field;
39
58
  const { t } = useTranslation();
59
+ const value: FileList = useWatch({ control, name });
40
60
 
41
- const [files, setFiles] = useState<string[] | undefined>(
42
- Object.values(value || {})?.map?.(({ name }) => name) || []
61
+ const [filenames, setFilenames] = useState<string[] | undefined>(
62
+ Object.values(value || {}).map(({ name }) => name) || []
43
63
  );
64
+
44
65
  useEffect(() => {
45
- setFiles(Object.values(value || {})?.map?.(({ name }) => name));
66
+ setFilenames(Object.values(value || {}).map(({ name }) => name));
46
67
  }, [value]);
47
68
 
69
+ const handleChange = useCallback(
70
+ (event: React.ChangeEvent<HTMLInputElement>) => {
71
+ event.preventDefault();
72
+ const target = event.target;
73
+ if (target.files && target.files.length > 0) {
74
+ setFilenames(Object.values(target.files).map(({ name }) => name));
75
+ }
76
+ onChange(event);
77
+ },
78
+ [onChange]
79
+ );
80
+
81
+ const handleReset = useCallback(
82
+ (event: React.MouseEvent<HTMLButtonElement>) => {
83
+ event.preventDefault();
84
+ resetField(name);
85
+ setFilenames(undefined);
86
+ },
87
+ [name, resetField]
88
+ );
89
+
48
90
  return (
49
91
  <>
50
92
  <FileUploadContainer
51
93
  variant={extra?.containerProps?.variant || 'default'}
52
- hasFiles={files && files.length > 0}
94
+ hasFiles={filenames && filenames.length > 0}
53
95
  >
54
- {files?.length ? (
96
+ {filenames?.length ? (
55
97
  <>
56
98
  <Paragraph>
57
- <b>{t('upload.file')}:</b> {`${files.join(', ')}`}
99
+ <b>{t('upload.file')}:</b> {`${filenames.join(', ')}`}
58
100
  </Paragraph>
59
101
  </>
60
102
  ) : (
@@ -68,40 +110,31 @@ export const FileInput: React.FC<any> = React.forwardRef(function FileInput(
68
110
  )}
69
111
  <FileUpload
70
112
  ref={ref}
71
- hasFiles={!!files?.length}
113
+ hasFiles={!!filenames?.length}
72
114
  name={name}
73
115
  variant={extra?.uploadButtonProps?.variant}
74
116
  disabled={disabled}
75
117
  id={name}
76
- value={value?.filename}
77
- onChange={(event) => {
78
- if (event?.target?.files && event?.target?.files.length > 0) {
79
- onChange(event.target.files);
80
- }
81
- }}
82
- {...{
83
- ...props,
84
- required: undefined,
85
- error: undefined,
86
- }}
118
+ onChange={handleChange}
119
+ {...{ ...props, required: undefined }}
87
120
  >
88
- {files?.length ? t('upload.change_file') : t('upload.choose_file')}
121
+ {filenames?.length
122
+ ? t('upload.change_file')
123
+ : t('upload.choose_file')}
89
124
  </FileUpload>
90
- {files !== undefined && files?.length > 0 && !extra?.noResetButton && (
91
- <>
92
- <Button
93
- variant={extra?.resetButtonProps?.variant || 'link'}
94
- onClick={(event) => {
95
- event.preventDefault();
96
- resetField(name);
97
- setFiles(undefined);
98
- }}
99
- color={extra?.resetButtonProps?.color || 'secondary'}
100
- >
101
- {t('upload.reset_file')}
102
- </Button>
103
- </>
104
- )}
125
+ {filenames !== undefined &&
126
+ filenames?.length > 0 &&
127
+ !extra?.noResetButton && (
128
+ <>
129
+ <Button
130
+ variant={extra?.resetButtonProps?.variant || 'link'}
131
+ onClick={handleReset}
132
+ color={extra?.resetButtonProps?.color || 'secondary'}
133
+ >
134
+ {t('upload.reset_file')}
135
+ </Button>
136
+ </>
137
+ )}
105
138
  </FileUploadContainer>
106
139
  </>
107
140
  );
@@ -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) => {
@@ -0,0 +1,45 @@
1
+ import React from 'react';
2
+ import FormBuilder, { Field, Fieldset } from '@digigov/form';
3
+ import logo from '@digigov/form/inputs/ImageInput/__stories__/logo.png';
4
+ import { FieldSpec } from '@digigov/form/types';
5
+ import { Button } from '@digigov/ui/form/Button';
6
+ const FIELDS: FieldSpec[] = [
7
+ {
8
+ key: 'image',
9
+ type: 'image',
10
+ required: true,
11
+ label: {
12
+ primary: 'Ανέβασμα φωτογραφίας',
13
+ secondary:
14
+ 'Οι επιτρεπόμενες διαστάσεις είναι για το ύψος από 100 μέχρι 400 και για το πλάτος από 100 μέχρι 400.',
15
+ },
16
+ extra: {
17
+ limit: {
18
+ maxHeight: 400,
19
+ maxWidth: 400,
20
+ minHeight: 100,
21
+ minWidth: 100,
22
+ },
23
+ },
24
+ },
25
+ ];
26
+
27
+ export const WithInitialValues = (_: any) => (
28
+ <FormBuilder
29
+ fields={FIELDS}
30
+ initial={{
31
+ image: { src: logo, filename: 'logo.png' },
32
+ }}
33
+ onSubmit={(data) => {
34
+ console.log(data);
35
+ }}
36
+ >
37
+ <Fieldset>
38
+ {FIELDS.map((field) => (
39
+ <Field key={field.key} name={field.key} />
40
+ ))}
41
+ </Fieldset>
42
+ <Button type="submit">Συνέχεια</Button>
43
+ </FormBuilder>
44
+ );
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,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/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
8
 
8
9
  test('renders the All ImageInput variants', async ({ mount, page }) => {
@@ -15,6 +16,9 @@ test('renders the All ImageInput variants', async ({ mount, page }) => {
15
16
  <TestVariant title="MaxSize">
16
17
  <MaxSize />
17
18
  </TestVariant>
19
+ <TestVariant title="WithInitialValues">
20
+ <WithInitialValues />
21
+ </TestVariant>
18
22
  <TestVariant title="WithInvalidImageDimension">
19
23
  <WithInvalidImageDimension />
20
24
  </TestVariant>
@@ -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';
@@ -14,5 +17,6 @@ export { MobilePhone } from '@digigov/form/inputs/Input/__stories__/MobilePhone'
14
17
  export { AFM } from '@digigov/form/inputs/Input/__stories__/AFM';
15
18
  export { AMKA } from '@digigov/form/inputs/Input/__stories__/AMKA';
16
19
  export { IBAN } from '@digigov/form/inputs/Input/__stories__/IBAN';
20
+ export { Email } from '@digigov/form/inputs/Input/__stories__/Email';
17
21
  export { PostalCode } from '@digigov/form/inputs/Input/__stories__/PostalCode';
18
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);
@@ -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);
@@ -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 PostalCode = () => (
5
+ export const PostalCode = (_: 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 String = () => (
5
+ export const String = (_: 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 StringWithTrimValidation = () => (
5
+ export const StringWithTrimValidation = (_: 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';
4
4
 
5
- export const TextWithLimit = () => (
5
+ export const TextWithLimit = (_: any) => (
6
6
  <FormBuilder
7
7
  onSubmit={(data) => {
8
8
  console.log(data);