setIsOpened(!isOpened)}
+ >
+
+ {idx + 1}
+
+ {trainData.num}
+ {trainData.origine}
+
+
+ {trainData.debut} - {trainData.fin}
+
+ {seconds2hhmmss(trainData.duree)}
+
+
+
+
+
+ {trainData.num_transilien}
+
+ {trainData.etapes.length - 2}
+
+
+
+ {trainData.etapes.map((step, stepIdx) =>
+ // Remove origin & destination
+ stepIdx !== 0 && stepIdx !== trainData.etapes.length - 1 ? (
+
+ {stepIdx}
+
+ {`${step.debut} - ${step.fin}`}
+
+ {step.duree}s
+ {step.gare}
+
+ ) : null
+ )}
+
+
+ );
+}
+
+TrainDetail.propTypes = {
+ trainData: PropTypes.object.isRequired,
+ idx: PropTypes.number.isRequired,
+};
diff --git a/front/src/applications/opendata/components/generatePathfindingPayload.js b/front/src/applications/opendata/components/generatePathfindingPayload.js
new file mode 100644
index 00000000000..fba0b7952bb
--- /dev/null
+++ b/front/src/applications/opendata/components/generatePathfindingPayload.js
@@ -0,0 +1,43 @@
+import rollingstockOpenData2OSRD from 'applications/opendata/components/rollingstock_opendata2osrd.json';
+
+function formatSteps(pointsDictionnary, trainFromPathRef, autoComplete) {
+ if (autoComplete) {
+ return trainFromPathRef.etapes.map((step, idx) => ({
+ duration: idx === 0 || idx === trainFromPathRef.etapes.length - 1 ? 0 : step.duree,
+ op_trigram: step.code,
+ }));
+ }
+ return trainFromPathRef.etapes.map((step, idx) => ({
+ duration: idx === 0 || idx === trainFromPathRef.etapes.length - 1 ? 0 : step.duree,
+ waypoints: [
+ {
+ track_section: pointsDictionnary[step.uic].trackSectionId,
+ geo_coordinate: [Number(step.lon), Number(step.lat)],
+ },
+ ],
+ }));
+}
+
+export default function generatePathfindingPayload(
+ infraID,
+ rollingStockID,
+ trainsWithPathRef,
+ pathsDictionnary,
+ pointsDictionnary,
+ rollingStockDB,
+ autoComplete
+) {
+ const pathsToGenerate = {};
+ pathsDictionnary.forEach((pathRef) => {
+ const trainFromPathRef = trainsWithPathRef.find((train) => train.num === pathRef.num);
+ const rollingStockFound = rollingStockDB.find(
+ (rollingstock) => rollingstock.name === rollingstockOpenData2OSRD[trainFromPathRef.type_em]
+ );
+ pathsToGenerate[pathRef.num] = {
+ infra: infraID,
+ rolling_stocks: [rollingStockFound ? rollingStockFound.id : rollingStockID],
+ steps: formatSteps(pointsDictionnary, trainFromPathRef, autoComplete),
+ };
+ });
+ return pathsToGenerate;
+}
diff --git a/front/src/applications/opendata/components/generateTrainSchedulesPayload.js b/front/src/applications/opendata/components/generateTrainSchedulesPayload.js
new file mode 100644
index 00000000000..869b27971ed
--- /dev/null
+++ b/front/src/applications/opendata/components/generateTrainSchedulesPayload.js
@@ -0,0 +1,21 @@
+import { time2sec } from 'utils/timeManipulation';
+
+export default function generateTrainSchedulesPayload(trainsWithPathRef, infraID, timetableID) {
+ const trainSchedulesByPathID = {};
+ trainsWithPathRef.forEach((train) => {
+ if (!trainSchedulesByPathID[train.pathId]) {
+ trainSchedulesByPathID[train.pathId] = {
+ timetable: timetableID,
+ path: train.pathId,
+ schedules: [],
+ };
+ }
+ trainSchedulesByPathID[train.pathId].schedules.push({
+ train_name: train.num,
+ rolling_stock: train.rollingStockId,
+ departure_time: time2sec(train.debut),
+ initial_speed: 0,
+ });
+ });
+ return trainSchedulesByPathID;
+}
diff --git a/front/src/applications/opendata/components/rollingstock_opendata2osrd.json b/front/src/applications/opendata/components/rollingstock_opendata2osrd.json
new file mode 100644
index 00000000000..60d29df8ecc
--- /dev/null
+++ b/front/src/applications/opendata/components/rollingstock_opendata2osrd.json
@@ -0,0 +1,128 @@
+{
+ "AGC3C": "1X76503",
+ "AGC4C": "1X76504",
+ "AGC4CLOR": "1X76504",
+ "AGCUM3C": "2X76503",
+ "AGCUM3C/4C": "2X76503",
+ "AGCUM4C": "2X76504",
+ "AM96": "SNCB1Z96",
+ "B5": "26000US",
+ "BB15000": "15000",
+ "BB15000B6": "15000",
+ "BB15000V2N": "15000",
+ "BB17000": "17000G",
+ "BB17000~RIB": "17000G",
+ "BB22000B5": "22200G",
+ "BB22200": "22200BM",
+ "BB22200~RRR": "22200G",
+ "BB22200~VR2N": "22200G",
+ "BB25500": "25500G",
+ "BB25500RRR3C": "25500G",
+ "BB25500RRR6C": "25500G",
+ "BB26000": "26000US",
+ "BB26000B5": "26000US",
+ "BB27000": "27000UM",
+ "BB27300": "CIM192L",
+ "BB27300~VB2N": "CIM192L",
+ "BB36000": "36000US",
+ "BB37000": "37000US",
+ "BB60000": "60000US",
+ "BB63000": "63001A",
+ "BB63500": "63500A",
+ "BB64600": "BB64600",
+ "BB66000": "66000A",
+ "BB66400": "66400A",
+ "BB66700": "66700",
+ "BB67200": "67200US",
+ "BB67300": "67300AG",
+ "BB67300RRR3C": "67300AG",
+ "BB67400": "67400A",
+ "BB67400CORAIL": "67400A",
+ "BB67400RRR3C": "67400A",
+ "BB67400RRR6C": "67400A",
+ "BB69200": "69400US",
+ "BB69400_Infra": "69400US",
+ "BB7200": "7200GH",
+ "BB7200B5": "7200GH",
+ "BB75000": "75000US",
+ "BB7600": "7600REV",
+ "BB8500": "8500G",
+ "BB8500~VO2N": "8500G",
+ "BB9300": "BB9300",
+ "BGC4C": "1Z81504",
+ "BGCUM4C": "2Z81504",
+ "CC72000": "72001BG",
+ "CC72100": "72001BG",
+ "CORAIL": "CORAIL",
+ "EUROSTAR": "TMSTEURO",
+ "ICE": "1ICE3",
+ "PPG": "1X83506",
+ "PPM": "1X83504",
+ "PPMUM": "2X83504",
+ "REGIO2N": "1Z56500",
+ "RIB": "RIB",
+ "RIO": "RIO",
+ "RRR": "RRR",
+ "S100": "S100",
+ "TGVA": "1TGVA",
+ "TGVD": "1TGVDUPL",
+ "TGVPOS": "1TGVPOS",
+ "TGVR": "1TGVR",
+ "TGVSE": "1TGVOSE",
+ "THALYS": "1TGVPBKA",
+ "TYPE13": "TYPE13",
+ "U25500": "1U52504",
+ "U52500": "1U52504",
+ "U53500": "1U53504",
+ "UM3ZGCALSLO": "3Z81504",
+ "UMBGC/ZGC": "2Z81504",
+ "V2N": "1TGV2N2",
+ "X2100": "X2100M10",
+ "X2100UM": "X2100M20",
+ "X2100UM3": "X2100M31",
+ "X2200": "X2200",
+ "X4750": "11X4547",
+ "X4900": "X4900S21",
+ "X72500": "1X725002",
+ "X73500": "1X73500",
+ "X73500/900UM": "2X73500",
+ "X73500/900UM3": "3X73500",
+ "X73500UM": "2X73500",
+ "X73500UM3": "3X73500",
+ "X73900": "1X73500",
+ "X73900UM": "2X73500",
+ "X73900UM3": "3X73500",
+ "Y8000": "Y8000AG",
+ "Z100": "Z100TJ",
+ "Z11500": "Z1150011",
+ "Z11500UM": "Z1150022",
+ "Z11500UM3": "Z1150033",
+ "Z150": "Z150",
+ "Z20500": "Z2050022",
+ "Z20900": "1Z20900",
+ "Z21500": "Z215001",
+ "Z21500UM": "Z215002",
+ "Z21500UM3": "Z215003",
+ "Z22500": "Z22500",
+ "Z23500": "TER2N",
+ "Z24500": "1Z24502",
+ "Z26500": "1Z26504",
+ "Z275LOR4C": "1Z27504",
+ "Z50000": "1Z50007",
+ "Z5300": "Z5300B12",
+ "Z5600": "1Z56500",
+ "Z6300": "Z630012",
+ "Z6400": "Z6400JUS",
+ "Z7300": "Z7300PP1",
+ "Z7500": "Z7500",
+ "Z800": "Z800MM",
+ "Z8100": "MI79US",
+ "Z850": "Z800MM",
+ "Z9500": "Z950011",
+ "Z9600": "Z950011",
+ "Z9600UM": "Z950022",
+ "ZGC3C": "1Z27503",
+ "ZGC4C": "1Z27504",
+ "ZGC4CALSUM": "2Z27504",
+ "ZGC4CUM": "2Z27504"
+}
\ No newline at end of file
diff --git a/front/src/applications/opendata/consts.js b/front/src/applications/opendata/consts.js
new file mode 100644
index 00000000000..b5cd2094072
--- /dev/null
+++ b/front/src/applications/opendata/consts.js
@@ -0,0 +1,26 @@
+export const GRAOU_URL = 'https://graou.info';
+// export const GRAOU_URL = 'http://localhost/graou';
+
+export const initialViewport = {
+ latitude: 48.86521728735368,
+ longitude: 2.341549498045856,
+ zoom: 10.257506947953921,
+ bearing: 0,
+ pitch: 0,
+ width: 420,
+ height: 320,
+ altitude: 1.5,
+ maxZoom: 24,
+ minZoom: 0,
+ maxPitch: 60,
+ minPitch: 0,
+ transitionDuration: 100,
+};
+
+export const initialStatus = {
+ uicComplete: false,
+ pathFindingDone: false,
+ trainSchedulesDone: false,
+};
+
+export const itineraryURI = '/pathfinding/';
diff --git a/front/src/applications/opendata/opendata.scss b/front/src/applications/opendata/opendata.scss
new file mode 100644
index 00000000000..85dcd88f327
--- /dev/null
+++ b/front/src/applications/opendata/opendata.scss
@@ -0,0 +1,264 @@
+.opendata-import {
+ --opendatagreen: #329623;
+
+ .opendata-import-global-settings {
+ background-color: var(--coolgray9);
+ border-radius: 4px;
+ padding: .25rem .5rem 0;
+ margin-bottom: .5rem;
+ transition: .2s;
+ &:hover {
+ background-color: var(--coolgray7);
+ }
+ .opendata-import-global-settings-bar {
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+ cursor: pointer;
+ color: var(--light);
+ padding: 0 0 .25rem;
+ }
+ .opendata-import-global-settings-items {
+ display: none;
+ &.active {
+ display: block;
+ }
+ }
+ }
+
+ .osrd-config-item-from {
+ background-color: var(--green);
+ }
+ .osrd-config-item-to {
+ background-color: var(--yellow);
+ }
+
+ .results-stations {
+ height: 15rem;
+ overflow: auto;
+ }
+ .results-stations, .result-station-selected {
+ border-radius: 4px;
+ position: relative;
+ margin-top: .5rem;
+ .results-station-data {
+ background-color: var(--white);
+ flex-grow: 1;
+ cursor: pointer;
+ border: 2px solid var(--coolgray1);
+ padding-top: .15rem;
+ margin-bottom: .25rem;
+ border-radius: 4px;
+ transition: .2s;
+ &:hover {
+ border-color: var(--coolgray9);
+ }
+ .station-data-head {
+ display: flex;
+ align-items: baseline;
+ padding: 0 .25rem;
+ height: 1.5rem;
+ .station-data-code {
+ font-size: .8rem;
+ width: 2.25rem;
+ }
+ .station-data-name {
+ overflow: hidden;
+ white-space: nowrap;
+ font-size: 1.1rem;
+ }
+ .station-data-ch {
+ margin-left: auto;
+ font-weight: 500;
+ font-size: .8rem;
+ }
+ }
+ .station-data-localization {
+ display: flex;
+ align-items: baseline;
+ position: relative;
+ padding: 0 .25rem 0 2.5rem;
+ height: 1rem;
+ line-height: .8rem;
+ color: var(--coolgray9);
+ gap: .25rem;
+ .station-data-city {
+ font-size: .7rem;
+ }
+ .station-data-department {
+ text-transform: uppercase;
+ font-size: .6rem;
+ }
+ .station-data-region {
+ text-transform: uppercase;
+ font-size: .6rem;
+ }
+ .station-data-uic {
+ margin-left: auto;
+ font-size: .6rem;
+ color: var(--primary);
+ }
+ }
+ .station-data-footer {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0 .25rem;
+ font-size: .7rem;
+ background-color: var(--coolgray1);
+ border-radius: 0 0 4px 4px;
+ height: 1rem;
+ .station-data-line {
+ overflow: hidden;
+ white-space: nowrap;
+ color: var(--coolgray9);
+ }
+ .station-data-pk {
+ overflow: hidden;
+ white-space: nowrap;
+ margin-left: auto;
+ margin-right: .25rem;
+ font-size: .6rem;
+ }
+ .station-data-line-number {
+ font-size: .6rem;
+ color: var(--purple);
+ }
+ }
+ }
+ }
+
+ .opendata-trainlist {
+ position: relative;
+ .opendata-trainlist-launchbar {
+ display: flex;
+ align-items: center;
+ padding: .5rem;
+ border-radius: 4px 4px 0 0;
+ height: 2.5rem;
+ color: var(--light);
+ background-color: var(--secondary);
+ }
+ .opendata-trainlist-results {
+ position: relative;
+ overflow: auto;
+ max-height: calc(100vh - 17.5rem);
+ .opendata-traindetail {
+ position: relative;
+ margin-bottom: .5rem;
+ border: 2px solid var(--coolgray3);
+ border-radius: 4px;
+ .opendata-traindetail-main {
+ display: flex;
+ align-items: baseline;
+ // justify-content: space-between;
+ cursor: pointer;
+ background-color: var(--coolgray1);
+ padding: .5rem;
+ transition: .2s;
+ &:hover {
+ background-color: var(--coolgray3);
+ }
+ .opendata-traindetail-idx {
+ width: 1.5rem;
+ font-size: .7rem;
+ }
+ .opendata-traindetail-num {
+ width: 4.5rem;
+ font-size: 1.2rem;
+ font-weight: bold;
+ color: var(--coolgray9);
+ height: 2rem;
+ .opendata-traindetail-activity {
+ display: block;
+ font-weight: normal;
+ text-transform: uppercase;
+ font-size: .6rem;
+ line-height: .5rem;
+ }
+ }
+ .opendata-traindetail-startend {
+ width: 9rem;
+ font-size: .9rem;
+ text-align: center;
+ }
+ .opendata-traindetail-duration {
+ width: 3.5rem;
+ font-size: .8rem;
+ }
+ .opendata-traindetail-rollingstock {
+ align-self: flex-start;
+ overflow: hidden;
+ height: 2rem;
+ width: 50%;
+ .opendata-traindetail-rollingstock-img {
+ display: flex;
+ align-items: baseline;
+ transform: scale(.4);
+ transform-origin: top;
+ }
+ }
+ .opendata-traindetail-transilien {
+ color: var(--blue);
+ font-weight: 500;
+ margin-left: auto;
+ text-transform: uppercase;
+ margin-right: .5rem;
+ font-size: .8rem;
+ }
+ .opendata-traindetail-stepnb {
+ color: var(--light);
+ font-weight: bold;
+ font-size: .8rem;
+ border-radius: 1rem;
+ padding: .5rem;
+ line-height: 1rem;
+ width: 2rem;
+ height: 2rem;
+ text-align: center;
+ }
+ }
+ .opendata-traindetail-steps {
+ overflow: auto;
+ max-height: 0rem;
+ transition: .2s;
+ &.opened {
+ max-height: 10rem;
+ }
+ .opendata-traindetail-step {
+ display: flex;
+ align-items: baseline;
+ margin-left: 5rem;
+ &:hover {
+ background-color: var(--coolgray1);
+ }
+ .opendata-traindetail-step-nb {
+ width: 2rem;
+ text-align: right;
+ padding: 0 .5rem;
+ font-size: .6rem;
+ }
+ .opendata-traindetail-step-startend {
+ width: 8.5rem;
+ font-size: .9rem;
+ }
+ .opendata-traindetail-step-duration {
+ width: 2rem;
+ margin-right: .5rem;
+ text-align: right;
+ font-size: .8rem;
+ }
+ .opendata-traindetail-step-name {
+ font-size: .9rem;
+ }
+ }
+ }
+ }
+ }
+ }
+ .automated-map {
+ position: relative;
+ width: 100%;
+ height: 20rem;
+ }
+}
\ No newline at end of file
diff --git a/front/src/applications/opendata/views/OpenDataGlobalSettings.js b/front/src/applications/opendata/views/OpenDataGlobalSettings.js
new file mode 100644
index 00000000000..557414a3cb7
--- /dev/null
+++ b/front/src/applications/opendata/views/OpenDataGlobalSettings.js
@@ -0,0 +1,64 @@
+import React, { useState } from 'react';
+import PropTypes from 'prop-types';
+import InfraSelector from 'common/InfraSelector/InfraSelector';
+import RollingStockSelector from 'applications/osrd/views/OSRDConfig/RollingStockSelector';
+import TimetableSelector from 'applications/osrd/views/OSRDConfig/TimetableSelector';
+import { useTranslation } from 'react-i18next';
+import { useSelector } from 'react-redux';
+import { getInfraID, getRollingStockID, getTimetableID } from 'reducers/osrdconf/selectors';
+
+function OpenDataGlobalSettings(props) {
+ const { mustUpdateTimetable, setMustUpdateTimetable } = props;
+ const infraID = useSelector(getInfraID);
+ const rollingStockID = useSelector(getRollingStockID);
+ const timetableID = useSelector(getTimetableID);
+ const [showGlobalSettings, setShowGlobalSettings] = useState(
+ !infraID || !timetableID || !rollingStockID
+ );
+ const { t } = useTranslation(['opendata']);
+
+ return (
+
{!via.suggestion &&
{idxTrueVia}}
diff --git a/front/src/applications/osrd/components/RollingStock/RollingStock.js b/front/src/applications/osrd/components/RollingStock/RollingStock.js
index b20d2a301b0..f580c074526 100644
--- a/front/src/applications/osrd/components/RollingStock/RollingStock.js
+++ b/front/src/applications/osrd/components/RollingStock/RollingStock.js
@@ -18,7 +18,7 @@ import { enhanceData } from './RollingStockHelpers';
const ROLLING_STOCK_URL = '/light_rolling_stock/';
-export default function RollingStock(props) {
+function RollingStock(props) {
const { ref2scroll } = props;
const dispatch = useDispatch();
const { darkmode } = useSelector((state) => state.main);
@@ -211,3 +211,6 @@ export default function RollingStock(props) {
RollingStock.propTypes = {
ref2scroll: PropTypes.object.isRequired,
};
+
+const MemoizedRollingStock = React.memo(RollingStock);
+export default MemoizedRollingStock;
diff --git a/front/src/applications/osrd/components/RollingStock/RollingStock2Img.js b/front/src/applications/osrd/components/RollingStock/RollingStock2Img.js
index 3c433cbb0ae..ecc749b45ef 100644
--- a/front/src/applications/osrd/components/RollingStock/RollingStock2Img.js
+++ b/front/src/applications/osrd/components/RollingStock/RollingStock2Img.js
@@ -12,13 +12,17 @@ function cleanGifName(gifName) {
export default function RollingStock2Img(props) {
const { name } = props;
- return mlgTraffic[name]
+ return name && mlgTraffic[name]
? mlgTraffic[name].map((gif) => (
))
: null;
}
+RollingStock2Img.defaultProps = {
+ name: undefined,
+};
+
RollingStock2Img.propTypes = {
- name: PropTypes.string.isRequired,
+ name: PropTypes.string,
};
diff --git a/front/src/applications/osrd/components/RollingStock/RollingStockEmpty.js b/front/src/applications/osrd/components/RollingStock/RollingStockEmpty.js
index 45b50e6d848..4e99c468812 100644
--- a/front/src/applications/osrd/components/RollingStock/RollingStockEmpty.js
+++ b/front/src/applications/osrd/components/RollingStock/RollingStockEmpty.js
@@ -1,6 +1,6 @@
import React from 'react';
import { FaQuestion } from 'react-icons/fa';
-import icon from 'assets/pictures/train.svg';
+import icon from 'assets/pictures/components/train.svg';
export default function RollingStockEmpty() {
return (
diff --git a/front/src/applications/osrd/components/TimetableSelector/TimetableSelectorModal.js b/front/src/applications/osrd/components/TimetableSelector/TimetableSelectorModal.js
index 256ec2dc70a..135107ad255 100644
--- a/front/src/applications/osrd/components/TimetableSelector/TimetableSelectorModal.js
+++ b/front/src/applications/osrd/components/TimetableSelector/TimetableSelectorModal.js
@@ -9,7 +9,7 @@ import ModalHeaderSNCF from 'common/BootstrapSNCF/ModalSNCF/ModalHeaderSNCF';
import ModalBodySNCF from 'common/BootstrapSNCF/ModalSNCF/ModalBodySNCF';
import InputSNCF from 'common/BootstrapSNCF/InputSNCF';
import { setSuccess, setFailure } from 'reducers/main';
-import icon from 'assets/pictures/trains_timetable.png';
+import icon from 'assets/pictures/components/trains_timetable.svg';
const timetableURL = '/timetable/';
@@ -65,7 +65,8 @@ export default function TimetableSelectorModal() {
};
try {
- await post(timetableURL, params, {});
+ const result = await post(timetableURL, params, {});
+ dispatch(updateTimetableID(result.id));
} catch (e) {
console.log('ERROR', e);
}
diff --git a/front/src/applications/osrd/views/OSRDConfig/AddTrainSchedule.js b/front/src/applications/osrd/views/OSRDConfig/AddTrainSchedule.js
index b40410c7106..de25c1b0721 100644
--- a/front/src/applications/osrd/views/OSRDConfig/AddTrainSchedule.js
+++ b/front/src/applications/osrd/views/OSRDConfig/AddTrainSchedule.js
@@ -15,7 +15,7 @@ import trainNameWithNum from 'applications/osrd/components/AddTrainSchedule/trai
import { scheduleURL } from 'applications/osrd/components/Simulation/consts';
export default function AddTrainSchedule(props) {
- const { mustUpdateTimetable, setMustUpdateTimetable } = props;
+ const { setMustUpdateTimetable } = props;
const [name, setName] = useState(undefined);
const [isWorking, setIsWorking] = useState(false);
const [trainCount, setTrainCount] = useState(1);
@@ -68,7 +68,7 @@ export default function AddTrainSchedule(props) {
})
);
}
- setMustUpdateTimetable(!mustUpdateTimetable);
+ setMustUpdateTimetable(true);
}
};
@@ -79,6 +79,7 @@ export default function AddTrainSchedule(props) {
const handleNameChange = useCallback((newName) => {
setName(newName);
debouncedUpdateName(newName);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
useEffect(() => {
@@ -148,6 +149,5 @@ export default function AddTrainSchedule(props) {
}
AddTrainSchedule.propTypes = {
- mustUpdateTimetable: PropTypes.bool.isRequired,
setMustUpdateTimetable: PropTypes.func.isRequired,
};
diff --git a/front/src/applications/osrd/views/OSRDConfig/Itinerary.js b/front/src/applications/osrd/views/OSRDConfig/Itinerary.js
index 6455403f779..28aa4cc4b1a 100644
--- a/front/src/applications/osrd/views/OSRDConfig/Itinerary.js
+++ b/front/src/applications/osrd/views/OSRDConfig/Itinerary.js
@@ -226,18 +226,21 @@ function Itinerary(props) {
zoomToFeature(bbox(osrdconf.geojson[map.mapTrackSources]));
}
setLaunchPathfinding(true);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
useEffect(() => {
if (launchPathfinding) {
mapItinerary();
}
+ // eslint-disable-next-line react-hooks/exhaustive-deps
}, [osrdconf.origin, osrdconf.destination, map.mapTrackSources, osrdconf.rollingStockID]);
useEffect(() => {
if (launchPathfinding) {
mapItinerary(false);
}
+ // eslint-disable-next-line react-hooks/exhaustive-deps
}, [osrdconf.vias]);
return (
diff --git a/front/src/applications/osrd/views/OSRDConfig/Map.tsx b/front/src/applications/osrd/views/OSRDConfig/Map.tsx
index f02ce9f058f..9c867fe50e5 100644
--- a/front/src/applications/osrd/views/OSRDConfig/Map.tsx
+++ b/front/src/applications/osrd/views/OSRDConfig/Map.tsx
@@ -187,7 +187,7 @@ function Map() {
touchZoomRotate
>
-
+
state.osrdconf);
+ const timetableID = useSelector((state) => state.osrdconf.timetableID);
const dispatch = useDispatch();
const { t } = useTranslation();
const getTimetable = async (id) => {
+ setIsWorking(true);
try {
const timetableQuery = await get(`${timetableURL}${id}/`, {});
timetableQuery.train_schedules.sort((a, b) => a.departure_time > b.departure_time);
- setselectedTimetable(timetableQuery);
+ setSelectedTimetable(timetableQuery);
setTrainList(timetableQuery.train_schedules);
+ setIsWorking(false);
} catch (e) {
dispatch(updateTimetableID(undefined));
dispatch(
@@ -37,6 +40,7 @@ export default function TimetableSelector(props) {
})
);
console.log('ERROR', e);
+ setIsWorking(false);
}
};
@@ -65,33 +69,48 @@ export default function TimetableSelector(props) {
));
+ useEffect(() => {
+ if (timetableID !== undefined && mustUpdateTimetable) {
+ getTimetable(timetableID);
+ setMustUpdateTimetable(false);
+ } else {
+ setSelectedTimetable(undefined);
+ setMustUpdateTimetable(false);
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [mustUpdateTimetable]);
+
useEffect(() => {
if (timetableID !== undefined) {
getTimetable(timetableID);
} else {
- setselectedTimetable(undefined);
+ setSelectedTimetable(undefined);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [timetableID, mustUpdateTimetable]);
- let timeTable =