Skip to content

Commit 6593071

Browse files
front: time window behavior (#2376)
* keep the same difference if possible between bounds * allow again to go beyond day limits * keep the bound in increasing order * add tooltp * Avoid error on DriverTrainSchedule Co-authored-by: Alexandre Damiron <[email protected]>
1 parent 972ce78 commit 6593071

File tree

6 files changed

+108
-40
lines changed

6 files changed

+108
-40
lines changed

front/public/locales/fr/osrdconf.json

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
"addTrainSchedule": "Ajouter",
33
"apply": "Appliquer",
44
"blocktype": "Type de block",
5+
"BoundsAreLinked": "Les deux bornes sont liées",
6+
"BoundsAreNotLinked": "Les deux bornes ne sont pas liées",
57
"cancelRequest": "Annuler la requête",
68
"chooseOnMap": "Choisir sur la carte",
79
"composition": "Composition",

front/src/applications/osrd/components/Itinerary/DisplayItinerary/Origin.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ function Origin(props: OriginProps) {
106106
onClick={() => {
107107
dispatch(toggleOriginLinkedBounds());
108108
}}
109+
title={t(originLinkedBounds ? 'osrdconf:BoundsAreLinked' : 'osrdconf:BoundsAreNotLinked')}
109110
>
110111
{originLinkedBounds ? <BiLink /> : <BiUnlink />}
111112
<span className="sr-only" aria-hidden="true">

front/src/applications/osrd/views/OSRDSimulation/DriverTrainSchedule.js

+8-9
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,17 @@ export default function DriverTrainSchedule(props) {
3232
};
3333

3434
useEffect(() => {
35-
if (data) getRollingStock();
35+
if (data && !data.isStdcm) getRollingStock(); // Useless if new train is from stDcm (no persistance, 404 garanteed)
3636
}, [data]);
3737

38+
const driverTrainScheduleModal =
39+
data && rollingStockSelected ? (
40+
<DriverTrainScheduleModal data={data} rollingStockSelected={rollingStockSelected} />
41+
) : null;
42+
3843
return isModal ? (
3944
<ModalSNCF className="modal-drivertrainschedule" htmlID="driverTrainScheduleModal" size="xl">
40-
<ModalBodySNCF>
41-
{data && rollingStockSelected && (
42-
<DriverTrainScheduleModal data={data} rollingStockSelected={rollingStockSelected} />
43-
)}
44-
</ModalBodySNCF>
45+
<ModalBodySNCF>{driverTrainScheduleModal}</ModalBodySNCF>
4546
<ModalFooterSNCF>
4647
<div className="d-flex flex-row-reverse w-100">
4748
<button className="btn btn-secondary btn-sm" type="button" data-dismiss="modal">
@@ -51,9 +52,7 @@ export default function DriverTrainSchedule(props) {
5152
</ModalFooterSNCF>
5253
</ModalSNCF>
5354
) : (
54-
data && rollingStockSelected && (
55-
<DriverTrainScheduleModal data={data} rollingStockSelected={rollingStockSelected} />
56-
)
55+
driverTrainScheduleModal
5756
);
5857
}
5958

front/src/applications/stdcm/views/OSRDStdcmResults.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,9 @@ export default function OSRDStcdmResults(props) {
8686
</div>
8787
<div className="osrd-simulation-container mx-3">
8888
<div className="col-sm-12">
89-
<DriverTrainSchedule data={simulation.trains[selectedTrain]} isModal={false} />
89+
{simulation.trains[selectedTrain] && (
90+
<DriverTrainSchedule data={simulation.trains[selectedTrain]} isModal={false} />
91+
)}
9092
</div>
9193
</div>
9294
</main>

front/src/reducers/__tests__/osrdconf.spec.ts

+67-15
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ describe('osrdconfReducer', () => {
2626
expect(state.osrdconf.originTime).toEqual('08:00:00');
2727
expect(state.osrdconf.originUpperBoundTime).toEqual('15:30:00');
2828
});
29-
it('should update originUpperBoundTime if linked', () => {
29+
it('should update originUpperBoundTime if linked, and keep the difference between the two', () => {
3030
const store = createStore({
3131
originLinkedBounds: true,
3232
originTime: '11:00:00',
@@ -38,21 +38,47 @@ describe('osrdconfReducer', () => {
3838

3939
const state = store.getState();
4040
expect(state.osrdconf.originTime).toEqual('08:00:00');
41-
expect(state.osrdconf.originUpperBoundTime).toEqual('10:00:00');
41+
expect(state.osrdconf.originUpperBoundTime).toEqual('12:30:00');
4242
});
43-
it('should not make upper bound go beyond midnight', () => {
43+
it('should use the default difference when originTime is not defined', () => {
4444
const store = createStore({
4545
originLinkedBounds: true,
46-
originTime: '11:00:00',
4746
originUpperBoundTime: '15:30:00',
4847
});
4948

50-
const action = updateOriginTime('23:30:00');
49+
const action = updateOriginTime('08:00:00');
50+
store.dispatch(action);
51+
52+
const state = store.getState();
53+
expect(state.osrdconf.originTime).toEqual('08:00:00');
54+
expect(state.osrdconf.originUpperBoundTime).toEqual('10:00:00');
55+
});
56+
it('should use the default difference when originUpperBoundTime is not defined', () => {
57+
const store = createStore({
58+
originLinkedBounds: true,
59+
originTime: '10:00:00',
60+
});
61+
62+
const action = updateOriginTime('08:00:00');
63+
store.dispatch(action);
64+
65+
const state = store.getState();
66+
expect(state.osrdconf.originTime).toEqual('08:00:00');
67+
expect(state.osrdconf.originUpperBoundTime).toEqual('10:00:00');
68+
});
69+
test('lower bound should not go above upper bound when unlinked', () => {
70+
const store = createStore({
71+
originLinkedBounds: false,
72+
originTime: '10:00:00',
73+
originUpperBoundTime: '12:00:00',
74+
});
75+
76+
const action = updateOriginTime('13:00:00');
5177
store.dispatch(action);
5278

5379
const state = store.getState();
54-
expect(state.osrdconf.originTime).toEqual('23:30:00');
55-
expect(state.osrdconf.originUpperBoundTime).toEqual('23:59:59');
80+
expect(state.osrdconf.originTime).toEqual('12:00:00');
81+
expect(state.osrdconf.originUpperBoundTime).toEqual('12:00:00');
5682
});
5783
});
5884
describe('updateOriginUpperBoundTime', () => {
@@ -70,11 +96,24 @@ describe('osrdconfReducer', () => {
7096
expect(state.osrdconf.originTime).toEqual('11:00:00');
7197
expect(state.osrdconf.originUpperBoundTime).toEqual('20:00:00');
7298
});
73-
it('should update originTime if linked', () => {
99+
it('should update originTime if linked, keeping the current difference between the two', () => {
74100
const store = createStore({
75101
originLinkedBounds: true,
76102
originTime: '11:00:00',
77-
originUpperBoundTime: '15:30:00',
103+
originUpperBoundTime: '14:00:00',
104+
});
105+
106+
const action = updateOriginUpperBoundTime('20:00:00');
107+
store.dispatch(action);
108+
109+
const state = store.getState();
110+
expect(state.osrdconf.originTime).toEqual('17:00:00');
111+
expect(state.osrdconf.originUpperBoundTime).toEqual('20:00:00');
112+
});
113+
it('should use default difference if originTime not defined', () => {
114+
const store = createStore({
115+
originLinkedBounds: true,
116+
originUpperBoundTime: '14:00:00',
78117
});
79118

80119
const action = updateOriginUpperBoundTime('20:00:00');
@@ -84,19 +123,32 @@ describe('osrdconfReducer', () => {
84123
expect(state.osrdconf.originTime).toEqual('18:00:00');
85124
expect(state.osrdconf.originUpperBoundTime).toEqual('20:00:00');
86125
});
87-
it('should not make originTime go below 0', () => {
126+
it('should use default difference if originUpperBoundTime not defined', () => {
88127
const store = createStore({
89128
originLinkedBounds: true,
90-
originTime: '11:00:00',
91-
originUpperBoundTime: '15:30:00',
129+
originTime: '14:00:00',
130+
});
131+
132+
const action = updateOriginUpperBoundTime('20:00:00');
133+
store.dispatch(action);
134+
135+
const state = store.getState();
136+
expect(state.osrdconf.originTime).toEqual('18:00:00');
137+
expect(state.osrdconf.originUpperBoundTime).toEqual('20:00:00');
138+
});
139+
test('upper bound should not go below lower bonud when unlinked', () => {
140+
const store = createStore({
141+
originLinkedBounds: false,
142+
originTime: '14:00:00',
143+
originUpperBoundTime: '18:00:00',
92144
});
93145

94-
const action = updateOriginUpperBoundTime('00:30:00');
146+
const action = updateOriginUpperBoundTime('12:00:00');
95147
store.dispatch(action);
96148

97149
const state = store.getState();
98-
expect(state.osrdconf.originTime).toEqual('00:00:00');
99-
expect(state.osrdconf.originUpperBoundTime).toEqual('00:30:00');
150+
expect(state.osrdconf.originTime).toEqual('14:00:00');
151+
expect(state.osrdconf.originUpperBoundTime).toEqual('14:00:00');
100152
});
101153
});
102154
describe('toggleOriginLinkedBounds', () => {

front/src/reducers/osrdconf/index.ts

+27-15
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export const initialState: OsrdConfState = {
7575
featureInfoClick: { displayPopup: false },
7676
};
7777

78-
const ORIGIN_TIME_BOUND_DIFFERENCE = 7200;
78+
const ORIGIN_TIME_BOUND_DEFAULT_DIFFERENCE = 7200;
7979
const MAX_UPPER_BOUND_TIME = 24 * 3600 - 1;
8080

8181
export default function reducer(inputState: OsrdConfState | undefined, action: AnyAction) {
@@ -124,27 +124,39 @@ export default function reducer(inputState: OsrdConfState | undefined, action: A
124124
case UPDATE_ORIGIN_TIME: {
125125
const newOriginTimeSeconds = time2sec(action.originTime);
126126
if (draft.originLinkedBounds) {
127-
draft.originUpperBoundTime = sec2time(
128-
boundedValue(newOriginTimeSeconds + ORIGIN_TIME_BOUND_DIFFERENCE, [
129-
0,
130-
MAX_UPPER_BOUND_TIME,
131-
])
132-
);
127+
const difference =
128+
draft.originTime && draft.originUpperBoundTime
129+
? time2sec(draft.originUpperBoundTime) - time2sec(draft.originTime)
130+
: ORIGIN_TIME_BOUND_DEFAULT_DIFFERENCE;
131+
draft.originUpperBoundTime = sec2time(newOriginTimeSeconds + difference);
132+
}
133+
if (
134+
draft.originUpperBoundTime &&
135+
time2sec(action.originTime) > time2sec(draft.originUpperBoundTime)
136+
) {
137+
draft.originTime = draft.originUpperBoundTime;
138+
} else {
139+
draft.originTime = action.originTime;
133140
}
134-
draft.originTime = action.originTime;
135141
break;
136142
}
137143
case UPDATE_ORIGIN_UPPER_BOUND_TIME: {
138144
const newOriginUpperBoundTimeSeconds = time2sec(action.originUpperBoundTime);
139145
if (draft.originLinkedBounds) {
140-
draft.originTime = sec2time(
141-
boundedValue(newOriginUpperBoundTimeSeconds - ORIGIN_TIME_BOUND_DIFFERENCE, [
142-
0,
143-
MAX_UPPER_BOUND_TIME,
144-
])
145-
);
146+
const difference =
147+
draft.originTime && draft.originUpperBoundTime
148+
? time2sec(draft.originUpperBoundTime) - time2sec(draft.originTime)
149+
: ORIGIN_TIME_BOUND_DEFAULT_DIFFERENCE;
150+
draft.originTime = sec2time(newOriginUpperBoundTimeSeconds - difference);
151+
}
152+
if (
153+
draft.originTime &&
154+
time2sec(action.originUpperBoundTime) < time2sec(draft.originTime)
155+
) {
156+
draft.originUpperBoundTime = draft.originTime;
157+
} else {
158+
draft.originUpperBoundTime = action.originUpperBoundTime;
146159
}
147-
draft.originUpperBoundTime = action.originUpperBoundTime;
148160
break;
149161
}
150162
case TOGGLE_ORIGIN_LINKED_BOUNDS:

0 commit comments

Comments
 (0)