diff --git a/front/src/modules/simulationResult/components/SpaceTimeChartWrapper/SpaceTimeChartWrapper.tsx b/front/src/modules/simulationResult/components/SpaceTimeChartWrapper/SpaceTimeChartWrapper.tsx index 3ae147fd4ad..c39b0b9432b 100644 --- a/front/src/modules/simulationResult/components/SpaceTimeChartWrapper/SpaceTimeChartWrapper.tsx +++ b/front/src/modules/simulationResult/components/SpaceTimeChartWrapper/SpaceTimeChartWrapper.tsx @@ -61,7 +61,8 @@ import { } from 'reducers/simulationResults/selectors'; import type { SelectionSource } from 'reducers/simulationResults/types'; import { useAppDispatch } from 'store'; -import { Duration } from 'utils/duration'; +import { Duration, subtractDurationFromDate } from 'utils/duration'; +import { usePrevious } from 'utils/hooks/state'; import { extractEditoastIdFromTrainScheduleId, extractExceptionIdFromOccurrenceId, @@ -522,13 +523,29 @@ const SpaceTimeChartWrapper = ({ (waypointsPanelData?.filteredWaypoints ?? operationalPoints).at(0)?.position || 0, }); + const previousProjectionId = usePrevious(selectedProjectionId); + useEffect(() => { - const trainId = isTrainScheduleId(selectedProjectionId) + const firstOccurrenceId = isTrainScheduleId(selectedProjectionId) ? formatTrainScheduleIdToIndexedOccurrenceId(selectedProjectionId, 0) - : selectedProjectionId; - const trainUsedForProjection = projectedTrains.find((train) => train.id === trainId); + : undefined; + const trainUsedForProjection = projectedTrains.find( + (train) => train.id === selectedProjectionId || train.id === firstOccurrenceId + ); if (trainUsedForProjection) { - setTimeOrigin(+trainUsedForProjection.departureTime); + // Center the view on the newly projected train (+5mn). + setTimeOrigin( + +subtractDurationFromDate( + trainUsedForProjection.departureTime, + new Duration({ minutes: 5 }) + ) + ); + // Only reset the pan when the projected train actually changed, not when this effect + // re-runs because trainScheduleProjections.length changed for another reason (e.g. + // adding/removing a different train) otherwise the user's current pan on the std is lost. + if (previousProjectionId !== selectedProjectionId && spaceTimeChartProps.xOffset) { + pan({ dx: -spaceTimeChartProps.xOffset }); + } } else { const minTime = Math.min( ...trainScheduleProjections