Skip to content

Commit f62f292

Browse files
Math-RUriel-Sautron
authored andcommitted
front: replace timetabletraincard by trainscheduleitem
Signed-off-by: Math_R_ <mathieu.richard747@gmail.com>
1 parent b1bd98d commit f62f292

File tree

9 files changed

+178
-114
lines changed

9 files changed

+178
-114
lines changed

front/public/locales/en/operationalStudies/scenario.json

+10-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@
2929
"pacedTrain": {
3030
"pacedTrain": "Paced train"
3131
},
32+
"pacedTrain_one": "1 service",
33+
"pacedTrain_other": "{{count}} services",
34+
"pacedTrain_zero": "0 service",
35+
"pacedTrainCount_one": "1/$t(pacedTrain, { 'count': {{totalCount}} }) selected",
36+
"pacedTrainCount_other": "{{count}}/$t(pacedTrain, { 'count': {{totalCount}} }) selected",
37+
"pacedTrainCount_zero": "$t(pacedTrain, { 'count': {{totalCount}} })",
38+
"pacedTrainAndTrainCount": "{{pacedTrainCount}}/$t(pacedTrain, { 'count': {{totalPacedTrainCount}} }) and {{trainCount}}/$t(train, { 'count': {{totalTrainScheduleCount}} }) selected",
3239
"scenarioCancel": "Cancel",
3340
"scenarioCreateButton": "Create a scenario",
3441
"scenarioCreationTitle": "Create a scenario",
@@ -72,6 +79,7 @@
7279
"simulation_failed": "Simulation failed"
7380
},
7481
"invalidTrains": "Some trains are invalid",
82+
"noItem": "No item",
7583
"noSpeedLimitTags": "Without code",
7684
"noSpeedLimitTagsShort": "None",
7785
"noTrain": "No train",
@@ -95,8 +103,8 @@
95103
"validityFilter": "Trains validity"
96104
},
97105
"toggleTimetable": "Toggle the timetable",
98-
"trainCount_one": "1 out of $t(train, { 'count': {{totalCount}} }) selected",
99-
"trainCount_other": "{{count}} out of $t(train, { 'count': {{totalCount}} }) selected",
106+
"trainCount_one": "1/$t(train, { 'count': {{totalCount}} }) selected",
107+
"trainCount_other": "{{count}}/$t(train, { 'count': {{totalCount}} }) selected",
100108
"trainCount_zero": "$t(train, { 'count': {{totalCount}} })",
101109
"train_one": "1 train",
102110
"train_other": "{{count}} trains",

front/public/locales/fr/operationalStudies/scenario.json

+10-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@
2828
"pacedTrain": {
2929
"pacedTrain": "Mission"
3030
},
31+
"pacedTrain_one": "1 mission",
32+
"pacedTrain_other": "{{count}} missions",
33+
"pacedTrain_zero": "0 mission",
34+
"pacedTrainCount_one": "1/$t(pacedTrain, { 'count': {{totalCount}} }) sélectionnée",
35+
"pacedTrainCount_other": "{{count}}/$t(pacedTrain, { 'count': {{totalCount}} }) sélectionnées",
36+
"pacedTrainCount_zero": "$t(pacedTrain, { 'count': {{totalCount}} })",
37+
"pacedTrainAndTrainCount": "{{pacedTrainCount}}/$t(pacedTrain, { 'count': {{totalPacedTrainCount}} }) et {{trainCount}}/$t(train, { 'count': {{totalTrainScheduleCount}} }) sélectionnés",
3138
"scenarioCancel": "Annuler",
3239
"scenarioCreateButton": "Créer le scénario",
3340
"scenarioCreationTitle": "Créer un scénario",
@@ -71,6 +78,7 @@
7178
"simulation_failed": "Simulation impossible"
7279
},
7380
"invalidTrains": "Certains trains sont invalides",
81+
"noItem": "Aucun item",
7482
"noSpeedLimitTags": "Sans code",
7583
"noSpeedLimitTagsShort": "Aucun",
7684
"noTrain": "Aucun train",
@@ -94,8 +102,8 @@
94102
"validityFilter": "Validité des trains"
95103
},
96104
"toggleTimetable": "Basculer l'affichage de la grille horaire",
97-
"trainCount_one": "1 sélectionné sur $t(train, { 'count': {{totalCount}} })",
98-
"trainCount_other": "{{count}} sélectionnés sur $t(train, { 'count': {{totalCount}} })",
105+
"trainCount_one": "1/$t(train, { 'count': {{totalCount}} }) sélectionné",
106+
"trainCount_other": "{{count}}/$t(train, { 'count': {{totalCount}} }) sélectionnés",
99107
"trainCount_zero": "$t(train, { 'count': {{totalCount}} })",
100108
"train_one": "1 train",
101109
"train_other": "{{count}} trains",

front/src/modules/trainschedule/components/Timetable/PacedTrain/PacedTrainItem.tsx

+9-3
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ const PacedTrainItem = ({
4040

4141
const pacedTrainCadence = pacedTrain.paced.step;
4242

43-
const occurrencesCount = Math.floor(pacedTrain.paced.duration.ms / pacedTrain.paced.step.ms);
43+
const occurrencesCount = Math.ceil(pacedTrain.paced.duration.ms / pacedTrain.paced.step.ms);
4444
return (
4545
<div
4646
data-testid="scenario-timetable-train"
@@ -90,9 +90,9 @@ const PacedTrainItem = ({
9090
</div>
9191
</div>
9292

93-
{!pacedTrain.invalidReason && (
93+
{!pacedTrain.invalidReason ? (
9494
<div className="paced-train-right-zone">
95-
{pacedTrain.isValid && <div>&mdash;{` ${ms2min(pacedTrainCadence.ms)}min`}</div>}
95+
{pacedTrain.isValid && <div>&mdash;&nbsp;{`${ms2min(pacedTrainCadence.ms)}min`}</div>}
9696
<div
9797
className={cx('status-icon', {
9898
'not-honored-or-too-fast': pacedTrain.notHonoredReason,
@@ -106,6 +106,12 @@ const PacedTrainItem = ({
106106
))}
107107
</div>
108108
</div>
109+
) : (
110+
<div className="invalid-reason">
111+
<span title={t(`timetable.invalid.${pacedTrain.invalidReason}`)}>
112+
{t(`timetable.invalid.${pacedTrain.invalidReason}`)}
113+
</span>
114+
</div>
109115
)}
110116
</div>
111117
<TimetableItemActions

front/src/modules/trainschedule/components/Timetable/Timetable.tsx

+16-37
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,7 @@ import type { Conflict, InfraState } from 'common/api/osrdEditoastApi';
1111
import i18n from 'i18n';
1212
import ConflictsList from 'modules/conflict/components/ConflictsList';
1313
import { selectTrainToEdit } from 'reducers/osrdconf/operationalStudiesConf';
14-
import type {
15-
PacedTrainId,
16-
TimetableItemId,
17-
TrainScheduleId,
18-
TrainScheduleResultWithTrainId,
19-
} from 'reducers/osrdconf/types';
14+
import type { TimetableItemId, TrainScheduleResultWithTrainId } from 'reducers/osrdconf/types';
2015
import { updateSelectedTrainId } from 'reducers/simulationResults';
2116
import {
2217
getSelectedTrainId,
@@ -33,7 +28,7 @@ import {
3328

3429
import PacedTrainItem from './PacedTrain/PacedTrainItem';
3530
import TimetableToolbar from './TimetableToolbar';
36-
import TimetableTrainCard from './TimetableTrainCard';
31+
import TrainScheduleItem from './TrainScheduleItem';
3732
import type { PacedTrainWithResult, TimetableItemResult, TrainScheduleWithDetails } from './types';
3833

3934
type TimetableProps = {
@@ -68,10 +63,7 @@ const Timetable = ({
6863

6964
const [displayedTimetableItems, setDisplayedTimetableItems] = useState<TimetableItemResult[]>([]);
7065
const [conflictsListExpanded, setConflictsListExpanded] = useState(false);
71-
const [selectedTimetableItemIds, setSelectedTimetableItemIds] = useState<{
72-
trainScheduleIds: TrainScheduleId[];
73-
pacedTrainIds: PacedTrainId[];
74-
}>({ trainScheduleIds: [], pacedTrainIds: [] });
66+
const [selectedTimetableItemIds, setSelectedTimetableItemIds] = useState<TimetableItemId[]>([]);
7567
const [showTrainDetails, setShowTrainDetails] = useState(false);
7668
const [timetableItems, setTimetableItems] = useState<TimetableItemResult[]>([]);
7769
const selectedTrainId = useSelector(getSelectedTrainId);
@@ -84,7 +76,7 @@ const Timetable = ({
8476

8577
const removeAndUnselectTrains = useCallback((trainIds: TimetableItemId[]) => {
8678
removeTrains(trainIds);
87-
setSelectedTimetableItemIds({ trainScheduleIds: [], pacedTrainIds: [] });
79+
setSelectedTimetableItemIds([]);
8880
dtoImport();
8981
}, []);
9082

@@ -94,22 +86,16 @@ const Timetable = ({
9486

9587
const handleSelectTimetableItem = useCallback(
9688
(id: TimetableItemId) => {
97-
const itemType = isTrainSchedule(id) ? 'trainScheduleIds' : 'pacedTrainIds';
98-
99-
// TODO Paced train : Adapt this to handle paced trains in issue https://github.com/OpenRailAssociation/osrd/issues/10615
100-
const currentSelectedTrainIds = [...selectedTimetableItemIds[itemType]];
101-
const index = currentSelectedTrainIds.indexOf(id as TrainScheduleId);
89+
const currentSelectedTrainIds: TimetableItemId[] = selectedTimetableItemIds;
90+
const index = currentSelectedTrainIds.indexOf(id);
10291

10392
if (index === -1) {
104-
currentSelectedTrainIds.push(id as TrainScheduleId);
93+
currentSelectedTrainIds.push(id);
10594
} else {
10695
currentSelectedTrainIds.splice(index, 1);
10796
}
10897

109-
setSelectedTimetableItemIds({
110-
...selectedTimetableItemIds,
111-
[itemType]: currentSelectedTrainIds,
112-
});
98+
setSelectedTimetableItemIds([...currentSelectedTrainIds]);
11399
},
114100
[selectedTimetableItemIds]
115101
);
@@ -138,12 +124,12 @@ const Timetable = ({
138124
});
139125
}, [currentDepartureDates]);
140126

141-
const selectTimeTableItemToEdit = (itemToEdit: TimetableItemResult) => {
127+
const selectTimetableItemToEdit = useCallback((itemToEdit: TimetableItemResult) => {
142128
dispatch(selectTrainToEdit(itemToEdit));
143129
// TODO Paced train : Adapt this to handle paced trains in issue https://github.com/OpenRailAssociation/osrd/issues/10615
144130
setItemIdToEdit(itemToEdit.id);
145131
setDisplayTrainScheduleManagement(MANAGE_TRAIN_SCHEDULE_TYPES.edit);
146-
};
132+
}, []);
147133

148134
// TODO PACED TRAIN : Remove this after adapting the code to handle paced trains in issue
149135
useEffect(() => {
@@ -200,12 +186,7 @@ const Timetable = ({
200186
setSelectedTimetableItemIds={setSelectedTimetableItemIds}
201187
removeTrains={removeAndUnselectTrains}
202188
trainSchedules={trainSchedules}
203-
isInSelection={
204-
[
205-
...selectedTimetableItemIds.pacedTrainIds,
206-
...selectedTimetableItemIds.trainScheduleIds,
207-
].length > 0
208-
}
189+
isInSelection={selectedTimetableItemIds.length > 0}
209190
/>
210191
<Virtualizer overscan={15}>
211192
{displayedTimetableItems.map((timetableItem, index) => (
@@ -218,17 +199,15 @@ const Timetable = ({
218199
{/* TODO Paced train : Adapt this to handle paced trains in issue
219200
https://github.com/OpenRailAssociation/osrd/issues/10615 */}
220201
{isTrainSchedule(timetableItem.id) ? (
221-
<TimetableTrainCard
222-
isInSelection={selectedTimetableItemIds.trainScheduleIds.includes(
223-
timetableItem.id
224-
)}
202+
<TrainScheduleItem
203+
isInSelection={selectedTimetableItemIds.includes(timetableItem.id)}
225204
handleSelectTrain={handleSelectTimetableItem}
226205
train={timetableItem as TrainScheduleWithDetails}
227206
isSelected={infraState === 'CACHED' && selectedTrainId === timetableItem.id}
228207
isModified={timetableItem.id === itemIdToEdit}
229208
upsertTrainSchedules={upsertTrainSchedules}
230209
removeTrains={removeAndUnselectTrains}
231-
selectTrainToEdit={selectTimeTableItemToEdit}
210+
selectTrainToEdit={selectTimetableItemToEdit}
232211
projectionPathIsUsed={
233212
infraState === 'CACHED' && trainIdUsedForProjection === timetableItem.id
234213
}
@@ -237,8 +216,8 @@ const Timetable = ({
237216
) : (
238217
<PacedTrainItem
239218
pacedTrain={timetableItem as PacedTrainWithResult}
240-
isInSelection={selectedTimetableItemIds.pacedTrainIds.includes(timetableItem.id)}
241-
selectPacedTrainToEdit={selectTimeTableItemToEdit}
219+
isInSelection={selectedTimetableItemIds.includes(timetableItem.id)}
220+
selectPacedTrainToEdit={selectTimetableItemToEdit}
242221
handleSelectPacedTrain={handleSelectTimetableItem}
243222
isOnEdit={timetableItem.id === itemIdToEdit}
244223
isProjectionPathUsed={false}

0 commit comments

Comments
 (0)