Skip to content

Commit 41d78a7

Browse files
committed
front: use Duration instead of string in SuggestedOP.arrival
Signed-off-by: Simon Ser <[email protected]>
1 parent 400ac86 commit 41d78a7

File tree

6 files changed

+28
-23
lines changed

6 files changed

+28
-23
lines changed

front/src/modules/pathfinding/utils.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { getSupportedElectrification, isThermal } from 'modules/rollingStock/hel
1212
import type { SuggestedOP } from 'modules/trainschedule/components/ManageTrainSchedule/types';
1313
import type { PathStep } from 'reducers/osrdconf/types';
1414
import { addElementAtIndex } from 'utils/array';
15+
import { Duration } from 'utils/duration';
1516
import { getPointCoordinates } from 'utils/geometry';
1617

1718
import getStepLocation from './helpers/getStepLocation';
@@ -93,7 +94,8 @@ export const getPathfindingQuery = ({
9394
export const upsertPathStepsInOPs = (ops: SuggestedOP[], pathSteps: PathStep[]): SuggestedOP[] => {
9495
let updatedOPs = [...ops];
9596
pathSteps.forEach((step) => {
96-
const { stopFor, arrival, receptionSignal, theoreticalMargin } = step;
97+
const { stopFor, receptionSignal, theoreticalMargin } = step;
98+
const arrival = step.arrival ? Duration.parse(step.arrival) : null;
9799
// We check only for pathSteps added by map click
98100
if ('track' in step) {
99101
const formattedStep: SuggestedOP = {

front/src/modules/timesStops/helpers/__tests__/utils.spec.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { describe, it, expect } from 'vitest';
22

33
import { type TimesStopsInputRow } from 'modules/timesStops/types';
4+
import { Duration } from 'utils/duration';
45

56
import {
67
updateRowTimesAndMargin,
@@ -820,7 +821,7 @@ describe('durationSinceStartTime', () => {
820821

821822
const result = durationSinceStartTime(startTime, stepTimeDays);
822823

823-
expect(result).toBe('PT36000S');
824+
expect(result).toEqual(Duration.parse('PT36000S'));
824825
});
825826

826827
it('should return the correct duration. daySinceDeparture 1', () => {
@@ -832,14 +833,14 @@ describe('durationSinceStartTime', () => {
832833

833834
const result = durationSinceStartTime(startTime, stepTimeDays);
834835

835-
expect(result).toBe('PT90000S');
836+
expect(result).toEqual(Duration.parse('PT90000S'));
836837
});
837838
});
838839

839840
describe('calculateStepTimeDays', () => {
840841
it('should return correct time and daySinceDeparture', () => {
841842
const startTime = new Date('2023-09-01T10:00:00Z');
842-
const isoDuration = 'PT36000S'; // 10 hours
843+
const isoDuration = Duration.parse('PT36000S'); // 10 hours
843844

844845
const result = calculateStepTimeAndDays(startTime, isoDuration);
845846

@@ -851,7 +852,7 @@ describe('calculateStepTimeDays', () => {
851852

852853
it('should return correct time and daySinceDeparture, daySinceDeparture 1', () => {
853854
const startTime = new Date('2023-09-01T10:00:00Z');
854-
const isoDuration = 'PT122400S'; // 1 day 10 hours
855+
const isoDuration = Duration.parse('PT122400S'); // 1 day 10 hours
855856

856857
const result = calculateStepTimeAndDays(startTime, isoDuration);
857858

front/src/modules/timesStops/helpers/utils.ts

+17-14
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@ import { round, isEqual, isNil } from 'lodash';
55
import { keyColumn, createTextColumn } from 'react-datasheet-grid';
66

77
import type { ReceptionSignal } from 'common/api/osrdEditoastApi';
8-
import type { IsoDurationString, TimeString } from 'common/types';
8+
import type { TimeString } from 'common/types';
99
import { matchPathStepAndOp } from 'modules/pathfinding/utils';
1010
import type { SuggestedOP } from 'modules/trainschedule/components/ManageTrainSchedule/types';
1111
import type { PathStep } from 'reducers/osrdconf/types';
12+
import { Duration } from 'utils/duration';
13+
import { msToS } from 'utils/physics';
1214
import { NO_BREAK_SPACE } from 'utils/strings';
1315
import {
14-
calculateTimeDifferenceInSeconds,
1516
datetime2sec,
1617
durationInSeconds,
17-
formatDurationAsISO8601,
1818
sec2time,
1919
SECONDS_IN_A_DAY,
2020
secToHoursString,
@@ -79,10 +79,15 @@ export const formatSuggestedViasToRowVias = (
7979
const { arrival, receptionSignal, stopFor, theoreticalMargin } = objectToUse || {};
8080

8181
const isMarginValid = theoreticalMargin ? marginRegExValidation.test(theoreticalMargin) : true;
82-
const durationArrivalTime = i === 0 ? 'PT0S' : arrival;
83-
const arrivalInSeconds = durationArrivalTime ? time2sec(durationArrivalTime) : null;
82+
const rawArrivalDuration = i === 0 ? Duration.zero : arrival;
83+
// TODO: turn PathStep.arrival into a Duration instead of a string
84+
const arrivalDuration =
85+
typeof rawArrivalDuration === 'string'
86+
? Duration.parse(rawArrivalDuration)
87+
: rawArrivalDuration;
88+
const arrivalInSeconds = arrivalDuration ? msToS(arrivalDuration.ms) : null;
8489

85-
const formattedArrival = calculateStepTimeAndDays(startTime, durationArrivalTime);
90+
const formattedArrival = calculateStepTimeAndDays(startTime, arrivalDuration);
8691

8792
const departureTime =
8893
stopFor && arrivalInSeconds
@@ -281,7 +286,7 @@ export function updateDaySinceDeparture(
281286
export function durationSinceStartTime(
282287
startTime?: Date,
283288
stepTimeDays?: TimeExtraDays
284-
): IsoDurationString | null {
289+
): Duration | null {
285290
if (!startTime || !stepTimeDays?.time || stepTimeDays?.daySinceDeparture === undefined) {
286291
return null;
287292
}
@@ -290,23 +295,21 @@ export function durationSinceStartTime(
290295
stepTimeDays.daySinceDeparture,
291296
'day'
292297
);
293-
return formatDurationAsISO8601(
294-
calculateTimeDifferenceInSeconds(start.toISOString(), step.toISOString())
295-
);
298+
return Duration.subtractDate(step.toDate(), startTime);
296299
}
297300

298301
export function calculateStepTimeAndDays(
299302
startTime?: Date | null,
300-
isoDuration?: IsoDurationString | null
303+
duration?: Duration | null
301304
): TimeExtraDays | undefined {
302-
if (!startTime || !isoDuration) {
305+
if (!startTime || !duration) {
303306
return undefined;
304307
}
305308

306309
const start = dayjs(startTime);
307-
const duration = dayjs.duration(isoDuration);
310+
const dur = dayjs.duration(duration.ms);
308311

309-
const waypointArrivalTime = start.add(duration);
312+
const waypointArrivalTime = start.add(dur);
310313
const daySinceDeparture = waypointArrivalTime.diff(start, 'day');
311314
const time: TimeString = waypointArrivalTime.format('HH:mm:ss');
312315

front/src/modules/trainschedule/components/ManageTrainSchedule/types.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Feature, Position } from 'geojson';
22

33
import type { ReceptionSignal, TrainScheduleBase } from 'common/api/osrdEditoastApi';
4-
import type { IsoDurationString } from 'common/types';
4+
import type { Duration } from 'utils/duration';
55

66
export type SuggestedOP = {
77
pathStepId?: string;
@@ -21,7 +21,7 @@ export type SuggestedOP = {
2121
It's useful for soft deleting the point (waiting to fix / remove all references)
2222
If true, the train schedule is consider as invalid and must be edited */
2323
deleted?: boolean;
24-
arrival?: IsoDurationString | null; // value asked by user, number of seconds since departure
24+
arrival?: Duration | null; // value asked by user, number of seconds since departure
2525
locked?: boolean;
2626
stopFor?: string | null; // value asked by user
2727
theoreticalMargin?: string; // value asked by user

front/src/reducers/osrdconf/helpers.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,13 @@ export function upsertPathStep(statePathSteps: (PathStep | null)[], op: Suggeste
6161
'name',
6262
'kp',
6363
'stopFor',
64-
'arrival',
6564
'locked',
6665
'deleted',
6766
'receptionSignal',
6867
'theoreticalMargin',
6968
]),
7069
id: nextId(),
70+
arrival: op.arrival?.toISOString(),
7171
...(op.uic
7272
? { uic: op.uic, secondary_code: op.ch }
7373
: {

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

-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,6 @@ describe('simulationConfReducer', () => {
148148
offset: 426.443,
149149
stopFor: 'PT5M',
150150
coordinates: [47.99542250806296, 0.1918181738752042],
151-
arrival: newVia.arrival,
152151
locked: newVia.locked,
153152
deleted: newVia.deleted,
154153
name: newVia.name,

0 commit comments

Comments
 (0)