Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

front: create type StdcmPathStep #9428

Merged
merged 2 commits into from
Oct 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 22 additions & 11 deletions front/src/applications/stdcm/components/StdcmForm/StdcmConfig.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { useOsrdConfActions, useOsrdConfSelectors } from 'common/osrdContext';
import useInfraStatus from 'modules/pathfinding/hooks/useInfraStatus';
import { Map } from 'modules/trainschedule/components/ManageTrainSchedule';
import type { StdcmConfSliceActions } from 'reducers/osrdconf/stdcmConf';
import type { StdcmConfSelectors } from 'reducers/osrdconf/stdcmConf/selectors';
import { useAppDispatch } from 'store';

import StdcmConsist from './StdcmConsist';
Expand Down Expand Up @@ -50,15 +51,20 @@ const StdcmConfig = ({
updateGridMarginAfter,
updateGridMarginBefore,
updateStdcmStandardAllowance,
updateOriginArrivalType,
updateDestinationArrivalType,
updateStdcmPathStep,
} = useOsrdConfActions() as StdcmConfSliceActions;

const { getOrigin, getDestination, getPathSteps, getProjectID, getScenarioID, getStudyID } =
useOsrdConfSelectors();
const origin = useSelector(getOrigin);
const pathSteps = useSelector(getPathSteps);
const destination = useSelector(getDestination);
const {
getStdcmOrigin,
getStdcmDestination,
getStdcmPathSteps,
getProjectID,
getScenarioID,
getStudyID,
} = useOsrdConfSelectors() as StdcmConfSelectors;
const origin = useSelector(getStdcmOrigin);
const pathSteps = useSelector(getStdcmPathSteps);
const destination = useSelector(getStdcmDestination);
const projectID = useSelector(getProjectID);
const studyID = useSelector(getStudyID);
const scenarioID = useSelector(getScenarioID);
Expand Down Expand Up @@ -88,10 +94,14 @@ const StdcmConfig = ({
};

const removeOriginArrivalTime = () => {
dispatch(updateOriginArrivalType(ArrivalTimeTypes.ASAP));
dispatch(
updateStdcmPathStep({ id: origin.id, updates: { arrivalType: ArrivalTimeTypes.ASAP } })
);
};
const removeDestinationArrivalTime = () => {
dispatch(updateDestinationArrivalType(ArrivalTimeTypes.ASAP));
dispatch(
updateStdcmPathStep({ id: destination.id, updates: { arrivalType: ArrivalTimeTypes.ASAP } })
);
};

useEffect(() => {
Expand Down Expand Up @@ -139,9 +149,9 @@ const StdcmConfig = ({
<div className="stdcm-simulation-itinerary">
{/* //TODO: use them when we implement this feature #403 */}
{/* <StdcmDefaultCard text="Indiquer le sillon antérieur" Icon={<ArrowUp size="lg" />} /> */}
<StdcmOrigin disabled={disabled} origin={origin} />
<StdcmOrigin disabled={disabled} />
<StdcmVias disabled={disabled} />
<StdcmDestination disabled={disabled} destination={destination} />
<StdcmDestination disabled={disabled} />
{/* <StdcmDefaultCard text="Indiquer le sillon postérieur" Icon={<ArrowDown size="lg" />} /> */}
<div
className={cx('stdcm-launch-request', {
Expand Down Expand Up @@ -169,6 +179,7 @@ const StdcmConfig = ({
preventPointSelection
pathGeometry={pathfinding?.geometry}
showStdcmAssets
simulationPathSteps={pathSteps}
/>
</div>
<div />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,83 +1,70 @@
import { useMemo, useState } from 'react';
import { useMemo } from 'react';

import { useTranslation } from 'react-i18next';
import { useSelector } from 'react-redux';

import DestinationIcon from 'assets/pictures/stdcm/destination.svg';
import { useOsrdConfActions } from 'common/osrdContext';
import { useOsrdConfActions, useOsrdConfSelectors } from 'common/osrdContext';
import type { StdcmConfSliceActions } from 'reducers/osrdconf/stdcmConf';
import type { PathStep } from 'reducers/osrdconf/types';
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';
import StdcmOpSchedule from './StdcmOpSchedule';
import { DEFAULT_TOLERANCE } from '../../consts';
import { ArrivalTimeTypes, type ScheduleConstraint, type StdcmConfigCardProps } from '../../types';
import type { ArrivalTimeTypes, ScheduleConstraint, StdcmConfigCardProps } from '../../types';

const StdcmDestination = ({
disabled = false,
destination,
}: StdcmConfigCardProps & {
destination: PathStep | null;
}) => {
const StdcmDestination = ({ disabled = false }: StdcmConfigCardProps) => {
const { t } = useTranslation('stdcm');
const dispatch = useAppDispatch();

const [arrivalScheduleConstraint, setArrivalScheduleConstraint] = useState<ScheduleConstraint>();
const { getStdcmDestination } = useOsrdConfSelectors() as StdcmConfSelectors;

const {
updateDestination,
updateDestinationArrival,
updateDestinationArrivalType,
updateDestinationTolerances,
} = useOsrdConfActions() as StdcmConfSliceActions;
const destination = useSelector(getStdcmDestination);

const { updateStdcmPathStep } = useOsrdConfActions() as StdcmConfSliceActions;

const { destinationArrival, destinationToleranceValues } = useMemo(
() => ({
destinationArrival: destination?.arrival
destinationArrival: destination.arrival
? extractDateAndTimefromISO(destination.arrival)
: undefined,
destinationToleranceValues: {
arrivalToleranceBefore: destination?.arrivalToleranceBefore || DEFAULT_TOLERANCE,
arrivalToleranceAfter: destination?.arrivalToleranceAfter || DEFAULT_TOLERANCE,
arrivalToleranceBefore: destination.tolerances?.before || DEFAULT_TOLERANCE,
arrivalToleranceAfter: destination.tolerances?.after || DEFAULT_TOLERANCE,
},
}),
[destination]
);

const updateDestinationPoint = (pathStep: PathStep | null) => {
if (!pathStep || !arrivalScheduleConstraint) {
dispatch(updateDestination(pathStep));
} else {
dispatch(
updateDestination({
...pathStep,
arrival: generateISODateFromDateTime(arrivalScheduleConstraint),
})
);
}
};

const onDestinationArrivalChange = (schedule: ScheduleConstraint) => {
setArrivalScheduleConstraint(schedule);

const newOpArrival = generateISODateFromDateTime(schedule);
dispatch(updateDestinationArrival(newOpArrival));
const onArrivalChange = (schedule: ScheduleConstraint) => {
dispatch(
updateStdcmPathStep({
id: destination.id,
updates: { arrival: generateISODateFromDateTime(schedule) },
})
);
};

const onDestinationArrivalTypeChange = (arrivalType: ArrivalTimeTypes) => {
dispatch(updateDestinationArrivalType(arrivalType));
const onArrivalTypeChange = (arrivalType: ArrivalTimeTypes) => {
dispatch(updateStdcmPathStep({ id: destination.id, updates: { arrivalType } }));
};

const onDestinationToleranceChange = ({
const onToleranceChange = ({
toleranceBefore,
toleranceAfter,
}: {
toleranceBefore: number;
toleranceAfter: number;
}) => {
dispatch(updateDestinationTolerances({ toleranceBefore, toleranceAfter }));
dispatch(
updateStdcmPathStep({
id: destination.id,
updates: { tolerances: { before: toleranceBefore, after: toleranceAfter } },
})
);
};

return (
Expand All @@ -87,26 +74,19 @@ const StdcmDestination = ({
disabled={disabled}
className="extremity"
>
<div className="stdcm-destination">
<StdcmOperationalPoint
updatePoint={updateDestinationPoint}
point={destination}
opPointId={destination?.id || 'destination'}
disabled={disabled}
/>
{destination && (
<StdcmOpSchedule
onArrivalChange={onDestinationArrivalChange}
onArrivalTypeChange={onDestinationArrivalTypeChange}
onArrivalToleranceChange={onDestinationToleranceChange}
opTimingData={destinationArrival}
opToleranceValues={destinationToleranceValues}
opScheduleTimeType={destination?.arrivalType || ArrivalTimeTypes.ASAP}
disabled={disabled}
opId="destination-arrival"
/>
)}
</div>
{'uic' in destination && (
<StdcmOperationalPoint point={destination} opPointId={destination.id} disabled={disabled} />
)}
<StdcmOpSchedule
onArrivalChange={onArrivalChange}
onArrivalTypeChange={onArrivalTypeChange}
onArrivalToleranceChange={onToleranceChange}
opTimingData={destinationArrival}
opToleranceValues={destinationToleranceValues}
opScheduleTimeType={destination.arrivalType}
disabled={disabled}
opId="destination-arrival"
/>
</StdcmCard>
);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,18 @@ import { useEffect, useMemo } from 'react';

import { Select, ComboBox } from '@osrd-project/ui-core';
import { useTranslation } from 'react-i18next';
import nextId from 'react-id-generator';

import type { SearchResultItemOperationalPoint } from 'common/api/osrdEditoastApi';
import useSearchOperationalPoint from 'common/Map/Search/useSearchOperationalPoint';
import type { PathStep } from 'reducers/osrdconf/types';
import { useOsrdConfActions } from 'common/osrdContext';
import type { StdcmConfSliceActions } from 'reducers/osrdconf/stdcmConf';
import type { StdcmPathStep } from 'reducers/osrdconf/types';
import { useAppDispatch } from 'store';
import { normalized } from 'utils/strings';
import { createFixedSelectOptions } from 'utils/uiCoreHelpers';

type StdcmOperationalPointProps = {
updatePoint: (pathStep: PathStep | null) => void;
point: PathStep | null;
point: StdcmPathStep;
opPointId: string;
disabled?: boolean;
};
Expand All @@ -23,16 +24,14 @@ function formatChCode(chCode: string) {
return chCode === '' ? 'BV' : chCode;
}

const StdcmOperationalPoint = ({
updatePoint,
point,
opPointId,
disabled,
}: StdcmOperationalPointProps) => {
const StdcmOperationalPoint = ({ point, opPointId, disabled }: StdcmOperationalPointProps) => {
const { t } = useTranslation('stdcm');
const dispatch = useAppDispatch();

const { searchTerm, chCodeFilter, sortedSearchResults, setSearchTerm, setChCodeFilter } =
useSearchOperationalPoint({ initialSearchTerm: point?.name, initialChCodeFilter: point?.ch });
useSearchOperationalPoint({ initialSearchTerm: point.name, initialChCodeFilter: point.ch });

const { updateStdcmPathStep } = useOsrdConfActions() as StdcmConfSliceActions;

const operationalPointsSuggestions = useMemo(
() =>
Expand Down Expand Up @@ -76,17 +75,16 @@ const StdcmOperationalPoint = ({
);

const dispatchNewPoint = (p?: SearchResultItemOperationalPoint) => {
if (p && p.ch === point?.ch && 'uic' in point && p.uic === point?.uic) return;
if (p && p.ch === point.ch && 'uic' in point && p.uic === point.uic) return;
const newPoint = p
? {
name: p.name,
ch: p.ch,
id: point?.id || nextId(),
uic: p.uic,
coordinates: p.geographic.coordinates,
}
: null;
updatePoint(newPoint);
: { name: undefined, ch: undefined, uic: -1, coordinates: undefined };
dispatch(updateStdcmPathStep({ id: point.id, updates: newPoint }));
};

const updateSelectedPoint = (
Expand Down
Loading
Loading