@digigov/form 2.0.0-85c27c19 → 2.0.0-aefd0709

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 (314) hide show
  1. package/Field/FieldBase/index.js +1 -0
  2. package/Field/FieldBase.js.map +2 -2
  3. package/Field/FieldBaseContainer/index.js +2 -2
  4. package/Field/FieldBaseContainer.js.map +2 -2
  5. package/Field/FieldConditional/index.js +7 -3
  6. package/Field/FieldConditional.js.map +2 -2
  7. package/Field/index.js +5 -2
  8. package/Field/index.js.map +2 -2
  9. package/Field/types.d.ts +10 -8
  10. package/Field/utils/index.d.ts +1 -0
  11. package/Field/utils/index.js +18 -1
  12. package/Field/utils/index.js.map +2 -2
  13. package/FieldArray/index.d.ts +1 -0
  14. package/FieldArray/index.js +7 -6
  15. package/FieldArray/index.js.map +2 -2
  16. package/FieldObject/index.d.ts +2 -0
  17. package/FieldObject/index.js +9 -5
  18. package/FieldObject/index.js.map +2 -2
  19. package/Fieldset/index.d.ts +1 -1
  20. package/Fieldset/index.js +5 -5
  21. package/Fieldset/index.js.map +2 -2
  22. package/Fieldset/types.d.ts +2 -3
  23. package/FormBuilder/index.d.ts +8 -2
  24. package/FormBuilder/index.js +150 -6
  25. package/FormBuilder/index.js.map +3 -3
  26. package/FormContext.js.map +2 -2
  27. package/MultiplicityField/add-objects/index.js +11 -7
  28. package/MultiplicityField/add-objects.js.map +2 -2
  29. package/MultiplicityField/index.js +16 -12
  30. package/MultiplicityField/index.js.map +2 -2
  31. package/MultiplicityField/types.d.ts +1 -2
  32. package/Questions/Questions/index.js +5 -4
  33. package/Questions/Questions.js.map +2 -2
  34. package/Questions/QuestionsContext.d.ts +0 -1
  35. package/Questions/Step/StepArrayReview.js.map +2 -2
  36. package/Questions/Step/StepContext.d.ts +0 -1
  37. package/Questions/Step/StepTitle/index.js +4 -3
  38. package/Questions/Step/StepTitle.d.ts +1 -1
  39. package/Questions/Step/StepTitle.js.map +2 -2
  40. package/Questions/Step/types.d.ts +0 -1
  41. package/Questions/types.d.ts +0 -1
  42. package/cjs/Field/FieldBase/index.js +1 -0
  43. package/cjs/Field/FieldBase.js.map +2 -2
  44. package/cjs/Field/FieldBaseContainer/index.js +4 -4
  45. package/cjs/Field/FieldBaseContainer.js.map +3 -3
  46. package/cjs/Field/FieldConditional/index.js +7 -3
  47. package/cjs/Field/FieldConditional.js.map +2 -2
  48. package/cjs/Field/index.js +5 -2
  49. package/cjs/Field/index.js.map +2 -2
  50. package/cjs/Field/types.js.map +1 -1
  51. package/cjs/Field/utils/index.js +18 -0
  52. package/cjs/Field/utils/index.js.map +2 -2
  53. package/cjs/FieldArray/index.js +8 -7
  54. package/cjs/FieldArray/index.js.map +3 -3
  55. package/cjs/FieldObject/index.js +10 -6
  56. package/cjs/FieldObject/index.js.map +3 -3
  57. package/cjs/Fieldset/index.js +10 -10
  58. package/cjs/Fieldset/index.js.map +3 -3
  59. package/cjs/Fieldset/types.js.map +1 -1
  60. package/cjs/FormBuilder/index.js +165 -5
  61. package/cjs/FormBuilder/index.js.map +3 -3
  62. package/cjs/FormContext/index.js +2 -2
  63. package/cjs/FormContext.js.map +3 -3
  64. package/cjs/MultiplicityField/add-objects/index.js +15 -11
  65. package/cjs/MultiplicityField/add-objects.js.map +3 -3
  66. package/cjs/MultiplicityField/index.js +15 -16
  67. package/cjs/MultiplicityField/index.js.map +3 -3
  68. package/cjs/MultiplicityField/types.js.map +1 -1
  69. package/cjs/Questions/Questions/index.js +5 -4
  70. package/cjs/Questions/Questions.js.map +2 -2
  71. package/cjs/Questions/Step/StepArrayReview.js.map +2 -2
  72. package/cjs/Questions/Step/StepTitle/index.js +5 -5
  73. package/cjs/Questions/Step/StepTitle.js.map +3 -3
  74. package/cjs/index.js +11 -155
  75. package/cjs/index.js.map +4 -4
  76. package/cjs/inputs/AutoCompleteInput/__stories__/Default/index.js +1 -7
  77. package/cjs/inputs/AutoCompleteInput/__stories__/Default.js.map +2 -2
  78. package/cjs/inputs/AutoCompleteInput/__stories__/Multiple/index.js +1 -8
  79. package/cjs/inputs/AutoCompleteInput/__stories__/Multiple.js.map +2 -2
  80. package/cjs/inputs/AutoCompleteInput/index.js +10 -8
  81. package/cjs/inputs/AutoCompleteInput/index.js.map +3 -3
  82. package/cjs/inputs/Checkboxes/index.js +7 -9
  83. package/cjs/inputs/Checkboxes/index.js.map +3 -3
  84. package/cjs/inputs/DateInput/__stories__/Default/index.js +3 -8
  85. package/cjs/inputs/DateInput/__stories__/Default.js.map +2 -2
  86. package/cjs/inputs/DateInput/index.js +4 -5
  87. package/cjs/inputs/DateInput/index.js.map +3 -3
  88. package/cjs/inputs/FileInput/index.js +8 -9
  89. package/cjs/inputs/FileInput/index.js.map +3 -3
  90. package/cjs/inputs/ImageInput/ImageInput.stories/index.js +4 -4
  91. package/cjs/inputs/ImageInput/ImageInput.stories.js.map +2 -2
  92. package/cjs/inputs/ImageInput/__stories__/MaxSize/index.js +69 -0
  93. package/cjs/inputs/ImageInput/__stories__/MaxSize.js.map +7 -0
  94. package/cjs/inputs/ImageInput/__stories__/WithInvalidImageDimension/index.js +2 -1
  95. package/cjs/inputs/ImageInput/__stories__/WithInvalidImageDimension.js.map +2 -2
  96. package/cjs/inputs/ImageInput/index.js +9 -9
  97. package/cjs/inputs/ImageInput/index.js.map +3 -3
  98. package/cjs/inputs/Input/__stories__/LandlineNumber/index.js +1 -0
  99. package/cjs/inputs/Input/__stories__/LandlineNumber.js.map +2 -2
  100. package/cjs/inputs/Input/__stories__/MobilePhone/index.js +1 -0
  101. package/cjs/inputs/Input/__stories__/MobilePhone.js.map +2 -2
  102. package/cjs/inputs/Input/__stories__/PhoneNumber/index.js +1 -0
  103. package/cjs/inputs/Input/__stories__/PhoneNumber.js.map +2 -2
  104. package/cjs/inputs/Input/__stories__/PostalCode/index.js +1 -0
  105. package/cjs/inputs/Input/__stories__/PostalCode.js.map +2 -2
  106. package/cjs/inputs/Input/index.js +19 -6
  107. package/cjs/inputs/Input/index.js.map +3 -3
  108. package/cjs/inputs/Input/inputsInputScenarios.js.map +2 -2
  109. package/cjs/inputs/Label/index.js +3 -3
  110. package/cjs/inputs/Label/index.js.map +3 -3
  111. package/cjs/inputs/OtpInput/index.js.map +2 -2
  112. package/cjs/inputs/Radio/__stories__/Conditional.js.map +2 -2
  113. package/cjs/inputs/Radio/index.js +56 -10
  114. package/cjs/inputs/Radio/index.js.map +3 -3
  115. package/cjs/inputs/Select/index.js +3 -4
  116. package/cjs/inputs/Select/index.js.map +3 -3
  117. package/cjs/inputs/inputsScenarios/index.js +4 -11
  118. package/cjs/inputs/inputsScenarios.js.map +2 -2
  119. package/cjs/lazy/index.js +320 -59
  120. package/cjs/lazy.js.map +2 -2
  121. package/cjs/locales/el.js.map +1 -1
  122. package/cjs/registry/index.js +118 -38
  123. package/cjs/registry.js.map +2 -2
  124. package/cjs/types.js.map +1 -1
  125. package/cjs/utils/index.js +2 -1
  126. package/cjs/utils.js.map +2 -2
  127. package/cjs/validators/index.js +16 -66
  128. package/cjs/validators/index.js.map +3 -3
  129. package/cjs/validators/utils/date/index.js +138 -0
  130. package/cjs/validators/utils/date.js.map +7 -0
  131. package/cjs/validators/utils/file/index.js +1 -1
  132. package/cjs/validators/utils/file.js.map +2 -2
  133. package/cjs/validators/utils/index.js +3 -1
  134. package/cjs/validators/utils/index.js.map +2 -2
  135. package/cjs/validators/utils/phone.js.map +2 -2
  136. package/cjs/validators/utils/postal_code.js.map +1 -1
  137. package/cjs/validators/utils/uuid4.js.map +2 -2
  138. package/index.d.ts +5 -8
  139. package/index.js +9 -152
  140. package/index.js.map +4 -4
  141. package/inputs/AutoCompleteInput/__stories__/Default/index.js +1 -7
  142. package/inputs/AutoCompleteInput/__stories__/Default.js.map +2 -2
  143. package/inputs/AutoCompleteInput/__stories__/Multiple/index.js +1 -8
  144. package/inputs/AutoCompleteInput/__stories__/Multiple.js.map +2 -2
  145. package/inputs/AutoCompleteInput/index.d.ts +1 -1
  146. package/inputs/AutoCompleteInput/index.js +12 -8
  147. package/inputs/AutoCompleteInput/index.js.map +2 -2
  148. package/inputs/Checkboxes/index.d.ts +1 -1
  149. package/inputs/Checkboxes/index.js +8 -6
  150. package/inputs/Checkboxes/index.js.map +2 -2
  151. package/inputs/DateInput/__stories__/Default/index.js +3 -8
  152. package/inputs/DateInput/__stories__/Default.js.map +2 -2
  153. package/inputs/DateInput/index.d.ts +1 -2
  154. package/inputs/DateInput/index.js +6 -4
  155. package/inputs/DateInput/index.js.map +2 -2
  156. package/inputs/FileInput/index.js +6 -7
  157. package/inputs/FileInput/index.js.map +2 -2
  158. package/inputs/ImageInput/ImageInput.stories/index.js +2 -2
  159. package/inputs/ImageInput/ImageInput.stories.d.ts +1 -1
  160. package/inputs/ImageInput/ImageInput.stories.js.map +2 -2
  161. package/inputs/ImageInput/__stories__/MaxSize/index.js +36 -0
  162. package/inputs/ImageInput/__stories__/MaxSize/package.json +6 -0
  163. package/inputs/ImageInput/__stories__/MaxSize.d.ts +3 -0
  164. package/inputs/ImageInput/__stories__/MaxSize.js.map +7 -0
  165. package/inputs/ImageInput/__stories__/WithInvalidImageDimension/index.js +2 -1
  166. package/inputs/ImageInput/__stories__/WithInvalidImageDimension.js.map +2 -2
  167. package/inputs/ImageInput/index.js +8 -8
  168. package/inputs/ImageInput/index.js.map +2 -2
  169. package/inputs/Input/__stories__/LandlineNumber/index.js +1 -0
  170. package/inputs/Input/__stories__/LandlineNumber.js.map +2 -2
  171. package/inputs/Input/__stories__/MobilePhone/index.js +1 -0
  172. package/inputs/Input/__stories__/MobilePhone.js.map +2 -2
  173. package/inputs/Input/__stories__/PhoneNumber/index.js +1 -0
  174. package/inputs/Input/__stories__/PhoneNumber.js.map +2 -2
  175. package/inputs/Input/__stories__/PostalCode/index.js +1 -0
  176. package/inputs/Input/__stories__/PostalCode.js.map +2 -2
  177. package/inputs/Input/index.js +17 -4
  178. package/inputs/Input/index.js.map +3 -3
  179. package/inputs/Input/inputsInputScenarios.js.map +2 -2
  180. package/inputs/Label/index.d.ts +0 -2
  181. package/inputs/Label/index.js +2 -2
  182. package/inputs/Label/index.js.map +2 -2
  183. package/inputs/OtpInput/index.js.map +2 -2
  184. package/inputs/Radio/__stories__/Conditional.js.map +2 -2
  185. package/inputs/Radio/index.d.ts +5 -1
  186. package/inputs/Radio/index.js +57 -8
  187. package/inputs/Radio/index.js.map +2 -2
  188. package/inputs/Select/index.d.ts +1 -1
  189. package/inputs/Select/index.js +4 -2
  190. package/inputs/Select/index.js.map +2 -2
  191. package/inputs/inputsScenarios/index.js +4 -11
  192. package/inputs/inputsScenarios.d.ts +0 -42
  193. package/inputs/inputsScenarios.js.map +2 -2
  194. package/lazy/index.js +320 -59
  195. package/lazy.d.ts +17 -10
  196. package/lazy.js.map +2 -2
  197. package/locales/el.js.map +1 -1
  198. package/package.json +4 -4
  199. package/registry/index.js +118 -38
  200. package/registry.d.ts +1 -0
  201. package/registry.js.map +2 -2
  202. package/src/Field/FieldBase.tsx +1 -0
  203. package/src/Field/FieldBaseContainer.tsx +2 -2
  204. package/src/Field/FieldConditional.tsx +4 -0
  205. package/src/Field/index.tsx +4 -1
  206. package/src/Field/types.tsx +10 -8
  207. package/src/Field/utils/index.ts +18 -1
  208. package/src/FieldArray/index.test.tsx +14 -13
  209. package/src/FieldArray/index.tsx +9 -6
  210. package/src/FieldObject/index.tsx +8 -2
  211. package/src/Fieldset/index.tsx +5 -5
  212. package/src/Fieldset/types.tsx +2 -2
  213. package/src/FormBuilder/{FormBuilder.mdx → doc.mdx} +20 -33
  214. package/src/FormBuilder/index.test.tsx +11 -10
  215. package/src/FormBuilder/index.tsx +178 -7
  216. package/src/FormBuilder/scenarios.test.tsx +2 -2
  217. package/src/FormContext.tsx +1 -2
  218. package/src/MultiplicityField/add-objects.tsx +10 -8
  219. package/src/MultiplicityField/{MultiplicityField.mdx → doc.mdx} +12 -16
  220. package/src/MultiplicityField/index.test.tsx +26 -25
  221. package/src/MultiplicityField/index.tsx +15 -12
  222. package/src/MultiplicityField/types.ts +1 -2
  223. package/src/Questions/Questions.tsx +4 -4
  224. package/src/Questions/Step/StepArrayReview.tsx +1 -1
  225. package/src/Questions/Step/StepTitle.tsx +4 -3
  226. package/src/Questions/__snapshots__/index.spec.tsx.snap +8 -4
  227. package/src/Questions/{index.mdx → doc.mdx} +9 -12
  228. package/src/Questions/index.spec.tsx +6 -2
  229. package/src/Questions/index.test.tsx +11 -10
  230. package/src/create-simple-form.mdx +2 -6
  231. package/src/{index.mdx → doc.mdx} +4 -8
  232. package/src/index.ts +6 -0
  233. package/src/inputs/AutoCompleteInput/__stories__/Default.tsx +2 -10
  234. package/src/inputs/AutoCompleteInput/__stories__/Multiple.tsx +1 -8
  235. package/src/inputs/AutoCompleteInput/{index.mdx → doc.mdx} +2 -13
  236. package/src/inputs/AutoCompleteInput/index.test.tsx +14 -13
  237. package/src/inputs/AutoCompleteInput/index.tsx +36 -31
  238. package/src/inputs/Checkboxes/{index.mdx → doc.mdx} +5 -15
  239. package/src/inputs/Checkboxes/index.test.tsx +17 -16
  240. package/src/inputs/Checkboxes/index.tsx +10 -8
  241. package/src/inputs/DateInput/__stories__/Default.tsx +7 -12
  242. package/src/inputs/DateInput/{index.mdx → doc.mdx} +1 -8
  243. package/src/inputs/DateInput/index.test.tsx +11 -10
  244. package/src/inputs/DateInput/index.tsx +6 -4
  245. package/src/inputs/FileInput/{index.mdx → doc.mdx} +1 -5
  246. package/src/inputs/FileInput/index.test.tsx +11 -10
  247. package/src/inputs/FileInput/index.tsx +7 -8
  248. package/src/inputs/ImageInput/ImageInput.stories.js +1 -1
  249. package/src/inputs/ImageInput/__stories__/MaxSize.tsx +37 -0
  250. package/src/inputs/ImageInput/__stories__/WithInvalidImageDimension.tsx +2 -0
  251. package/src/inputs/ImageInput/doc.mdx +23 -0
  252. package/src/inputs/ImageInput/index.test.tsx +21 -16
  253. package/src/inputs/ImageInput/index.tsx +10 -15
  254. package/src/inputs/Input/__stories__/LandlineNumber.tsx +2 -1
  255. package/src/inputs/Input/__stories__/MobilePhone.tsx +1 -0
  256. package/src/inputs/Input/__stories__/PhoneNumber.tsx +1 -0
  257. package/src/inputs/Input/__stories__/PostalCode.tsx +1 -0
  258. package/src/inputs/Input/doc.mdx +56 -0
  259. package/src/inputs/Input/index.test.tsx +38 -37
  260. package/src/inputs/Input/index.tsx +32 -29
  261. package/src/inputs/Input/inputsInputScenarios.ts +244 -245
  262. package/src/inputs/Label/doc.mdx +14 -0
  263. package/src/inputs/Label/index.test.tsx +11 -10
  264. package/src/inputs/Label/index.tsx +2 -6
  265. package/src/inputs/OtpInput/{index.mdx → doc.mdx} +1 -8
  266. package/src/inputs/OtpInput/index.test.tsx +11 -10
  267. package/src/inputs/OtpInput/index.tsx +2 -1
  268. package/src/inputs/Radio/__stories__/Conditional.tsx +2 -1
  269. package/src/inputs/Radio/{index.mdx → doc.mdx} +5 -15
  270. package/src/inputs/Radio/index.test.tsx +17 -16
  271. package/src/inputs/Radio/index.tsx +76 -10
  272. package/src/inputs/Select/{index.mdx → doc.mdx} +1 -5
  273. package/src/inputs/Select/index.test.tsx +11 -10
  274. package/src/inputs/Select/index.tsx +5 -3
  275. package/src/inputs/inputsScenarios.ts +174 -181
  276. package/src/installation.mdx +2 -5
  277. package/src/lazy.js +322 -62
  278. package/src/locales/el.ts +1 -1
  279. package/src/registry.js +121 -45
  280. package/src/types.tsx +3 -2
  281. package/src/utils.ts +2 -2
  282. package/src/validators/index.ts +33 -71
  283. package/src/validators/utils/date.ts +107 -0
  284. package/src/validators/utils/file.ts +5 -3
  285. package/src/validators/utils/index.ts +1 -0
  286. package/src/validators/utils/phone.ts +1 -1
  287. package/src/validators/utils/postal_code.ts +1 -1
  288. package/src/validators/utils/uuid4.ts +2 -1
  289. package/src/validators/validators.spec.ts +3 -3
  290. package/types.d.ts +3 -3
  291. package/types.js.map +1 -1
  292. package/utils/index.js +2 -1
  293. package/utils.js.map +2 -2
  294. package/validators/index.js +20 -67
  295. package/validators/index.js.map +2 -2
  296. package/validators/utils/date/index.js +103 -0
  297. package/validators/utils/date/package.json +6 -0
  298. package/validators/utils/date.d.ts +9 -0
  299. package/validators/utils/date.js.map +7 -0
  300. package/validators/utils/file/index.js +1 -1
  301. package/validators/utils/file.js.map +2 -2
  302. package/validators/utils/index.d.ts +1 -0
  303. package/validators/utils/index.js +1 -0
  304. package/validators/utils/index.js.map +2 -2
  305. package/validators/utils/phone.d.ts +1 -1
  306. package/validators/utils/phone.js.map +2 -2
  307. package/validators/utils/postal_code.d.ts +1 -1
  308. package/validators/utils/postal_code.js.map +1 -1
  309. package/validators/utils/uuid4.js.map +2 -2
  310. package/src/index.tsx +0 -178
  311. package/src/inputs/ImageInput/index.mdx +0 -19
  312. package/src/inputs/Input/index.mdx +0 -95
  313. package/src/inputs/Label/index.mdx +0 -0
  314. /package/src/Field/{index.mdx → doc.mdx} +0 -0
@@ -56,6 +56,7 @@ export const Field: React.FC<FieldProps> = ({
56
56
  register={register}
57
57
  field={calculatedField as FieldWithCondition}
58
58
  error={error}
59
+ Field={Field}
59
60
  />
60
61
  );
61
62
  }
@@ -67,6 +68,7 @@ export const Field: React.FC<FieldProps> = ({
67
68
  register={register}
68
69
  error={error}
69
70
  formState={formState}
71
+ Field={Field}
70
72
  {...calculatedField}
71
73
  />
72
74
  );
@@ -87,6 +89,7 @@ export const Field: React.FC<FieldProps> = ({
87
89
  setValue={setValue}
88
90
  getValues={getValues}
89
91
  unregister={unregister}
92
+ Field={Field}
90
93
  {...calculatedField}
91
94
  />
92
95
  );
@@ -100,7 +103,7 @@ export const Field: React.FC<FieldProps> = ({
100
103
  register={register}
101
104
  reset={reset}
102
105
  error={error}
103
- fieldComponent={Field}
106
+ Field={Field}
104
107
  />
105
108
  );
106
109
  };
@@ -3,10 +3,10 @@ import { ErrorOption, UseFormReturn, UseFormProps } from 'react-hook-form';
3
3
  import { ValidatorSchema } from '@digigov/form/validators/types';
4
4
  import { GridProps } from '@digigov/ui/layouts/Grid';
5
5
 
6
- export type FieldLabelProps = {
6
+ export interface FieldLabelProps {
7
7
  primary?: string;
8
8
  secondary?: string;
9
- };
9
+ }
10
10
 
11
11
  export interface FieldSpec {
12
12
  key: string; // !TODO rename key to name;
@@ -31,13 +31,12 @@ export interface FieldSpec {
31
31
  | 'array'
32
32
  | 'object';
33
33
  component?: any;
34
+ autoComplete?: string;
34
35
  maxLength?: number;
35
36
  condition?: Record<string, FieldCondition>;
36
37
  controlled?: boolean;
37
38
  label?: FieldLabelProps;
38
- extra?: {
39
- [key: string]: any;
40
- };
39
+ extra?: Record<string, any>;
41
40
  editable?: boolean;
42
41
  required?: boolean;
43
42
  enabled?: boolean;
@@ -77,14 +76,15 @@ export interface FieldConditionalProps {
77
76
  register: UseFormReturn['register'];
78
77
  reset: UseFormReturn['reset'];
79
78
  error?: ErrorOption;
79
+ Field: React.FC<FieldProps>;
80
80
  }
81
81
 
82
- export type FieldComponentItem = {
82
+ export interface FieldComponentItem {
83
83
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
84
84
  component: any;
85
85
  controlled?: boolean;
86
86
  wrapper?: FieldSpec['wrapper'];
87
- };
87
+ }
88
88
 
89
89
  export interface FieldContainerProps {
90
90
  name?: FieldSpec['key'];
@@ -111,6 +111,7 @@ export interface ControlledFieldProps {
111
111
  error?: boolean;
112
112
  name?: string;
113
113
  disabled?: boolean;
114
+ Field: React.FC<FieldProps>;
114
115
  }
115
116
 
116
117
  export interface UncontrolledFieldProps {
@@ -121,6 +122,7 @@ export interface UncontrolledFieldProps {
121
122
  extra?: Record<string, never>;
122
123
  type?: string;
123
124
  disabled?: boolean;
125
+ Field: React.FC<FieldProps>;
124
126
  }
125
127
 
126
128
  export interface CalculatedField extends OmittedFieldSpec {
@@ -137,7 +139,7 @@ export interface FieldBaseProps extends CalculatedField {
137
139
  control: UseFormReturn['control'];
138
140
  register: UseFormReturn['register'];
139
141
  reset: UseFormReturn['reset'];
140
- fieldComponent?: React.FC<FieldBaseProps>;
142
+ Field: React.FC<FieldProps>;
141
143
  }
142
144
 
143
145
  export interface FieldProps extends FieldSpec {
@@ -6,7 +6,7 @@ import FileInput from '@digigov/form/inputs/FileInput';
6
6
  import ImageInput from '@digigov/form/inputs/ImageInput';
7
7
  import Input from '@digigov/form/inputs/Input';
8
8
  import OtpInput from '@digigov/form/inputs/OtpInput';
9
- import Radio from '@digigov/form/inputs/Radio';
9
+ import Radio, { ControlledRadioButtonsGroup } from '@digigov/form/inputs/Radio';
10
10
  import Select from '@digigov/form/inputs/Select';
11
11
 
12
12
  export const FIELD_COMPONENTS: FieldComponentRegistry = {
@@ -57,3 +57,20 @@ export const ALTERNATIVE_COMPONENTS: FieldComponentRegistry = {
57
57
  wrapper: 'fieldset',
58
58
  },
59
59
  };
60
+
61
+ export const CONTROLLED_FIELD_COMPONENTS: FieldComponentRegistry = {
62
+ ...FIELD_COMPONENTS,
63
+ 'choice:single': {
64
+ wrapper: 'fieldset',
65
+ controlled: true,
66
+ component: ControlledRadioButtonsGroup,
67
+ },
68
+ text: {
69
+ component: Input,
70
+ controlled: true,
71
+ },
72
+ string: {
73
+ component: Input,
74
+ controlled: true,
75
+ },
76
+ };
@@ -1,24 +1,25 @@
1
1
  import React from 'react';
2
2
  import { test, expect } from '@playwright/experimental-ct-react';
3
- import TestVariant from '@digigov/ui/utils/TestVariant'
4
3
  import { Default } from '@digigov/form/FieldArray/__stories__/Default';
5
4
  import { WithExactLength } from '@digigov/form/FieldArray/__stories__/WithExactLength';
5
+ import TestVariant from '@digigov/ui/utils/TestVariant';
6
6
 
7
7
  test('renders the All FieldArray variants', async ({ mount, page }) => {
8
8
  await mount(
9
-
10
- <div>
11
- <TestVariant title="Default">
12
- <Default />
13
- </TestVariant>
14
- <TestVariant title="WithExactLength">
15
- <WithExactLength />
16
- </TestVariant>
17
- </div>
18
- )
9
+ <div>
10
+ <TestVariant title="Default">
11
+ <Default />
12
+ </TestVariant>
13
+ <TestVariant title="WithExactLength">
14
+ <WithExactLength />
15
+ </TestVariant>
16
+ </div>
17
+ );
19
18
  await page.evaluate(() => document.fonts.ready);
20
19
 
21
- const screenshot = await page.screenshot({ fullPage: true, animations: 'disabled' });
20
+ const screenshot = await page.screenshot({
21
+ fullPage: true,
22
+ animations: 'disabled',
23
+ });
22
24
  expect(screenshot).toMatchSnapshot();
23
25
  });
24
-
@@ -1,18 +1,19 @@
1
1
  import React from 'react';
2
2
  import { ErrorOption, useFieldArray, UseFormReturn } from 'react-hook-form';
3
- import FieldContainer from '@digigov/form/Field/FieldBaseContainer';
3
+ import { FieldBaseContainer } from '@digigov/form/Field/FieldBaseContainer';
4
4
  import { FieldProps } from '@digigov/form/Field/types';
5
- import FieldObject from '@digigov/form/FieldObject';
6
- import { FieldsetLabel } from '@digigov/form/Fieldset';
7
- import Fieldset from '@digigov/react-core/Fieldset';
5
+ import { FieldObject } from '@digigov/form/FieldObject';
6
+ import { FieldsetLabel, Fieldset } from '@digigov/form/Fieldset';
8
7
  import { Card } from '@digigov/ui/content/Card';
9
8
  import { Button } from '@digigov/ui/form/Button';
10
9
  import { Hint } from '@digigov/ui/typography/Hint';
10
+
11
11
  export interface FieldArrayProps extends FieldProps {
12
12
  control: UseFormReturn['control'];
13
13
  register: UseFormReturn['register'];
14
14
  formState: UseFormReturn['formState'];
15
15
  error?: ErrorOption;
16
+ Field: React.FC<FieldProps>;
16
17
  }
17
18
  export const FieldArray: React.FC<FieldArrayProps> = ({
18
19
  name,
@@ -22,6 +23,7 @@ export const FieldArray: React.FC<FieldArrayProps> = ({
22
23
  error,
23
24
  layout,
24
25
  label,
26
+ Field,
25
27
  ...customField
26
28
  }) => {
27
29
  const { fields, append, remove } = useFieldArray({
@@ -30,7 +32,7 @@ export const FieldArray: React.FC<FieldArrayProps> = ({
30
32
  });
31
33
 
32
34
  return (
33
- <FieldContainer
35
+ <FieldBaseContainer
34
36
  label={label}
35
37
  layout={layout}
36
38
  error={
@@ -60,6 +62,7 @@ export const FieldArray: React.FC<FieldArrayProps> = ({
60
62
  register={register}
61
63
  control={control}
62
64
  {...customField.extra?.of}
65
+ Field={Field}
63
66
  />
64
67
  <Button
65
68
  name={`${name}-object-remove`}
@@ -84,7 +87,7 @@ export const FieldArray: React.FC<FieldArrayProps> = ({
84
87
  >
85
88
  {customField.extra?.label.object?.add}
86
89
  </Button>
87
- </FieldContainer>
90
+ </FieldBaseContainer>
88
91
  );
89
92
  };
90
93
 
@@ -7,9 +7,9 @@ import {
7
7
  ALTERNATIVE_COMPONENTS,
8
8
  } from '@digigov/form/Field/utils';
9
9
  import { calculateField } from '@digigov/form/Field/utils/calculateField';
10
- import Fieldset, { FieldsetCaption } from '@digigov/form/Fieldset';
10
+ import { Fieldset, FieldsetCaption } from '@digigov/form/Fieldset';
11
11
  import { FieldSpec } from '@digigov/form/types';
12
- import { FieldsetLegend } from '@digigov/react-core/FieldsetLegend';
12
+ import { FieldsetLegend } from '@digigov/ui/form/FieldContainer';
13
13
  import { useTranslation } from '@digigov/ui/i18n';
14
14
 
15
15
  export interface FieldObjectProps extends Omit<FieldProps, 'key'> {
@@ -18,6 +18,7 @@ export interface FieldObjectProps extends Omit<FieldProps, 'key'> {
18
18
  reset: UseFormReturn['reset'];
19
19
  formState: UseFormReturn['formState'];
20
20
  error?: ErrorOption;
21
+ Field: React.FC<FieldProps>;
21
22
  }
22
23
 
23
24
  export const FieldObject: React.FC<FieldObjectProps> = ({
@@ -29,6 +30,7 @@ export const FieldObject: React.FC<FieldObjectProps> = ({
29
30
  reset,
30
31
  formState,
31
32
  error,
33
+ Field,
32
34
  }) => {
33
35
  const { t } = useTranslation();
34
36
 
@@ -50,6 +52,7 @@ export const FieldObject: React.FC<FieldObjectProps> = ({
50
52
  field={field}
51
53
  error={error && error[field.key]}
52
54
  formState={formState}
55
+ Field={Field}
53
56
  />
54
57
  ))}
55
58
  </Fieldset>
@@ -65,6 +68,7 @@ export interface FieldObjectItemProps {
65
68
  formState: UseFormReturn['formState'];
66
69
  error?: ErrorOption;
67
70
  children?: React.ReactNode;
71
+ Field: React.FC<FieldProps>;
68
72
  }
69
73
 
70
74
  const FieldObjectItem: React.FC<FieldObjectItemProps> = ({
@@ -76,6 +80,7 @@ const FieldObjectItem: React.FC<FieldObjectItemProps> = ({
76
80
  formState,
77
81
  reset,
78
82
  register,
83
+ Field,
79
84
  }) => {
80
85
  const calculatedField: CalculatedField = useMemo(
81
86
  () =>
@@ -88,6 +93,7 @@ const FieldObjectItem: React.FC<FieldObjectItemProps> = ({
88
93
  <FieldBase
89
94
  {...calculatedField}
90
95
  name={name}
96
+ Field={Field}
91
97
  control={control}
92
98
  reset={reset}
93
99
  register={register}
@@ -4,11 +4,11 @@ import {
4
4
  FieldsetCaptionProps,
5
5
  FieldsetBodyProps,
6
6
  } from '@digigov/form/Fieldset/types';
7
- import Fieldset from '@digigov/react-core/Fieldset';
8
- import FieldsetLegend from '@digigov/react-core/FieldsetLegend';
9
- import Hint from '@digigov/react-core/Hint';
10
- import Grid from '@digigov/ui/layouts/Grid';
11
- import NormalText from '@digigov/ui/typography/NormalText';
7
+ import { Fieldset } from '@digigov/react-core/Fieldset';
8
+ import { FieldsetLegend } from '@digigov/ui/form/FieldContainer';
9
+ import { Grid } from '@digigov/ui/layouts/Grid';
10
+ import { Hint } from '@digigov/ui/typography/Hint';
11
+ import { NormalText } from '@digigov/ui/typography/NormalText';
12
12
 
13
13
  export const FieldsetLabel: React.FC<FieldsetLabelProps> = ({
14
14
  children,
@@ -1,5 +1,5 @@
1
- import { FieldsetLegendProps } from '@digigov/react-core/FieldsetLegend';
2
- import { HintProps } from '@digigov/react-core/Hint';
1
+ import { FieldsetLegendProps } from '@digigov/ui/form/FieldContainer';
2
+ import { HintProps } from '@digigov/ui/typography/Hint';
3
3
 
4
4
  export interface FieldsetLabelProps extends FieldsetLegendProps {}
5
5
  export interface FieldsetCaptionProps extends HintProps {}
@@ -8,11 +8,8 @@ sidebar_label: FormBuilder
8
8
 
9
9
  `stepForm` component:
10
10
 
11
- <Story
12
- packageName="@digigov/form"
13
- component="FormBuilder"
14
- story="Default.tsx"
15
- />
11
+ <code src="@digigov/form/FormBuilder/__stories__/Default.tsx" />
12
+
16
13
 
17
14
  ### Importing and using FormBuilder Component
18
15
 
@@ -34,18 +31,14 @@ import BasicLayout, {
34
31
  import {FormBuilder} from '@digigov/form';
35
32
 
36
33
  export default function MyComponent({ props }) {
37
-
38
34
  return (
39
35
  <BasicLayout>
40
- .
41
- .
36
+ /* code */
42
37
  <Container>
43
38
  <Main>
44
- .
45
- .
39
+ /* code */
46
40
  <FormBuilder></FormBuilder>
47
- .
48
- .
41
+ /* code */
49
42
  </Main>
50
43
  </Container>
51
44
  <Bottom>
@@ -54,7 +47,6 @@ export default function MyComponent({ props }) {
54
47
  </BasicLayout>
55
48
  );
56
49
  }
57
- }
58
50
  ```
59
51
 
60
52
  ### Props
@@ -83,7 +75,7 @@ Below are demostrated some examples for each type of field
83
75
 
84
76
  The examples above are implemented by using the code below
85
77
 
86
- ```javascript
78
+ ```jsx
87
79
  import React, { useState } from 'react';
88
80
  import BasicLayout, {
89
81
  Top,
@@ -91,7 +83,7 @@ import BasicLayout, {
91
83
  Main,
92
84
  Bottom,
93
85
  } from '@digigov/ui/layouts/Basic';
94
- import Header, { HeaderTitle } from '@digigov/ui/app/Header';
86
+ import Header, { HeaderTitle, HeaderContent, HeaderSection } from '@digigov/ui/app/Header';
95
87
  import GovGRLogo from '@digigov/ui/govgr/GovGRLogo';
96
88
  import GovGRFooter from '@digigov/ui/govgr/Footer';
97
89
  import Button from '@digigov/ui/form/Button';
@@ -99,8 +91,9 @@ import PageTitleContainer, {
99
91
  PageTitleCaption,
100
92
  PageTitleHeading,
101
93
  } from '@digigov/ui/app/PageTitleContainer';
102
- import BackButton from '@digigov/ui/form/Button/BackButton';
103
- import FormBuilder, { Fieldset, FieldsetLabel, Field } from '@digigov/form';
94
+ import BackLink from '@digigov/ui/navigation/BackLink';
95
+ import FormBuilder, { Fieldset, Field } from '@digigov/form';
96
+ import { FieldsetLabel } from '@digigov/form/Fieldset';
104
97
  import { useTranslation } from '@digigov/ui/i18n';
105
98
 
106
99
  const FIELDS = [
@@ -203,30 +196,24 @@ const initialValues = {
203
196
  string: 'default content',
204
197
  };
205
198
 
206
- const useStyles = makeStyles(
207
- {
208
- top: { minHeight: '75px' },
209
- main: {},
210
- side: {},
211
- },
212
- { name: 'MuiSite' }
213
- );
214
-
215
199
  export default function Index() {
216
- const styles = useStyles();
217
200
  const [data, setData] = useState(null);
218
201
  const { t } = useTranslation();
219
202
  return (
220
203
  <BasicLayout>
221
- <Top className={styles.top}>
204
+ <Top>
222
205
  <Header>
223
- <GovGRLogo />
224
- <HeaderTitle>Service name</HeaderTitle>
206
+ <HeaderContent>
207
+ <HeaderSection>
208
+ <GovGRLogo />
209
+ <HeaderTitle>Service name</HeaderTitle>
210
+ </HeaderSection>
211
+ </HeaderContent>
225
212
  </Header>
226
213
  </Top>
227
214
  <Container>
228
- <Main className={styles.main}>
229
- <BackButton>{t('button.back')}</BackButton>
215
+ <Main>
216
+ <BackLink>Back</BackLink>
230
217
  <PageTitleContainer>
231
218
  <PageTitleCaption>Before we start</PageTitleCaption>
232
219
  <PageTitleHeading>Submit a form</PageTitleHeading>
@@ -237,7 +224,7 @@ export default function Index() {
237
224
  initial={initialValues}
238
225
  >
239
226
  <Fieldset>
240
- <FieldsetLabel>This is a fieldset</FieldsetLabel>
227
+ <FieldsetLabel size="lg">This is a fieldset</FieldsetLabel>
241
228
  {FIELDS.map((field) => (
242
229
  <Field key={field.key} name={field.key} />
243
230
  ))}
@@ -1,20 +1,21 @@
1
1
  import React from 'react';
2
2
  import { test, expect } from '@playwright/experimental-ct-react';
3
- import TestVariant from '@digigov/ui/utils/TestVariant'
4
3
  import { Default } from '@digigov/form/FormBuilder/__stories__/Default';
4
+ import TestVariant from '@digigov/ui/utils/TestVariant';
5
5
 
6
6
  test('renders the All FormBuilder variants', async ({ mount, page }) => {
7
7
  await mount(
8
-
9
- <div>
10
- <TestVariant title="Default">
11
- <Default />
12
- </TestVariant>
13
- </div>
14
- )
8
+ <div>
9
+ <TestVariant title="Default">
10
+ <Default />
11
+ </TestVariant>
12
+ </div>
13
+ );
15
14
  await page.evaluate(() => document.fonts.ready);
16
15
 
17
- const screenshot = await page.screenshot({ fullPage: true, animations: 'disabled' });
16
+ const screenshot = await page.screenshot({
17
+ fullPage: true,
18
+ animations: 'disabled',
19
+ });
18
20
  expect(screenshot).toMatchSnapshot();
19
21
  });
20
-
@@ -1,8 +1,179 @@
1
- import {
2
- FormBuilder,
3
- useFormContext,
4
- useFormValues,
5
- FormBase,
6
- } from '@digigov/form';
7
- export { useFormContext, useFormValues, FormBase };
1
+ import React, { useCallback, useContext, useRef } from 'react';
2
+ import { useForm } from 'react-hook-form';
3
+ import { Field } from '@digigov/form/Field';
4
+ import { CONTROLLED_FIELD_COMPONENTS } from '@digigov/form/Field/utils';
5
+ import { Fieldset } from '@digigov/form/Fieldset';
6
+ import { FormContext } from '@digigov/form/FormContext';
7
+ import { FormBaseProps, FormData, FormBuilderProps } from '@digigov/form/types';
8
+ import { yupResolver } from '@digigov/form/utils';
9
+ import { useValidationSchema } from '@digigov/form/validators';
10
+ import { Button } from '@digigov/ui/form/Button';
11
+ import { Form } from '@digigov/ui/form/Form';
12
+
13
+ const FormBase = React.forwardRef(function FormBase(
14
+ {
15
+ onSubmit,
16
+ children,
17
+ registerField,
18
+ fieldsMap,
19
+ fieldsetsMap,
20
+ resolver,
21
+ mode,
22
+ initial,
23
+ reValidateMode,
24
+ shouldFocusError,
25
+ criteriaMode,
26
+ componentRegistry,
27
+ grid,
28
+ ...props
29
+ }: FormBaseProps,
30
+ ref: React.Ref<HTMLFormElement>
31
+ ) {
32
+ const form = useForm({
33
+ resolver,
34
+ mode,
35
+ defaultValues: initial,
36
+ reValidateMode,
37
+ shouldFocusError,
38
+ criteriaMode,
39
+ });
40
+
41
+ const handleSubmit = useCallback(
42
+ (data: FormData): void => {
43
+ if (onSubmit) onSubmit(data);
44
+ },
45
+ [onSubmit]
46
+ );
47
+ const submit = form.handleSubmit(handleSubmit);
48
+ const ctx = {
49
+ fieldsMap,
50
+ fieldsetsMap,
51
+ control: form.control,
52
+ register: form.register,
53
+ watch: form.watch,
54
+ resetField: form.resetField,
55
+ registerField: registerField,
56
+ errors: form.formState.errors,
57
+ formState: form.formState,
58
+ reset: form.reset,
59
+ trigger: form.trigger,
60
+ getFieldState: form.getFieldState,
61
+ setValue: form.setValue,
62
+ clearErrors: form.clearErrors,
63
+ getValues: form.getValues,
64
+ unregister: form.unregister,
65
+ componentRegistry,
66
+ setError: form.setError,
67
+ formRef: ref,
68
+ submit,
69
+ };
70
+ return (
71
+ <FormContext.Provider value={ctx}>
72
+ <Form grid={grid} onSubmit={submit} ref={ref} {...props}>
73
+ {children}
74
+ </Form>
75
+ </FormContext.Provider>
76
+ );
77
+ });
78
+
79
+ const useFormContext = () => {
80
+ return useContext(FormContext);
81
+ };
82
+ const useFormValues = () => {
83
+ const ctx = useFormContext();
84
+ return ctx.getValues();
85
+ };
86
+ const FormBuilder = React.forwardRef(function FormBuilder(
87
+ {
88
+ fields = [],
89
+ fieldsets,
90
+ initial = {},
91
+ onSubmit,
92
+ children,
93
+ reValidateMode = 'onSubmit',
94
+ mode = 'onSubmit',
95
+ shouldFocusError = true,
96
+ criteriaMode = 'all',
97
+ auto = false,
98
+ validatorRegistry,
99
+ componentRegistry,
100
+ grid = false,
101
+ ...props
102
+ }: FormBuilderProps,
103
+ ref: React.Ref<HTMLFormElement>
104
+ ): React.ReactElement {
105
+ const fieldsState = useRef(fields);
106
+ const setFieldsState = useCallback((newFields) => {
107
+ fieldsState.current = newFields;
108
+ }, []);
109
+ const schema = useValidationSchema(fieldsState, validatorRegistry);
110
+ const registerField = useCallback((field) => {
111
+ const fieldIndex = fieldsState.current.findIndex(
112
+ (f) => f.key === field.key
113
+ );
114
+ if (fieldIndex > -1) {
115
+ fieldsState.current[fieldIndex] = field;
116
+ } else {
117
+ fieldsState.current.push(field);
118
+ }
119
+ setFieldsState(fieldsState.current);
120
+ }, []);
121
+ let resolver;
122
+ let fieldsMap;
123
+ let fieldsetsMap;
124
+ let fieldChildren;
125
+ if (schema) {
126
+ resolver = yupResolver(schema);
127
+ fieldsMap = fields
128
+ ? fields.reduce((map, field) => ({ ...map, [field.key]: field }), {})
129
+ : {};
130
+ fieldsetsMap =
131
+ fieldsets &&
132
+ fieldsets.reduce(
133
+ (map, fieldset) => ({ ...map, [fieldset.key]: fieldset }),
134
+ {}
135
+ );
136
+
137
+ if (auto) {
138
+ if (fieldsets) {
139
+ fieldChildren = fieldsets.map((fieldset) => (
140
+ <Fieldset key={fieldset.key} />
141
+ ));
142
+ } else if (fields) {
143
+ fieldChildren = fields.map((field) => (
144
+ <Field key={field.key} name={field.key} />
145
+ ));
146
+ }
147
+ }
148
+ }
149
+ return (
150
+ <FormBase
151
+ resolver={resolver}
152
+ fieldsetsMap={fieldsetsMap}
153
+ fieldsMap={fieldsMap}
154
+ registerField={registerField}
155
+ initial={initial}
156
+ reValidateMode={reValidateMode}
157
+ mode={mode}
158
+ shouldFocusError={shouldFocusError}
159
+ criteriaMode={criteriaMode}
160
+ onSubmit={onSubmit}
161
+ componentRegistry={componentRegistry}
162
+ ref={ref}
163
+ grid={grid}
164
+ {...props}
165
+ >
166
+ {fieldChildren}
167
+ {auto && <Button type="submit">Συνέχεια</Button>}
168
+ {children}
169
+ </FormBase>
170
+ );
171
+ });
172
+ export const ControlledFormBuilder = (props) => {
173
+ return (
174
+ <FormBuilder {...props} componentRegistry={CONTROLLED_FIELD_COMPONENTS} />
175
+ );
176
+ };
8
177
  export default FormBuilder;
178
+
179
+ export { useFormContext, useFormValues, FormBase };
@@ -589,7 +589,7 @@ const generateScenarios = (
589
589
  };
590
590
  scenarioFill.push(finalScenarioFill);
591
591
  for (const multiplicityField of fillTemplate?.value?.of?.extra
592
- ?.fields) {
592
+ ?.fields ?? []) {
593
593
  scenarioExpect.push({
594
594
  type: 'success',
595
595
  fieldKey: `${fillTemplate.fieldKey}\\.${i}\\.${multiplicityField.fieldKey}`,
@@ -1120,7 +1120,7 @@ const inputsScenarios = [
1120
1120
  args: {
1121
1121
  maxSizeToMb: 0.0003,
1122
1122
  },
1123
- text: el.form.error.file_size,
1123
+ text: el.form.error.image_size,
1124
1124
  },
1125
1125
  {
1126
1126
  type: 'error',
@@ -1,5 +1,4 @@
1
- import React from 'react';
2
- import { createContext } from 'react';
1
+ import React, { createContext } from 'react';
3
2
  import { FormContextProps } from '@digigov/form/types';
4
3
 
5
4
  export const FormContext: React.Context<FormContextProps> = createContext({