From e7e185711c468da77a36afa2fba009e818538a15 Mon Sep 17 00:00:00 2001 From: Clara Ni Date: Fri, 15 Nov 2024 16:42:26 +0100 Subject: [PATCH] front: separate StdcmPathStep and PathStep types - completely separate StdcmPathStep and PathStep types - remove all the fake uic path item location (which were equal to -1) - add a transformer in the persist config so the date are correctly deserialized from the local storage Signed-off-by: Clara Ni --- .../components/StdcmForm/StdcmConfig.tsx | 24 +++----- .../components/StdcmForm/StdcmDestination.tsx | 19 +++--- .../components/StdcmForm/StdcmInputVia.tsx | 25 ++------ .../StdcmForm/StdcmOperationalPoint.tsx | 42 +++++++------ .../components/StdcmForm/StdcmOrigin.tsx | 17 ++++-- .../stdcm/components/StdcmForm/StdcmVias.tsx | 36 +++++------ .../StdcmResults/SimulationReportSheet.tsx | 52 ++++++++++------ .../components/StdcmResults/StdcmResults.tsx | 10 ++- .../StdcmResults/StdcmResultsTable.tsx | 6 +- .../stdcm/hooks/useStaticPathfinding.ts | 5 +- .../src/applications/stdcm/hooks/useStdcm.ts | 2 +- .../applications/stdcm/hooks/useStdcmForm.ts | 4 +- front/src/applications/stdcm/types.ts | 8 +-- .../stdcm/utils/checkStdcmConfigErrors.ts | 11 +--- .../stdcm/utils/formatStdcmConf.ts | 61 ++++++++++++------- front/src/applications/stdcm/utils/index.ts | 24 ++++++++ .../applications/stdcm/views/StdcmView.tsx | 2 +- .../pathfinding/helpers/getStepLocation.ts | 10 +-- .../pathfinding/hooks/usePathfinding.ts | 1 + front/src/modules/pathfinding/utils.ts | 9 +-- front/src/reducers/index.ts | 19 +++++- .../src/reducers/osrdconf/stdcmConf/index.ts | 10 ++- .../stdcmConf/stdcmConfReducers.spec.ts | 35 ++++++++--- front/src/reducers/osrdconf/types.ts | 25 +++++++- front/src/utils/__tests__/date.spec.ts | 17 ------ front/src/utils/date.ts | 33 +++++----- 26 files changed, 290 insertions(+), 217 deletions(-) create mode 100644 front/src/applications/stdcm/utils/index.ts diff --git a/front/src/applications/stdcm/components/StdcmForm/StdcmConfig.tsx b/front/src/applications/stdcm/components/StdcmForm/StdcmConfig.tsx index 417f9298535..87e5bd330e1 100644 --- a/front/src/applications/stdcm/components/StdcmForm/StdcmConfig.tsx +++ b/front/src/applications/stdcm/components/StdcmForm/StdcmConfig.tsx @@ -1,12 +1,12 @@ -import { useEffect, useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import { Button } from '@osrd-project/ui-core'; import { ArrowDown, ArrowUp } from '@osrd-project/ui-icons'; import cx from 'classnames'; -import { compact } from 'lodash'; import { useTranslation } from 'react-i18next'; import { useSelector } from 'react-redux'; +import { extractMarkersInfo } from 'applications/stdcm/utils'; import { useOsrdConfActions, useOsrdConfSelectors } from 'common/osrdContext'; import useInfraStatus from 'modules/pathfinding/hooks/useInfraStatus'; import { Map } from 'modules/trainschedule/components/ManageTrainSchedule'; @@ -77,15 +77,11 @@ const StdcmConfig = ({ const disabled = isPending || retainedSimulationIndex > -1; + const markerInfos = useMemo(() => extractMarkersInfo(pathSteps), [pathSteps]); + const startSimulation = () => { const isPathfindingFailed = !!pathfinding && pathfinding.status !== 'success'; - const formErrorsStatus = checkStdcmConfigErrors( - isPathfindingFailed, - origin, - destination, - compact(pathSteps), - t - ); + const formErrorsStatus = checkStdcmConfigErrors(isPathfindingFailed, origin, destination, t); if (pathfinding?.status === 'success' && !formErrorsStatus) { launchStdcmRequest(); } else { @@ -108,13 +104,7 @@ const StdcmConfig = ({ useEffect(() => { const isPathfindingFailed = !!pathfinding && pathfinding.status !== 'success'; - const formErrorsStatus = checkStdcmConfigErrors( - isPathfindingFailed, - origin, - destination, - [], - t - ); + const formErrorsStatus = checkStdcmConfigErrors(isPathfindingFailed, origin, destination, t); setFormErrors(formErrorsStatus); }, [origin, destination, pathfinding]); @@ -195,7 +185,7 @@ const StdcmConfig = ({ preventPointSelection pathGeometry={pathfinding?.geometry} showStdcmAssets - simulationPathSteps={pathSteps} + simulationPathSteps={markerInfos} /> diff --git a/front/src/applications/stdcm/components/StdcmForm/StdcmDestination.tsx b/front/src/applications/stdcm/components/StdcmForm/StdcmDestination.tsx index 990a533db5d..d51d5f0150a 100644 --- a/front/src/applications/stdcm/components/StdcmForm/StdcmDestination.tsx +++ b/front/src/applications/stdcm/components/StdcmForm/StdcmDestination.tsx @@ -3,12 +3,12 @@ import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useSelector } from 'react-redux'; +import { getTimesInfoFromDate } from 'applications/stdcm/utils'; import DestinationIcon from 'assets/pictures/mapMarkers/destination.svg'; import { useOsrdConfActions, useOsrdConfSelectors } from 'common/osrdContext'; import type { StdcmConfSliceActions } from 'reducers/osrdconf/stdcmConf'; import type { StdcmConfSelectors } from 'reducers/osrdconf/stdcmConf/selectors'; import { useAppDispatch } from 'store'; -import { extractDateAndTimefromISO, generateISODateFromDateTime } from 'utils/date'; import StdcmCard from './StdcmCard'; import StdcmOperationalPoint from './StdcmOperationalPoint'; @@ -28,9 +28,7 @@ const StdcmDestination = ({ disabled = false }: StdcmConfigCardProps) => { const { destinationArrival, destinationToleranceValues } = useMemo( () => ({ - destinationArrival: destination.arrival - ? extractDateAndTimefromISO(destination.arrival) - : undefined, + destinationArrival: getTimesInfoFromDate(destination.arrival), destinationToleranceValues: { arrivalToleranceBefore: destination.tolerances?.before !== undefined @@ -45,11 +43,12 @@ const StdcmDestination = ({ disabled = false }: StdcmConfigCardProps) => { [destination] ); - const onArrivalChange = (schedule: ScheduleConstraint) => { + const onArrivalChange = ({ date, hours, minutes }: ScheduleConstraint) => { + date.setHours(hours, minutes); dispatch( updateStdcmPathStep({ id: destination.id, - updates: { arrival: generateISODateFromDateTime(schedule) }, + updates: { arrival: date }, }) ); }; @@ -80,8 +79,12 @@ const StdcmDestination = ({ disabled = false }: StdcmConfigCardProps) => { disabled={disabled} className="extremity" > - {'uic' in destination && ( - + {(!destination.location || 'uic' in destination.location) && ( + )} void; }; const StdcmInputVia = ({ stopType, stopDuration, updatePathStepStopTime }: StdcmInputViaProps) => { const { t } = useTranslation('stdcm'); - const computedStopTime = useMemo(() => { - const duration = stopDuration ? `${secToMin(ISO8601Duration2sec(stopDuration))}` : ''; - switch (stopType) { - case StdcmStopTypes.PASSAGE_TIME: - return '0'; - case StdcmStopTypes.DRIVER_SWITCH: - return duration || '3'; - default: - return duration || '0'; - } - }, [stopDuration, stopType]); - - const [pathStepStopTime, setPathStepStopTime] = useState(computedStopTime); + const [pathStepStopTime, setPathStepStopTime] = useState(''); - const stopWarning = stopType === StdcmStopTypes.DRIVER_SWITCH && Number(computedStopTime) < 3; + const stopWarning = stopType === StdcmStopTypes.DRIVER_SWITCH && stopDuration && stopDuration < 3; const debounceUpdatePathStepStopTime = useMemo( () => debounce((value) => updatePathStepStopTime(value), 300), @@ -40,8 +25,8 @@ const StdcmInputVia = ({ stopType, stopDuration, updatePathStepStopTime }: Stdcm ); useEffect(() => { - setPathStepStopTime(computedStopTime); - }, [computedStopTime]); + setPathStepStopTime(stopDuration ? `${stopDuration}` : ''); + }, [stopDuration]); return ( stopType !== StdcmStopTypes.PASSAGE_TIME && ( diff --git a/front/src/applications/stdcm/components/StdcmForm/StdcmOperationalPoint.tsx b/front/src/applications/stdcm/components/StdcmForm/StdcmOperationalPoint.tsx index 28217bbe623..838379fb19c 100644 --- a/front/src/applications/stdcm/components/StdcmForm/StdcmOperationalPoint.tsx +++ b/front/src/applications/stdcm/components/StdcmForm/StdcmOperationalPoint.tsx @@ -7,14 +7,14 @@ import { type SearchResultItemOperationalPoint } from 'common/api/osrdEditoastAp import useSearchOperationalPoint from 'common/Map/Search/useSearchOperationalPoint'; import { useOsrdConfActions } from 'common/osrdContext'; import type { StdcmConfSliceActions } from 'reducers/osrdconf/stdcmConf'; -import type { StdcmPathStep } from 'reducers/osrdconf/types'; +import type { UicPathItemLocation } from 'reducers/osrdconf/types'; import { useAppDispatch } from 'store'; import { normalized } from 'utils/strings'; import { createFixedSelectOptions } from 'utils/uiCoreHelpers'; type StdcmOperationalPointProps = { - point: StdcmPathStep; - opPointId: string; + location?: UicPathItemLocation; + pathStepId: string; disabled?: boolean; }; @@ -24,12 +24,15 @@ function formatChCode(chCode: string) { return chCode === '' ? 'BV' : chCode; } -const StdcmOperationalPoint = ({ point, opPointId, disabled }: StdcmOperationalPointProps) => { +const StdcmOperationalPoint = ({ location, pathStepId, disabled }: StdcmOperationalPointProps) => { const { t } = useTranslation('stdcm'); const dispatch = useAppDispatch(); const { searchTerm, chCodeFilter, sortedSearchResults, setSearchTerm, setChCodeFilter } = - useSearchOperationalPoint({ initialSearchTerm: point.name, initialChCodeFilter: point.ch }); + useSearchOperationalPoint({ + initialSearchTerm: location?.name, + initialChCodeFilter: location?.secondary_code || undefined, + }); const { updateStdcmPathStep } = useOsrdConfActions() as StdcmConfSliceActions; @@ -71,20 +74,21 @@ const StdcmOperationalPoint = ({ point, opPointId, disabled }: StdcmOperationalP }, [] as { label: string; id: string }[] ), - [point, sortedSearchResults] + [location, sortedSearchResults] ); const dispatchNewPoint = (p?: SearchResultItemOperationalPoint) => { - if (p && p.ch === point.ch && 'uic' in point && p.uic === point.uic) return; - const newPoint = p + if (p && p.ch === location?.secondary_code && 'uic' in location && p.uic === location.uic) + return; + const newLocation = p ? { name: p.name, ch: p.ch, uic: p.uic, - coordinates: p.geographic.coordinates, + coordinates: p.geographic.coordinates as [number, number], } - : { name: undefined, ch: undefined, uic: -1, coordinates: undefined }; - dispatch(updateStdcmPathStep({ id: point.id, updates: newPoint })); + : undefined; + dispatch(updateStdcmPathStep({ id: pathStepId, updates: { location: newLocation } })); }; const updateSelectedPoint = ( @@ -110,8 +114,8 @@ const StdcmOperationalPoint = ({ point, opPointId, disabled }: StdcmOperationalP const onSelectChCodeFilter = (selectedChCode?: { id: string }) => { setChCodeFilter(selectedChCode?.id); - if (point && 'uic' in point) - updateSelectedPoint(sortedSearchResults, point.uic, selectedChCode?.id); + if (location && 'uic' in location) + updateSelectedPoint(sortedSearchResults, location.uic, selectedChCode?.id); }; const onInputChange = (e: React.ChangeEvent) => { @@ -122,20 +126,20 @@ const StdcmOperationalPoint = ({ point, opPointId, disabled }: StdcmOperationalP }; useEffect(() => { - if (point) { - setSearchTerm(point.name || ''); - setChCodeFilter(point.ch || ''); + if (location) { + setSearchTerm(location.name || ''); + setChCodeFilter(location.secondary_code || ''); } else { setSearchTerm(''); setChCodeFilter(undefined); } - }, [point]); + }, [location]); return (