- {displaySimulation && (
+ {simulation.trains.length > 0 && (
)}
diff --git a/front/src/applications/stdcm/views/StdcmRequestModal.tsx b/front/src/applications/stdcm/views/StdcmRequestModal.tsx
index f308f7a0447..24b0f76a182 100644
--- a/front/src/applications/stdcm/views/StdcmRequestModal.tsx
+++ b/front/src/applications/stdcm/views/StdcmRequestModal.tsx
@@ -46,8 +46,10 @@ export default function StdcmRequestModal(props: StdcmRequestModalProps) {
const dispatch = useDispatch();
const [postStdcm] = osrdEditoastApi.endpoints.postStdcm.useMutation();
- const [getTrainScheduleResults] =
- osrdEditoastApi.endpoints.getTrainScheduleResults.useLazyQuery();
+ const [postTrainScheduleResults] =
+ osrdEditoastApi.endpoints.postTrainScheduleResults.useMutation();
+
+ const [getTimetable] = osrdEditoastApi.endpoints.getTimetableById.useLazyQuery();
const { updateItinerary } = useOsrdConfActions();
@@ -58,11 +60,11 @@ export default function StdcmRequestModal(props: StdcmRequestModalProps) {
// https://developer.mozilla.org/en-US/docs/Web/API/AbortController
const controller = new AbortController();
- const timetableId = osrdconf.timetableID;
+ const { timetableID } = osrdconf;
useEffect(() => {
const payload = formatStdcmConf(dispatch, t, osrdconf as OsrdStdcmConfState);
- if (payload && currentStdcmRequestStatus === STDCM_REQUEST_STATUS.pending && timetableId) {
+ if (payload && currentStdcmRequestStatus === STDCM_REQUEST_STATUS.pending && timetableID) {
postStdcm(payload)
.unwrap()
.then((result) => {
@@ -75,39 +77,44 @@ export default function StdcmRequestModal(props: StdcmRequestModalProps) {
id: 1500,
isStdcm: true,
};
-
- getTrainScheduleResults({
- timetableId,
- pathId: result.path.id,
- })
- .unwrap()
- .then((timetableTrains) => {
- const trains: SimulationReport[] = [...timetableTrains, fakedNewTrain];
- const consolidatedSimulation = createTrain(
- dispatch,
- CHART_AXES.SPACE_TIME,
- trains as Train[], // TODO: remove Train interface
- t
- );
- dispatch(updateConsolidatedSimulation(consolidatedSimulation));
- dispatch(updateSimulation({ trains }));
- dispatch(updateSelectedTrainId(fakedNewTrain.id));
-
- dispatch(
- updateSelectedProjection({
- id: fakedNewTrain.id,
- path: result.path.id,
- })
- );
+ getTimetable({ id: timetableID }).then(({ data: timetable }) => {
+ const trainIdsToFetch =
+ timetable?.train_schedule_summaries.map((train) => train.id) ?? [];
+ postTrainScheduleResults({
+ body: {
+ path_id: result.path.id,
+ train_ids: trainIdsToFetch,
+ },
})
- .catch(() => {
- dispatch(
- setFailure({
- name: t('operationalStudies/manageTrainSchedule:errorMessages.stdcmError'),
- message: t('translation:common.error'),
- })
- );
- });
+ .unwrap()
+ .then((timetableTrains) => {
+ const trains: SimulationReport[] = [...timetableTrains, fakedNewTrain];
+ const consolidatedSimulation = createTrain(
+ dispatch,
+ CHART_AXES.SPACE_TIME,
+ trains as Train[], // TODO: remove Train interface
+ t
+ );
+ dispatch(updateConsolidatedSimulation(consolidatedSimulation));
+ dispatch(updateSimulation({ trains }));
+ dispatch(updateSelectedTrainId(fakedNewTrain.id));
+
+ dispatch(
+ updateSelectedProjection({
+ id: fakedNewTrain.id,
+ path: result.path.id,
+ })
+ );
+ })
+ .catch(() => {
+ dispatch(
+ setFailure({
+ name: t('operationalStudies/manageTrainSchedule:errorMessages.stdcmError'),
+ message: t('translation:common.error'),
+ })
+ );
+ });
+ });
}
})
.catch((e) => {
diff --git a/front/src/modules/simulationResult/components/SpaceTimeChart/SpaceTimeChart.tsx b/front/src/modules/simulationResult/components/SpaceTimeChart/SpaceTimeChart.tsx
index e67f1d0014b..3f3582d764a 100644
--- a/front/src/modules/simulationResult/components/SpaceTimeChart/SpaceTimeChart.tsx
+++ b/front/src/modules/simulationResult/components/SpaceTimeChart/SpaceTimeChart.tsx
@@ -64,6 +64,7 @@ export type SpaceTimeChartProps = {
onOffsetTimeByDragging?: (trains: Train[], offset: number, timePosition: Date) => void;
onSetBaseHeight?: (newHeight: number) => void;
isDisplayed?: boolean;
+ setTrainResultsToFetch?: (trainSchedulesIDs?: number[]) => void;
};
export default function SpaceTimeChart(props: SpaceTimeChartProps) {
@@ -85,6 +86,7 @@ export default function SpaceTimeChart(props: SpaceTimeChartProps) {
isDisplayed = true,
onOffsetTimeByDragging = noop,
onSetBaseHeight = noop,
+ setTrainResultsToFetch = noop,
} = props;
const [baseHeight, setBaseHeight] = useState(initialHeight);
@@ -122,7 +124,7 @@ export default function SpaceTimeChart(props: SpaceTimeChartProps) {
train.id === selectedTrain.id ? timeShiftTrain(train as Train, offset) : train
);
setTrainSimulations(trains as Train[]);
- onOffsetTimeByDragging(trains, offset, timePosition);
+ onOffsetTimeByDragging(trains, offset, timePosition, setTrainResultsToFetch);
}
},
[trainSimulations, selectedTrain, onOffsetTimeByDragging]
diff --git a/front/src/modules/simulationResult/components/SpaceTimeChart/withOSRDData.tsx b/front/src/modules/simulationResult/components/SpaceTimeChart/withOSRDData.tsx
index b00b7122c02..914bec83e9f 100644
--- a/front/src/modules/simulationResult/components/SpaceTimeChart/withOSRDData.tsx
+++ b/front/src/modules/simulationResult/components/SpaceTimeChart/withOSRDData.tsx
@@ -52,9 +52,15 @@ function withOSRDData
(
const onOffsetTimeByDragging = (
trains: SimulationReport[],
offset: number,
- timePosition: Date
+ timePosition: Date,
+ setTrainResultsToFetch: (trainSchedulesIDs?: number[]) => void
) => {
dispatch(persistentUpdateSimulation({ ...simulation, trains }));
+
+ // Sets the train which needs its results to be updated
+ // We know it is always the selected train because when dragging one, it gets the selection
+ if (selectedTrain && setTrainResultsToFetch) setTrainResultsToFetch([selectedTrain.id]);
+
if (timePosition && offset) {
const newTimePosition = sec2datetime(datetime2sec(timePosition) + offset);
updateTimePosition(newTimePosition);
diff --git a/front/src/modules/simulationResult/components/SpeedSpaceChart/sampleData.ts b/front/src/modules/simulationResult/components/SpeedSpaceChart/sampleData.ts
index 652ec12744f..5481e86828d 100644
--- a/front/src/modules/simulationResult/components/SpeedSpaceChart/sampleData.ts
+++ b/front/src/modules/simulationResult/components/SpeedSpaceChart/sampleData.ts
@@ -6493,7 +6493,6 @@ const ORSD_GRAPH_SAMPLE_DATA: OsrdSimulationState = {
speed_limit_tags: 'Aucune composition',
},
],
- displaySimulation: true,
simulation: {
past: [
{
diff --git a/front/src/modules/simulationResult/components/simulationResultsHelpers.ts b/front/src/modules/simulationResult/components/simulationResultsHelpers.ts
index e721ce3dd78..194487dd7a5 100644
--- a/front/src/modules/simulationResult/components/simulationResultsHelpers.ts
+++ b/front/src/modules/simulationResult/components/simulationResultsHelpers.ts
@@ -41,7 +41,6 @@ export const changeTrain =
error: getTrainDetailsError,
isSuccess: isGetTrainDetailsSuccess,
} = await dispatch(osrdEditoastApi.endpoints.getTrainScheduleById.initiate({ id }));
-
if (isGetTrainDetailsSuccess) {
// TODO: add the other information of the trainSchedule (allowances...)
const trainSchedule: TrainSchedulePatch = {
diff --git a/front/src/modules/trainschedule/components/ManageTrainSchedule/SubmitConfAddTrainSchedule.tsx b/front/src/modules/trainschedule/components/ManageTrainSchedule/SubmitConfAddTrainSchedule.tsx
index 1c025704f55..4726c09cfb2 100644
--- a/front/src/modules/trainschedule/components/ManageTrainSchedule/SubmitConfAddTrainSchedule.tsx
+++ b/front/src/modules/trainschedule/components/ManageTrainSchedule/SubmitConfAddTrainSchedule.tsx
@@ -19,6 +19,7 @@ type SubmitConfAddTrainScheduleProps = {
refetchTimetable: () => void;
refetchConflicts: () => void;
setIsWorking: (isWorking: boolean) => void;
+ setTrainResultsToFetch: (trainScheduleIds?: number[]) => void;
};
type error400 = {
@@ -37,6 +38,7 @@ export default function SubmitConfAddTrainSchedule({
refetchTimetable,
refetchConflicts,
setIsWorking,
+ setTrainResultsToFetch,
}: SubmitConfAddTrainScheduleProps) {
const [postTrainSchedule] =
osrdEditoastApi.endpoints.postTrainScheduleStandaloneSimulation.useMutation();
@@ -87,7 +89,7 @@ export default function SubmitConfAddTrainSchedule({
}
try {
- await postTrainSchedule({
+ const newTrainIds = await postTrainSchedule({
body: {
path: pathfindingID,
schedules,
@@ -102,6 +104,7 @@ export default function SubmitConfAddTrainSchedule({
})
);
setIsWorking(false);
+ setTrainResultsToFetch(newTrainIds);
refetchTimetable();
refetchConflicts();
} catch (e: unknown) {
diff --git a/front/src/modules/trainschedule/components/ManageTrainSchedule/SubmitConfUpdateTrainSchedules.tsx b/front/src/modules/trainschedule/components/ManageTrainSchedule/SubmitConfUpdateTrainSchedules.tsx
index 7f8c8d7dc28..7a87a1905bd 100644
--- a/front/src/modules/trainschedule/components/ManageTrainSchedule/SubmitConfUpdateTrainSchedules.tsx
+++ b/front/src/modules/trainschedule/components/ManageTrainSchedule/SubmitConfUpdateTrainSchedules.tsx
@@ -18,6 +18,7 @@ import { updateSelectedProjection, updateSelectedTrainId } from 'reducers/osrdsi
type SubmitConfUpdateTrainSchedulesProps = {
setIsWorking: (isWorking: boolean) => void;
setDisplayTrainScheduleManagement: (arg0: string) => void;
+ setTrainResultsToFetch: (trainScheduleIds?: number[]) => void;
};
// Refacto in a component to prepare the migration of the patch in editoast (need to be a React component to use hooks inside like rtk's)
@@ -25,21 +26,23 @@ type SubmitConfUpdateTrainSchedulesProps = {
export default function SubmitConfUpdateTrainSchedules({
setIsWorking,
setDisplayTrainScheduleManagement,
+ setTrainResultsToFetch,
}: SubmitConfUpdateTrainSchedulesProps) {
- const { getTrainScheduleIDsToModify } = useOsrdConfSelectors();
+ const { getTrainScheduleIDsToModify, getConf, getPathfindingID, getName, getDepartureTime } =
+ useOsrdConfSelectors();
+ const confName = useSelector(getName);
+ const simulationConf = useSelector(getConf);
+ const pathfindingID = useSelector(getPathfindingID);
+ const departureTime = useSelector(getDepartureTime);
+ const trainScheduleIDsToModify = useSelector(getTrainScheduleIDsToModify);
+
const { updateTrainScheduleIDsToModify } = useOsrdConfActions();
const dispatch = useDispatch();
const { t } = useTranslation(['operationalStudies/manageTrainSchedule']);
- const trainScheduleIDsToModify = useSelector(getTrainScheduleIDsToModify);
+
const [patchTrainSchedules] = osrdEditoastApi.endpoints.patchTrainSchedule.useMutation();
async function submitConfUpdateTrainSchedules() {
- const { getConf, getPathfindingID, getName, getDepartureTime } = useOsrdConfSelectors();
- const simulationConf = useSelector(getConf);
- const pathfindingID = useSelector(getPathfindingID);
- const confName = useSelector(getName);
- const departureTime = useSelector(getDepartureTime);
-
// First train tested, and next we put the other trains
const formattedSimulationConf = formatConf(dispatch, t, simulationConf, true);
if (!pathfindingID) {
@@ -78,6 +81,7 @@ export default function SubmitConfUpdateTrainSchedules({
})
);
if (callSuccess) {
+ setTrainResultsToFetch(trainScheduleIDsToModify);
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 32b26105900..d912941d054 100644
--- a/front/src/modules/trainschedule/components/Timetable/Timetable.tsx
+++ b/front/src/modules/trainschedule/components/Timetable/Timetable.tsx
@@ -23,11 +23,16 @@ import DeleteModal from 'common/BootstrapSNCF/ModalSNCF/DeleteModal';
import { useOsrdConfActions, useOsrdConfSelectors } from 'common/osrdContext';
import { ModalContext } from 'common/BootstrapSNCF/ModalSNCF/ModalProvider';
import TimetableTrainCard from 'modules/trainschedule/components/Timetable/TimetableTrainCard';
-import type { Conflict, Infra, TimetableWithSchedulesDetails } from 'common/api/osrdEditoastApi';
+import type {
+ Conflict,
+ Infra,
+ SimulationReport,
+ TimetableWithSchedulesDetails,
+} from 'common/api/osrdEditoastApi';
import { setFailure, setSuccess } from 'reducers/main';
-import type { ScheduledTrain } from 'reducers/osrdsimulation/types';
-import { updateSelectedTrainId } from 'reducers/osrdsimulation/actions';
+import type { ScheduledTrain, SimulationSnapshot } from 'reducers/osrdsimulation/types';
+import { updateSelectedTrainId, updateSimulation } from 'reducers/osrdsimulation/actions';
import { getSelectedProjection } from 'reducers/osrdsimulation/selectors';
type TimetableProps = {
@@ -38,6 +43,8 @@ type TimetableProps = {
selectedTrainId?: number;
refetchTimetable: () => void;
conflicts?: Conflict[];
+ setTrainResultsToFetch: (trainScheduleIds?: number[]) => void;
+ simulation: SimulationSnapshot;
};
export default function Timetable({
@@ -48,6 +55,8 @@ export default function Timetable({
selectedTrainId,
refetchTimetable,
conflicts,
+ setTrainResultsToFetch,
+ simulation,
}: TimetableProps) {
const { t } = useTranslation(['operationalStudies/scenario', 'common/itemTypes']);
@@ -155,6 +164,15 @@ export default function Timetable({
await deleteTrainSchedules({ body: { ids: selectedTrainIds } })
.unwrap()
.then(() => {
+ const updatedSimulation = (simulation.trains as SimulationReport[]).filter(
+ (simulationTrain) => !selectedTrainIds.includes(simulationTrain.id)
+ );
+ if (updatedSimulation.length > 0) {
+ setTrainResultsToFetch([]);
+ } else {
+ setTrainResultsToFetch(undefined);
+ }
+ dispatch(updateSimulation({ trains: updatedSimulation }));
dispatch(
setSuccess({
title: t('timetable.trainsSelectionDeletedCount', { count: trainsCount }),
@@ -303,6 +321,8 @@ export default function Timetable({
}
refetchTimetable={refetchTimetable}
setDisplayTrainScheduleManagement={setDisplayTrainScheduleManagement}
+ setTrainResultsToFetch={setTrainResultsToFetch}
+ simulation={simulation}
/>
))}
diff --git a/front/src/modules/trainschedule/components/Timetable/TimetableManageTrainSchedule.tsx b/front/src/modules/trainschedule/components/Timetable/TimetableManageTrainSchedule.tsx
index d8774ac943f..a95aad187f3 100644
--- a/front/src/modules/trainschedule/components/Timetable/TimetableManageTrainSchedule.tsx
+++ b/front/src/modules/trainschedule/components/Timetable/TimetableManageTrainSchedule.tsx
@@ -17,6 +17,7 @@ import type { Infra } from 'common/api/osrdEditoastApi';
type TimetableManageTrainScheduleProps = {
displayTrainScheduleManagement: string;
setDisplayTrainScheduleManagement: (type: string) => void;
+ setTrainResultsToFetch: (trainScheduleIds?: number[]) => void;
infraState?: Infra['state'];
refetchTimetable: () => void;
refetchConflicts: () => void;
@@ -25,6 +26,7 @@ type TimetableManageTrainScheduleProps = {
export default function TimetableManageTrainSchedule({
displayTrainScheduleManagement,
setDisplayTrainScheduleManagement,
+ setTrainResultsToFetch,
infraState,
refetchTimetable,
refetchConflicts,
@@ -46,6 +48,7 @@ export default function TimetableManageTrainSchedule({