diff --git a/front/src/applications/operationalStudies/components/Scenario/ScenarioContent.tsx b/front/src/applications/operationalStudies/components/Scenario/ScenarioContent.tsx index 3eb67889417..c1395e4f92f 100644 --- a/front/src/applications/operationalStudies/components/Scenario/ScenarioContent.tsx +++ b/front/src/applications/operationalStudies/components/Scenario/ScenarioContent.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect, useCallback } from 'react'; +import { useState, useCallback, useEffect } from 'react'; import { ChevronRight } from '@osrd-project/ui-icons'; import cx from 'classnames'; @@ -24,7 +24,6 @@ import ScenarioLoaderMessage from 'modules/scenario/components/ScenarioLoaderMes import TimetableManageTrainSchedule from 'modules/trainschedule/components/ManageTrainSchedule/TimetableManageTrainSchedule'; import Timetable from 'modules/trainschedule/components/Timetable/Timetable'; import { useAppDispatch } from 'store'; -import { concatMap, mapBy } from 'utils/types'; import ScenarioDescription from './ScenarioDescription'; @@ -61,6 +60,13 @@ const ScenarioContent = ({ removeTrains, } = useScenarioData(scenario, timetable, infra); + const [ngeDto, setNgeDto] = useState(); + + const dtoImport = async () => { + const dto = await importTimetableToNGE(scenario.infra_id, scenario.timetable_id, dispatch); + setNgeDto(dto); + }; + const toggleMicroMacroButton = useCallback( (isMacroMode: boolean) => { setIsMacro(isMacroMode); @@ -68,40 +74,16 @@ const ScenarioContent = ({ setCollapsedTimetable(false); } }, - [setIsMacro, setCollapsedTimetable, collapsedTimetable] + [setIsMacro, collapsedTimetable] ); - const [ngeDto, setNgeDto] = useState(); - const [ngeUpsertedTrainSchedules, setNgeUpsertedTrainSchedules] = useState< - Map - >(new Map()); - const [ngeDeletedTrainIds, setNgeDeletedTrainIds] = useState([]); - - useEffect(() => { - if (!isMacro || (isMacro && ngeDto)) { - return; - } - - const doImport = async () => { - const dto = await importTimetableToNGE(scenario.infra_id, scenario.timetable_id, dispatch); - setNgeDto(dto); - }; - doImport(); - }, [scenario, isMacro]); - useEffect(() => { if (isMacro) { - return; - } - - if (ngeDto) { - setNgeDto(undefined); + dtoImport(); } - upsertTrainSchedules(Array.from(ngeUpsertedTrainSchedules.values())); - removeTrains(ngeDeletedTrainIds); }, [isMacro]); - const handleNGEOperation = (event: NGEEvent, netzgrafikDto: NetzgrafikDto) => + const handleNGEOperation = (event: NGEEvent, netzgrafikDto: NetzgrafikDto) => { handleOperation({ event, dispatch, @@ -109,14 +91,13 @@ const ScenarioContent = ({ timeTableId: scenario.timetable_id, netzgrafikDto, addUpsertedTrainSchedules: (upsertedTrainSchedules: TrainScheduleResult[]) => { - setNgeUpsertedTrainSchedules((prev) => - concatMap(prev, mapBy(upsertedTrainSchedules, 'id')) - ); + upsertTrainSchedules(upsertedTrainSchedules); }, addDeletedTrainIds: (trainIds: number[]) => { - setNgeDeletedTrainIds((prev) => [...prev, ...trainIds]); + removeTrains(trainIds); }, }); + }; return (
@@ -146,6 +127,7 @@ const ScenarioContent = ({ trainIdToEdit={trainIdToEdit} setTrainIdToEdit={setTrainIdToEdit} infraState={infra.state} + dtoImport={dtoImport} /> )} )} diff --git a/front/src/modules/trainschedule/components/ManageTrainSchedule/AddTrainScheduleButton.tsx b/front/src/modules/trainschedule/components/ManageTrainSchedule/AddTrainScheduleButton.tsx index c98aa18020b..4acbd324077 100644 --- a/front/src/modules/trainschedule/components/ManageTrainSchedule/AddTrainScheduleButton.tsx +++ b/front/src/modules/trainschedule/components/ManageTrainSchedule/AddTrainScheduleButton.tsx @@ -24,12 +24,14 @@ type AddTrainScheduleButtonProps = { infraState?: InfraState; setIsWorking: (isWorking: boolean) => void; upsertTrainSchedules: (trainSchedules: TrainScheduleResult[]) => void; + dtoImport: () => void; }; const AddTrainScheduleButton = ({ infraState, setIsWorking, upsertTrainSchedules, + dtoImport, }: AddTrainScheduleButtonProps) => { const [postTrainSchedule] = osrdEditoastApi.endpoints.postTimetableByIdTrainSchedule.useMutation(); @@ -83,6 +85,7 @@ const AddTrainScheduleButton = ({ }) ); setIsWorking(false); + dtoImport(); upsertTrainSchedules(newTrainSchedules); } catch (e) { setIsWorking(false); diff --git a/front/src/modules/trainschedule/components/ManageTrainSchedule/TimetableManageTrainSchedule.tsx b/front/src/modules/trainschedule/components/ManageTrainSchedule/TimetableManageTrainSchedule.tsx index b88aeab53bb..9c2518851ac 100644 --- a/front/src/modules/trainschedule/components/ManageTrainSchedule/TimetableManageTrainSchedule.tsx +++ b/front/src/modules/trainschedule/components/ManageTrainSchedule/TimetableManageTrainSchedule.tsx @@ -18,6 +18,7 @@ type TimetableManageTrainScheduleProps = { upsertTrainSchedules: (trainSchedules: TrainScheduleResult[]) => void; infraState?: InfraState; setTrainIdToEdit: (trainIdToEdit?: number) => void; + dtoImport: () => void; }; const TimetableManageTrainSchedule = ({ @@ -27,6 +28,7 @@ const TimetableManageTrainSchedule = ({ infraState, trainIdToEdit, setTrainIdToEdit, + dtoImport, }: TimetableManageTrainScheduleProps) => { const { t } = useTranslation('operationalStudies/manageTrainSchedule'); const [isWorking, setIsWorking] = useState(false); @@ -41,9 +43,9 @@ const TimetableManageTrainSchedule = ({ setDisplayTrainScheduleManagement, upsertTrainSchedules, setTrainIdToEdit, + dtoImport, trainIdToEdit ); - return (
@@ -77,6 +79,7 @@ const TimetableManageTrainSchedule = ({ infraState={infraState} setIsWorking={setIsWorking} upsertTrainSchedules={upsertTrainSchedules} + dtoImport={dtoImport} /> )} diff --git a/front/src/modules/trainschedule/components/ManageTrainSchedule/hooks/useUpdateTrainSchedule.ts b/front/src/modules/trainschedule/components/ManageTrainSchedule/hooks/useUpdateTrainSchedule.ts index d02188f81b3..99d58445d1b 100644 --- a/front/src/modules/trainschedule/components/ManageTrainSchedule/hooks/useUpdateTrainSchedule.ts +++ b/front/src/modules/trainschedule/components/ManageTrainSchedule/hooks/useUpdateTrainSchedule.ts @@ -19,6 +19,7 @@ const useUpdateTrainSchedule = ( setDisplayTrainScheduleManagement: (type: string) => void, upsertTrainSchedules: (trainSchedules: TrainScheduleResult[]) => void, setTrainIdToEdit: (trainIdToEdit?: number) => void, + dtoImport: () => void, trainIdToEdit?: number ) => { const { t } = useTranslation(['operationalStudies/manageTrainSchedule']); @@ -50,8 +51,8 @@ const useUpdateTrainSchedule = ( id: trainIdToEdit, trainScheduleForm: trainSchedule, }).unwrap(); - upsertTrainSchedules([trainScheduleResult]); + dtoImport(); dispatch( setSuccess({ title: t('trainUpdated'), diff --git a/front/src/modules/trainschedule/components/Timetable/Timetable.tsx b/front/src/modules/trainschedule/components/Timetable/Timetable.tsx index fd1aa410ac0..1d2579aa573 100644 --- a/front/src/modules/trainschedule/components/Timetable/Timetable.tsx +++ b/front/src/modules/trainschedule/components/Timetable/Timetable.tsx @@ -28,6 +28,7 @@ type TimetableProps = { trainIdToEdit?: number; trainSchedules?: TrainScheduleResult[]; trainSchedulesWithDetails: TrainScheduleWithDetails[]; + dtoImport: () => void; }; const formatDepartureDate = (d: Date) => dayjs(d).locale(i18n.language).format('dddd D MMMM YYYY'); @@ -43,6 +44,7 @@ const Timetable = ({ trainIdToEdit, trainSchedules = [], trainSchedulesWithDetails, + dtoImport, }: TimetableProps) => { const { t } = useTranslation(['operationalStudies/scenario', 'common/itemTypes']); @@ -160,6 +162,7 @@ const Timetable = ({ projectionPathIsUsed={ infraState === 'CACHED' && trainIdUsedForProjection === train.id } + dtoImport={dtoImport} />
))} diff --git a/front/src/modules/trainschedule/components/Timetable/TimetableTrainCard.tsx b/front/src/modules/trainschedule/components/Timetable/TimetableTrainCard.tsx index 2bc25621fc5..02341a5a559 100644 --- a/front/src/modules/trainschedule/components/Timetable/TimetableTrainCard.tsx +++ b/front/src/modules/trainschedule/components/Timetable/TimetableTrainCard.tsx @@ -34,6 +34,7 @@ type TimetableTrainCardProps = { setTrainIdToEdit: (trainIdToEdit?: number) => void; removeTrains: (trainIds: number[]) => void; projectionPathIsUsed: boolean; + dtoImport: () => void; }; const formatFullDate = (d: Date) => dayjs(d).format('D/MM/YYYY HH:mm:ss'); @@ -50,6 +51,7 @@ const TimetableTrainCard = ({ setTrainIdToEdit, removeTrains, projectionPathIsUsed, + dtoImport, }: TimetableTrainCardProps) => { const { t } = useTranslation(['operationalStudies/scenario']); const dispatch = useAppDispatch(); @@ -81,6 +83,7 @@ const TimetableTrainCard = ({ .unwrap() .then(() => { removeTrains([train.id]); + dtoImport(); dispatch( setSuccess({ title: t('timetable.trainDeleted', { name: train.trainName }), @@ -125,6 +128,7 @@ const TimetableTrainCard = ({ body: [newTrain], }).unwrap(); upsertTrainSchedules([trainScheduleResult]); + dtoImport(); dispatch( setSuccess({ title: t('timetable.trainAdded'),