diff --git a/src/components/shared/UpdatePersonalDataDrawer.tsx b/src/components/shared/UpdatePersonalDataDrawer.tsx index 6e4210524..53f29a89f 100644 --- a/src/components/shared/UpdatePersonalDataDrawer.tsx +++ b/src/components/shared/UpdatePersonalDataDrawer.tsx @@ -73,9 +73,14 @@ export const UpdatePersonalDataDrawer: React.FC = + value === true || value === false || tCommon('validation.mixed.required'), + }} /> diff --git a/src/components/shared/react-hook-form-inputs/RHFRadioGroup.tsx b/src/components/shared/react-hook-form-inputs/RHFRadioGroup.tsx index bef85a3c6..748ee917b 100644 --- a/src/components/shared/react-hook-form-inputs/RHFRadioGroup.tsx +++ b/src/components/shared/react-hook-form-inputs/RHFRadioGroup.tsx @@ -8,19 +8,20 @@ import { } from '@mui/material' import { InputWrapper } from '../InputWrapper' import { Controller, useFormContext } from 'react-hook-form' -import type { InputOption } from '@/types/common.types' +import type { InputRadioGroupOption } from '@/types/common.types' import type { ControllerProps } from 'react-hook-form/dist/types' import { useTranslation } from 'react-i18next' import { mapValidationErrorMessages } from '@/utils/form.utils' export type RHFRadioGroupProps = Omit & { label?: string | JSX.Element - options: Array + options: Array name: string infoLabel?: string disabled?: boolean rules?: ControllerProps['rules'] onValueChange?: (value: string) => void + isOptionValueAsBoolean?: boolean } export const RHFRadioGroup: React.FC = ({ @@ -32,6 +33,7 @@ export const RHFRadioGroup: React.FC = ({ disabled, rules, onValueChange, + isOptionValueAsBoolean = false, ...props }) => { const { formState } = useFormContext() @@ -59,8 +61,16 @@ export const RHFRadioGroup: React.FC = ({ aria-labelledby={labelId} {...props} {...fieldProps} - onChange={(_, value) => { - if (onValueChange) onValueChange(value) + onChange={(_, val) => { + let value: string | boolean = val + if (isOptionValueAsBoolean) { + if (val === 'true') { + value = true + } else if (val === 'false') { + value = false + } + } + if (onValueChange) onValueChange(val) onChange(value) }} > diff --git a/src/pages/ConsumerPurposeEditPage/components/PurposeEditStepRiskAnalysis/PurposeEditStepRiskAnalysis.tsx b/src/pages/ConsumerPurposeEditPage/components/PurposeEditStepRiskAnalysis/PurposeEditStepRiskAnalysis.tsx index 4814801c8..829d04be8 100644 --- a/src/pages/ConsumerPurposeEditPage/components/PurposeEditStepRiskAnalysis/PurposeEditStepRiskAnalysis.tsx +++ b/src/pages/ConsumerPurposeEditPage/components/PurposeEditStepRiskAnalysis/PurposeEditStepRiskAnalysis.tsx @@ -69,7 +69,7 @@ export const PurposeEditStepRiskAnalysis: React.FC = ({ back }) defaultAnswers={purpose.riskAnalysisForm?.answers} onSubmit={handleSubmit} onCancel={back} - personalData={purpose.eservice.personalData ? purpose.eservice.personalData : undefined} //TODO: CHECK THIS WHEN BE IS READY + personalData={purpose.eservice.personalData ? purpose.eservice.personalData : undefined} /> ) } diff --git a/src/pages/ConsumerPurposeEditPage/components/PurposeEditStepRiskAnalysis/RiskAnalysisForm/RiskAnalysisForm.tsx b/src/pages/ConsumerPurposeEditPage/components/PurposeEditStepRiskAnalysis/RiskAnalysisForm/RiskAnalysisForm.tsx index 6f49f0527..88abf5611 100644 --- a/src/pages/ConsumerPurposeEditPage/components/PurposeEditStepRiskAnalysis/RiskAnalysisForm/RiskAnalysisForm.tsx +++ b/src/pages/ConsumerPurposeEditPage/components/PurposeEditStepRiskAnalysis/RiskAnalysisForm/RiskAnalysisForm.tsx @@ -37,6 +37,9 @@ export const RiskAnalysisForm: React.FC = ({ const [incompatibleAnswerValue, setIncompatibleAnswerValue] = React.useState(false) const checkIncompatibleAnswerValue = (answers: Record) => { + if (personalData === undefined) { + return false + } const userAnswer = answers['usesPersonalData']?.[0] const isYes = userAnswer === 'YES' const isNo = userAnswer === 'NO' diff --git a/src/pages/ConsumerPurposeSummaryPage/ConsumerPurposeSummary.page.tsx b/src/pages/ConsumerPurposeSummaryPage/ConsumerPurposeSummary.page.tsx index af1c0dc01..78282d476 100644 --- a/src/pages/ConsumerPurposeSummaryPage/ConsumerPurposeSummary.page.tsx +++ b/src/pages/ConsumerPurposeSummaryPage/ConsumerPurposeSummary.page.tsx @@ -35,11 +35,23 @@ const ConsumerPurposeSummaryPage: React.FC = () => { const hasRiskAnalysisVersionMismatch = useCheckRiskAnalysisVersionMismatch(purpose) const alertProps = useGetConsumerPurposeAlertProps(purpose) - const eservicePersonalData = undefined //purpose?.eservice.personalData + const eservicePersonalData = purpose?.eservice.personalData + + const checkIncompatibleAnswerValue = () => { + const userAnswer = purpose?.riskAnalysisForm?.answers['usesPersonalData']?.[0] + const isYes = userAnswer === 'YES' + const isNo = userAnswer === 'NO' + + const incompatible = + (isYes && eservicePersonalData !== true) || (isNo && eservicePersonalData !== false) + + return incompatible + } const isPublishButtonDisabled = purpose?.riskAnalysisForm && - eservicePersonalData !== purpose?.riskAnalysisForm?.answers['usesPersonalData'] + eservicePersonalData !== undefined && + checkIncompatibleAnswerValue() const arePublishOrEditButtonsDisabled = (purpose?.eservice.mode === 'DELIVER' && hasRiskAnalysisVersionMismatch) || diff --git a/src/pages/ProviderEServiceCreatePage/components/EServiceCreateStepGeneral/EServiceCreateStepGeneral.tsx b/src/pages/ProviderEServiceCreatePage/components/EServiceCreateStepGeneral/EServiceCreateStepGeneral.tsx index f78654cf7..2899ed219 100644 --- a/src/pages/ProviderEServiceCreatePage/components/EServiceCreateStepGeneral/EServiceCreateStepGeneral.tsx +++ b/src/pages/ProviderEServiceCreatePage/components/EServiceCreateStepGeneral/EServiceCreateStepGeneral.tsx @@ -58,6 +58,7 @@ export const EServiceCreateStepGeneral: React.FC = () => { const { isOrganizationAllowedToProduce } = AuthHooks.useJwt() const { t } = useTranslation('eservice') + const { t: tCommon } = useTranslation('common', { keyPrefix: 'validation.mixed' }) const navigate = useNavigate() const { eServiceTemplateId } = useParams<'PROVIDE_ESERVICE_FROM_TEMPLATE_CREATE'>() @@ -244,18 +245,21 @@ export const EServiceCreateStepGeneral: React.FC = () => { options={[ { label: t(`create.step1.eservicePersonalDataField.${eserviceMode}.options.true`), - value: 'true', + value: true, }, { label: t( `create.step1.eservicePersonalDataField.${eserviceMode}.options.false` ), - value: 'false', + value: false, }, ]} disabled={!areEServiceGeneralInfoEditable || isEserviceFromTemplate} - rules={{ required: true }} + rules={{ + validate: (value) => value === true || value === false || tCommon('required'), + }} sx={{ mb: 3, mt: 3 }} + isOptionValueAsBoolean /> {isEserviceFromTemplate && !eserviceTemplate?.personalData && ( diff --git a/src/pages/ProviderEServiceDetailsPage/components/ProviderEServiceDetailsTab/ProviderEServiceGeneralInfoSection/ProviderEServiceGeneralInfoSection.tsx b/src/pages/ProviderEServiceDetailsPage/components/ProviderEServiceDetailsTab/ProviderEServiceGeneralInfoSection/ProviderEServiceGeneralInfoSection.tsx index 06fa1f1f8..172342b20 100644 --- a/src/pages/ProviderEServiceDetailsPage/components/ProviderEServiceDetailsTab/ProviderEServiceGeneralInfoSection/ProviderEServiceGeneralInfoSection.tsx +++ b/src/pages/ProviderEServiceDetailsPage/components/ProviderEServiceDetailsTab/ProviderEServiceGeneralInfoSection/ProviderEServiceGeneralInfoSection.tsx @@ -43,6 +43,7 @@ export const ProviderEServiceGeneralInfoSection: React.FC = () => { }) const isEserviceFromTemplate = Boolean(descriptor.templateRef) + const arePersonalDataSet = descriptor.eservice.personalData !== undefined const downloadConsumerList = EServiceDownloads.useDownloadConsumerList() const exportVersion = EServiceDownloads.useExportVersion() @@ -150,19 +151,14 @@ export const ProviderEServiceGeneralInfoSection: React.FC = () => { ) } - const handleEServicePersonalDataUpdate = ( - eserviceId: string, - personalData: boolean | undefined - ) => { - if (personalData) { - updateEservicePersonalData( - { - eserviceId: eserviceId, - personalData: personalData, - }, - { onSuccess: closeEServiceUpdatePersonalDataDrawer } - ) - } + const handleEServicePersonalDataUpdate = (eserviceId: string, personalData: boolean) => { + updateEservicePersonalData( + { + eserviceId: eserviceId, + personalData: personalData, + }, + { onSuccess: closeEServiceUpdatePersonalDataDrawer } + ) } const watchRiskyAnalysisAssociatedAction = { @@ -200,7 +196,7 @@ export const ProviderEServiceGeneralInfoSection: React.FC = () => { content={t(`personalDataField.value.${descriptor.eservice.personalData}`)} /> {FEATURE_FLAG_ESERVICE_PERSONAL_DATA && - !descriptor.eservice.personalData && + !arePersonalDataSet && !isEserviceFromTemplate && ( diff --git a/src/pages/ProviderEServiceSummaryPage/ProviderEServiceSummary.page.tsx b/src/pages/ProviderEServiceSummaryPage/ProviderEServiceSummary.page.tsx index f44a47b97..c8f7b8504 100644 --- a/src/pages/ProviderEServiceSummaryPage/ProviderEServiceSummary.page.tsx +++ b/src/pages/ProviderEServiceSummaryPage/ProviderEServiceSummary.page.tsx @@ -154,18 +154,20 @@ const ProviderEServiceSummaryPage: React.FC = () => { return !!descriptor.templateRef?.interfaceMetadata } + const arePersonalDataSet = descriptor?.eservice.personalData !== undefined + const canBePublished = () => { return ( - !!(descriptor && - descriptor.interface && - descriptor.description && - descriptor.audience[0] && - descriptor.voucherLifespan && - descriptor.dailyCallsPerConsumer && - descriptor.dailyCallsTotal >= descriptor.dailyCallsPerConsumer && - FEATURE_FLAG_ESERVICE_PERSONAL_DATA - ? descriptor.eservice.personalData - : true) && checklistEServiceFromTemplate() + !!( + descriptor && + descriptor.interface && + descriptor.description && + descriptor.audience[0] && + descriptor.voucherLifespan && + descriptor.dailyCallsPerConsumer && + descriptor.dailyCallsTotal >= descriptor.dailyCallsPerConsumer && + (FEATURE_FLAG_ESERVICE_PERSONAL_DATA ? arePersonalDataSet : true) + ) && checklistEServiceFromTemplate() ) } @@ -281,9 +283,7 @@ const ProviderEServiceSummaryPage: React.FC = () => { )} diff --git a/src/pages/ProviderEServiceTemplateCreatePage/components/EServiceTemplateCreateStepGeneral/EServiceTemplateCreateStepGeneral.tsx b/src/pages/ProviderEServiceTemplateCreatePage/components/EServiceTemplateCreateStepGeneral/EServiceTemplateCreateStepGeneral.tsx index 4ed2064bc..2ee9d9d36 100644 --- a/src/pages/ProviderEServiceTemplateCreatePage/components/EServiceTemplateCreateStepGeneral/EServiceTemplateCreateStepGeneral.tsx +++ b/src/pages/ProviderEServiceTemplateCreatePage/components/EServiceTemplateCreateStepGeneral/EServiceTemplateCreateStepGeneral.tsx @@ -33,6 +33,7 @@ export type EServiceTemplateCreateStepGeneralFormValues = { export const EServiceTemplateCreateStepGeneral: React.FC = () => { const { t } = useTranslation('eserviceTemplate') + const { t: tCommon } = useTranslation('common', { keyPrefix: 'validation.mixed' }) const navigate = useNavigate() const { @@ -183,18 +184,21 @@ export const EServiceTemplateCreateStepGeneral: React.FC = () => { label: t( `create.step1.eservicePersonalDataField.${eserviceTemplateMode}.options.true` ), - value: 'true', + value: true, }, { label: t( `create.step1.eservicePersonalDataField.${eserviceTemplateMode}.options.false` ), - value: 'false', + value: false, }, ]} disabled={!areEServiceTemplateGeneralInfoEditable} - rules={{ required: true }} + rules={{ + validate: (value) => value === true || value === false || tCommon('required'), + }} sx={{ mb: 0, mt: 3 }} + isOptionValueAsBoolean /> )} diff --git a/src/types/common.types.ts b/src/types/common.types.ts index 0d8628f31..e81ba5e21 100644 --- a/src/types/common.types.ts +++ b/src/types/common.types.ts @@ -69,6 +69,10 @@ export type StepperStep = { } export type InputOption = { label: string | JSX.Element; value: string | number } +export type InputRadioGroupOption = { + label: string | JSX.Element + value: string | number | boolean +} /** * InputDescriptors describes the various labels and messages that can be