diff --git a/front/src/modules/trainschedule/components/ManageTrainSchedule/ManageTrainScheduleMap/RenderPopup.tsx b/front/src/modules/trainschedule/components/ManageTrainSchedule/ManageTrainScheduleMap/RenderPopup.tsx index 402ae53c4d5..14caea3ae61 100644 --- a/front/src/modules/trainschedule/components/ManageTrainSchedule/ManageTrainScheduleMap/RenderPopup.tsx +++ b/front/src/modules/trainschedule/components/ManageTrainSchedule/ManageTrainScheduleMap/RenderPopup.tsx @@ -4,6 +4,7 @@ import React, { useEffect, useState, useMemo } from 'react'; import { Select } from '@osrd-project/ui-core'; import { point } from '@turf/helpers'; + import { useTranslation } from 'react-i18next'; import { IoFlag } from 'react-icons/io5'; import { RiMapPin2Fill, RiMapPin3Fill } from 'react-icons/ri'; @@ -14,16 +15,18 @@ import { useSelector } from 'react-redux'; import { editoastToEditorEntity } from 'applications/editor/data/api'; import type { TrackSectionEntity } from 'applications/editor/tools/trackEdition/types'; import { calculateDistanceAlongTrack } from 'applications/editor/tools/utils'; +import { useScenarioContext } from 'applications/operationalStudies/hooks/useScenarioContext'; import type { ManageTrainSchedulePathProperties } from 'applications/operationalStudies/types'; import { osrdEditoastApi, - type OperationalPointPart, + type OperationalPoint, type OperationalPointReference, type TrackReference, } from 'common/api/osrdEditoastApi'; import { useOsrdConfActions, useOsrdConfSelectors } from 'common/osrdContext'; import { setPointIti } from 'modules/trainschedule/components/ManageTrainSchedule/ManageTrainScheduleMap/setPointIti'; import { type PathStep } from 'reducers/osrdconf/types'; +import { getPointCoordinates } from 'utils/geometry'; type FeatureInfoClickType = { displayPopup: boolean; @@ -52,10 +55,14 @@ function RenderPopup({ pathProperties }: RenderPopupProps) { return !!properties?.track_id || !!properties?.track_name; }, [featureInfoClick]); + const { getTrackSectionsByIds } = useScenarioContext(); + const [trackOffset, setTrackOffset] = useState(0); const [trackSelected, setTrackSelected] = useState(); - const [selectOp, setSelectedOp] = useState(); - const [trackOptions, setTrackOptions] = useState([]); + const [selectOp, setSelectedOp] = useState(); + const [trackOptions, setTrackOptions] = useState<(TrackReference & { coordinates: number[] })[]>( + [] + ); const [getTrackEntity] = osrdEditoastApi.endpoints.postInfraByInfraIdObjectsAndObjectType.useLazyQuery(); @@ -70,7 +77,7 @@ function RenderPopup({ pathProperties }: RenderPopupProps) { return; const trackId = featureInfoClick.feature.properties.id; - + console.log(trackId, 'trackId'); const result = await getTrackEntity({ infraId: infraId!, objectType: isOperationalPoint ? 'OperationalPoint' : 'TrackSection', @@ -82,46 +89,44 @@ function RenderPopup({ pathProperties }: RenderPopupProps) { return; } - let trackResults = []; - if (isOperationalPoint) { - const trackParts = result[0].railjson.parts as OperationalPointPart[]; - const trackIds = trackParts.map((part) => part.track); - - trackResults = await getTrackEntity({ - infraId: infraId!, - objectType: 'TrackSection', - body: trackIds, - }).unwrap(); - - setSelectedOp({ - secondary_code: result[0].railjson.extensions.sncf.ch, - uic: result[0].railjson.extensions.identifier.uic, - track_reference: trackSelected, - coordinates: featureInfoClick.coordinates.slice(0, 2), + const { parts } = result[0].railjson as OperationalPoint; + const trackIds = parts.map((part) => part.track); + + const tracks = await getTrackSectionsByIds(trackIds); + + const trackPartCoordinates = parts.map((step) => { + const track = tracks[step.track]; + + return { + coordinates: getPointCoordinates(track.geo, track.length, step.position), + track_name: track.extensions?.sncf?.track_name as string, + }; }); - if (!trackResults.length) { - console.error('No track found'); - return; - } + console.log(trackPartCoordinates, 'trackPartCoordinates'); + + // setSelectedOp({ + // secondary_code: result[0].railjson.extensions.sncf.ch, + // uic: result[0].railjson.extensions.identifier.uic, + // track_reference: trackSelected, + // coordinates: featureInfoClick.coordinates.slice(0, 2), + // }); - const options = trackResults.map((track) => ({ - track_id: track.railjson.extensions.sncf.track_number, - track_name: track.railjson.extensions.sncf.track_name, - })); - setTrackOptions(options); + setTrackOptions(trackPartCoordinates); } - // definir pour les points opérationnels setTrackSelected(undefined); - const trackEntity = editoastToEditorEntity(result[0], 'TrackSection'); - const offset = calculateDistanceAlongTrack( - trackEntity, - point(featureInfoClick.coordinates.slice(0, 2)).geometry, - 'millimeters' - ); - setTrackOffset(offset); + if (!isOperationalPoint) { + // if operationnalPoint we already have coordinates + const trackEntity = editoastToEditorEntity(result[0], 'TrackSection'); + const offset = calculateDistanceAlongTrack( + trackEntity, + point(featureInfoClick.coordinates.slice(0, 2)).geometry, + 'millimeters' + ); + setTrackOffset(offset); + } }; if (featureInfoClick.displayPopup) { @@ -140,16 +145,16 @@ function RenderPopup({ pathProperties }: RenderPopupProps) { const { properties: trackProperties } = featureInfoClick.feature; const coordinates = featureInfoClick.coordinates.slice(0, 2); - console.log(trackProperties, 'trackProperties'); - let pathStepProperties: PathStep; if (isOperationalPoint && selectOp) { + console.log('if'); + console.log(selectOp, 'selectedOp'); pathStepProperties = { id: nextId(), ...selectOp, }; - console.log(pathStepProperties, 'pathStepProperties dans isOperationalPoint'); } else { + console.log('else'); pathStepProperties = { id: nextId(), coordinates, @@ -165,10 +170,9 @@ function RenderPopup({ pathProperties }: RenderPopupProps) { } as PathStep; } + console.log(pathStepProperties, 'path render'); console.log(trackSelected, 'trackSelected'); - // renvoyer UIC CH et trackReference - return (