Skip to content

Commit dbc24ed

Browse files
committed
change selectedTimetableItemIdsByType by selectedTimetableItemIds
1 parent ef850d6 commit dbc24ed

File tree

6 files changed

+60
-93
lines changed

6 files changed

+60
-93
lines changed

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

+1-1
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"

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

+16-43
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,
@@ -34,12 +29,7 @@ import {
3429
import PacedTrainItem from './PacedTrain/PacedTrainItem';
3530
import TimetableToolbar from './TimetableToolbar';
3631
import TrainScheduleItem from './TrainScheduleItem';
37-
import type {
38-
PacedTrainWithResult,
39-
SelectedTimetableIdsByType,
40-
TimetableItemResult,
41-
TrainScheduleWithDetails,
42-
} from './types';
32+
import type { PacedTrainWithResult, TimetableItemResult, TrainScheduleWithDetails } from './types';
4333

4434
type TimetableProps = {
4535
setDisplayTrainScheduleManagement: (mode: string) => void;
@@ -73,11 +63,7 @@ const Timetable = ({
7363

7464
const [displayedTimetableItems, setDisplayedTimetableItems] = useState<TimetableItemResult[]>([]);
7565
const [conflictsListExpanded, setConflictsListExpanded] = useState(false);
76-
const [selectedTimetableItemIdsByType, setSelectedTimetableItemIdsByType] =
77-
useState<SelectedTimetableIdsByType>({
78-
selectedTrainScheduleIds: [],
79-
selectedPacedTrainIds: [],
80-
});
66+
const [selectedTimetableItemIds, setSelectedTimetableItemIds] = useState<TimetableItemId[]>([]);
8167
const [showTrainDetails, setShowTrainDetails] = useState(false);
8268
const [timetableItems, setTimetableItems] = useState<TimetableItemResult[]>([]);
8369
const selectedTrainId = useSelector(getSelectedTrainId);
@@ -90,7 +76,7 @@ const Timetable = ({
9076

9177
const removeAndUnselectTrains = useCallback((trainIds: TimetableItemId[]) => {
9278
removeTrains(trainIds);
93-
setSelectedTimetableItemIdsByType({ selectedTrainScheduleIds: [], selectedPacedTrainIds: [] });
79+
setSelectedTimetableItemIds([]);
9480
dtoImport();
9581
}, []);
9682

@@ -100,22 +86,18 @@ const Timetable = ({
10086

10187
const handleSelectTimetableItem = useCallback(
10288
(id: TimetableItemId) => {
103-
const itemType = isTrainSchedule(id) ? 'selectedTrainScheduleIds' : 'selectedPacedTrainIds';
104-
const currentSelectedTrainIds: TimetableItemId[] = selectedTimetableItemIdsByType[itemType];
105-
const index = currentSelectedTrainIds.indexOf(id as TrainScheduleId);
89+
const currentSelectedTrainIds: TimetableItemId[] = selectedTimetableItemIds;
90+
const index = currentSelectedTrainIds.indexOf(id);
10691

10792
if (index === -1) {
108-
currentSelectedTrainIds.push(id as TrainScheduleId);
93+
currentSelectedTrainIds.push(id);
10994
} else {
11095
currentSelectedTrainIds.splice(index, 1);
11196
}
11297

113-
setSelectedTimetableItemIdsByType({
114-
...selectedTimetableItemIdsByType,
115-
[itemType]: currentSelectedTrainIds,
116-
});
98+
setSelectedTimetableItemIds([...currentSelectedTrainIds]);
11799
},
118-
[selectedTimetableItemIdsByType]
100+
[selectedTimetableItemIds]
119101
);
120102

121103
const handleConflictClick = (conflict: Conflict) => {
@@ -142,12 +124,12 @@ const Timetable = ({
142124
});
143125
}, [currentDepartureDates]);
144126

145-
const selectTimetableItemToEdit = (itemToEdit: TimetableItemResult) => {
127+
const selectTimetableItemToEdit = useCallback((itemToEdit: TimetableItemResult) => {
146128
dispatch(selectTrainToEdit(itemToEdit));
147129
// TODO Paced train : Adapt this to handle paced trains in issue https://github.com/OpenRailAssociation/osrd/issues/10615
148130
setItemIdToEdit(itemToEdit.id);
149131
setDisplayTrainScheduleManagement(MANAGE_TRAIN_SCHEDULE_TYPES.edit);
150-
};
132+
}, []);
151133

152134
// TODO PACED TRAIN : Remove this after adapting the code to handle paced trains in issue
153135
useEffect(() => {
@@ -200,16 +182,11 @@ const Timetable = ({
200182
timetableItems={timetableItems}
201183
displayedTimetableItems={displayedTimetableItems}
202184
setDisplayedTimetableItems={setDisplayedTimetableItems}
203-
selectedTimetableItemIdsByType={selectedTimetableItemIdsByType}
204-
setSelectedTimetableItemIdsByType={setSelectedTimetableItemIdsByType}
185+
selectedTimetableItemIds={selectedTimetableItemIds}
186+
setSelectedTimetableItemIds={setSelectedTimetableItemIds}
205187
removeTrains={removeAndUnselectTrains}
206188
trainSchedules={trainSchedules}
207-
isInSelection={
208-
[
209-
...selectedTimetableItemIdsByType.selectedPacedTrainIds,
210-
...selectedTimetableItemIdsByType.selectedTrainScheduleIds,
211-
].length > 0
212-
}
189+
isInSelection={selectedTimetableItemIds.length > 0}
213190
/>
214191
<Virtualizer overscan={15}>
215192
{displayedTimetableItems.map((timetableItem, index) => (
@@ -223,9 +200,7 @@ const Timetable = ({
223200
https://github.com/OpenRailAssociation/osrd/issues/10615 */}
224201
{isTrainSchedule(timetableItem.id) ? (
225202
<TrainScheduleItem
226-
isInSelection={selectedTimetableItemIdsByType.selectedTrainScheduleIds.includes(
227-
timetableItem.id
228-
)}
203+
isInSelection={selectedTimetableItemIds.includes(timetableItem.id)}
229204
handleSelectTrain={handleSelectTimetableItem}
230205
train={timetableItem as TrainScheduleWithDetails}
231206
isSelected={infraState === 'CACHED' && selectedTrainId === timetableItem.id}
@@ -241,9 +216,7 @@ const Timetable = ({
241216
) : (
242217
<PacedTrainItem
243218
pacedTrain={timetableItem as PacedTrainWithResult}
244-
isInSelection={selectedTimetableItemIdsByType.selectedPacedTrainIds.includes(
245-
timetableItem.id
246-
)}
219+
isInSelection={selectedTimetableItemIds.includes(timetableItem.id)}
247220
selectPacedTrainToEdit={selectTimetableItemToEdit}
248221
handleSelectPacedTrain={handleSelectTimetableItem}
249222
isOnEdit={timetableItem.id === itemIdToEdit}

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

+27-32
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,7 @@ import { useDebounce } from 'utils/helpers';
2424
import { formatTrainScheduleIdToEditoastTrainId, isTrainSchedule } from 'utils/trainId';
2525

2626
import FilterPanel from './FilterPanel';
27-
import type {
28-
ScheduledPointsHonoredFilter,
29-
SelectedTimetableIdsByType,
30-
TimetableItemResult,
31-
ValidityFilter,
32-
} from './types';
27+
import type { ScheduledPointsHonoredFilter, TimetableItemResult, ValidityFilter } from './types';
3328
import useFilterTrainSchedules from './useFilterTrainSchedules';
3429
import { timetableHasInvalidTrain } from './utils';
3530

@@ -39,8 +34,8 @@ type TimetableToolbarProps = {
3934
timetableItems: TimetableItemResult[];
4035
displayedTimetableItems: TimetableItemResult[];
4136
setDisplayedTimetableItems: (trainSchedulesDetails: TimetableItemResult[]) => void;
42-
selectedTimetableItemIdsByType: SelectedTimetableIdsByType;
43-
setSelectedTimetableItemIdsByType: (selectedTimetableIds: SelectedTimetableIdsByType) => void;
37+
selectedTimetableItemIds: TimetableItemId[];
38+
setSelectedTimetableItemIds: (selectedTimetableIds: TimetableItemId[]) => void;
4439
removeTrains: (trainIds: TimetableItemId[]) => void;
4540
trainSchedules: TrainScheduleResultWithTrainId[];
4641
isInSelection: boolean;
@@ -52,8 +47,8 @@ const TimetableToolbar = ({
5247
timetableItems,
5348
displayedTimetableItems,
5449
setDisplayedTimetableItems,
55-
selectedTimetableItemIdsByType,
56-
setSelectedTimetableItemIdsByType,
50+
selectedTimetableItemIds,
51+
setSelectedTimetableItemIds,
5752
removeTrains,
5853
trainSchedules,
5954
isInSelection,
@@ -73,6 +68,25 @@ const TimetableToolbar = ({
7368
useState<ScheduledPointsHonoredFilter>('both');
7469
const [selectedTags, setSelectedTags] = useState<Set<string | null>>(new Set());
7570

71+
const { selectedTrainScheduleIds, selectedPacedTrainIds } = useMemo(
72+
() =>
73+
selectedTimetableItemIds.reduce(
74+
(acc, timetableItemId) => {
75+
if (isTrainSchedule(timetableItemId)) {
76+
acc.selectedTrainScheduleIds.push(timetableItemId);
77+
} else {
78+
acc.selectedPacedTrainIds.push(timetableItemId);
79+
}
80+
return acc;
81+
},
82+
{ selectedTrainScheduleIds: [], selectedPacedTrainIds: [] } as {
83+
selectedTrainScheduleIds: TrainScheduleId[];
84+
selectedPacedTrainIds: PacedTrainId[];
85+
}
86+
),
87+
[selectedTimetableItemIds]
88+
);
89+
7690
const { totalPacedTrainCount, totalTrainScheduleCount } = useMemo(
7791
() =>
7892
timetableItems.reduce(
@@ -95,9 +109,6 @@ const TimetableToolbar = ({
95109

96110
const [deleteTrainSchedules] = osrdEditoastApi.endpoints.deleteTrainSchedule.useMutation();
97111

98-
const { selectedTrainScheduleIds, selectedPacedTrainIds } = selectedTimetableItemIdsByType;
99-
const selectedTimetableItemIds = [...selectedTrainScheduleIds, ...selectedPacedTrainIds];
100-
101112
// TODO: move this hook in Timetable
102113
const { uniqueTags } = useFilterTrainSchedules(
103114
timetableItems,
@@ -115,26 +126,10 @@ const TimetableToolbar = ({
115126

116127
const toggleAllTrainsSelecton = () => {
117128
if (displayedTimetableItems.length === selectedTimetableItemIds.length) {
118-
setSelectedTimetableItemIdsByType({
119-
selectedTrainScheduleIds: [],
120-
selectedPacedTrainIds: [],
121-
});
129+
setSelectedTimetableItemIds([]);
122130
} else {
123-
const timetableItemsDisplayed = displayedTimetableItems.reduce(
124-
(acc, { id }) => {
125-
if (isTrainSchedule(id)) {
126-
acc.selectedTrainScheduleIds.push(id);
127-
} else {
128-
acc.selectedPacedTrainIds.push(id);
129-
}
130-
return acc;
131-
},
132-
{
133-
selectedTrainScheduleIds: [] as TrainScheduleId[],
134-
selectedPacedTrainIds: [] as PacedTrainId[],
135-
}
136-
);
137-
setSelectedTimetableItemIdsByType(timetableItemsDisplayed);
131+
const timetableItemsDisplayed = displayedTimetableItems.map(({ id }) => id);
132+
setSelectedTimetableItemIds(timetableItemsDisplayed);
138133
}
139134
};
140135

front/src/modules/trainschedule/components/Timetable/types.ts

-5
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,3 @@ export type PacedTrainWithResult = TimetableItemWithDetails & {
5757
};
5858

5959
export type TimetableItemResult = TrainScheduleWithDetails | PacedTrainWithResult;
60-
61-
export type SelectedTimetableIdsByType = {
62-
selectedTrainScheduleIds: TrainScheduleId[];
63-
selectedPacedTrainIds: PacedTrainId[];
64-
};

front/src/styles/scss/applications/operationalStudies/_pacedTrain.scss

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
height: 24px;
4545
width: 100%;
4646
align-items: center;
47+
overflow: hidden;
4748

4849
.train-projected {
4950
height: 20px;

front/src/styles/scss/applications/operationalStudies/_scenario.scss

+15-12
Original file line numberDiff line numberDiff line change
@@ -335,17 +335,6 @@
335335
margin-left: 8px;
336336
position: relative;
337337
line-height: 24px;
338-
339-
&::after {
340-
content: '';
341-
position: absolute;
342-
top: 0;
343-
right: -24px;
344-
width: 24px;
345-
height: 22px;
346-
background: linear-gradient(270deg, rgba(247, 246, 238, 0), rgba(247, 246, 238, 1));
347-
z-index: 1;
348-
}
349338
}
350339

351340
.custom-checkbox.small {
@@ -518,6 +507,20 @@
518507
align-items: center;
519508
overflow: hidden;
520509
height: 24px;
510+
position: relative;
511+
512+
&:has(img) {
513+
&::after {
514+
content: '';
515+
position: absolute;
516+
top: 0;
517+
left: 0;
518+
width: 24px;
519+
height: 22px;
520+
background: linear-gradient(270deg, rgba(247, 246, 238, 0), rgba(247, 246, 238, 1));
521+
z-index: 1;
522+
}
523+
}
521524

522525
.status-invalid {
523526
width: 4px;
@@ -636,7 +639,7 @@
636639
&.selected:not(.invalid) {
637640
background-color: var(--selection20);
638641
box-shadow: inset 0 -1px 0 0 rgba(0, 0, 0, 0.25);
639-
.checkbox-title::after {
642+
.rolling-stock::after {
640643
background: linear-gradient(
641644
270deg,
642645
rgba(255, 242, 179, 0),

0 commit comments

Comments
 (0)