Skip to content

Commit

Permalink
[Unités] Pouvoir créer une mission à partir d'une unité (#1111)
Browse files Browse the repository at this point in the history
## Related Pull Requests & Issues

- Resolve #1007

----

- [ ] Tests E2E (Cypress)
  • Loading branch information
ivangabriele authored Jan 8, 2024
2 parents 6e851ad + 99fb9b7 commit 9675cca
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 37 deletions.
74 changes: 50 additions & 24 deletions frontend/src/domain/use_cases/missions/addMission.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,54 @@ import { sideWindowActions } from '../../../features/SideWindow/slice'
import { isNewMission } from '../../../utils/isNewMission'
import { sideWindowPaths } from '../../entities/sideWindow'

import type { HomeAppThunk } from '../../../store'
import type { ReportingDetailed } from '../../entities/reporting'

export const addMission = (attachedReporting?: ReportingDetailed) => async (dispatch, getState) => {
const { missions = {} } = getState().missionForms

const maxNewMissionId = _.chain(missions)
.filter(newMission => isNewMission(newMission?.missionForm?.id))
.maxBy(filteredNewMission => Number(filteredNewMission?.missionForm?.id?.split('new-')[1]))
.value()

const id: string =
maxNewMissionId && maxNewMissionId.missionForm.id
? `new-${Number(maxNewMissionId?.missionForm?.id?.split('new-')[1]) + 1}`
: 'new-1'

const newMission = { isFormDirty: false, missionForm: missionFactory({ id }, true, attachedReporting) }

await dispatch(missionFormsActions.setMission(newMission))

await dispatch(
attachReportingToMissionSliceActions.setAttachedReportings(attachedReporting ? [attachedReporting] : [])
)

await dispatch(sideWindowActions.focusAndGoTo(generatePath(sideWindowPaths.MISSION, { id })))
}
import type { ControlUnit } from '@mtes-mct/monitor-ui'

export const addMission =
({
attachedReporting,
initialControlUnit
}: Partial<{
attachedReporting: ReportingDetailed
initialControlUnit: ControlUnit.ControlUnit
}> = {}): HomeAppThunk =>
async (dispatch, getState) => {
const { missions = {} } = getState().missionForms

const maxNewMissionId = _.chain(missions)
.filter(newMission => isNewMission(newMission.missionForm.id))
.maxBy(filteredNewMission => Number(String(filteredNewMission.missionForm.id).split('new-')[1]))
.value()

const id: string =
maxNewMissionId && maxNewMissionId.missionForm.id
? `new-${Number(String(maxNewMissionId.missionForm.id).split('new-')[1]) + 1}`
: 'new-1'

const initialMission: any = { id }
if (initialControlUnit) {
initialMission.controlUnits = [
{
administration: initialControlUnit.administration.name,
id: initialControlUnit.id,
isArchived: false,
name: initialControlUnit.name,
resources: []
}
]
}

const newMission = {
isFormDirty: false,
missionForm: missionFactory(initialMission, true, attachedReporting)
}

await dispatch(missionFormsActions.setMission(newMission))

await dispatch(
attachReportingToMissionSliceActions.setAttachedReportings(attachedReporting ? [attachedReporting] : [])
)

await dispatch(sideWindowActions.focusAndGoTo(generatePath(sideWindowPaths.MISSION, { id })))
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export const createMissionFromReporting = (values: Reporting | Partial<Reporting
)
await dispatch(updateMapInteractionListeners(MapInteractionListenerEnum.NONE))
await dispatch(reportingActions.deleteSelectedReporting(values.id))
await dispatch(addMission(response.data))
await dispatch(addMission({ attachedReporting: response.data }))
} else {
throw Error('Erreur à la création ou à la modification du signalement')
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Icon, MapMenuDialog } from '@mtes-mct/monitor-ui'
import { Accent, Button, Icon, MapMenuDialog } from '@mtes-mct/monitor-ui'
import { Formik } from 'formik'
import { noop } from 'lodash/fp'
import { useCallback } from 'react'
Expand All @@ -10,6 +10,7 @@ import { ControlUnitResourceList } from './ControlUnitResourceList'
import { RTK_DEFAULT_QUERY_OPTIONS } from '../../../../api/constants'
import { useGetControlUnitQuery, useUpdateControlUnitMutation } from '../../../../api/controlUnitsAPI'
import { globalActions } from '../../../../domain/shared_slices/Global'
import { addMission } from '../../../../domain/use_cases/missions/addMission'
import { useAppDispatch } from '../../../../hooks/useAppDispatch'
import { useAppSelector } from '../../../../hooks/useAppSelector'
import { FrontendError } from '../../../../libs/FrontendError'
Expand All @@ -24,6 +25,10 @@ export function ControlUnitDialog() {
const { data: controlUnit } = useGetControlUnitQuery(mapControlUnitDialog.controlUnitId, RTK_DEFAULT_QUERY_OPTIONS)
const [updateControlUnit] = useUpdateControlUnitMutation()

const openNewMission = useCallback(() => {
dispatch(addMission({ initialControlUnit: controlUnit }))
}, [controlUnit, dispatch])

const close = useCallback(() => {
dispatch(
globalActions.setDisplayedItems({
Expand All @@ -43,17 +48,6 @@ export function ControlUnitDialog() {
)
}

if (!controlUnit) {
return (
<MapMenuDialog.Container>
<MapMenuDialog.Header>
<MapMenuDialog.Title>Chargement en cours...</MapMenuDialog.Title>
<MapMenuDialog.CloseButton Icon={Icon.Close} onClick={close} />
</MapMenuDialog.Header>
</MapMenuDialog.Container>
)
}

return (
<Wrapper>
<MapMenuDialog.Header>
Expand All @@ -64,6 +58,9 @@ export function ControlUnitDialog() {
</MapMenuDialog.Header>
<Formik initialValues={controlUnit} onSubmit={noop}>
<StyledMapMenuDialogBody>
<Button accent={Accent.SECONDARY} Icon={Icon.Plus} isFullWidth onClick={openNewMission}>
Créer une mission avec cette unité
</Button>
<ControlUnitContactList controlUnit={controlUnit} onSubmit={updateControlUnit} />
<ControlUnitResourceList controlUnit={controlUnit} />
<AreaNote controlUnit={controlUnit} onSubmit={updateControlUnit} />
Expand Down

0 comments on commit 9675cca

Please sign in to comment.