From f37d0dbc0da9571d9ddb15e0f42f3c487c6b63d9 Mon Sep 17 00:00:00 2001 From: Sampo Tawast Date: Thu, 10 Aug 2023 12:04:02 +0300 Subject: [PATCH 1/2] add translations for isUnfinishedDeminimisAid --- frontend/benefit/applicant/public/locales/en/common.json | 4 ++++ frontend/benefit/applicant/public/locales/fi/common.json | 4 ++++ frontend/benefit/applicant/public/locales/sv/common.json | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/frontend/benefit/applicant/public/locales/en/common.json b/frontend/benefit/applicant/public/locales/en/common.json index 6b3ce28ee3..d25fd345ba 100644 --- a/frontend/benefit/applicant/public/locales/en/common.json +++ b/frontend/benefit/applicant/public/locales/en/common.json @@ -86,6 +86,10 @@ "deMinimisAidMaxAmount": { "label": "Maximum amount exceeded", "content": "The maximum amount of de minimis aid has been exceeded. Under the EU Regulation, a company may receive a maximum EUR 200,000 of de minimis aid during the current year and the previous two tax years. All forms of de minimis aid granted by various authorities during this period will be taken into account in the maximum amount." + }, + "deMinimisUnfinished": { + "label": "Missing de minimis aid information", + "content": "Please fill any missing de minimis aid information and press 'Add' button." } }, "tooltips": { diff --git a/frontend/benefit/applicant/public/locales/fi/common.json b/frontend/benefit/applicant/public/locales/fi/common.json index 7020b7519b..b8b2217029 100644 --- a/frontend/benefit/applicant/public/locales/fi/common.json +++ b/frontend/benefit/applicant/public/locales/fi/common.json @@ -86,6 +86,10 @@ "deMinimisAidMaxAmount": { "label": "Enimmäismäärä ylitetty", "content": "De minimis-tuen enimmäismäärä on ylitetty. Tuki voi olla enintään 200 000 euroa, joka myönnetään yritykselle kuluvan vuoden ja kahden edellisen verovuoden kuluessa. Enimmäismäärässä huomioidaan kaikkien eri viranomaisten kyseisenä ajanjaksona de minimis -tukena myöntämä rahoitus." + }, + "deMinimisUnfinished": { + "label": "Puuttuvia de minimis-tuen tietoja", + "content": "Täytä puuttuvat de minimis -kentät ja paina 'Lisää' painiketta." } }, "tooltips": { diff --git a/frontend/benefit/applicant/public/locales/sv/common.json b/frontend/benefit/applicant/public/locales/sv/common.json index ac3f6fcb2c..0e9dc248b3 100644 --- a/frontend/benefit/applicant/public/locales/sv/common.json +++ b/frontend/benefit/applicant/public/locales/sv/common.json @@ -86,6 +86,10 @@ "deMinimisAidMaxAmount": { "label": "Maximibeloppet har överskridits", "content": "Maximibeloppet för de minimis-stöd har överskridits. Enligt EU:s förordning kan ett företag få de minimis-stöd till ett belopp om högst 200 000 euro under det innevarandet året och under de två föregående skatteåren. I maximibeloppet beaktas samtliga de minimis-stöd som olika myndigheter har beviljat under denna tidsperiod." + }, + "deMinimisUnfinished": { + "label": "Information saknar om de minimis stöd", + "content": "Vänligen fyll i eventuell saknad de minimis-stöd information och tryck på knappen 'Lägg till'." } }, "tooltips": { From fa62b9093145d86a6dafd2d83fd740eac8b3bba1 Mon Sep 17 00:00:00 2001 From: Sampo Tawast Date: Thu, 10 Aug 2023 12:07:27 +0300 Subject: [PATCH 2/2] feat: show toast error on unfinished de minimis aid; set radio to false if no deminimis aids --- .../deMinimisAid/DeMinimisAidForm.tsx | 34 +++++- .../step1/ApplicationFormStep1.tsx | 106 +++++++++--------- .../step1/useApplicationFormStep1.ts | 25 ++++- 3 files changed, 106 insertions(+), 59 deletions(-) diff --git a/frontend/benefit/applicant/src/components/applications/forms/application/deMinimisAid/DeMinimisAidForm.tsx b/frontend/benefit/applicant/src/components/applications/forms/application/deMinimisAid/DeMinimisAidForm.tsx index 95dd9dae9a..95f1558b8a 100644 --- a/frontend/benefit/applicant/src/components/applications/forms/application/deMinimisAid/DeMinimisAidForm.tsx +++ b/frontend/benefit/applicant/src/components/applications/forms/application/deMinimisAid/DeMinimisAidForm.tsx @@ -23,9 +23,13 @@ import { useDeminimisAid } from './useDeminimisAid'; interface DeMinimisAidFormProps { data: DeMinimisAid[]; + setUnfinishedDeMinimisAid: React.Dispatch>; } -const DeMinimisAidForm: React.FC = ({ data }) => { +const DeMinimisAidForm: React.FC = ({ + data, + setUnfinishedDeMinimisAid, +}) => { const { t, language, @@ -38,6 +42,26 @@ const DeMinimisAidForm: React.FC = ({ data }) => { } = useDeminimisAid(data); const theme = useTheme(); + const onSubmit = ( + event: React.MouseEvent + ): void => { + setUnfinishedDeMinimisAid(false); + return handleSubmit(event); + }; + + const handleBlur = ( + event: React.FocusEvent + ): void => { + setUnfinishedDeMinimisAid(false); + const grantValuesAsString = Object.values(formik.values).reduce( + (acc, val) => acc + val + ); + if (grantValuesAsString !== '') { + setUnfinishedDeMinimisAid(true); + } + formik.handleBlur(event); + }; + return ( <$GridCell $colStart={3} @@ -65,7 +89,7 @@ const DeMinimisAidForm: React.FC = ({ data }) => { name={fields.granter.name} label={fields.granter.label} placeholder={fields.granter.placeholder} - onBlur={formik.handleBlur} + onBlur={(event) => handleBlur(event)} onChange={formik.handleChange} value={formik.values.granter} invalid={!!getErrorMessage(DE_MINIMIS_AID_KEYS.GRANTER)} @@ -80,7 +104,7 @@ const DeMinimisAidForm: React.FC = ({ data }) => { name={fields.amount.name} label={fields.amount.label || ''} placeholder={fields.amount.placeholder} - onBlur={formik.handleBlur} + onBlur={(event) => handleBlur(event)} onChange={(e) => formik.setFieldValue( fields.amount.name, @@ -101,7 +125,7 @@ const DeMinimisAidForm: React.FC = ({ data }) => { label={fields.grantedAt.label} placeholder={fields.grantedAt.placeholder} language={language} - onBlur={formik.handleBlur} + onBlur={(event) => handleBlur(event)} onChange={(value) => formik.setFieldValue(fields.grantedAt.name, value) } @@ -133,7 +157,7 @@ const DeMinimisAidForm: React.FC = ({ data }) => { !formik.isValid || sumBy(grants, 'amount') > MAX_DEMINIMIS_AID_TOTAL_AMOUNT } - onClick={(e) => handleSubmit(e)} + onClick={(e) => onSubmit(e)} iconLeft={} fullWidth > diff --git a/frontend/benefit/applicant/src/components/applications/forms/application/step1/ApplicationFormStep1.tsx b/frontend/benefit/applicant/src/components/applications/forms/application/step1/ApplicationFormStep1.tsx index 8344d8b03a..2a77e86bf3 100644 --- a/frontend/benefit/applicant/src/components/applications/forms/application/step1/ApplicationFormStep1.tsx +++ b/frontend/benefit/applicant/src/components/applications/forms/application/step1/ApplicationFormStep1.tsx @@ -20,6 +20,9 @@ import { useApplicationFormStep1 } from './useApplicationFormStep1'; const ApplicationFormStep1: React.FC = ({ data, }) => { + const [isUnfinishedDeMinimisAid, setUnfinishedDeMinimisAid] = + React.useState(false); + const { t, handleSubmit, @@ -34,7 +37,7 @@ const ApplicationFormStep1: React.FC = ({ translationsBase, formik, deMinimisAidSet, - } = useApplicationFormStep1(data); + } = useApplicationFormStep1(data, Boolean(isUnfinishedDeMinimisAid)); useAlertBeforeLeaving(formik.dirty); @@ -161,56 +164,59 @@ const ApplicationFormStep1: React.FC = ({ /> - {showDeminimisSection && ( - - <$GridCell $colSpan={8}> - - <$RadioButton - id={`${fields.deMinimisAid.name}False`} - name={fields.deMinimisAid.name} - value="false" - label={t( - `${translationsBase}.fields.${APPLICATION_FIELDS_STEP1_KEYS.DE_MINIMIS_AID}.no` - )} - onChange={() => { - formik.setFieldValue(fields.deMinimisAid.name, false); - setDeMinimisAids([]); - }} - // 3 states: null (none is selected), true, false - checked={formik.values.deMinimisAid === false} - /> - <$RadioButton - id={`${fields.deMinimisAid.name}True`} - name={fields.deMinimisAid.name} - value="true" - label={t( - `${translationsBase}.fields.${APPLICATION_FIELDS_STEP1_KEYS.DE_MINIMIS_AID}.yes` - )} - onChange={() => - formik.setFieldValue(fields.deMinimisAid.name, true) - } - checked={formik.values.deMinimisAid === true} - /> - - + {showDeminimisSection && ( + + <$GridCell $colSpan={8}> + + <$RadioButton + id={`${fields.deMinimisAid.name}False`} + name={fields.deMinimisAid.name} + value="false" + label={t( + `${translationsBase}.fields.${APPLICATION_FIELDS_STEP1_KEYS.DE_MINIMIS_AID}.no` + )} + onChange={() => { + formik.setFieldValue(fields.deMinimisAid.name, false); + setDeMinimisAids([]); + }} + // 3 states: null (none is selected), true, false + checked={formik.values.deMinimisAid === false} + /> + <$RadioButton + id={`${fields.deMinimisAid.name}True`} + name={fields.deMinimisAid.name} + value="true" + label={t( + `${translationsBase}.fields.${APPLICATION_FIELDS_STEP1_KEYS.DE_MINIMIS_AID}.yes` + )} + onChange={() => + formik.setFieldValue(fields.deMinimisAid.name, true) + } + checked={formik.values.deMinimisAid === true} + /> + + - {formik.values.deMinimisAid && ( - <> - - - - )} - - )} + {formik.values.deMinimisAid && ( + <> + + + + )} + + )} <$GridCell $colSpan={8}> + application: Partial, + isUnfinishedDeminimisAid: boolean ): ExtendedComponentProps => { const { t } = useTranslation(); - const { setDeMinimisAids } = React.useContext(DeMinimisContext); + const { deMinimisAids, setDeMinimisAids } = + React.useContext(DeMinimisContext); const { onNext, onSave, onDelete } = useFormActions(application); const translationsBase = 'common:applications.sections.company'; @@ -103,6 +106,20 @@ const useApplicationFormStep1 = ( return focusAndScroll(errorFieldKey); } + if (isUnfinishedDeminimisAid) { + showErrorToast( + t(`${translationsBase}.deMinimisUnfinished.label`), + t(`${translationsBase}.deMinimisUnfinished.content`) + ); + return false; + } + + // de minimis fields are empty, set radio to false + if (deMinimisAids.length === 0) { + void formik.setFieldValue(fields.deMinimisAidSet.name, []); + void formik.setFieldValue(fields.deMinimisAid.name, false); + } + return formik.submitForm(); }); }; @@ -114,8 +131,8 @@ const useApplicationFormStep1 = ( const applicationId = values?.id; const handleDelete = applicationId ? () => { - void onDelete(applicationId); - } + void onDelete(applicationId); + } : undefined; const clearDeminimisAids = React.useCallback((): void => {