Skip to content

Commit

Permalink
front: ensure behavior for non-recognized points in path
Browse files Browse the repository at this point in the history
Signed-off-by: Achraf Mohyeddine <[email protected]>
  • Loading branch information
achrafmohye committed Nov 7, 2024
1 parent c3d0409 commit 9d3391f
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
"pathfinding": "Path search",
"pathfindingDone": "Pathfinding done.",
"pathfindingError": "An error occurred in pathfinding: {{errorMessage}}.",
"InvalidTrainScheduleStep": "At least one of the waypoints could not be recognized",
"pathfindingInProgress": "Pathfinding in progress…",
"pathfindingMissingParams": "Missing parameters for pathfinding: {{missingElements}}.",
"pathfindingMissingParamsSimple": "Missing information for the search",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
"pathfinding": "Recherche d’itinéraire",
"pathfindingDone": "Recherche d'itinéraire terminée.",
"pathfindingError": "Erreur dans la recherche d’itinéraire : {{errorMessage}}.",
"InvalidTrainScheduleStep": "Au moins un des points de passage n'a pas été reconnu",
"pathfindingInProgress": "Recherche d’itinéraire en cours…",
"pathfindingMissingParams": "Éléments manquants pour la recherche : {{missingElements}}.",
"pathfindingMissingParamsSimple": "Informations manquantes pour la recherche",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { useEffect } from 'react';

import { Alert, CheckCircle, Stop } from '@osrd-project/ui-icons';
import cx from 'classnames';
import { isEqual } from 'lodash';
Expand All @@ -10,6 +12,7 @@ import infraLogo from 'assets/pictures/components/tracks.svg';
import { Spinner } from 'common/Loaders';
import { useOsrdConfSelectors } from 'common/osrdContext';
import { usePathfinding } from 'modules/pathfinding/hooks/usePathfinding';
import { isPathStepInvalid } from 'modules/pathfinding/utils';
import { useStoreDataForRollingStockSelector } from 'modules/rollingStock/components/RollingStockSelector/useStoreDataForRollingStockSelector';
import { conditionalStringConcat, formatKmValue } from 'utils/strings';

Expand All @@ -23,13 +26,16 @@ type PathfindingProps = {
const Pathfinding = ({ pathProperties, setPathProperties }: PathfindingProps) => {
const { t } = useTranslation(['operationalStudies/manageTrainSchedule']);

const { getOrigin, getDestination } = useOsrdConfSelectors();
const { getOrigin, getDestination, getPathSteps } = useOsrdConfSelectors();
const pathSteps = useSelector(getPathSteps);
const hasInvalidPathStep = pathSteps.some((pathStep) => isPathStepInvalid(pathStep));
const origin = useSelector(getOrigin, isEqual);
const destination = useSelector(getDestination, isEqual);
const { rollingStock } = useStoreDataForRollingStockSelector();

const {
pathfindingState,
pathfindingDispatch,
infraInfos: { infra, reloadCount },
} = usePathfinding(setPathProperties, pathProperties);

Expand Down Expand Up @@ -61,7 +67,8 @@ const Pathfinding = ({ pathProperties, setPathProperties }: PathfindingProps) =>
!pathfindingState.running &&
pathfindingState.done &&
origin &&
destination && (
destination &&
!hasInvalidPathStep && (
<div className="content pathfinding-done">
<span className="lead" data-testid="result-pathfinding-done">
<CheckCircle />
Expand All @@ -83,7 +90,7 @@ const Pathfinding = ({ pathProperties, setPathProperties }: PathfindingProps) =>
</div>
) : (
<>
{pathfindingState.error && (
{(pathfindingState.error || hasInvalidPathStep) && (
<div
className={cx('content pathfinding-error', {
'mt-2': infra && infra.state !== 'CACHED',
Expand All @@ -93,7 +100,9 @@ const Pathfinding = ({ pathProperties, setPathProperties }: PathfindingProps) =>
<Stop />
</span>
<span className="flex-grow-1">
{t('pathfindingError', { errorMessage: t(pathfindingState.error) })}
{hasInvalidPathStep
? t('InvalidTrainScheduleStep')
: t('pathfindingError', { errorMessage: t(pathfindingState.error) })}
</span>
</div>
)}
Expand Down
60 changes: 7 additions & 53 deletions front/src/modules/pathfinding/hooks/usePathfinding.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import { useSelector } from 'react-redux';

import type { ManageTrainSchedulePathProperties } from 'applications/operationalStudies/types';
import type {
PathfindingInputError,
PostInfraByInfraIdPathPropertiesApiArg,
PostInfraByInfraIdPathfindingBlocksApiArg,
RollingStockWithLiveries,
Expand All @@ -18,7 +17,6 @@ import type { PathfindingAction, PathfindingState } from 'modules/pathfinding/ty
import {
formatSuggestedOperationalPoints,
getPathfindingQuery,
matchPathStepAndOp,
upsertPathStepsInOPs,
} from 'modules/pathfinding/utils';
import { useStoreDataForRollingStockSelector } from 'modules/rollingStock/components/RollingStockSelector/useStoreDataForRollingStockSelector';
Expand Down Expand Up @@ -181,18 +179,7 @@ export const usePathfinding = (

const generatePathfindingParams = (): PostInfraByInfraIdPathfindingBlocksApiArg | null => {
setPathProperties?.(undefined);

const filteredPathSteps = pathSteps.filter(
(step) => step !== null && step.coordinates !== null && !step.isInvalid
);

return getPathfindingQuery({
infraId,
rollingStock,
origin,
destination,
pathSteps: filteredPathSteps,
});
return getPathfindingQuery({ infraId, rollingStock, origin, destination, pathSteps });
};

useEffect(() => {
Expand All @@ -219,36 +206,7 @@ export const usePathfinding = (
},
});
}
}, [origin?.id, destination?.id, rollingStock]);

const handleInvalidPathItems = (
steps: (PathStep | null)[],
invalidPathItems: Extract<PathfindingInputError, { error_type: 'invalid_path_items' }>['items']
) => {
// TODO: we currently only handle invalid pathSteps with trigram. We will have to do it for trackOffset, opId and uic too.
const invalidTrigrams = invalidPathItems
.map((item) => {
if ('trigram' in item.path_item) {
return item.path_item.trigram;
}
return null;
})
.filter((trigram): trigram is string => trigram !== null);
if (invalidTrigrams.length > 0) {
const updatedPathSteps = steps.map((step) => {
if (step && 'trigram' in step && invalidTrigrams.includes(step.trigram)) {
return { ...step, isInvalid: true };
}
return step;
});

dispatch(updatePathSteps({ pathSteps: updatedPathSteps }));
pathfindingDispatch({ type: 'PATHFINDING_FINISHED' });
pathfindingDispatch({ type: 'PATHFINDING_PARAM_CHANGED' });
} else {
dispatch(setFailure({ name: t('pathfindingError'), message: t('missingPathSteps') }));
}
};
}, [origin, destination, rollingStock]);

useEffect(() => {
const startPathFinding = async () => {
Expand All @@ -271,13 +229,8 @@ export const usePathfinding = (
pathfindingResult.status === 'failure' &&
pathfindingResult.failed_status === 'pathfinding_not_found' &&
pathfindingResult.error_type === 'incompatible_constraints';
if (
pathfindingResult.status === 'failure' &&
pathfindingResult.failed_status === 'pathfinding_input_error' &&
pathfindingResult.error_type === 'invalid_path_items'
) {
handleInvalidPathItems(pathSteps, pathfindingResult.items);
} else if (pathfindingResult.status === 'success' || incompatibleConstraintsCheck) {

if (pathfindingResult.status === 'success' || incompatibleConstraintsCheck) {
const pathResult =
pathfindingResult.status === 'success'
? pathfindingResult
Expand All @@ -303,8 +256,9 @@ export const usePathfinding = (
// We update existing pathsteps with coordinates, positionOnPath and kp corresponding to the new pathfinding result
const updatedPathSteps: (PathStep | null)[] = pathSteps.map((step, i) => {
if (!step) return step;
const correspondingOp = suggestedOperationalPoints.find((suggestedOp) =>
matchPathStepAndOp(step, suggestedOp)
const correspondingOp = suggestedOperationalPoints.find(
(suggestedOp) =>
'uic' in step && suggestedOp.uic === step.uic && suggestedOp.ch === step.ch
);

const theoreticalMargin = i === 0 ? '0%' : step.theoreticalMargin;
Expand Down

0 comments on commit 9d3391f

Please sign in to comment.