Skip to content

Commit 7e4aa0e

Browse files
Uriel-SautronMath-R
andcommitted
front: wip: create paced train item
- create PacedTrainItem component Co-authored-by: Math_R_ <mathieu.richard747@gmail.com> Signed-off-by: Uriel-Sautron <uriel.sautron@gmail.com>
1 parent 4ddefb0 commit 7e4aa0e

File tree

5 files changed

+167
-26
lines changed

5 files changed

+167
-26
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import React, { useState } from 'react';
2+
3+
import { Checkbox } from '@osrd-project/ui-core';
4+
import { ChevronDown, Manchette } from '@osrd-project/ui-icons';
5+
import cx from 'classnames';
6+
7+
import type { TrainScheduleWithDetails } from '../types';
8+
9+
export type PacedTrain = TrainScheduleWithDetails & {
10+
paced: {
11+
duration: string;
12+
step: string;
13+
};
14+
};
15+
16+
type PacedTrainItemProps = {
17+
isInSelection: boolean;
18+
handleSelectPacedTrain: (pacedTrainId: number) => void;
19+
pacedTrain: PacedTrain;
20+
isOnEdit: boolean;
21+
isProjectionPathUsed: boolean;
22+
};
23+
24+
const PacedTrainItem = ({
25+
isInSelection,
26+
handleSelectPacedTrain,
27+
pacedTrain,
28+
isOnEdit,
29+
isProjectionPathUsed,
30+
}: PacedTrainItemProps) => {
31+
const [isOpened, setIsOpened] = useState(false);
32+
33+
const toggle = () => setIsOpened((open) => !open);
34+
35+
return (
36+
<div
37+
data-testid="scenario-timetable-train"
38+
className={cx('scenario-timetable-train paced-train', {
39+
modified: isOnEdit,
40+
'in-selection': isInSelection,
41+
closed: !isOpened,
42+
// invalid: train.invalidReason,
43+
})}
44+
>
45+
<div className="base-info" onClick={toggle} role="button" tabIndex={0}>
46+
<div className="checkbox-title">
47+
{/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}
48+
<div onClick={(e) => e.stopPropagation()}>
49+
<Checkbox
50+
label=""
51+
checked={isInSelection}
52+
onChange={() => handleSelectPacedTrain(pacedTrain.id)}
53+
small
54+
/>
55+
</div>
56+
<div className="occurancies-count">1</div>
57+
<ChevronDown className="toggle-icon" />
58+
</div>
59+
<div title={pacedTrain.trainName} className="checkbox-label">
60+
<div className="train-info">
61+
{isProjectionPathUsed && (
62+
<div className="train-projected">
63+
<Manchette iconColor="var(--white100)" />
64+
</div>
65+
)}
66+
<span className="train-name">{pacedTrain.trainName}</span>
67+
</div>
68+
</div>
69+
</div>
70+
<div className="occurancies" />
71+
</div>
72+
);
73+
};
74+
75+
export default PacedTrainItem;

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

+41-24
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import {
1717
} from 'reducers/simulationResults/selectors';
1818
import { useAppDispatch } from 'store';
1919

20+
import fakePacedTrainData from './PacedTrain/fakeData.json';
21+
import PacedTrainItem, { type PacedTrain } from './PacedTrain/PacedTrainItem';
2022
import TimetableToolbar from './TimetableToolbar';
2123
import TimetableTrainCard from './TimetableTrainCard';
2224
import type { TrainScheduleWithDetails } from './types';
@@ -150,30 +152,45 @@ const Timetable = ({
150152
isInSelection={selectedTrainIds.length > 0}
151153
/>
152154
<Virtualizer overscan={15}>
153-
{displayedTrainSchedules.map((train: TrainScheduleWithDetails, index) => (
154-
<div key={`timetable-train-card-${train.id}`}>
155-
{showDepartureDates[index] && (
156-
<div className="scenario-timetable-departure-date">
157-
{currentDepartureDates[index]}
158-
</div>
159-
)}
160-
<TimetableTrainCard
161-
isInSelection={selectedTrainIds.includes(train.id)}
162-
handleSelectTrain={handleSelectTrain}
163-
train={train}
164-
isSelected={infraState === 'CACHED' && selectedTrainId === train.id}
165-
isModified={train.id === trainIdToEdit}
166-
setDisplayTrainScheduleManagement={setDisplayTrainScheduleManagement}
167-
upsertTrainSchedules={upsertTrainSchedules}
168-
setTrainIdToEdit={setTrainIdToEdit}
169-
removeTrains={removeAndUnselectTrains}
170-
projectionPathIsUsed={
171-
infraState === 'CACHED' && trainIdUsedForProjection === train.id
172-
}
173-
dtoImport={dtoImport}
174-
/>
175-
</div>
176-
))}
155+
{displayedTrainSchedules.map((train: TrainScheduleWithDetails, index) => (
156+
<div key={`timetable-train-card-${train.id}`}>
157+
{showDepartureDates[index] && (
158+
<div className="scenario-timetable-departure-date">
159+
{currentDepartureDates[index]}
160+
</div>
161+
)}
162+
<TimetableTrainCard
163+
isInSelection={selectedTrainIds.includes(train.id)}
164+
handleSelectTrain={handleSelectTrain}
165+
train={train}
166+
isSelected={infraState === 'CACHED' && selectedTrainId === train.id}
167+
isModified={train.id === trainIdToEdit}
168+
setDisplayTrainScheduleManagement={setDisplayTrainScheduleManagement}
169+
upsertTrainSchedules={upsertTrainSchedules}
170+
setTrainIdToEdit={setTrainIdToEdit}
171+
removeTrains={removeAndUnselectTrains}
172+
projectionPathIsUsed={
173+
infraState === 'CACHED' && trainIdUsedForProjection === train.id
174+
}
175+
dtoImport={dtoImport}
176+
/>
177+
</div>
178+
))}
179+
<PacedTrainItem
180+
pacedTrain={
181+
{
182+
...fakePacedTrainData,
183+
startTime: new Date(fakePacedTrainData.startTime),
184+
arrivalTime: fakePacedTrainData.arrivalTime
185+
? new Date(fakePacedTrainData.arrivalTime)
186+
: null,
187+
} as PacedTrain
188+
}
189+
isInSelection={selectedTrainIds.includes(fakePacedTrainData.id)}
190+
handleSelectPacedTrain={handleSelectTrain}
191+
isOnEdit={false}
192+
isProjectionPathUsed={false}
193+
/>
177194
</Virtualizer>
178195
<div
179196
className={cx('bottom-timetables-trains', {

front/src/styles/scss/_variables.scss

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ $colors: (
5454
'grey40': #94918e,
5555
'grey50': #797671,
5656
'grey60': #5c5955,
57+
'grey70': #494641,
5758
'grey80': #312e2b,
5859
'grey90': #1f1b17,
5960
'info5': #e6f7ff,

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

+49-1
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@
341341
}
342342

343343
.checkbox-label {
344-
margin: 0 8px;
344+
margin-right: 8px;
345345
font-size: 1rem;
346346
font-weight: 600;
347347
max-width: 160px;
@@ -473,6 +473,54 @@
473473
background-color: var(--ambiantB10);
474474
box-shadow: inset 0 -1px 0 0 rgba(0, 0, 0, 0.25);
475475

476+
&.paced-train {
477+
display: flex;
478+
align-items: center;
479+
480+
.custom-checkbox.small {
481+
margin-bottom: 0;
482+
}
483+
484+
.toggle-icon{
485+
transition: all 0.3s;
486+
}
487+
488+
.base-info{
489+
height: 48px;
490+
align-items: center;
491+
}
492+
493+
494+
495+
.occurancies-count{
496+
height: 20px;
497+
border: 0.5px solid var(--grey90);
498+
font-size: 14px;
499+
padding: 3px 4px;
500+
background-color: var(--grey70);
501+
color: var(--white100);
502+
font-weight: 600;
503+
border-radius: 3px;
504+
display: flex;
505+
align-items: center;
506+
align-self: center;
507+
margin-right: 8px;
508+
}
509+
.occurancies{
510+
width: 100%;
511+
height: 20px;
512+
}
513+
514+
&.closed {
515+
.toggle-icon{
516+
transform: rotate(-90deg);
517+
transition: all 0.3s;
518+
}
519+
.occurancies{
520+
height: 0;
521+
}
522+
}}
523+
476524
.clickable-button {
477525
width: 100%;
478526
padding: 12px 0;

front/src/styles/scss/applications/stdcm/_home.scss

+1-1
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@
174174
rgba(226, 226, 222, 1) 0%,
175175
rgba(211, 209, 207, 1) 100%
176176
);
177-
color: #494641;
177+
color: var(--grey70);
178178
padding: 4px 12px 8px 12px;
179179
max-width: fit-content;
180180
}

0 commit comments

Comments
 (0)