Skip to content

Commit

Permalink
front: use editoast stdcm
Browse files Browse the repository at this point in the history
  • Loading branch information
anisometropie committed Aug 18, 2023
1 parent b458f86 commit 238b9df
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 55 deletions.
3 changes: 2 additions & 1 deletion front/src/applications/operationalStudies/consts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { Position, Feature } from 'geojson';
import { PowerRestrictionRange as PowerRestritionSchedule } from 'common/api/osrdMiddlewareApi';
import {
Allowance,
AllowanceValue,
CatenaryRange,
Comfort,
ElectrificationRange,
Expand Down Expand Up @@ -110,7 +111,7 @@ export const STDCM_REQUEST_STATUS = Object.freeze({
});

export interface StandardAllowance {
type: string;
type: AllowanceValue['value_type'];
value: number;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { AllowanceValue } from 'common/api/osrdMiddlewareApi';
import { AllowanceValue } from 'common/api/osrdEditoastApi';

export const ALLOWANCE_UNITS_KEYS = {
time: 's',
Expand All @@ -12,12 +12,6 @@ export const TYPES_UNITS = {
time_per_distance: 'minutes',
} as const;

export const ALLOWANCE_UNIT_TYPES = {
TIME: 'time',
PERCENTAGE: 'percentage',
TIME_PER_DISTANCE: 'time_per_distance',
};

export type AllowanceUnitsKeys = keyof typeof ALLOWANCE_UNITS_KEYS;
export type AllowanceUnitskeysValues = (typeof ALLOWANCE_UNITS_KEYS)[AllowanceUnitsKeys];

Expand All @@ -26,3 +20,34 @@ export interface AllowanceType {
label: string;
unit: AllowanceUnitskeysValues;
}

export function createAllowanceValue(
type: AllowanceValue['value_type'] | undefined,
value: number | undefined
): AllowanceValue {
if (!type || !value) {
return {
value_type: 'percentage',
percentage: 0,
};
}
switch (type) {
case 'time_per_distance':
return {
value_type: 'time_per_distance',
minutes: value,
};
case 'time':
return {
value_type: 'time',
seconds: value,
};
case 'percentage':
return {
value_type: 'percentage',
percentage: value,
};
default:
throw new Error(`Unsupported value_type: ${type}`);
}
}
69 changes: 33 additions & 36 deletions front/src/applications/stdcm/formatStcmConf.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,26 @@
import { Dispatch } from 'redux';
import { TFunction } from 'i18next';
import { PathQuery, PostStdcmApiArg } from 'common/api/osrdEditoastApi';

import {
ALLOWANCE_UNIT_TYPES,
TYPES_UNITS,
} from 'applications/stdcm/components/OldAllowances/allowancesConsts';
import { createAllowanceValue } from 'applications/stdcm/components/OldAllowances/allowancesConsts';
import { STDCM_MODES, OsrdStdcmConfState } from 'applications/operationalStudies/consts';
import { time2sec } from 'utils/timeManipulation';
import { makeEnumBooleans } from 'utils/constants';

import { ActionFailure } from 'reducers/main';
import { ThunkAction } from 'types';
import { getOpenApiSteps } from 'common/Pathfinding/Pathfinding';
import { getPathfindingQuery } from 'common/Pathfinding/Pathfinding';

export default function formatStdcmConf(
dispatch: Dispatch,
setFailure: (e: Error) => ThunkAction<ActionFailure>,
t: TFunction,
osrdconf: OsrdStdcmConfState
) {
): PostStdcmApiArg | undefined {
const { isByOrigin, isByDestination } = makeEnumBooleans(STDCM_MODES, osrdconf.stdcmMode);

let error = false;
if (!osrdconf.origin && isByOrigin) {
if (!(osrdconf.origin && osrdconf.originUpperBoundTime) && isByOrigin) {
error = true;
dispatch(
setFailure({
Expand Down Expand Up @@ -90,40 +88,39 @@ export default function formatStdcmConf(
// Demander: format de date
// Demander: pourquoi tableaux

const originDate = osrdconf.originTime ? time2sec(osrdconf.originTime) : null;
const destinationDate = osrdconf.destinationTime ? time2sec(osrdconf.destinationTime) : null;
const maximumDepartureDelay =
osrdconf.originTime && osrdconf.originUpperBoundTime
? time2sec(osrdconf.originUpperBoundTime) - time2sec(osrdconf.originTime)
: null;

if (!error) {
// TODO: refactor: have a clearer way to set dynamics units
const standardAllowanceType: string =
(osrdconf.standardStdcmAllowance?.type as string) || ALLOWANCE_UNIT_TYPES.PERCENTAGE;
const standardAllowanceValue: number = osrdconf.standardStdcmAllowance?.value || 0;
const standardAllowance: { [index: string]: string | number } = {};
const typeUnitTanslationIndex: { [index: string]: string } = TYPES_UNITS;
const correspondantTypesForApi: string = typeUnitTanslationIndex[standardAllowanceType];
standardAllowance[correspondantTypesForApi] = standardAllowanceValue;
standardAllowance.value_type = standardAllowanceType;
const originDate = time2sec(osrdconf.originTime as string);
const destinationDate = time2sec(osrdconf.destinationTime as string);
const maximumDepartureDelay =
time2sec(osrdconf.originUpperBoundTime as string) - time2sec(osrdconf.originTime as string);

const standardAllowance = createAllowanceValue(
osrdconf.standardStdcmAllowance?.type,
osrdconf.standardStdcmAllowance?.value
);

// we already checked that everything is defined
const pathfindingQuery = getPathfindingQuery(osrdconf) as PathQuery;
const osrdConfStdcm = {
...getOpenApiSteps(osrdconf),
rolling_stock: osrdconf.rollingStockID,
comfort: osrdconf.rollingStockComfort,
timetable: osrdconf.timetableID,
start_time: originDate, // Build a date
end_time: destinationDate, // Build a date
maximum_departure_delay: maximumDepartureDelay,
speed_limit_tags: osrdconf.speedLimitByTag,
margin_before: osrdconf.gridMarginBefore,
margin_after: osrdconf.gridMarginAfter,
standard_allowance: standardAllowance,
maximum_run_time: osrdconf.maximumRunTime,
body: {
steps: pathfindingQuery.steps,
rolling_stocks: pathfindingQuery.rolling_stocks,
infra_id: pathfindingQuery.infra,
rolling_stock_id: osrdconf.rollingStockID as number,
comfort: osrdconf.rollingStockComfort,
timetable_id: osrdconf.timetableID as number,
start_time: originDate || undefined,
end_time: destinationDate || undefined,
maximum_departure_delay: maximumDepartureDelay,
speed_limit_tags: osrdconf.speedLimitByTag,
margin_before: osrdconf.gridMarginBefore,
margin_after: osrdconf.gridMarginAfter,
standard_allowance: standardAllowance,
maximum_run_time: osrdconf.maximumRunTime,
},
};

return osrdConfStdcm;
}
return false;
return undefined;
}
19 changes: 10 additions & 9 deletions front/src/applications/stdcm/views/StdcmRequestModal.jsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import React, { useEffect } from 'react';
import { get, post } from 'common/requests';
import { get } from 'common/requests';
import { cloneDeep } from 'lodash';
// osrd Redux reducers
import {
updateConsolidatedSimulation,
Expand Down Expand Up @@ -29,26 +30,24 @@ import { STDCM_REQUEST_STATUS } from 'applications/operationalStudies/consts';
import { updateItinerary } from 'reducers/osrdconf';
import { useTranslation } from 'react-i18next';
import { Spinner } from 'common/Loader';
import { osrdEditoastApi } from 'common/api/osrdEditoastApi';

export default function StdcmRequestModal(props) {
const { t } = useTranslation(['translation', 'operationalStudies/manageTrainSchedule']);
const osrdconf = useSelector(getConf);
const dispatch = useDispatch();

const [postStdcm] = osrdEditoastApi.usePostStdcmMutation();
// Theses are prop-drilled from OSRDSTDCM Component, which is conductor.
// Remains fit with one-level limit
const { setCurrentStdcmRequestStatus, currentStdcmRequestStatus } = props;

// https://developer.mozilla.org/en-US/docs/Web/API/AbortController
const controller = new AbortController();

const stdcmURL = `/stdcm/`;

// Returns a promise that will be a fetch or an axios (through react-query)
const stdcmRequest = async () => {
const params = formatStdcmConf(dispatch, setFailure, t, osrdconf);

return post(stdcmURL, params, {});
return postStdcm(params).unwrap();
};

useEffect(() => {
Expand All @@ -58,9 +57,11 @@ export default function StdcmRequestModal(props) {
setCurrentStdcmRequestStatus(STDCM_REQUEST_STATUS.success);
dispatch(updateItinerary(result.path));

const fakedNewTrain = result.simulation;
fakedNewTrain.id = 1500;
fakedNewTrain.isStdcm = true;
const fakedNewTrain = {
...cloneDeep(result.simulation),
id: 1500,
isStdcm: true,
};

fakedNewTrain.base.stops = fakedNewTrain.base.head_positions[0].map(
(headPosition, index) => ({
Expand Down
4 changes: 2 additions & 2 deletions front/src/common/Pathfinding/Pathfinding.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ interface PathfindingProps {
zoomToFeature: (lngLat: Position, id?: undefined, source?: undefined) => void;
}

export function getOpenApiSteps({
export function getPathfindingQuery({
infraID,
rollingStockID,
origin,
Expand Down Expand Up @@ -377,7 +377,7 @@ function Pathfinding({ mustUpdate = true, zoomToFeature }: PathfindingProps) {

const generatePathfindingParams = (): PathQuery | null => {
dispatch(updateItinerary(undefined));
return getOpenApiSteps({ infraID, rollingStockID, origin, destination, vias });
return getPathfindingQuery({ infraID, rollingStockID, origin, destination, vias });
};

const startPathFinding = (zoom = true) => {
Expand Down

0 comments on commit 238b9df

Please sign in to comment.