@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.
- package/Field/FieldBase/index.js +6 -2
- package/Field/FieldBase.js.map +2 -2
- package/Field/FieldBaseContainer/index.js +5 -3
- package/Field/FieldBaseContainer.js.map +2 -2
- package/Field/FieldConditional/index.js +4 -0
- package/Field/FieldConditional.js.map +2 -2
- package/Field/index.js +10 -4
- package/Field/index.js.map +2 -2
- package/Field/types.d.ts +11 -3
- package/Field/utils/index.js +3 -1
- package/Field/utils/index.js.map +2 -2
- package/Field/utils/useField/index.js +8 -1
- package/Field/utils/useField.js.map +2 -2
- package/FieldArray/FormDialog/index.js +314 -196
- package/FieldArray/FormDialog.d.ts +20 -7
- package/FieldArray/FormDialog.js.map +3 -3
- package/FieldArray/__stories__/Default.d.ts +1 -1
- package/FieldArray/__stories__/WithExactLength.d.ts +1 -1
- package/FieldArray/__stories__/WithModal.d.ts +1 -1
- package/FieldArray/index.d.ts +1 -0
- package/FieldArray/index.js +12 -7
- package/FieldArray/index.js.map +2 -2
- package/FieldObject/index.d.ts +3 -0
- package/FieldObject/index.js +26 -15
- package/FieldObject/index.js.map +2 -2
- package/FormBuilder/FormBuilder.stories.d.ts +2 -0
- package/FormBuilder/__stories__/AutoErrorGrouping.d.ts +1 -1
- package/FormBuilder/__stories__/Default.d.ts +1 -1
- package/FormBuilder/__stories__/ErrorGrouping.d.ts +1 -1
- package/FormBuilder/index.d.ts +1 -1
- package/FormBuilder/index.js +11 -6
- package/FormBuilder/index.js.map +2 -2
- package/FormContext/index.js +6 -2
- package/FormContext.d.ts +1 -0
- package/FormContext.js.map +2 -2
- package/MultiplicityField/MultiplicityField.stories.d.ts +2 -0
- package/MultiplicityField/__stories__/Default.d.ts +1 -1
- package/MultiplicityField/__stories__/PreviewDisplay.d.ts +1 -1
- package/MultiplicityField/__stories__/WithExactLength.d.ts +1 -1
- package/MultiplicityField/__stories__/WithMaxLength.d.ts +1 -1
- package/MultiplicityField/__stories__/WithMinAndMaxLength.d.ts +1 -1
- package/MultiplicityField/__stories__/WithMinLength.d.ts +1 -1
- package/MultiplicityField/add-objects/index.js +2 -0
- package/MultiplicityField/add-objects.js.map +2 -2
- package/MultiplicityField/index.js +4 -1
- package/MultiplicityField/index.js.map +2 -2
- package/MultiplicityField/types.d.ts +1 -0
- package/Questions/Questions.stories.d.ts +2 -0
- package/Questions/__stories__/Default.d.ts +1 -1
- package/cjs/Field/FieldBase/index.js +6 -2
- package/cjs/Field/FieldBase.js.map +2 -2
- package/cjs/Field/FieldBaseContainer/index.js +4 -2
- package/cjs/Field/FieldBaseContainer.js.map +3 -3
- package/cjs/Field/FieldConditional/index.js +4 -0
- package/cjs/Field/FieldConditional.js.map +2 -2
- package/cjs/Field/index.js +10 -4
- package/cjs/Field/index.js.map +2 -2
- package/cjs/Field/types.js.map +1 -1
- package/cjs/Field/utils/index.js +3 -1
- package/cjs/Field/utils/index.js.map +2 -2
- package/cjs/Field/utils/useField/index.js +8 -1
- package/cjs/Field/utils/useField.js.map +2 -2
- package/cjs/FieldArray/FormDialog/index.js +309 -194
- package/cjs/FieldArray/FormDialog.js.map +3 -3
- package/cjs/FieldArray/index.js +12 -7
- package/cjs/FieldArray/index.js.map +2 -2
- package/cjs/FieldObject/index.js +26 -15
- package/cjs/FieldObject/index.js.map +2 -2
- package/cjs/FormBuilder/index.js +11 -6
- package/cjs/FormBuilder/index.js.map +2 -2
- package/cjs/FormContext/index.js +7 -2
- package/cjs/FormContext.js.map +2 -2
- package/cjs/MultiplicityField/add-objects/index.js +2 -0
- package/cjs/MultiplicityField/add-objects.js.map +2 -2
- package/cjs/MultiplicityField/index.js +4 -1
- package/cjs/MultiplicityField/index.js.map +2 -2
- package/cjs/MultiplicityField/types.js.map +1 -1
- package/cjs/inputs/Checkboxes/index.js +1 -1
- package/cjs/inputs/Checkboxes/index.js.map +2 -2
- package/cjs/inputs/DateInput/index.js +20 -8
- package/cjs/inputs/DateInput/index.js.map +2 -2
- package/cjs/inputs/DateTimeInput/index.js +23 -10
- package/cjs/inputs/DateTimeInput/index.js.map +2 -2
- package/cjs/inputs/FileInput/index.js +26 -21
- package/cjs/inputs/FileInput/index.js.map +2 -2
- package/cjs/inputs/ImageInput/__stories__/logo.d/index.js +1 -0
- package/cjs/inputs/ImageInput/__stories__/logo.d.js.map +7 -0
- package/cjs/inputs/ImageInput/index.js +41 -10
- package/cjs/inputs/ImageInput/index.js.map +2 -2
- package/cjs/inputs/Input/index.js +4 -4
- package/cjs/inputs/Input/index.js.map +2 -2
- package/cjs/inputs/Select/index.js +4 -3
- package/cjs/inputs/Select/index.js.map +2 -2
- package/cjs/inputs/inputsScenarios/index.js +2 -2
- package/cjs/inputs/inputsScenarios.js.map +2 -2
- package/cjs/lazy/index.js +2 -1
- package/cjs/lazy.js.map +2 -2
- package/cjs/registry/index.js +8 -8
- package/cjs/registry.js.map +2 -2
- package/cjs/types.js.map +1 -1
- package/cjs/utils/index.js +20 -6
- package/cjs/utils.js.map +2 -2
- package/cjs/validators/index.js +10 -5
- package/cjs/validators/index.js.map +2 -2
- package/cjs/validators/utils/amka/index.js +60 -0
- package/cjs/validators/utils/amka.js.map +7 -0
- package/cjs/validators/utils/file/index.js +30 -17
- package/cjs/validators/utils/file.js.map +2 -2
- package/cjs/validators/utils/index.js +5 -1
- package/cjs/validators/utils/index.js.map +2 -2
- package/index.js +1 -1
- package/inputs/AutoCompleteInput/AutoComplete.stories.d.ts +2 -0
- package/inputs/AutoCompleteInput/__stories__/Default.d.ts +1 -1
- package/inputs/AutoCompleteInput/__stories__/Multiple.d.ts +1 -1
- package/inputs/Checkboxes/Checkboxes.stories.d.ts +2 -0
- package/inputs/Checkboxes/__stories__/Conditional.d.ts +1 -1
- package/inputs/Checkboxes/__stories__/Default.d.ts +1 -1
- package/inputs/Checkboxes/__stories__/WithDivider.d.ts +1 -1
- package/inputs/Checkboxes/index.js +1 -1
- package/inputs/Checkboxes/index.js.map +2 -2
- package/inputs/DateInput/DateInput.stories.d.ts +2 -0
- package/inputs/DateInput/__stories__/Default.d.ts +1 -1
- package/inputs/DateInput/index.js +20 -8
- package/inputs/DateInput/index.js.map +2 -2
- package/inputs/DateTimeInput/DateTimeInput.stories.d.ts +2 -0
- package/inputs/DateTimeInput/__stories__/Default.d.ts +1 -1
- package/inputs/DateTimeInput/index.js +23 -10
- package/inputs/DateTimeInput/index.js.map +2 -2
- package/inputs/FileInput/FileInput.stories.d.ts +3 -0
- package/inputs/FileInput/__stories__/Default.d.ts +1 -1
- package/inputs/FileInput/__stories__/WithBorderAndLink.d.ts +3 -0
- package/inputs/FileInput/index.d.ts +6 -3
- package/inputs/FileInput/index.js +31 -23
- package/inputs/FileInput/index.js.map +2 -2
- package/inputs/ImageInput/ImageInput.stories.d.ts +4 -1
- package/inputs/ImageInput/__stories__/Default.d.ts +1 -1
- package/inputs/ImageInput/__stories__/MaxSize.d.ts +1 -1
- package/inputs/ImageInput/__stories__/WithInitialValues.d.ts +3 -0
- package/inputs/ImageInput/__stories__/WithInvalidImageDimension.d.ts +1 -1
- package/inputs/ImageInput/__stories__/logo.d/index.js +1 -0
- package/inputs/ImageInput/__stories__/logo.d/package.json +6 -0
- package/inputs/ImageInput/__stories__/logo.d.js.map +7 -0
- package/inputs/ImageInput/index.d.ts +9 -1
- package/inputs/ImageInput/index.js +42 -11
- package/inputs/ImageInput/index.js.map +2 -2
- package/inputs/Input/Input.stories.d.ts +4 -0
- package/inputs/Input/__stories__/AFM.d.ts +1 -1
- package/inputs/Input/__stories__/AMKA.d.ts +3 -0
- package/inputs/Input/__stories__/Boolean.d.ts +1 -1
- package/inputs/Input/__stories__/Email.d.ts +3 -0
- package/inputs/Input/__stories__/IBAN.d.ts +1 -1
- package/inputs/Input/__stories__/Integer.d.ts +1 -1
- package/inputs/Input/__stories__/LandlineNumber.d.ts +1 -1
- package/inputs/Input/__stories__/MobilePhone.d.ts +1 -1
- package/inputs/Input/__stories__/PhoneNumber.d.ts +1 -1
- package/inputs/Input/__stories__/PostalCode.d.ts +1 -1
- package/inputs/Input/__stories__/String.d.ts +1 -1
- package/inputs/Input/__stories__/StringWithTrimValidation.d.ts +1 -1
- package/inputs/Input/__stories__/TextWithLimit.d.ts +1 -1
- package/inputs/Input/index.d.ts +2 -1
- package/inputs/Input/index.js +4 -4
- package/inputs/Input/index.js.map +2 -2
- package/inputs/Label/Label.stories.d.ts +2 -0
- package/inputs/Label/__stories__/Default.d.ts +1 -1
- package/inputs/OtpInput/OtpInput.stories.d.ts +2 -0
- package/inputs/OtpInput/__stories__/Default.d.ts +1 -1
- package/inputs/Radio/Radio.stories.d.ts +2 -0
- package/inputs/Radio/__stories__/Conditional.d.ts +1 -1
- package/inputs/Radio/__stories__/Default.d.ts +1 -1
- package/inputs/Radio/__stories__/WithDivider.d.ts +1 -1
- package/inputs/Select/Select.stories.d.ts +2 -0
- package/inputs/Select/__stories__/Default.d.ts +1 -1
- package/inputs/Select/index.d.ts +2 -1
- package/inputs/Select/index.js +4 -3
- package/inputs/Select/index.js.map +2 -2
- package/inputs/inputsScenarios/index.js +2 -2
- package/inputs/inputsScenarios.d.ts +1 -1
- package/inputs/inputsScenarios.js.map +2 -2
- package/lazy/index.js +2 -1
- package/package.json +8 -8
- package/registry/index.js +8 -8
- package/src/Field/FieldBase.tsx +5 -1
- package/src/Field/FieldBaseContainer.tsx +8 -4
- package/src/Field/FieldConditional.tsx +4 -0
- package/src/Field/doc.mdx +202 -1
- package/src/Field/index.tsx +15 -5
- package/src/Field/types.tsx +12 -3
- package/src/Field/utils/index.ts +2 -0
- package/src/Field/utils/useField.ts +9 -1
- package/src/FieldArray/FormDialog.tsx +430 -243
- package/src/FieldArray/__stories__/Default.tsx +1 -1
- package/src/FieldArray/__stories__/WithExactLength.tsx +1 -1
- package/src/FieldArray/__stories__/WithModal.tsx +4 -3
- package/src/FieldArray/index.test.tsx +4 -0
- package/src/FieldArray/index.tsx +26 -30
- package/src/FieldObject/index.tsx +33 -18
- package/src/FormBuilder/FormBuilder.stories.js +3 -0
- package/src/FormBuilder/__stories__/AutoErrorGrouping.tsx +1 -1
- package/src/FormBuilder/__stories__/Default.tsx +1 -1
- package/src/FormBuilder/__stories__/ErrorGrouping.tsx +1 -1
- package/src/FormBuilder/doc.mdx +9 -4
- package/src/FormBuilder/index.test.tsx +4 -0
- package/src/FormBuilder/index.tsx +12 -6
- package/src/FormBuilder/interaction.test.tsx +8 -0
- package/src/FormBuilder/scenarios.test.tsx +7 -7
- package/src/FormContext.tsx +5 -1
- package/src/MultiplicityField/MultiplicityField.stories.js +3 -0
- package/src/MultiplicityField/__stories__/Default.tsx +1 -1
- package/src/MultiplicityField/__stories__/PreviewDisplay.tsx +1 -1
- package/src/MultiplicityField/__stories__/WithExactLength.tsx +1 -1
- package/src/MultiplicityField/__stories__/WithMaxLength.tsx +1 -1
- package/src/MultiplicityField/__stories__/WithMinAndMaxLength.tsx +1 -1
- package/src/MultiplicityField/__stories__/WithMinLength.tsx +1 -1
- package/src/MultiplicityField/add-objects.tsx +2 -0
- package/src/MultiplicityField/doc.mdx +101 -83
- package/src/MultiplicityField/index.test.tsx +4 -0
- package/src/MultiplicityField/index.tsx +3 -0
- package/src/MultiplicityField/types.ts +1 -0
- package/src/Questions/Questions.stories.js +3 -0
- package/src/Questions/__snapshots__/index.spec.tsx.snap +2 -1
- package/src/Questions/__stories__/Default.tsx +1 -1
- package/src/Questions/doc.mdx +21 -41
- package/src/Questions/index.test.tsx +4 -0
- package/src/doc.mdx +26 -11
- package/src/inputs/AutoCompleteInput/AutoComplete.stories.js +3 -0
- package/src/inputs/AutoCompleteInput/__stories__/Default.tsx +1 -1
- package/src/inputs/AutoCompleteInput/__stories__/Multiple.tsx +1 -1
- package/src/inputs/AutoCompleteInput/index.test.tsx +4 -0
- package/src/inputs/Checkboxes/Checkboxes.stories.js +3 -0
- package/src/inputs/Checkboxes/__stories__/Conditional.tsx +1 -1
- package/src/inputs/Checkboxes/__stories__/Default.tsx +1 -1
- package/src/inputs/Checkboxes/__stories__/WithDivider.tsx +1 -1
- package/src/inputs/Checkboxes/index.test.tsx +4 -0
- package/src/inputs/Checkboxes/index.tsx +1 -1
- package/src/inputs/DateInput/DateInput.stories.js +3 -0
- package/src/inputs/DateInput/__stories__/Default.tsx +1 -1
- package/src/inputs/DateInput/index.test.tsx +4 -0
- package/src/inputs/DateInput/index.tsx +21 -7
- package/src/inputs/DateTimeInput/DateTimeInput.stories.js +3 -0
- package/src/inputs/DateTimeInput/__stories__/Default.tsx +1 -1
- package/src/inputs/DateTimeInput/index.test.tsx +4 -0
- package/src/inputs/DateTimeInput/index.tsx +24 -9
- package/src/inputs/FileInput/FileInput.stories.js +4 -0
- package/src/inputs/FileInput/__stories__/Default.tsx +1 -1
- package/src/inputs/FileInput/__stories__/WithBorderAndLink.tsx +34 -0
- package/src/inputs/FileInput/index.test.tsx +8 -0
- package/src/inputs/FileInput/index.tsx +41 -30
- package/src/inputs/ImageInput/ImageInput.stories.js +5 -1
- package/src/inputs/ImageInput/__stories__/Default.tsx +1 -1
- package/src/inputs/ImageInput/__stories__/MaxSize.tsx +3 -2
- package/src/inputs/ImageInput/__stories__/{WithInvalidImageSize.tsx → WithInitialValues.tsx} +12 -3
- package/src/inputs/ImageInput/__stories__/WithInvalidImageDimension.tsx +1 -1
- package/src/inputs/ImageInput/__stories__/logo.d.ts +4 -0
- package/src/inputs/ImageInput/__stories__/logo.png +0 -0
- package/src/inputs/ImageInput/index.test.tsx +8 -4
- package/src/inputs/ImageInput/index.tsx +100 -48
- package/src/inputs/Input/Input.stories.js +5 -0
- package/src/inputs/Input/__stories__/AFM.tsx +1 -1
- package/src/inputs/Input/__stories__/AMKA.tsx +23 -0
- package/src/inputs/Input/__stories__/Boolean.tsx +1 -1
- package/src/inputs/Input/__stories__/Email.tsx +23 -0
- package/src/inputs/Input/__stories__/IBAN.tsx +1 -1
- package/src/inputs/Input/__stories__/Integer.tsx +1 -1
- package/src/inputs/Input/__stories__/LandlineNumber.tsx +1 -1
- package/src/inputs/Input/__stories__/MobilePhone.tsx +1 -1
- package/src/inputs/Input/__stories__/PhoneNumber.tsx +1 -1
- package/src/inputs/Input/__stories__/PostalCode.tsx +1 -1
- package/src/inputs/Input/__stories__/String.tsx +1 -1
- package/src/inputs/Input/__stories__/StringWithTrimValidation.tsx +1 -1
- package/src/inputs/Input/__stories__/TextWithLimit.tsx +1 -1
- package/src/inputs/Input/index.test.tsx +12 -0
- package/src/inputs/Input/index.tsx +5 -3
- package/src/inputs/Label/Label.stories.js +3 -0
- package/src/inputs/Label/__stories__/Default.tsx +1 -1
- package/src/inputs/Label/index.test.tsx +4 -0
- package/src/inputs/OtpInput/OtpInput.stories.js +3 -0
- package/src/inputs/OtpInput/__stories__/Default.tsx +1 -1
- package/src/inputs/OtpInput/index.test.tsx +4 -0
- package/src/inputs/Radio/Radio.stories.js +3 -0
- package/src/inputs/Radio/__stories__/Conditional.tsx +1 -1
- package/src/inputs/Radio/__stories__/Default.tsx +1 -1
- package/src/inputs/Radio/__stories__/WithDivider.tsx +1 -1
- package/src/inputs/Radio/index.test.tsx +4 -0
- package/src/inputs/Select/Select.stories.js +3 -0
- package/src/inputs/Select/__stories__/Default.tsx +1 -1
- package/src/inputs/Select/index.test.tsx +4 -0
- package/src/inputs/Select/index.tsx +7 -4
- package/src/inputs/inputsScenarios.ts +2 -2
- package/src/lazy.js +2 -1
- package/src/registry.js +8 -8
- package/src/types.tsx +2 -1
- package/src/utils.ts +27 -6
- package/src/validators/index.ts +16 -5
- package/src/validators/utils/amka.ts +39 -0
- package/src/validators/utils/file.ts +33 -19
- package/src/validators/utils/index.ts +4 -1
- package/types.d.ts +2 -1
- package/types.js.map +1 -1
- package/utils/index.js +20 -6
- package/utils.d.ts +2 -0
- package/utils.js.map +2 -2
- package/validators/index.d.ts +1 -1
- package/validators/index.js +11 -5
- package/validators/index.js.map +2 -2
- package/validators/utils/amka/index.js +36 -0
- package/{inputs/Input/inputsInputScenarios → validators/utils/amka}/package.json +1 -1
- package/validators/utils/amka.d.ts +6 -0
- package/validators/utils/amka.js.map +7 -0
- package/validators/utils/file/index.js +30 -17
- package/validators/utils/file.js.map +2 -2
- package/validators/utils/index.d.ts +1 -0
- package/validators/utils/index.js +4 -1
- package/validators/utils/index.js.map +2 -2
- package/cjs/inputs/Input/inputsInputScenarios/index.js +0 -439
- package/cjs/inputs/Input/inputsInputScenarios.js.map +0 -7
- package/inputs/ImageInput/__stories__/WithInvalidImageSize.d.ts +0 -3
- package/inputs/Input/inputsInputScenarios/index.js +0 -406
- package/inputs/Input/inputsInputScenarios.d.ts +0 -57
- package/inputs/Input/inputsInputScenarios.js.map +0 -7
- package/src/inputs/Input/inputsInputScenarios.ts +0 -404
|
@@ -22,6 +22,8 @@ const fields = [
|
|
|
22
22
|
secondary: 'Οι συνυπογράφοντες είναι άνθρωποι σαν και εμάς',
|
|
23
23
|
},
|
|
24
24
|
extra: {
|
|
25
|
+
noIndex: true,
|
|
26
|
+
border: false,
|
|
25
27
|
variant: 'dialog',
|
|
26
28
|
noHeader: false,
|
|
27
29
|
label: {
|
|
@@ -145,15 +147,14 @@ const fields = [
|
|
|
145
147
|
},
|
|
146
148
|
] as FieldSpec[];
|
|
147
149
|
|
|
148
|
-
export const WithModal = () => (
|
|
150
|
+
export const WithModal = (_: any) => (
|
|
149
151
|
<FormBuilder
|
|
150
152
|
onSubmit={(data) => {
|
|
151
153
|
console.log(data);
|
|
154
|
+
window.alert('Submit success');
|
|
152
155
|
}}
|
|
153
156
|
>
|
|
154
|
-
<Field name="string" {...fields[0]} />
|
|
155
157
|
<Field name="multiplicity" {...fields[1]} />
|
|
156
|
-
<Field name="arrayofafm" {...fields[2]} />
|
|
157
158
|
<Button>Συνέχεια</Button>
|
|
158
159
|
</FormBuilder>
|
|
159
160
|
);
|
|
@@ -22,6 +22,10 @@ test('renders the All FieldArray variants', async ({ mount, page }) => {
|
|
|
22
22
|
)
|
|
23
23
|
await page.evaluate(() => document.fonts.ready);
|
|
24
24
|
|
|
25
|
+
// Move the mouse to the top-left corner to avoid random hover issues
|
|
26
|
+
await page.mouse.move(0, 0);
|
|
27
|
+
|
|
28
|
+
|
|
25
29
|
const screenshot = await page.screenshot({ fullPage: true, animations: 'disabled' });
|
|
26
30
|
expect(screenshot).toMatchSnapshot();
|
|
27
31
|
});
|
package/src/FieldArray/index.tsx
CHANGED
|
@@ -7,7 +7,6 @@ import { FieldObject } from '@digigov/form/FieldObject';
|
|
|
7
7
|
import { FieldsetLabel, Fieldset } from '@digigov/form/Fieldset';
|
|
8
8
|
import { Card } from '@digigov/ui/content/Card';
|
|
9
9
|
import { Button } from '@digigov/ui/form/Button';
|
|
10
|
-
import { Hint } from '@digigov/ui/typography/Hint';
|
|
11
10
|
|
|
12
11
|
export interface FieldArrayProps extends FieldProps {
|
|
13
12
|
control: UseFormReturn['control'];
|
|
@@ -19,6 +18,7 @@ export interface FieldArrayProps extends FieldProps {
|
|
|
19
18
|
getValues: UseFormReturn['getValues'];
|
|
20
19
|
setValue: UseFormReturn['setValue'];
|
|
21
20
|
reset: UseFormReturn['reset'];
|
|
21
|
+
resetField?: UseFormReturn['resetField'];
|
|
22
22
|
Field: React.FC<FieldProps>;
|
|
23
23
|
}
|
|
24
24
|
export const FieldArray: React.FC<FieldArrayProps> = ({
|
|
@@ -33,36 +33,28 @@ export const FieldArray: React.FC<FieldArrayProps> = ({
|
|
|
33
33
|
setValue,
|
|
34
34
|
layout,
|
|
35
35
|
reset,
|
|
36
|
+
resetField,
|
|
36
37
|
label,
|
|
37
38
|
Field,
|
|
38
39
|
...customField
|
|
39
40
|
}) => {
|
|
40
|
-
const {
|
|
41
|
+
const { append, remove } = useFieldArray({
|
|
41
42
|
control,
|
|
42
43
|
name,
|
|
43
44
|
});
|
|
44
|
-
|
|
45
|
+
const fields = getValues(name) || [];
|
|
45
46
|
return (
|
|
46
47
|
<FieldBaseContainer
|
|
47
48
|
label={label}
|
|
48
49
|
layout={layout}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
!formState.isSubmitting &&
|
|
52
|
-
error?.message &&
|
|
53
|
-
error
|
|
54
|
-
? error
|
|
55
|
-
: undefined
|
|
56
|
-
}
|
|
50
|
+
register={register}
|
|
51
|
+
error={error?.message && error ? error : undefined}
|
|
57
52
|
hasError={formState.isSubmitted && !formState.isSubmitting && !!error}
|
|
58
53
|
wrapper="fieldset"
|
|
59
54
|
name={name}
|
|
55
|
+
labelSize={customField.extra?.labelSize}
|
|
56
|
+
controlled={true}
|
|
60
57
|
>
|
|
61
|
-
{fields.length === 0 && (
|
|
62
|
-
<Hint {...customField.extra?.label.object?.nothing_added_props}>
|
|
63
|
-
{customField.extra?.label.object?.nothing_added}
|
|
64
|
-
</Hint>
|
|
65
|
-
)}
|
|
66
58
|
{customField.extra?.variant === 'dialog' ? (
|
|
67
59
|
<FormDialog
|
|
68
60
|
name={name}
|
|
@@ -78,6 +70,8 @@ export const FieldArray: React.FC<FieldArrayProps> = ({
|
|
|
78
70
|
label={label}
|
|
79
71
|
Field={Field}
|
|
80
72
|
reset={reset}
|
|
73
|
+
resetField={resetField}
|
|
74
|
+
sortable={customField.extra.sortable}
|
|
81
75
|
{...customField}
|
|
82
76
|
/>
|
|
83
77
|
) : (
|
|
@@ -85,7 +79,7 @@ export const FieldArray: React.FC<FieldArrayProps> = ({
|
|
|
85
79
|
{fields.map((field, index) => (
|
|
86
80
|
<Card
|
|
87
81
|
variant={customField.extra?.border ? 'border' : 'divider'}
|
|
88
|
-
key={field.id}
|
|
82
|
+
key={field.id || index}
|
|
89
83
|
>
|
|
90
84
|
<Fieldset>
|
|
91
85
|
<FieldsetLabel>
|
|
@@ -114,19 +108,21 @@ export const FieldArray: React.FC<FieldArrayProps> = ({
|
|
|
114
108
|
</Fieldset>
|
|
115
109
|
</Card>
|
|
116
110
|
))}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
ev
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
111
|
+
{customField.editable && (
|
|
112
|
+
<Button
|
|
113
|
+
type="button"
|
|
114
|
+
name={`${name}-add-object`}
|
|
115
|
+
color="secondary"
|
|
116
|
+
variant={customField.extra?.label.object?.addButtonVariant}
|
|
117
|
+
onClick={(ev) => {
|
|
118
|
+
ev.preventDefault();
|
|
119
|
+
append({});
|
|
120
|
+
}}
|
|
121
|
+
disabled={!customField?.editable}
|
|
122
|
+
>
|
|
123
|
+
{customField.extra?.label.object?.add}
|
|
124
|
+
</Button>
|
|
125
|
+
)}
|
|
130
126
|
</>
|
|
131
127
|
)}
|
|
132
128
|
</FieldBaseContainer>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { useMemo } from 'react';
|
|
2
2
|
import { ErrorOption, UseFormReturn } from 'react-hook-form';
|
|
3
3
|
import { FieldBase } from '@digigov/form/Field/FieldBase';
|
|
4
|
-
import {
|
|
4
|
+
import { FieldProps, CalculatedField } from '@digigov/form/Field/types';
|
|
5
5
|
import {
|
|
6
6
|
FIELD_COMPONENTS,
|
|
7
7
|
ALTERNATIVE_COMPONENTS,
|
|
@@ -16,6 +16,7 @@ export interface FieldObjectProps extends Omit<FieldProps, 'key'> {
|
|
|
16
16
|
control: UseFormReturn['control'];
|
|
17
17
|
register: UseFormReturn['register'];
|
|
18
18
|
reset: UseFormReturn['reset'];
|
|
19
|
+
resetField: UseFormReturn['resetField'];
|
|
19
20
|
formState: UseFormReturn['formState'];
|
|
20
21
|
error?: ErrorOption;
|
|
21
22
|
defaultValue?: undefined;
|
|
@@ -29,6 +30,7 @@ export const FieldObject: React.FC<FieldObjectProps> = ({
|
|
|
29
30
|
control,
|
|
30
31
|
register,
|
|
31
32
|
reset,
|
|
33
|
+
resetField,
|
|
32
34
|
formState,
|
|
33
35
|
error,
|
|
34
36
|
defaultValue,
|
|
@@ -39,10 +41,12 @@ export const FieldObject: React.FC<FieldObjectProps> = ({
|
|
|
39
41
|
return (
|
|
40
42
|
<Fieldset>
|
|
41
43
|
{label?.primary && (
|
|
42
|
-
<FieldsetLegend size="sm"
|
|
44
|
+
<FieldsetLegend size="sm" marginBottom={3}>
|
|
45
|
+
{t(label.primary)}
|
|
46
|
+
</FieldsetLegend>
|
|
43
47
|
)}
|
|
44
48
|
{label?.secondary && (
|
|
45
|
-
<FieldsetCaption>{t(label.secondary)}</FieldsetCaption>
|
|
49
|
+
<FieldsetCaption marginBottom={3}>{t(label.secondary)}</FieldsetCaption>
|
|
46
50
|
)}
|
|
47
51
|
{extra?.fields.map((field) => (
|
|
48
52
|
<FieldObjectItem
|
|
@@ -51,10 +55,11 @@ export const FieldObject: React.FC<FieldObjectProps> = ({
|
|
|
51
55
|
control={control}
|
|
52
56
|
register={register}
|
|
53
57
|
reset={reset}
|
|
58
|
+
resetField={resetField}
|
|
54
59
|
field={field}
|
|
55
60
|
error={error && error[field.key]}
|
|
56
61
|
formState={formState}
|
|
57
|
-
defaultValue={defaultValue}
|
|
62
|
+
defaultValue={defaultValue?.[field.key] || undefined}
|
|
58
63
|
Field={Field}
|
|
59
64
|
/>
|
|
60
65
|
))}
|
|
@@ -63,15 +68,16 @@ export const FieldObject: React.FC<FieldObjectProps> = ({
|
|
|
63
68
|
};
|
|
64
69
|
|
|
65
70
|
export interface FieldObjectItemProps {
|
|
71
|
+
key: string;
|
|
66
72
|
name: string;
|
|
67
73
|
field: FieldSpec;
|
|
68
74
|
control: UseFormReturn['control'];
|
|
69
75
|
register: UseFormReturn['register'];
|
|
70
76
|
reset: UseFormReturn['reset'];
|
|
77
|
+
resetField: UseFormReturn['resetField'];
|
|
71
78
|
formState: UseFormReturn['formState'];
|
|
72
79
|
error?: ErrorOption;
|
|
73
80
|
children?: React.ReactNode;
|
|
74
|
-
// defaultValue?: FormData | undefined;
|
|
75
81
|
defaultValue?: undefined;
|
|
76
82
|
Field: React.FC<FieldProps>;
|
|
77
83
|
}
|
|
@@ -84,6 +90,7 @@ const FieldObjectItem: React.FC<FieldObjectItemProps> = ({
|
|
|
84
90
|
control,
|
|
85
91
|
formState,
|
|
86
92
|
reset,
|
|
93
|
+
resetField,
|
|
87
94
|
register,
|
|
88
95
|
defaultValue,
|
|
89
96
|
Field,
|
|
@@ -93,19 +100,27 @@ const FieldObjectItem: React.FC<FieldObjectItemProps> = ({
|
|
|
93
100
|
calculateField(children, field, FIELD_COMPONENTS, ALTERNATIVE_COMPONENTS),
|
|
94
101
|
[field]
|
|
95
102
|
);
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
103
|
+
if (Field) {
|
|
104
|
+
if (!field.type) {
|
|
105
|
+
field.type = 'string';
|
|
106
|
+
}
|
|
107
|
+
return <Field {...field} name={name} />;
|
|
108
|
+
} else {
|
|
109
|
+
const customError = error ? error : formState?.errors[name];
|
|
110
|
+
return (
|
|
111
|
+
<FieldBase
|
|
112
|
+
{...calculatedField}
|
|
113
|
+
name={name}
|
|
114
|
+
Field={Field}
|
|
115
|
+
control={control}
|
|
116
|
+
reset={reset}
|
|
117
|
+
resetField={resetField}
|
|
118
|
+
register={register}
|
|
119
|
+
error={customError}
|
|
120
|
+
defaultValue={defaultValue}
|
|
121
|
+
/>
|
|
122
|
+
);
|
|
123
|
+
}
|
|
109
124
|
};
|
|
110
125
|
|
|
111
126
|
export default FieldObject;
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import FormBuilder from '@digigov/form/FormBuilder';
|
|
2
|
+
import doc from './doc.mdx?raw';
|
|
2
3
|
export default {
|
|
3
4
|
title: 'Digigov Form/FormBuilder',
|
|
4
5
|
component: FormBuilder,
|
|
6
|
+
tags: ['autodocs'],
|
|
7
|
+
markdown: doc,
|
|
5
8
|
displayName: 'FormBuilder',
|
|
6
9
|
};
|
|
7
10
|
export { Default } from '@digigov/form/FormBuilder/__stories__/Default';
|
|
@@ -3,7 +3,7 @@ import FormBuilder, { Field } from '@digigov/form';
|
|
|
3
3
|
import { ErrorGroup } from '@digigov/form/Field/ErrorGroup';
|
|
4
4
|
import { Button } from '@digigov/ui/form/Button';
|
|
5
5
|
|
|
6
|
-
export const ErrorGrouping = () => (
|
|
6
|
+
export const ErrorGrouping = (_: any) => (
|
|
7
7
|
<FormBuilder
|
|
8
8
|
grid={true}
|
|
9
9
|
onSubmit={(data) => {
|
package/src/FormBuilder/doc.mdx
CHANGED
|
@@ -4,13 +4,14 @@ title: FormBuilder
|
|
|
4
4
|
sidebar_label: FormBuilder
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
# FormBuilder
|
|
8
|
+
|
|
7
9
|
`FormBuilder` is a React component that provides an easy way to efficiently create reusable form page. Forms are a flexible mechanism for collecting user input because there are suitable widgets for entering many different types of data, including text boxes, checkboxes, radio buttons, dropdowns and so on for submission to a server. Actually when we use `stepForm` for building step-forms all we do is to render `FormBuilder` component.
|
|
8
10
|
|
|
9
11
|
`stepForm` component:
|
|
10
12
|
|
|
11
13
|
<code src="@digigov/form/FormBuilder/__stories__/Default.tsx" />
|
|
12
14
|
|
|
13
|
-
|
|
14
15
|
### Importing and using FormBuilder Component
|
|
15
16
|
|
|
16
17
|
To import `FormBuilder` component simply import it from `'@digigov/form`.
|
|
@@ -28,7 +29,7 @@ import BasicLayout, {
|
|
|
28
29
|
Main,
|
|
29
30
|
Bottom,
|
|
30
31
|
} from '@digigov/ui/layouts/Basic';
|
|
31
|
-
import {FormBuilder} from '@digigov/form';
|
|
32
|
+
import { FormBuilder } from '@digigov/form';
|
|
32
33
|
|
|
33
34
|
export default function MyComponent({ props }) {
|
|
34
35
|
return (
|
|
@@ -73,7 +74,7 @@ Below are demostrated some examples for each type of field
|
|
|
73
74
|
|
|
74
75
|
### FormBuilder implementation
|
|
75
76
|
|
|
76
|
-
The
|
|
77
|
+
The example below are implemented by using the code above.
|
|
77
78
|
|
|
78
79
|
```jsx
|
|
79
80
|
import React, { useState } from 'react';
|
|
@@ -83,7 +84,11 @@ import BasicLayout, {
|
|
|
83
84
|
Main,
|
|
84
85
|
Bottom,
|
|
85
86
|
} from '@digigov/ui/layouts/Basic';
|
|
86
|
-
import Header, {
|
|
87
|
+
import Header, {
|
|
88
|
+
HeaderTitle,
|
|
89
|
+
HeaderContent,
|
|
90
|
+
HeaderSection,
|
|
91
|
+
} from '@digigov/ui/app/Header';
|
|
87
92
|
import GovGRLogo from '@digigov/ui/govgr/GovGRLogo';
|
|
88
93
|
import GovGRFooter from '@digigov/ui/govgr/Footer';
|
|
89
94
|
import Button from '@digigov/ui/form/Button';
|
|
@@ -22,6 +22,10 @@ test('renders the All FormBuilder variants', async ({ mount, page }) => {
|
|
|
22
22
|
)
|
|
23
23
|
await page.evaluate(() => document.fonts.ready);
|
|
24
24
|
|
|
25
|
+
// Move the mouse to the top-left corner to avoid random hover issues
|
|
26
|
+
await page.mouse.move(0, 0);
|
|
27
|
+
|
|
28
|
+
|
|
25
29
|
const screenshot = await page.screenshot({ fullPage: true, animations: 'disabled' });
|
|
26
30
|
expect(screenshot).toMatchSnapshot();
|
|
27
31
|
});
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import React, { useCallback,
|
|
1
|
+
import React, { useCallback, useEffect, useRef } from 'react';
|
|
2
2
|
import { useForm } from 'react-hook-form';
|
|
3
3
|
import { Field } from '@digigov/form/Field';
|
|
4
4
|
import { ErrorGroup } from '@digigov/form/Field/ErrorGroup';
|
|
5
5
|
import { CONTROLLED_FIELD_COMPONENTS } from '@digigov/form/Field/utils';
|
|
6
6
|
import { FieldsetWithContext } from '@digigov/form/Fieldset/FieldsetWithContext';
|
|
7
|
-
import { FormContext } from '@digigov/form/FormContext';
|
|
7
|
+
import { FormContext, useFormContext } from '@digigov/form/FormContext';
|
|
8
8
|
import { FormBaseProps, FormData, FormBuilderProps } from '@digigov/form/types';
|
|
9
9
|
import { yupResolver } from '@digigov/form/utils';
|
|
10
10
|
import { useValidationSchema } from '@digigov/form/validators';
|
|
@@ -23,10 +23,11 @@ const FormBase = React.forwardRef(function FormBase(
|
|
|
23
23
|
mode,
|
|
24
24
|
initial,
|
|
25
25
|
reValidateMode,
|
|
26
|
-
shouldFocusError,
|
|
26
|
+
shouldFocusError = true,
|
|
27
27
|
criteriaMode,
|
|
28
28
|
componentRegistry,
|
|
29
29
|
grid,
|
|
30
|
+
errors,
|
|
30
31
|
...props
|
|
31
32
|
}: FormBaseProps,
|
|
32
33
|
ref: React.Ref<HTMLFormElement>
|
|
@@ -49,6 +50,13 @@ const FormBase = React.forwardRef(function FormBase(
|
|
|
49
50
|
},
|
|
50
51
|
[onSubmit]
|
|
51
52
|
);
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (errors) {
|
|
55
|
+
for (const fieldName in errors) {
|
|
56
|
+
form.setError(fieldName, errors[fieldName]);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}, [errors]);
|
|
52
60
|
const submit = form.handleSubmit(handleSubmit);
|
|
53
61
|
const ctx = {
|
|
54
62
|
fieldsMap,
|
|
@@ -72,6 +80,7 @@ const FormBase = React.forwardRef(function FormBase(
|
|
|
72
80
|
formRef: ref,
|
|
73
81
|
submit,
|
|
74
82
|
};
|
|
83
|
+
|
|
75
84
|
return (
|
|
76
85
|
<FormContext.Provider value={ctx}>
|
|
77
86
|
<Form grid={grid} onSubmit={submit} ref={ref} {...props}>
|
|
@@ -118,9 +127,6 @@ const groupFieldsByLayout = (fields) => {
|
|
|
118
127
|
return sizes;
|
|
119
128
|
}, {});
|
|
120
129
|
};
|
|
121
|
-
const useFormContext = () => {
|
|
122
|
-
return useContext(FormContext);
|
|
123
|
-
};
|
|
124
130
|
const useFormValues = () => {
|
|
125
131
|
const ctx = useFormContext();
|
|
126
132
|
return ctx.getValues();
|
|
@@ -7,6 +7,10 @@ import { ErrorGrouping } from '@digigov/form/FormBuilder/__stories__/ErrorGroupi
|
|
|
7
7
|
test('renders the ErrorGrouping and click submit', async ({ mount, page }) => {
|
|
8
8
|
await mount(<ErrorGrouping />);
|
|
9
9
|
await page.evaluate(() => document.fonts.ready);
|
|
10
|
+
|
|
11
|
+
// Move the mouse to the top-left corner to avoid random hover issues
|
|
12
|
+
await page.mouse.move(0, 0);
|
|
13
|
+
|
|
10
14
|
await page.click('text="Συνέχεια"');
|
|
11
15
|
|
|
12
16
|
const screenshot = await page.screenshot({
|
|
@@ -22,6 +26,10 @@ test('renders the AutoErrorGrouping and click submit', async ({
|
|
|
22
26
|
}) => {
|
|
23
27
|
await mount(<AutoErrorGrouping />);
|
|
24
28
|
await page.evaluate(() => document.fonts.ready);
|
|
29
|
+
|
|
30
|
+
// Move the mouse to the top-left corner to avoid random hover issues
|
|
31
|
+
await page.mouse.move(0, 0);
|
|
32
|
+
|
|
25
33
|
await page.click('text="Συνέχεια"');
|
|
26
34
|
|
|
27
35
|
const screenshot = await page.screenshot({
|
|
@@ -652,9 +652,9 @@ const el = {
|
|
|
652
652
|
email: 'Συμπληρώστε μια έγκυρη ηλεκτρονική διεύθυνση (e-mail).',
|
|
653
653
|
afm: 'Ο Α.Φ.Μ που πληκτρολογήσατε είναι λανθασμένος.',
|
|
654
654
|
file_size:
|
|
655
|
-
'Το μέγεθος του αρχείου είναι μεγαλύτερο
|
|
655
|
+
'Το μέγεθος του αρχείου είναι μεγαλύτερο από το επιτρεπόμενο ({{maxSize}} Bytes).',
|
|
656
656
|
image_size:
|
|
657
|
-
'Το μέγεθος της φωτογραφίας είναι μεγαλύτερο
|
|
657
|
+
'Το μέγεθος της φωτογραφίας είναι μεγαλύτερο από το επιτρεπόμενο ({{maxSize}} Bytes).',
|
|
658
658
|
mobile_phone: 'Συμπληρώστε έναν έγκυρο αριθμό κινητού τηλεφώνου.',
|
|
659
659
|
phone_number: 'Συμπληρώστε έναν έγκυρο αριθμό τηλεφώνου.',
|
|
660
660
|
landline: 'Συμπληρώστε έναν έγκυρο αριθμό σταθερού τηλεφώνου.',
|
|
@@ -1122,7 +1122,7 @@ const inputsScenarios = [
|
|
|
1122
1122
|
type: 'error',
|
|
1123
1123
|
fieldKey: 'image',
|
|
1124
1124
|
args: {
|
|
1125
|
-
|
|
1125
|
+
maxSize: 300,
|
|
1126
1126
|
},
|
|
1127
1127
|
text: el.form.error.image_size,
|
|
1128
1128
|
},
|
|
@@ -1130,7 +1130,7 @@ const inputsScenarios = [
|
|
|
1130
1130
|
type: 'error',
|
|
1131
1131
|
fieldKey: 'file',
|
|
1132
1132
|
args: {
|
|
1133
|
-
|
|
1133
|
+
maxSize: 300,
|
|
1134
1134
|
},
|
|
1135
1135
|
text: el.form.error.file_size,
|
|
1136
1136
|
},
|
|
@@ -1462,7 +1462,7 @@ const inputsInputScenarios = [
|
|
|
1462
1462
|
{
|
|
1463
1463
|
title: 'empty fill for inputs Input',
|
|
1464
1464
|
describe: 'inputs Input scenario',
|
|
1465
|
-
delay:
|
|
1465
|
+
delay: 5_000,
|
|
1466
1466
|
fields: [...INPUTS_INPUT_FIELDS, ...ERROR_GROUPING_FIELDS],
|
|
1467
1467
|
fill: [],
|
|
1468
1468
|
expect: [
|
|
@@ -1564,7 +1564,7 @@ const inputsInputScenarios = [
|
|
|
1564
1564
|
},
|
|
1565
1565
|
{
|
|
1566
1566
|
fieldKey: 'email',
|
|
1567
|
-
value: '
|
|
1567
|
+
value: 'example@mail.',
|
|
1568
1568
|
},
|
|
1569
1569
|
{
|
|
1570
1570
|
fieldKey: 'location',
|
|
@@ -1947,7 +1947,7 @@ const scenarios = [
|
|
|
1947
1947
|
...inputsInputScenarios,
|
|
1948
1948
|
];
|
|
1949
1949
|
|
|
1950
|
-
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
|
|
1950
|
+
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
1951
1951
|
|
|
1952
1952
|
for (const scenario of scenarios) {
|
|
1953
1953
|
test.describe(scenario.describe, () => {
|
package/src/FormContext.tsx
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import React, { createContext } from 'react';
|
|
1
|
+
import React, { createContext, useContext } from 'react';
|
|
2
2
|
import { FormContextProps } from '@digigov/form/types';
|
|
3
3
|
|
|
4
4
|
export const FormContext: React.Context<FormContextProps> = createContext({
|
|
5
5
|
fieldsMap: {},
|
|
6
6
|
fieldsetsMap: {},
|
|
7
7
|
} as FormContextProps);
|
|
8
|
+
|
|
9
|
+
export const useFormContext = () => {
|
|
10
|
+
return useContext(FormContext);
|
|
11
|
+
};
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import MultiplicityField from '@digigov/form/MultiplicityField';
|
|
2
|
+
import doc from './doc.mdx?raw';
|
|
2
3
|
export default {
|
|
3
4
|
title: 'Digigov Form/MultiplicityField',
|
|
4
5
|
component: MultiplicityField,
|
|
6
|
+
tags: ['autodocs'],
|
|
7
|
+
markdown: doc,
|
|
5
8
|
displayName: 'MultiplicityField',
|
|
6
9
|
};
|
|
7
10
|
export { Default } from '@digigov/form/MultiplicityField/__stories__/Default';
|
|
@@ -47,6 +47,7 @@ export const AddObjects: React.FC<AddObjectsProps> = ({
|
|
|
47
47
|
setValue,
|
|
48
48
|
stashedObjects,
|
|
49
49
|
getValues,
|
|
50
|
+
resetField,
|
|
50
51
|
onStash,
|
|
51
52
|
error,
|
|
52
53
|
Field,
|
|
@@ -187,6 +188,7 @@ export const AddObjects: React.FC<AddObjectsProps> = ({
|
|
|
187
188
|
control={control}
|
|
188
189
|
register={register}
|
|
189
190
|
reset={reset}
|
|
191
|
+
resetField={resetField}
|
|
190
192
|
Field={Field}
|
|
191
193
|
error={
|
|
192
194
|
extra?.max - stashedObjects.length === 0 ||
|