diff --git a/apps/judicial-system/web/src/components/IndictmentCaseFilesList/IndictmentCaseFilesList.strings.ts b/apps/judicial-system/web/src/components/IndictmentCaseFilesList/IndictmentCaseFilesList.strings.ts index 134cae5bdca9..7e93be0a3dfc 100644 --- a/apps/judicial-system/web/src/components/IndictmentCaseFilesList/IndictmentCaseFilesList.strings.ts +++ b/apps/judicial-system/web/src/components/IndictmentCaseFilesList/IndictmentCaseFilesList.strings.ts @@ -28,4 +28,9 @@ export const strings = defineMessages({ description: 'Notaður sem titill á innsend gögn hluta á dómskjalaskjá í ákærum.', }, + civilClaimsTitle: { + id: 'judicial.system.core:indictment_case_files_list.civil_claims_title', + defaultMessage: 'Einkaréttarkröfur', + description: 'Notaður sem titill á dómskjalaskjá í ákærum.', + }, }) diff --git a/apps/judicial-system/web/src/components/IndictmentCaseFilesList/IndictmentCaseFilesList.tsx b/apps/judicial-system/web/src/components/IndictmentCaseFilesList/IndictmentCaseFilesList.tsx index 10d1b3b71023..f28a239cf977 100644 --- a/apps/judicial-system/web/src/components/IndictmentCaseFilesList/IndictmentCaseFilesList.tsx +++ b/apps/judicial-system/web/src/components/IndictmentCaseFilesList/IndictmentCaseFilesList.tsx @@ -230,14 +230,15 @@ const IndictmentCaseFilesList: FC = ({ )} ) : null} - {civilClaims && + {workingCase.hasCivilClaims && + civilClaims && civilClaims.length > 0 && (isDistrictCourtUser(user) || isProsecutionUser(user) || isDefenceUser(user)) && ( - {formatMessage(caseFiles.civilClaimSection)} + {formatMessage(strings.civilClaimsTitle)} { onRetry={(file) => handleRetry(file, updateUploadFile)} /> - + @@ -172,29 +177,34 @@ const CaseFiles = () => { onRetry={(file) => handleRetry(file, updateUploadFile)} /> - - - file.category === CaseFileCategory.CIVIL_CLAIM, - )} - accept={Object.values(fileExtensionWhitelist)} - header={formatMessage(strings.caseFiles.inputFieldLabel)} - buttonLabel={formatMessage(strings.caseFiles.buttonLabel)} - onChange={(files) => - handleUpload( - addUploadFiles(files, { - category: CaseFileCategory.CIVIL_CLAIM, - }), - updateUploadFile, - ) - } - onRemove={(file) => handleRemove(file, removeUploadFile)} - onRetry={(file) => handleRetry(file, updateUploadFile)} - /> - + {workingCase.hasCivilClaims && ( + + + file.category === CaseFileCategory.CIVIL_CLAIM, + )} + accept={Object.values(fileExtensionWhitelist)} + header={formatMessage(strings.caseFiles.inputFieldLabel)} + buttonLabel={formatMessage(strings.caseFiles.buttonLabel)} + onChange={(files) => + handleUpload( + addUploadFiles(files, { + category: CaseFileCategory.CIVIL_CLAIM, + }), + updateUploadFile, + ) + } + onRemove={(file) => handleRemove(file, removeUploadFile)} + onRetry={(file) => handleRetry(file, updateUploadFile)} + /> + + )} {isTrafficViolationCaseCheck && ( { /> - - - - - removeTabsValidateAndSet( - 'civilDemands', - event.target.value, - ['empty'], - setWorkingCase, - civilDemandsErrorMessage, - setCivilDemandsErrorMessage, - ) - } - onBlur={(event) => - validateAndSendToServer( - 'civilDemands', - event.target.value, - ['empty'], - workingCase, - updateCase, - setCivilDemandsErrorMessage, - ) - } - textarea - autoComplete="off" - required - rows={7} - autoExpand={{ on: true, maxHeight: 300 }} - /> - - + {workingCase.hasCivilClaims && ( + + + + + removeTabsValidateAndSet( + 'civilDemands', + event.target.value, + ['empty'], + setWorkingCase, + civilDemandsErrorMessage, + setCivilDemandsErrorMessage, + ) + } + onBlur={(event) => + validateAndSendToServer( + 'civilDemands', + event.target.value, + ['empty'], + workingCase, + updateCase, + setCivilDemandsErrorMessage, + ) + } + textarea + autoComplete="off" + required + rows={7} + autoExpand={{ on: true, maxHeight: 300 }} + /> + + + )} { isCaseUpToDate, refreshCase, } = useContext(FormContext) - const { updateCase, transitionCase } = useCase() + const { updateCase, transitionCase, setAndSendCaseToServer } = useCase() + const { handleRemove } = useS3Upload(workingCase.id) const { formatMessage } = useIntl() const { updateDefendant, updateDefendantState } = useDefendants() const router = useRouter() const isTrafficViolationCaseCheck = isTrafficViolationCase(workingCase) + const [hasCivilClaimsChoice, setHasCivilClaimsChoice] = useState() + const initialize = useCallback(async () => { if (!workingCase.court) { await updateCase(workingCase.id, { @@ -96,6 +101,36 @@ const Processing: FC = () => { [updateDefendantState, setWorkingCase, workingCase.id, updateDefendant], ) + const handleHasCivilClaimsChange = async (hasCivilClaims: boolean) => { + setHasCivilClaimsChoice(hasCivilClaims) + + setAndSendCaseToServer( + [{ hasCivilClaims, force: true }], + workingCase, + setWorkingCase, + ) + + if (hasCivilClaims === false) { + const civilClaims = workingCase.caseFiles?.filter( + (caseFile) => caseFile.category === CaseFileCategory.CIVIL_CLAIM, + ) + + if (!civilClaims) { + return + } + + setAndSendCaseToServer( + [{ civilDemands: null, force: true }], + workingCase, + setWorkingCase, + ) + + for (const civilClaim of civilClaims) { + handleRemove(civilClaim as UploadFile) + } + } + } + return ( { ))} )} - + + + + + + + handleHasCivilClaimsChange(true)} + checked={ + hasCivilClaimsChoice === true || + (hasCivilClaimsChoice === undefined && + workingCase.hasCivilClaims === true) + } + /> + + + handleHasCivilClaimsChange(false)} + checked={ + hasCivilClaimsChoice === false || + (hasCivilClaimsChoice === undefined && + workingCase.hasCivilClaims === false) + } + /> + + + + { ) const handleRemove = useCallback( - async (file: TUploadFile, callback: (file: TUploadFile) => void) => { + async (file: TUploadFile, callback?: (file: TUploadFile) => void) => { try { if (file.id) { const { data } = await remove(file.id) @@ -421,7 +421,7 @@ const useS3Upload = (caseId: string) => { throw new Error('Failed to delete file') } - callback(file) + callback && callback(file) } } catch { toast.error(formatMessage(strings.removeFailed)) diff --git a/apps/judicial-system/web/src/utils/validate.ts b/apps/judicial-system/web/src/utils/validate.ts index 003fa9471208..dae538e76314 100644 --- a/apps/judicial-system/web/src/utils/validate.ts +++ b/apps/judicial-system/web/src/utils/validate.ts @@ -267,15 +267,25 @@ export const isProcessingStepValidIndictments = ( return validate([[defendant.defendantPlea, ['empty']]]).isValid }) + const hasCivilClaimSelected = + workingCase.hasCivilClaims !== null && + workingCase.hasCivilClaims !== undefined + return Boolean( - workingCase.prosecutor && workingCase.court && defendantsAreValid(), + workingCase.prosecutor && + workingCase.court && + hasCivilClaimSelected && + defendantsAreValid(), ) } export const isTrafficViolationStepValidIndictments = ( workingCase: Case, ): boolean => { - return Boolean(workingCase.demands && workingCase.civilDemands) + return Boolean( + workingCase.demands && + (!workingCase.hasCivilClaims || workingCase.civilDemands), + ) } export const isPoliceDemandsStepValidRC = (workingCase: Case): boolean => {