From 7c7639ad064838582b30154a34d1046363fe3d79 Mon Sep 17 00:00:00 2001 From: Theo Macron Date: Thu, 16 Nov 2023 17:50:43 +0100 Subject: [PATCH] wip --- .../tools/pointEdition/CustomPosition.tsx | 41 +++++++++++++++++++ .../editor/tools/pointEdition/components.tsx | 27 ++++++++---- .../editor/tools/pointEdition/tool-factory.ts | 17 ++++---- 3 files changed, 71 insertions(+), 14 deletions(-) create mode 100644 front/src/applications/editor/tools/pointEdition/CustomPosition.tsx diff --git a/front/src/applications/editor/tools/pointEdition/CustomPosition.tsx b/front/src/applications/editor/tools/pointEdition/CustomPosition.tsx new file mode 100644 index 00000000000..6ebdef2f4f5 --- /dev/null +++ b/front/src/applications/editor/tools/pointEdition/CustomPosition.tsx @@ -0,0 +1,41 @@ +import React, { useEffect, useState } from 'react'; +import { WidgetProps } from '@rjsf/core'; +import InputSNCF from 'common/BootstrapSNCF/InputSNCF'; +import { Point } from 'geojson'; +import { TrackSectionEntity } from 'types'; +import { calculateDistanceAlongTrack } from './tool-factory'; + +export const CustomPosition: React.FC< + WidgetProps & { value?: number; track: TrackSectionEntity; point: Point } +> = (props) => { + const { schema, onChange, title, value, track, point } = props; + const [, setLocalDistance] = useState(value); + const POINT_NAME = 'point-parameter'; + + useEffect(() => { + if (track && point) { + const calculatedDistance = calculateDistanceAlongTrack(track, point); + setLocalDistance(calculatedDistance); + } + }, [track, point]); + const handleInputChange = (e: any) => { + const newDistance = e.target.value; + setLocalDistance(newDistance); + onChange(newDistance); + }; + + return ( +
+

{title}

+ +
+ ); +}; + +export default CustomPosition; diff --git a/front/src/applications/editor/tools/pointEdition/components.tsx b/front/src/applications/editor/tools/pointEdition/components.tsx index c91fc69df78..3afa25b147f 100644 --- a/front/src/applications/editor/tools/pointEdition/components.tsx +++ b/front/src/applications/editor/tools/pointEdition/components.tsx @@ -4,7 +4,7 @@ import { useDispatch, useSelector } from 'react-redux'; import { Popup } from 'react-map-gl/maplibre'; import { useTranslation } from 'react-i18next'; import { featureCollection } from '@turf/helpers'; -import { isEqual } from 'lodash'; +import { cloneDeep, isEqual } from 'lodash'; import along from '@turf/along'; import { BiArrowFromLeft, BiArrowToRight } from 'react-icons/bi'; import { BsBoxArrowInRight } from 'react-icons/bs'; @@ -20,6 +20,8 @@ import { TrackSectionEntity, RouteEntity, SignalEntity, + BufferStopEntity, + DetectorEntity, } from 'types'; import { osrdEditoastApi } from 'common/api/osrdEditoastApi'; import EditorForm from 'applications/editor/components/EditorForm'; @@ -37,12 +39,17 @@ import { import { getEditRouteState } from 'applications/editor/tools/routeEdition/utils'; import TOOL_TYPES from 'applications/editor/tools/toolTypes'; import { EditoastType } from 'applications/editor/tools/types'; +import { Point } from 'geojson'; import { CustomFlagSignalCheckbox } from './CustomFlagSignalCheckbox'; import { PointEditionState } from './types'; import { formatSignalingSystems } from './utils'; +import CustomPosition from './CustomPosition'; +import { calculateDistanceAlongTrack } from './tool-factory'; export const POINT_LAYER_ID = 'pointEditionTool/new-entity'; +type EditorPoint = BufferStopEntity | DetectorEntity | SignalEntity; + /** * Generic component to show routes starting or ending from the edited waypoint: */ @@ -259,6 +266,9 @@ export const PointEditionLeftPanel: FC<{ type: EditoastType }> = { // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -293,7 +303,8 @@ export const PointEditionLeftPanel: FC<{ type: EditoastType }> = { + onChange={(entity: Entity | SignalEntity | EditorPoint) => { + const newEntity = cloneDeep(entity); const additionalUpdate: Partial = {}; const additionalPropertiesUpdate: Partial = {}; const newPosition = entity.properties?.position; @@ -307,22 +318,24 @@ export const PointEditionLeftPanel: FC<{ type: EditoastType }> = { requiresAngle?: boolean; } +export function calculateDistanceAlongTrack(track: Feature, point: Point) { + const wrongPointOnTrack = nearestPointOnLine(track.geometry, point, { units: 'meters' }); + return approximateDistanceWithEditoastData( + track as TrackSectionEntity, + wrongPointOnTrack.geometry + ); +} + function getPointEditionTool({ layer, icon, @@ -115,14 +123,9 @@ function getPointEditionTool({ getEntity(infraID as number, newEntity.properties.track, 'TrackSection', dispatch).then( (track) => { - const wrongPointOnTrack = nearestPointOnLine( - (track as Feature).geometry, - newEntity.geometry as Point, - { units: 'meters' } - ); - const distanceAlongTrack = approximateDistanceWithEditoastData( + const distanceAlongTrack = calculateDistanceAlongTrack( track as TrackSectionEntity, - wrongPointOnTrack.geometry + newEntity.geometry as Point ); newEntity.properties.position = distanceAlongTrack;