@digigov/form 2.0.0-555d1027 → 2.0.0-5e7a6790
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/ErrorGroup.d.ts +3 -3
- package/Field/ErrorGroup.js.map +1 -1
- package/Field/FieldBase/index.js +0 -1
- package/Field/FieldBase.d.ts +1 -1
- package/Field/FieldBase.js.map +2 -2
- package/Field/FieldBaseContainer/index.js +36 -34
- package/Field/FieldBaseContainer.d.ts +2 -2
- package/Field/FieldBaseContainer.js.map +2 -2
- package/Field/FieldConditional.d.ts +1 -1
- package/Field/FieldConditional.js.map +1 -1
- package/Field/index.d.ts +1 -1
- package/Field/index.js +15 -25
- package/Field/index.js.map +2 -2
- package/Field/types.d.ts +11 -10
- package/Field/utils/evaluateFieldWithConditions.d.ts +2 -2
- package/Field/utils/evaluateFieldWithConditions.js.map +2 -2
- package/Field/utils/resolveField/index.js +35 -0
- package/Field/utils/{calculateField → resolveField}/package.json +1 -1
- package/Field/utils/resolveField.d.ts +3 -0
- package/Field/utils/resolveField.js.map +7 -0
- package/Field/utils/useField/index.js +4 -2
- package/Field/utils/useField.d.ts +1 -1
- package/Field/utils/useField.js.map +2 -2
- package/FieldArray/BaseFieldArray/index.js +76 -0
- package/{inputs/inputsScenarios → FieldArray/BaseFieldArray}/package.json +1 -1
- package/FieldArray/BaseFieldArray.d.ts +5 -0
- package/FieldArray/BaseFieldArray.js.map +7 -0
- package/FieldArray/FormDialog/ArrayDisplay/ArrayDisplay.stories.d.ts +10 -0
- package/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay/index.js +97 -0
- package/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay/package.json +6 -0
- package/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay.d.ts +22 -0
- package/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay.js.map +7 -0
- package/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader/index.js +11 -0
- package/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader/package.json +6 -0
- package/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader.d.ts +5 -0
- package/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader.js.map +7 -0
- package/FieldArray/FormDialog/ArrayDisplay/__stories__/Default.d.ts +2 -0
- package/FieldArray/FormDialog/ArrayDisplay/__stories__/ReadOnly.d.ts +2 -0
- package/FieldArray/FormDialog/ArrayDisplay/__stories__/Sortable.d.ts +2 -0
- package/FieldArray/FormDialog/ArrayDisplay/index.d.ts +14 -0
- package/FieldArray/FormDialog/ArrayDisplay/index.js +51 -0
- package/FieldArray/FormDialog/ArrayDisplay/index.js.map +7 -0
- package/FieldArray/FormDialog/ArrayDisplay/package.json +6 -0
- package/FieldArray/FormDialog/ArrayEditModal/index.js +149 -0
- package/FieldArray/FormDialog/ArrayEditModal/package.json +6 -0
- package/FieldArray/FormDialog/ArrayEditModal.d.ts +26 -0
- package/FieldArray/FormDialog/ArrayEditModal.js.map +7 -0
- package/FieldArray/FormDialog/index.d.ts +19 -0
- package/FieldArray/FormDialog/index.js +139 -348
- package/FieldArray/FormDialog/index.js.map +7 -0
- package/FieldArray/index.d.ts +4 -2
- package/FieldArray/index.js +28 -54
- package/FieldArray/index.js.map +2 -2
- package/FieldObject/index.d.ts +4 -4
- package/FieldObject/index.js +5 -12
- package/FieldObject/index.js.map +2 -2
- package/Fieldset/FieldsetWithContext.js.map +1 -1
- package/Fieldset/index.d.ts +1 -1
- package/Fieldset/index.js.map +1 -1
- package/Fieldset/types.d.ts +2 -2
- package/FormBuilder/index.d.ts +1 -1
- package/FormBuilder/index.js +155 -130
- package/FormBuilder/index.js.map +2 -2
- package/FormContext.d.ts +2 -2
- package/FormContext.js.map +2 -2
- package/MultiplicityField/add-objects/index.js +10 -19
- package/MultiplicityField/add-objects.d.ts +1 -1
- package/MultiplicityField/add-objects.js.map +2 -2
- package/MultiplicityField/index.d.ts +2 -2
- package/MultiplicityField/index.js.map +2 -2
- package/MultiplicityField/types.d.ts +2 -2
- package/Questions/Questions.d.ts +1 -1
- package/Questions/Questions.js.map +1 -1
- package/Questions/QuestionsContext.d.ts +1 -1
- package/Questions/QuestionsContext.js.map +1 -1
- package/Questions/Step/Step.d.ts +1 -1
- package/Questions/Step/Step.js.map +1 -1
- package/Questions/Step/StepArrayReview.d.ts +1 -1
- package/Questions/Step/StepArrayReview.js.map +1 -1
- package/Questions/Step/StepContext.d.ts +1 -1
- package/Questions/Step/StepContext.js.map +1 -1
- package/Questions/Step/StepDescription.d.ts +1 -1
- package/Questions/Step/StepDescription.js.map +2 -2
- package/Questions/Step/StepForm.d.ts +2 -2
- package/Questions/Step/StepForm.js.map +1 -1
- package/Questions/Step/StepQuote.d.ts +1 -1
- package/Questions/Step/StepQuote.js.map +2 -2
- package/Questions/Step/StepTitle.d.ts +1 -1
- package/Questions/Step/StepTitle.js.map +2 -2
- package/Questions/Step/getAddMoreFields.d.ts +2 -2
- package/Questions/Step/getAddMoreFields.js.map +1 -1
- package/Questions/Step/types.d.ts +1 -1
- package/Questions/getNextStep.d.ts +1 -1
- package/Questions/getNextStep.js.map +1 -1
- package/Questions/types.d.ts +1 -1
- package/cjs/Field/ErrorGroup.js.map +1 -1
- package/cjs/Field/FieldBase/index.js +0 -1
- package/cjs/Field/FieldBase.js.map +2 -2
- package/cjs/Field/FieldBaseContainer/index.js +36 -34
- package/cjs/Field/FieldBaseContainer.js.map +2 -2
- package/cjs/Field/FieldConditional.js.map +1 -1
- package/cjs/Field/index.js +15 -22
- package/cjs/Field/index.js.map +2 -2
- package/cjs/Field/types.js.map +1 -1
- package/cjs/Field/utils/evaluateFieldWithConditions.js.map +2 -2
- package/cjs/Field/utils/resolveField/index.js +55 -0
- package/cjs/Field/utils/resolveField.js.map +7 -0
- package/cjs/Field/utils/useField/index.js +4 -2
- package/cjs/Field/utils/useField.js.map +2 -2
- package/cjs/FieldArray/BaseFieldArray/index.js +109 -0
- package/cjs/FieldArray/BaseFieldArray.js.map +7 -0
- package/cjs/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay/index.js +130 -0
- package/cjs/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay.js.map +7 -0
- package/cjs/{locales/el → FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader}/index.js +16 -7
- package/cjs/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader.js.map +7 -0
- package/cjs/FieldArray/FormDialog/ArrayDisplay/index.js +84 -0
- package/cjs/FieldArray/FormDialog/ArrayDisplay/index.js.map +7 -0
- package/cjs/FieldArray/FormDialog/ArrayEditModal/index.js +177 -0
- package/cjs/FieldArray/FormDialog/ArrayEditModal.js.map +7 -0
- package/cjs/FieldArray/FormDialog/index.js +130 -331
- package/cjs/FieldArray/FormDialog/index.js.map +7 -0
- package/cjs/FieldArray/index.js +27 -53
- package/cjs/FieldArray/index.js.map +3 -3
- package/cjs/FieldObject/index.js +5 -9
- package/cjs/FieldObject/index.js.map +2 -2
- package/cjs/Fieldset/FieldsetWithContext.js.map +1 -1
- package/cjs/Fieldset/index.js.map +1 -1
- package/cjs/Fieldset/types.js.map +1 -1
- package/cjs/FormBuilder/index.js +156 -131
- package/cjs/FormBuilder/index.js.map +3 -3
- package/cjs/FormContext.js.map +2 -2
- package/cjs/MultiplicityField/add-objects/index.js +9 -13
- package/cjs/MultiplicityField/add-objects.js.map +2 -2
- package/cjs/MultiplicityField/index.js.map +2 -2
- package/cjs/MultiplicityField/types.js.map +1 -1
- package/cjs/Questions/Questions.js.map +1 -1
- package/cjs/Questions/QuestionsContext.js.map +1 -1
- package/cjs/Questions/Step/Step.js.map +1 -1
- package/cjs/Questions/Step/StepArrayReview.js.map +1 -1
- package/cjs/Questions/Step/StepContext.js.map +1 -1
- package/cjs/Questions/Step/StepDescription.js.map +2 -2
- package/cjs/Questions/Step/StepForm.js.map +1 -1
- package/cjs/Questions/Step/StepQuote.js.map +2 -2
- package/cjs/Questions/Step/StepTitle.js.map +2 -2
- package/cjs/Questions/Step/getAddMoreFields.js.map +1 -1
- package/cjs/Questions/Step/types.js.map +1 -1
- package/cjs/Questions/getNextStep.js.map +1 -1
- package/cjs/Questions/types.js.map +1 -1
- package/cjs/hooks/useFieldFocusManager/index.js +135 -0
- package/cjs/hooks/useFieldFocusManager.js.map +7 -0
- package/cjs/hooks/utils/index.js +98 -0
- package/cjs/hooks/utils.js.map +7 -0
- package/cjs/inputs/AutoCompleteInput/index.js.map +2 -2
- package/cjs/inputs/Checkboxes/index.js +67 -63
- package/cjs/inputs/Checkboxes/index.js.map +2 -2
- package/cjs/inputs/DateInput/index.js +10 -5
- package/cjs/inputs/DateInput/index.js.map +2 -2
- package/cjs/inputs/DateTimeInput/index.js +10 -5
- package/cjs/inputs/DateTimeInput/index.js.map +2 -2
- package/cjs/inputs/FileInput/index.js.map +2 -2
- package/cjs/inputs/ImageInput/index.js.map +1 -1
- package/cjs/inputs/Input/index.js +54 -56
- package/cjs/inputs/Input/index.js.map +2 -2
- package/cjs/inputs/Label/index.js.map +1 -1
- package/cjs/inputs/OtpInput/index.js +36 -31
- package/cjs/inputs/OtpInput/index.js.map +2 -2
- package/cjs/inputs/Radio/index.js +5 -4
- package/cjs/inputs/Radio/index.js.map +3 -3
- package/cjs/inputs/Select/index.js.map +1 -1
- package/cjs/{Field/utils → inputs/registry}/index.js +4 -4
- package/cjs/inputs/registry.js.map +7 -0
- package/cjs/{lazy/index.js → lazy.js} +10 -9
- package/cjs/lazy.js.map +2 -2
- package/cjs/{registry/index.js → registry.js} +23 -13
- package/cjs/registry.js.map +2 -2
- package/cjs/types.js.map +1 -1
- package/cjs/utils.js.map +2 -2
- package/cjs/validators/index.js.map +2 -2
- package/cjs/validators/types.js.map +1 -1
- package/cjs/validators/utils/date/index.js +6 -1
- package/cjs/validators/utils/date.js.map +2 -2
- package/cjs/validators/utils/datetime/index.js +6 -1
- package/cjs/validators/utils/datetime.js.map +2 -2
- package/cjs/validators/utils/file.js.map +1 -1
- package/cjs/validators/utils/iban.js.map +1 -1
- package/cjs/validators/utils/image.js.map +1 -1
- package/cjs/validators/utils/index.js.map +1 -1
- package/cjs/validators/utils/int.js.map +1 -1
- package/cjs/validators/utils/number.js.map +1 -1
- package/cjs/validators/utils/otp.js.map +1 -1
- package/cjs/validators/utils/phone.js.map +1 -1
- package/cjs/validators/utils/postal_code.js.map +1 -1
- package/cjs/validators/utils/text_limit.js.map +1 -1
- package/hooks/useFieldFocusManager/index.js +116 -0
- package/hooks/useFieldFocusManager/package.json +6 -0
- package/hooks/useFieldFocusManager.d.ts +25 -0
- package/hooks/useFieldFocusManager.js.map +7 -0
- package/hooks/utils/index.js +73 -0
- package/{Field → hooks}/utils/package.json +1 -1
- package/hooks/utils.d.ts +18 -0
- package/hooks/utils.js.map +7 -0
- package/index.js +1 -1
- package/inputs/AutoCompleteInput/index.d.ts +3 -3
- package/inputs/AutoCompleteInput/index.js +1 -3
- package/inputs/AutoCompleteInput/index.js.map +2 -2
- package/inputs/Checkboxes/index.d.ts +3 -3
- package/inputs/Checkboxes/index.js +67 -63
- package/inputs/Checkboxes/index.js.map +2 -2
- package/inputs/DateInput/index.d.ts +2 -5
- package/inputs/DateInput/index.js +10 -5
- package/inputs/DateInput/index.js.map +2 -2
- package/inputs/DateTimeInput/index.d.ts +2 -5
- package/inputs/DateTimeInput/index.js +10 -5
- package/inputs/DateTimeInput/index.js.map +2 -2
- package/inputs/FileInput/index.d.ts +4 -4
- package/inputs/FileInput/index.js +1 -4
- package/inputs/FileInput/index.js.map +2 -2
- package/inputs/ImageInput/index.d.ts +2 -2
- package/inputs/ImageInput/index.js.map +1 -1
- package/inputs/Input/index.d.ts +2 -2
- package/inputs/Input/index.js +54 -56
- package/inputs/Input/index.js.map +2 -2
- package/inputs/Label/index.d.ts +1 -1
- package/inputs/Label/index.js.map +1 -1
- package/inputs/OtpInput/index.d.ts +1 -5
- package/inputs/OtpInput/index.js +36 -31
- package/inputs/OtpInput/index.js.map +2 -2
- package/inputs/Radio/index.d.ts +4 -4
- package/inputs/Radio/index.js +5 -4
- package/inputs/Radio/index.js.map +3 -3
- package/inputs/Select/index.d.ts +2 -2
- package/inputs/Select/index.js.map +1 -1
- package/{Field/utils → inputs/registry}/index.js +1 -1
- package/{locales/el → inputs/registry}/package.json +1 -1
- package/{Field/utils/index.d.ts → inputs/registry.d.ts} +2 -1
- package/inputs/registry.js.map +7 -0
- package/lazy/index.js +10 -9
- package/package.json +4 -4
- package/registry/index.js +23 -13
- package/src/Field/ErrorGroup.tsx +3 -3
- package/src/Field/FieldBase.tsx +1 -2
- package/src/Field/FieldBaseContainer.tsx +68 -58
- package/src/Field/FieldConditional.tsx +1 -1
- package/src/Field/index.tsx +15 -33
- package/src/Field/types.tsx +11 -12
- package/src/Field/utils/evaluateFieldWithConditions.ts +5 -2
- package/src/Field/utils/resolveField.ts +58 -0
- package/src/Field/utils/useField.ts +3 -1
- package/src/FieldArray/BaseFieldArray.tsx +97 -0
- package/src/FieldArray/FormDialog/ArrayDisplay/ArrayDisplay.stories.js +11 -0
- package/src/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay.tsx +165 -0
- package/src/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader.tsx +15 -0
- package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/Default.tsx +93 -0
- package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/ReadOnly.tsx +79 -0
- package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/Sortable.tsx +93 -0
- package/src/FieldArray/FormDialog/ArrayDisplay/index.tsx +75 -0
- package/src/FieldArray/FormDialog/ArrayEditModal.tsx +233 -0
- package/src/FieldArray/FormDialog/index.tsx +247 -0
- package/src/FieldArray/__tests__/fieldset-multiplicity.spec.tsx +271 -0
- package/src/FieldArray/__tests__/multiplicity-attachment.spec.tsx +280 -0
- package/src/FieldArray/__tests__/multiplicity-required.spec.tsx +131 -0
- package/src/FieldArray/__tests__/nested-fieldset-multiplicity.spec.tsx +627 -0
- package/src/FieldArray/__tests__/preference-multiple-choice.spec.tsx +222 -0
- package/src/FieldArray/index.spec.tsx +355 -0
- package/src/FieldArray/index.tsx +34 -61
- package/src/FieldObject/index.tsx +9 -17
- package/src/Fieldset/FieldsetWithContext.tsx +1 -1
- package/src/Fieldset/index.tsx +1 -1
- package/src/Fieldset/types.tsx +2 -2
- package/src/FormBuilder/index.tsx +188 -142
- package/src/FormBuilder/scenarios.test.tsx +759 -1
- package/src/FormContext.tsx +3 -2
- package/src/MultiplicityField/add-objects.tsx +12 -21
- package/src/MultiplicityField/index.tsx +3 -2
- package/src/MultiplicityField/types.ts +5 -2
- package/src/Questions/Questions.tsx +2 -2
- package/src/Questions/QuestionsContext.tsx +1 -1
- package/src/Questions/Step/Step.tsx +1 -1
- package/src/Questions/Step/StepArrayReview.tsx +2 -2
- package/src/Questions/Step/StepContext.tsx +1 -1
- package/src/Questions/Step/StepDescription.tsx +2 -1
- package/src/Questions/Step/StepForm.tsx +2 -2
- package/src/Questions/Step/StepQuote.tsx +2 -1
- package/src/Questions/Step/StepTitle.tsx +2 -1
- package/src/Questions/Step/getAddMoreFields.tsx +2 -2
- package/src/Questions/Step/types.tsx +1 -1
- package/src/Questions/getNextStep.tsx +1 -1
- package/src/Questions/types.tsx +1 -1
- package/src/hooks/__tests__/useFieldFocusManager.spec.tsx +1079 -0
- package/src/hooks/__tests__/utils.spec.ts +568 -0
- package/src/hooks/useFieldFocusManager.ts +162 -0
- package/src/hooks/utils.ts +122 -0
- package/src/inputs/AutoCompleteInput/index.tsx +4 -6
- package/src/inputs/Checkboxes/index.tsx +95 -87
- package/src/inputs/DateInput/index.tsx +19 -6
- package/src/inputs/DateTimeInput/index.tsx +19 -6
- package/src/inputs/FileInput/index.tsx +9 -7
- package/src/inputs/ImageInput/index.tsx +2 -2
- package/src/inputs/Input/index.tsx +72 -71
- package/src/inputs/Label/index.tsx +1 -1
- package/src/inputs/OtpInput/index.tsx +43 -34
- package/src/inputs/Radio/index.tsx +29 -21
- package/src/inputs/Select/index.tsx +2 -2
- package/src/{Field/utils/index.ts → inputs/registry.ts} +3 -1
- package/src/lazy.js +10 -9
- package/src/registry.js +23 -13
- package/src/types.tsx +12 -5
- package/src/utils.ts +3 -2
- package/src/validators/index.ts +10 -9
- package/src/validators/types.ts +1 -1
- package/src/validators/utils/date.ts +8 -3
- package/src/validators/utils/datetime.ts +8 -3
- package/src/validators/utils/file.ts +2 -2
- package/src/validators/utils/iban.ts +2 -2
- package/src/validators/utils/image.ts +2 -2
- package/src/validators/utils/index.ts +2 -2
- package/src/validators/utils/int.ts +1 -1
- package/src/validators/utils/number.ts +1 -1
- package/src/validators/utils/otp.ts +2 -2
- package/src/validators/utils/phone.ts +2 -2
- package/src/validators/utils/postal_code.ts +2 -2
- package/src/validators/utils/text_limit.ts +2 -2
- package/types.d.ts +8 -4
- package/types.js.map +1 -1
- package/utils.d.ts +1 -1
- package/utils.js.map +2 -2
- package/validators/index.d.ts +5 -5
- package/validators/index.js.map +2 -2
- package/validators/types.d.ts +1 -1
- package/validators/utils/date/index.js +6 -1
- package/validators/utils/date.d.ts +2 -2
- package/validators/utils/date.js.map +2 -2
- package/validators/utils/datetime/index.js +6 -1
- package/validators/utils/datetime.d.ts +2 -2
- package/validators/utils/datetime.js.map +2 -2
- package/validators/utils/file.d.ts +2 -2
- package/validators/utils/file.js.map +1 -1
- package/validators/utils/iban.d.ts +2 -2
- package/validators/utils/iban.js.map +1 -1
- package/validators/utils/image.d.ts +2 -2
- package/validators/utils/image.js.map +1 -1
- package/validators/utils/index.d.ts +2 -2
- package/validators/utils/index.js.map +1 -1
- package/validators/utils/int.d.ts +1 -1
- package/validators/utils/int.js.map +1 -1
- package/validators/utils/number.d.ts +1 -1
- package/validators/utils/number.js.map +1 -1
- package/validators/utils/otp.d.ts +2 -2
- package/validators/utils/otp.js.map +1 -1
- package/validators/utils/phone.d.ts +2 -2
- package/validators/utils/phone.js.map +1 -1
- package/validators/utils/postal_code.d.ts +2 -2
- package/validators/utils/postal_code.js.map +1 -1
- package/validators/utils/text_limit.d.ts +2 -2
- package/validators/utils/text_limit.js.map +1 -1
- package/Field/utils/calculateField/index.js +0 -27
- package/Field/utils/calculateField.d.ts +0 -2
- package/Field/utils/calculateField.js.map +0 -7
- package/Field/utils/index.js.map +0 -7
- package/FieldArray/FormDialog.d.ts +0 -67
- package/FieldArray/FormDialog.js.map +0 -7
- package/FormBuilder/index.test.d.ts +0 -1
- package/FormBuilder/interaction.test.d.ts +0 -1
- package/FormBuilder/scenarios.test.d.ts +0 -88
- package/MultiplicityField/index.test.d.ts +0 -1
- package/Questions/index.spec.d.ts +0 -1
- package/Questions/index.test.d.ts +0 -1
- package/cjs/Field/utils/calculateField/index.js +0 -50
- package/cjs/Field/utils/calculateField.js.map +0 -7
- package/cjs/Field/utils/index.js.map +0 -7
- package/cjs/FieldArray/FormDialog.js.map +0 -7
- package/cjs/inputs/inputsScenarios/index.js +0 -533
- package/cjs/inputs/inputsScenarios.js.map +0 -7
- package/cjs/locales/el.js.map +0 -7
- package/inputs/AutoCompleteInput/index.test.d.ts +0 -1
- package/inputs/Checkboxes/index.test.d.ts +0 -1
- package/inputs/DateInput/index.test.d.ts +0 -1
- package/inputs/DateTimeInput/index.test.d.ts +0 -1
- package/inputs/FileInput/index.test.d.ts +0 -1
- package/inputs/ImageInput/index.test.d.ts +0 -1
- package/inputs/Input/index.test.d.ts +0 -1
- package/inputs/Label/index.test.d.ts +0 -1
- package/inputs/OtpInput/index.test.d.ts +0 -1
- package/inputs/Radio/index.test.d.ts +0 -1
- package/inputs/Select/index.test.d.ts +0 -1
- package/inputs/inputsScenarios/index.js +0 -499
- package/inputs/inputsScenarios.d.ts +0 -296
- package/inputs/inputsScenarios.js.map +0 -7
- package/locales/el/index.js +0 -6
- package/locales/el.d.ts +0 -2
- package/locales/el.js.map +0 -7
- package/src/Field/utils/calculateField.ts +0 -49
- package/src/FieldArray/FormDialog.tsx +0 -568
- package/src/inputs/inputsScenarios.ts +0 -496
- package/src/locales/el.ts +0 -3
- /package/{FieldArray/index.test.d.ts → hooks/__tests__/utils.spec.d.ts} +0 -0
|
@@ -0,0 +1,627 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
fireEvent,
|
|
4
|
+
render,
|
|
5
|
+
screen,
|
|
6
|
+
waitFor,
|
|
7
|
+
within,
|
|
8
|
+
} from '@testing-library/react';
|
|
9
|
+
import type { FieldSpec } from '@digigov/form';
|
|
10
|
+
import FormBuilder, { Field } from '@digigov/form';
|
|
11
|
+
import { Button } from '@digigov/ui/form/Button';
|
|
12
|
+
|
|
13
|
+
beforeAll(() => {
|
|
14
|
+
global.ResizeObserver = class ResizeObserver {
|
|
15
|
+
observe() {
|
|
16
|
+
// do nothing
|
|
17
|
+
}
|
|
18
|
+
unobserve() {
|
|
19
|
+
// do nothing
|
|
20
|
+
}
|
|
21
|
+
disconnect() {
|
|
22
|
+
// do nothing
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const fieldSpec: FieldSpec = {
|
|
28
|
+
key: 'nested_fieldset_multiplicity',
|
|
29
|
+
type: 'array',
|
|
30
|
+
editable: true,
|
|
31
|
+
label: {
|
|
32
|
+
primary:
|
|
33
|
+
'Fieldset με multiplicity που περιέχει πεδία με multiplicity (multiplinception)',
|
|
34
|
+
},
|
|
35
|
+
extra: {
|
|
36
|
+
noIndex: true,
|
|
37
|
+
tableCellActionsLabel: '',
|
|
38
|
+
border: true,
|
|
39
|
+
variant: 'dialog',
|
|
40
|
+
labelSize: 'md',
|
|
41
|
+
tableContainer: {
|
|
42
|
+
mb: 0,
|
|
43
|
+
},
|
|
44
|
+
stackProps: {
|
|
45
|
+
spacing: 2,
|
|
46
|
+
justifyContent: 'flex-end',
|
|
47
|
+
direction: 'row',
|
|
48
|
+
},
|
|
49
|
+
max: 5,
|
|
50
|
+
label: {
|
|
51
|
+
object: {
|
|
52
|
+
append: {
|
|
53
|
+
label: 'Αποθήκευση',
|
|
54
|
+
props: {
|
|
55
|
+
color: 'primary',
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
edit: {
|
|
59
|
+
label: 'Αποθήκευση',
|
|
60
|
+
props: {
|
|
61
|
+
color: 'primary',
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
cancel: {
|
|
65
|
+
label: 'Ακύρωση',
|
|
66
|
+
props: {
|
|
67
|
+
variant: 'button',
|
|
68
|
+
color: 'secondary',
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
add: 'Προσθήκη',
|
|
72
|
+
addButtonVariant: 'link',
|
|
73
|
+
delete: 'Αφαίρεση',
|
|
74
|
+
deleteButtonVariant: 'link',
|
|
75
|
+
nothing_added: 'Δεν έχουν προστεθεί στοιχεία',
|
|
76
|
+
nothing_added_props: {
|
|
77
|
+
style: {
|
|
78
|
+
color: 'var(--color-gray-600)',
|
|
79
|
+
},
|
|
80
|
+
margin: 0,
|
|
81
|
+
paddingLeft: 2,
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
of: {
|
|
86
|
+
type: 'object',
|
|
87
|
+
extra: {
|
|
88
|
+
fields: [
|
|
89
|
+
{
|
|
90
|
+
type: 'array',
|
|
91
|
+
key: 'nested_multiplicity_required',
|
|
92
|
+
name: 'nested_multiplicity_required',
|
|
93
|
+
label: {
|
|
94
|
+
primary: '"required" μέχρι 10',
|
|
95
|
+
secondary:
|
|
96
|
+
'Ο χρήστης μπορεί να προσθέσει τιμές (σύνολο από 1 έως 10)',
|
|
97
|
+
},
|
|
98
|
+
extra: {
|
|
99
|
+
editVariant: 'required',
|
|
100
|
+
noIndex: true,
|
|
101
|
+
border: false,
|
|
102
|
+
noHeader: true,
|
|
103
|
+
variant: 'dialog',
|
|
104
|
+
min: 1,
|
|
105
|
+
max: 10,
|
|
106
|
+
tableContainer: {
|
|
107
|
+
mb: 0,
|
|
108
|
+
},
|
|
109
|
+
stackProps: {
|
|
110
|
+
spacing: 2,
|
|
111
|
+
justifyContent: 'flex-end',
|
|
112
|
+
direction: 'row',
|
|
113
|
+
},
|
|
114
|
+
label: {
|
|
115
|
+
object: {
|
|
116
|
+
append: {
|
|
117
|
+
label: 'Αποθήκευση',
|
|
118
|
+
props: {
|
|
119
|
+
color: 'primary',
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
edit: {
|
|
123
|
+
label: 'Αποθήκευση',
|
|
124
|
+
props: {
|
|
125
|
+
color: 'primary',
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
cancel: {
|
|
129
|
+
label: 'Ακύρωση',
|
|
130
|
+
props: {
|
|
131
|
+
variant: 'button',
|
|
132
|
+
color: 'secondary',
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
add: 'Προσθήκη',
|
|
136
|
+
addButtonVariant: 'link',
|
|
137
|
+
delete: 'Αφαίρεση',
|
|
138
|
+
deleteButtonVariant: 'link',
|
|
139
|
+
nothing_added: 'Δεν έχουν προστεθεί στοιχεία',
|
|
140
|
+
nothing_added_props: {
|
|
141
|
+
style: {
|
|
142
|
+
color: 'var(--color-gray-600)',
|
|
143
|
+
},
|
|
144
|
+
margin: 0,
|
|
145
|
+
paddingLeft: 2,
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
of: {
|
|
150
|
+
type: 'string',
|
|
151
|
+
label: {},
|
|
152
|
+
editable: true,
|
|
153
|
+
required: true,
|
|
154
|
+
layout: {},
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
required: true,
|
|
158
|
+
editable: true,
|
|
159
|
+
layout: {},
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
type: 'array',
|
|
163
|
+
key: 'nested_multiplicity_optional',
|
|
164
|
+
name: 'nested_multiplicity_optional',
|
|
165
|
+
label: {
|
|
166
|
+
primary: '"optional" μέχρι 10',
|
|
167
|
+
secondary:
|
|
168
|
+
'Ο χρήστης μπορεί να προσθέσει τιμές (σύνολο από 1 έως 10)',
|
|
169
|
+
},
|
|
170
|
+
extra: {
|
|
171
|
+
editVariant: 'optional',
|
|
172
|
+
noIndex: true,
|
|
173
|
+
border: false,
|
|
174
|
+
noHeader: true,
|
|
175
|
+
variant: 'dialog',
|
|
176
|
+
min: 0,
|
|
177
|
+
max: 10,
|
|
178
|
+
tableContainer: {
|
|
179
|
+
mb: 0,
|
|
180
|
+
},
|
|
181
|
+
stackProps: {
|
|
182
|
+
spacing: 2,
|
|
183
|
+
justifyContent: 'flex-end',
|
|
184
|
+
direction: 'row',
|
|
185
|
+
},
|
|
186
|
+
label: {
|
|
187
|
+
object: {
|
|
188
|
+
append: {
|
|
189
|
+
label: 'Αποθήκευση',
|
|
190
|
+
props: {
|
|
191
|
+
color: 'primary',
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
edit: {
|
|
195
|
+
label: 'Αποθήκευση',
|
|
196
|
+
props: {
|
|
197
|
+
color: 'primary',
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
cancel: {
|
|
201
|
+
label: 'Ακύρωση',
|
|
202
|
+
props: {
|
|
203
|
+
variant: 'button',
|
|
204
|
+
color: 'secondary',
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
|
+
add: 'Προσθήκη',
|
|
208
|
+
addButtonVariant: 'link',
|
|
209
|
+
delete: 'Αφαίρεση',
|
|
210
|
+
deleteButtonVariant: 'link',
|
|
211
|
+
nothing_added: 'Δεν έχουν προστεθεί στοιχεία',
|
|
212
|
+
nothing_added_props: {
|
|
213
|
+
style: {
|
|
214
|
+
color: 'var(--color-gray-600)',
|
|
215
|
+
},
|
|
216
|
+
margin: 0,
|
|
217
|
+
paddingLeft: 2,
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
of: {
|
|
222
|
+
type: 'string',
|
|
223
|
+
label: {},
|
|
224
|
+
required: false,
|
|
225
|
+
editable: true,
|
|
226
|
+
layout: {},
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
required: false,
|
|
230
|
+
editable: true,
|
|
231
|
+
layout: {},
|
|
232
|
+
},
|
|
233
|
+
],
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
describe('nested_fieldset_multiplicity case from dilosi', () => {
|
|
240
|
+
const submitHandler = vi.fn();
|
|
241
|
+
|
|
242
|
+
const TestForm = () => (
|
|
243
|
+
<FormBuilder onSubmit={submitHandler}>
|
|
244
|
+
<Field name="nested_fieldset_multiplicity" {...fieldSpec} />
|
|
245
|
+
<Button type="submit">Συνέχεια</Button>
|
|
246
|
+
</FormBuilder>
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
beforeEach(() => {
|
|
250
|
+
submitHandler.mockClear();
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
it('should render', async () => {
|
|
254
|
+
render(<TestForm />);
|
|
255
|
+
expect(
|
|
256
|
+
screen.getByText(
|
|
257
|
+
'Fieldset με multiplicity που περιέχει πεδία με multiplicity (multiplinception)'
|
|
258
|
+
)
|
|
259
|
+
).toBeInTheDocument();
|
|
260
|
+
const addButton = screen.getByRole('button', { name: 'Προσθήκη' });
|
|
261
|
+
expect(addButton).toBeInTheDocument();
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it('should open dialog on "add" button click', async () => {
|
|
265
|
+
render(<TestForm />);
|
|
266
|
+
const addButton = screen.getByRole('button', { name: 'Προσθήκη' });
|
|
267
|
+
fireEvent.click(addButton);
|
|
268
|
+
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
for (const fieldsetType of ['required', 'optional'] as const) {
|
|
272
|
+
it(`should open the nested_multiplicity_${fieldsetType} dialog on nested "add" button click`, async () => {
|
|
273
|
+
render(<TestForm />);
|
|
274
|
+
openMainDialog();
|
|
275
|
+
const nestedFieldset = getNestedFieldset(fieldsetType);
|
|
276
|
+
const nestedFieldsetAddButton = within(nestedFieldset!).getByRole(
|
|
277
|
+
'button',
|
|
278
|
+
{ name: 'Προσθήκη' }
|
|
279
|
+
);
|
|
280
|
+
fireEvent.click(nestedFieldsetAddButton);
|
|
281
|
+
expect(screen.getAllByRole('dialog').length).toBe(2);
|
|
282
|
+
const inputField = screen.getByRole('textbox');
|
|
283
|
+
expect(inputField).toBeInTheDocument();
|
|
284
|
+
expect(inputField).toHaveProperty(
|
|
285
|
+
'name',
|
|
286
|
+
`nested_multiplicity_${fieldsetType}`
|
|
287
|
+
);
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
it('should validate nested_multiplicity_required', async () => {
|
|
292
|
+
render(<TestForm />);
|
|
293
|
+
openMainDialog();
|
|
294
|
+
const submitButton = screen.getByRole('button', {
|
|
295
|
+
name: 'Αποθήκευση',
|
|
296
|
+
});
|
|
297
|
+
fireEvent.click(submitButton);
|
|
298
|
+
|
|
299
|
+
expect(
|
|
300
|
+
await screen.findByText(
|
|
301
|
+
'Το πεδίο πρέπει να έχει τουλάχιστον 1 εγγραφές. Προσθέστε μια ακόμα επιλέγοντας την απάντηση «Ναι» στην επόμενη ερώτηση.'
|
|
302
|
+
)
|
|
303
|
+
).toBeInTheDocument();
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
it('should validate nested_multiplicity_required string field', async () => {
|
|
307
|
+
render(<TestForm />);
|
|
308
|
+
openMainDialog();
|
|
309
|
+
const nestedFieldset = getNestedFieldset('required');
|
|
310
|
+
const nestedFieldsetAddButton = within(nestedFieldset).getByRole('button', {
|
|
311
|
+
name: 'Προσθήκη',
|
|
312
|
+
});
|
|
313
|
+
fireEvent.click(nestedFieldsetAddButton);
|
|
314
|
+
expect(screen.getAllByRole('dialog').length).toBe(2);
|
|
315
|
+
const inputField = screen.getByRole('textbox');
|
|
316
|
+
expect(inputField).toHaveProperty('name', `nested_multiplicity_required`);
|
|
317
|
+
const submitButton = screen.getAllByRole('button', {
|
|
318
|
+
name: 'Αποθήκευση',
|
|
319
|
+
})[1];
|
|
320
|
+
fireEvent.click(submitButton);
|
|
321
|
+
await waitFor(() =>
|
|
322
|
+
expect(
|
|
323
|
+
screen.getByText('Το πεδίο είναι υποχρεωτικό.')
|
|
324
|
+
).toBeInTheDocument()
|
|
325
|
+
);
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
it('should submit nested_multiplicity_required item added by nested form', async () => {
|
|
329
|
+
render(<TestForm />);
|
|
330
|
+
openMainDialog();
|
|
331
|
+
const nestedFieldset = getNestedFieldset('required');
|
|
332
|
+
const nestedFieldsetAddButton = within(nestedFieldset).getByRole('button', {
|
|
333
|
+
name: 'Προσθήκη',
|
|
334
|
+
});
|
|
335
|
+
fireEvent.click(nestedFieldsetAddButton);
|
|
336
|
+
expect(screen.getAllByRole('dialog').length).toBe(2);
|
|
337
|
+
const nestedFieldsetInput = screen.getByRole('textbox');
|
|
338
|
+
expect(nestedFieldsetInput).toBeInTheDocument();
|
|
339
|
+
expect(nestedFieldsetInput).toHaveProperty(
|
|
340
|
+
'name',
|
|
341
|
+
`nested_multiplicity_required`
|
|
342
|
+
);
|
|
343
|
+
fireEvent.change(nestedFieldsetInput, {
|
|
344
|
+
target: { value: 'Test Value' },
|
|
345
|
+
});
|
|
346
|
+
expect(nestedFieldsetInput).toHaveValue('Test Value');
|
|
347
|
+
// There are two "Αποθήκευση" buttons, one for the nested dialog and one for the main dialog
|
|
348
|
+
const submitButton = screen.getAllByRole('button', {
|
|
349
|
+
name: 'Αποθήκευση',
|
|
350
|
+
})[1];
|
|
351
|
+
fireEvent.click(submitButton);
|
|
352
|
+
await waitFor(() => {
|
|
353
|
+
// Only one dialog should remain open (the main one)
|
|
354
|
+
expect(screen.getAllByRole('dialog').length).toBe(1);
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
expect(screen.getByText('Test Value')).toBeInTheDocument();
|
|
358
|
+
expect(submitHandler).not.toHaveBeenCalled();
|
|
359
|
+
|
|
360
|
+
const mainDialogSubmitButton = screen.getByRole('button', {
|
|
361
|
+
name: 'Αποθήκευση',
|
|
362
|
+
});
|
|
363
|
+
fireEvent.click(mainDialogSubmitButton);
|
|
364
|
+
await waitFor(() => {
|
|
365
|
+
expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
|
|
366
|
+
});
|
|
367
|
+
expect(screen.getByText('Test Value')).toBeInTheDocument();
|
|
368
|
+
const continueButton = screen.getByRole('button', { name: 'Συνέχεια' });
|
|
369
|
+
expect(continueButton).toBeInTheDocument();
|
|
370
|
+
fireEvent.click(continueButton);
|
|
371
|
+
await waitFor(() => {
|
|
372
|
+
expect(submitHandler).toHaveBeenCalledTimes(1);
|
|
373
|
+
});
|
|
374
|
+
expect(submitHandler).toHaveBeenCalledWith({
|
|
375
|
+
nested_fieldset_multiplicity: expect.arrayContaining([
|
|
376
|
+
{
|
|
377
|
+
nested_multiplicity_required: ['Test Value'],
|
|
378
|
+
nested_multiplicity_optional: [],
|
|
379
|
+
},
|
|
380
|
+
]),
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
it('should submit both nested_multiplicity_required and nested_multiplicity_optional items added by nested forms', async () => {
|
|
385
|
+
render(<TestForm />);
|
|
386
|
+
openMainDialog();
|
|
387
|
+
|
|
388
|
+
// Add multiple nested_multiplicity_required items
|
|
389
|
+
const requiredNestedFieldset = getNestedFieldset('required');
|
|
390
|
+
const requiredNestedFieldsetAddButton = within(
|
|
391
|
+
requiredNestedFieldset
|
|
392
|
+
).getByRole('button', {
|
|
393
|
+
name: 'Προσθήκη',
|
|
394
|
+
});
|
|
395
|
+
fireEvent.click(requiredNestedFieldsetAddButton);
|
|
396
|
+
expect(screen.getAllByRole('dialog').length).toBe(2);
|
|
397
|
+
const requiredNestedFieldsetInput = screen.getByRole('textbox');
|
|
398
|
+
expect(requiredNestedFieldsetInput).toBeInTheDocument();
|
|
399
|
+
expect(requiredNestedFieldsetInput).toHaveProperty(
|
|
400
|
+
'name',
|
|
401
|
+
`nested_multiplicity_required`
|
|
402
|
+
);
|
|
403
|
+
fireEvent.change(requiredNestedFieldsetInput, {
|
|
404
|
+
target: { value: 'Required Test Value 1' },
|
|
405
|
+
});
|
|
406
|
+
expect(requiredNestedFieldsetInput).toHaveValue('Required Test Value 1');
|
|
407
|
+
// There are two "Αποθήκευση" buttons, one for the nested dialog and one for the main dialog
|
|
408
|
+
const requiredSubmitButton = screen.getAllByRole('button', {
|
|
409
|
+
name: 'Αποθήκευση',
|
|
410
|
+
})[1];
|
|
411
|
+
fireEvent.click(requiredSubmitButton);
|
|
412
|
+
await waitFor(() => {
|
|
413
|
+
// Only one dialog should remain open (the main one)
|
|
414
|
+
expect(screen.getAllByRole('dialog').length).toBe(1);
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
expect(screen.getByText('Required Test Value 1')).toBeInTheDocument();
|
|
418
|
+
expect(submitHandler).not.toHaveBeenCalled();
|
|
419
|
+
// Add a second required item
|
|
420
|
+
fireEvent.click(requiredNestedFieldsetAddButton);
|
|
421
|
+
expect(screen.getAllByRole('dialog').length).toBe(2);
|
|
422
|
+
const secondRequiredNestedFieldsetInput = screen.getByRole('textbox');
|
|
423
|
+
expect(secondRequiredNestedFieldsetInput).toBeInTheDocument();
|
|
424
|
+
expect(secondRequiredNestedFieldsetInput).toHaveProperty(
|
|
425
|
+
'name',
|
|
426
|
+
`nested_multiplicity_required`
|
|
427
|
+
);
|
|
428
|
+
fireEvent.change(secondRequiredNestedFieldsetInput, {
|
|
429
|
+
target: { value: 'Required Test Value 2' },
|
|
430
|
+
});
|
|
431
|
+
expect(secondRequiredNestedFieldsetInput).toHaveValue(
|
|
432
|
+
'Required Test Value 2'
|
|
433
|
+
);
|
|
434
|
+
const secondRequiredSubmitButton = screen.getAllByRole('button', {
|
|
435
|
+
name: 'Αποθήκευση',
|
|
436
|
+
})[1];
|
|
437
|
+
fireEvent.click(secondRequiredSubmitButton);
|
|
438
|
+
await waitFor(() => {
|
|
439
|
+
// Only one dialog should remain open (the main one)
|
|
440
|
+
expect(screen.getAllByRole('dialog').length).toBe(1);
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
expect(screen.getByText('Required Test Value 1')).toBeInTheDocument();
|
|
444
|
+
expect(submitHandler).not.toHaveBeenCalled();
|
|
445
|
+
|
|
446
|
+
// Add nested_multiplicity_optional item
|
|
447
|
+
const optionalNestedFieldset = getNestedFieldset('optional');
|
|
448
|
+
const optionalNestedFieldsetAddButton = within(
|
|
449
|
+
optionalNestedFieldset
|
|
450
|
+
).getByRole('button', { name: 'Προσθήκη' });
|
|
451
|
+
fireEvent.click(optionalNestedFieldsetAddButton);
|
|
452
|
+
expect(screen.getAllByRole('dialog').length).toBe(2);
|
|
453
|
+
const optionalNestedFieldsetInput = screen.getByRole('textbox');
|
|
454
|
+
expect(optionalNestedFieldsetInput).toBeInTheDocument();
|
|
455
|
+
expect(optionalNestedFieldsetInput).toHaveProperty(
|
|
456
|
+
'name',
|
|
457
|
+
`nested_multiplicity_optional`
|
|
458
|
+
);
|
|
459
|
+
fireEvent.change(optionalNestedFieldsetInput, {
|
|
460
|
+
target: { value: 'Optional Test Value' },
|
|
461
|
+
});
|
|
462
|
+
expect(optionalNestedFieldsetInput).toHaveValue('Optional Test Value');
|
|
463
|
+
|
|
464
|
+
// There are two "Αποθήκευση" buttons, one for the nested dialog and one for the main dialog
|
|
465
|
+
const optionalSubmitButton = screen.getAllByRole('button', {
|
|
466
|
+
name: 'Αποθήκευση',
|
|
467
|
+
})[1];
|
|
468
|
+
fireEvent.click(optionalSubmitButton);
|
|
469
|
+
await waitFor(() => {
|
|
470
|
+
// Only one dialog should remain open (the main one)
|
|
471
|
+
expect(screen.getAllByRole('dialog').length).toBe(1);
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
expect(screen.getByText('Optional Test Value')).toBeInTheDocument();
|
|
475
|
+
expect(submitHandler).not.toHaveBeenCalled();
|
|
476
|
+
|
|
477
|
+
const mainDialogSubmitButton = screen.getByRole('button', {
|
|
478
|
+
name: 'Αποθήκευση',
|
|
479
|
+
});
|
|
480
|
+
fireEvent.click(mainDialogSubmitButton);
|
|
481
|
+
await waitFor(() => {
|
|
482
|
+
expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
|
|
483
|
+
});
|
|
484
|
+
expect(screen.getByText('Optional Test Value')).toBeInTheDocument();
|
|
485
|
+
const continueButton = screen.getByRole('button', { name: 'Συνέχεια' });
|
|
486
|
+
expect(continueButton).toBeInTheDocument();
|
|
487
|
+
fireEvent.click(continueButton);
|
|
488
|
+
await waitFor(() => {
|
|
489
|
+
expect(submitHandler).toHaveBeenCalledTimes(1);
|
|
490
|
+
});
|
|
491
|
+
expect(submitHandler).toHaveBeenCalledWith({
|
|
492
|
+
nested_fieldset_multiplicity: expect.arrayContaining([
|
|
493
|
+
{
|
|
494
|
+
nested_multiplicity_required: [
|
|
495
|
+
'Required Test Value 1',
|
|
496
|
+
'Required Test Value 2',
|
|
497
|
+
],
|
|
498
|
+
nested_multiplicity_optional: ['Optional Test Value'],
|
|
499
|
+
},
|
|
500
|
+
]),
|
|
501
|
+
});
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
it('should submit multiple fieldset items added to main form', async () => {
|
|
505
|
+
render(<TestForm />);
|
|
506
|
+
openMainDialog();
|
|
507
|
+
|
|
508
|
+
// Add first item
|
|
509
|
+
const nestedFieldset = getNestedFieldset('required');
|
|
510
|
+
const nestedFieldsetAddButton = within(nestedFieldset).getByRole('button', {
|
|
511
|
+
name: 'Προσθήκη',
|
|
512
|
+
});
|
|
513
|
+
fireEvent.click(nestedFieldsetAddButton);
|
|
514
|
+
expect(screen.getAllByRole('dialog').length).toBe(2);
|
|
515
|
+
const nestedFieldsetInput = screen.getByRole('textbox');
|
|
516
|
+
expect(nestedFieldsetInput).toBeInTheDocument();
|
|
517
|
+
expect(nestedFieldsetInput).toHaveProperty(
|
|
518
|
+
'name',
|
|
519
|
+
`nested_multiplicity_required`
|
|
520
|
+
);
|
|
521
|
+
fireEvent.change(nestedFieldsetInput, {
|
|
522
|
+
target: { value: 'Test Value 1' },
|
|
523
|
+
});
|
|
524
|
+
expect(nestedFieldsetInput).toHaveValue('Test Value 1');
|
|
525
|
+
// There are two "Αποθήκευση" buttons, one for the nested dialog and one for the main dialog
|
|
526
|
+
const submitButton = screen.getAllByRole('button', {
|
|
527
|
+
name: 'Αποθήκευση',
|
|
528
|
+
})[1];
|
|
529
|
+
fireEvent.click(submitButton);
|
|
530
|
+
await waitFor(() => {
|
|
531
|
+
// Only one dialog should remain open (the main one)
|
|
532
|
+
expect(screen.getAllByRole('dialog').length).toBe(1);
|
|
533
|
+
});
|
|
534
|
+
expect(screen.getByText('Test Value 1')).toBeInTheDocument();
|
|
535
|
+
expect(submitHandler).not.toHaveBeenCalled();
|
|
536
|
+
|
|
537
|
+
// Submit first item
|
|
538
|
+
const mainDialogSubmitButton = screen.getByRole('button', {
|
|
539
|
+
name: 'Αποθήκευση',
|
|
540
|
+
});
|
|
541
|
+
fireEvent.click(mainDialogSubmitButton);
|
|
542
|
+
await waitFor(() => {
|
|
543
|
+
expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
|
|
544
|
+
});
|
|
545
|
+
expect(screen.getByText('Test Value 1')).toBeInTheDocument();
|
|
546
|
+
|
|
547
|
+
// Add second item
|
|
548
|
+
openMainDialog();
|
|
549
|
+
const secondNestedFieldset = getNestedFieldset('required', true);
|
|
550
|
+
const secondNestedFieldsetAddButton = within(
|
|
551
|
+
secondNestedFieldset
|
|
552
|
+
).getByRole('button', {
|
|
553
|
+
name: 'Προσθήκη',
|
|
554
|
+
});
|
|
555
|
+
fireEvent.click(secondNestedFieldsetAddButton);
|
|
556
|
+
expect(screen.getAllByRole('dialog').length).toBe(2);
|
|
557
|
+
const secondNestedFieldsetInput = screen.getByRole('textbox');
|
|
558
|
+
expect(secondNestedFieldsetInput).toBeInTheDocument();
|
|
559
|
+
expect(secondNestedFieldsetInput).toHaveProperty(
|
|
560
|
+
'name',
|
|
561
|
+
`nested_multiplicity_required`
|
|
562
|
+
);
|
|
563
|
+
fireEvent.change(secondNestedFieldsetInput, {
|
|
564
|
+
target: { value: 'Test Value 2' },
|
|
565
|
+
});
|
|
566
|
+
expect(secondNestedFieldsetInput).toHaveValue('Test Value 2');
|
|
567
|
+
// There are two "Αποθήκευση" buttons, one for the nested dialog and one for the main dialog
|
|
568
|
+
const secondSubmitButton = screen.getAllByRole('button', {
|
|
569
|
+
name: 'Αποθήκευση',
|
|
570
|
+
})[1];
|
|
571
|
+
fireEvent.click(secondSubmitButton);
|
|
572
|
+
await waitFor(() => {
|
|
573
|
+
// Only one dialog should remain open (the main one)
|
|
574
|
+
expect(screen.getAllByRole('dialog').length).toBe(1);
|
|
575
|
+
});
|
|
576
|
+
expect(screen.getByText('Test Value 2')).toBeInTheDocument();
|
|
577
|
+
expect(submitHandler).not.toHaveBeenCalled();
|
|
578
|
+
// Submit second item
|
|
579
|
+
const secondMainDialogSubmitButton = screen.getByRole('button', {
|
|
580
|
+
name: 'Αποθήκευση',
|
|
581
|
+
});
|
|
582
|
+
fireEvent.click(secondMainDialogSubmitButton);
|
|
583
|
+
await waitFor(() => {
|
|
584
|
+
expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
|
|
585
|
+
});
|
|
586
|
+
expect(screen.getByText('Test Value 2')).toBeInTheDocument();
|
|
587
|
+
|
|
588
|
+
const continueButton = screen.getByRole('button', { name: 'Συνέχεια' });
|
|
589
|
+
expect(continueButton).toBeInTheDocument();
|
|
590
|
+
fireEvent.click(continueButton);
|
|
591
|
+
await waitFor(() => {
|
|
592
|
+
expect(submitHandler).toHaveBeenCalledTimes(1);
|
|
593
|
+
});
|
|
594
|
+
expect(submitHandler).toHaveBeenCalledWith({
|
|
595
|
+
nested_fieldset_multiplicity: expect.arrayContaining([
|
|
596
|
+
{
|
|
597
|
+
nested_multiplicity_required: ['Test Value 1'],
|
|
598
|
+
nested_multiplicity_optional: [],
|
|
599
|
+
},
|
|
600
|
+
{
|
|
601
|
+
nested_multiplicity_required: ['Test Value 2'],
|
|
602
|
+
nested_multiplicity_optional: [],
|
|
603
|
+
},
|
|
604
|
+
]),
|
|
605
|
+
});
|
|
606
|
+
});
|
|
607
|
+
});
|
|
608
|
+
|
|
609
|
+
function openMainDialog() {
|
|
610
|
+
const addButton = screen.getByRole('button', { name: 'Προσθήκη' });
|
|
611
|
+
fireEvent.click(addButton);
|
|
612
|
+
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
613
|
+
// Expect: The external "add" button + the required "add" button + the optional "add" button
|
|
614
|
+
expect(screen.getAllByRole('button', { name: 'Προσθήκη' }).length).toBe(3);
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
function getNestedFieldset(
|
|
618
|
+
type: 'required' | 'optional',
|
|
619
|
+
hasSubmittedOnce = false
|
|
620
|
+
) {
|
|
621
|
+
const nestedFieldsetTitle = screen.getAllByText(
|
|
622
|
+
new RegExp(`"${type}" μέχρι 10`)
|
|
623
|
+
)[hasSubmittedOnce ? 1 : 0];
|
|
624
|
+
const nestedFieldset = nestedFieldsetTitle.closest('fieldset');
|
|
625
|
+
expect(nestedFieldset).toBeInTheDocument();
|
|
626
|
+
return nestedFieldset!;
|
|
627
|
+
}
|