-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathImportTrainScheduleTrainDetail.tsx
108 lines (102 loc) · 3.92 KB
/
ImportTrainScheduleTrainDetail.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import { useState } from 'react';
import cx from 'classnames';
import nextId from 'react-id-generator';
import type { ImportedTrainSchedule } from 'applications/operationalStudies/types';
import type {
LightRollingStockWithLiveries,
RollingStockWithLiveries,
} from 'common/api/osrdEditoastApi';
import RollingStock2Img from 'modules/rollingStock/components/RollingStock2Img';
import { secToHoursString } from 'utils/timeManipulation';
type ImportTrainScheduleTrainDetailProps = {
trainData: ImportedTrainSchedule;
idx: number;
rollingStock?: LightRollingStockWithLiveries | RollingStockWithLiveries;
};
export default function ImportTrainScheduleTrainDetail({
trainData,
idx,
rollingStock,
}: ImportTrainScheduleTrainDetailProps) {
const [isOpened, setIsOpened] = useState(false);
const openCard = () => {
if (trainData.steps.length > 2) {
setIsOpened(!isOpened);
}
};
const calcRouteDurationInHour = (departureTime: string, arrivalTime: string) => {
const durationInSecond = Math.round(
(new Date(arrivalTime).getTime() - new Date(departureTime).getTime()) / 1000
);
return secToHoursString(durationInSecond, { withSeconds: true });
};
return (
<div
className="import-train-schedule-traindetail import-train-schedule-traindetail-no-hover"
role="button"
tabIndex={0}
onClick={openCard}
>
<div
className={cx('import-train-schedule-traindetail-main', {
'import-train-schedule-traindetail-with-hover': trainData.steps.length > 2,
})}
>
<span className="import-train-schedule-traindetail-idx">{idx + 1}</span>
<span className="import-train-schedule-traindetail-num">
{trainData.trainNumber}
{trainData.departure && (
<span className="import-train-schedule-traindetail-activity">
{trainData.departure}
</span>
)}
</span>
<span className="import-train-schedule-traindetail-startend">
{trainData.departureTime.slice(-8)} - {trainData.arrivalTime.slice(-8)}
</span>
<span className="import-train-schedule-traindetail-duration">
{calcRouteDurationInHour(trainData.departureTime, trainData.arrivalTime)}
</span>
{rollingStock && (
<span className="import-train-schedule-traindetail-rollingstock">
<RollingStock2Img rollingStock={rollingStock} />
</span>
)}
<span className="import-train-schedule-traindetail-rollingstock-name">
{trainData.rollingStock}
{trainData.transilienName && (
<span className="import-train-schedule-traindetail-transilien">
{trainData.transilienName}
</span>
)}
</span>
<span
className={`import-train-schedule-traindetail-stepnb ${
trainData.steps.length < 2 ? 'import-invalid-step-nb' : 'bg-primary'
}`}
>
{trainData.steps.length - 2}
</span>
</div>
<div className={cx('import-train-schedule-traindetail-steps', { opened: isOpened })}>
{trainData.steps.map(
(step, stepIdx) =>
// Remove origin & destination
stepIdx !== 0 &&
stepIdx !== trainData.steps.length - 1 && (
<div className="import-train-schedule-traindetail-step" key={nextId()}>
<span className="import-train-schedule-traindetail-step-nb">{stepIdx}</span>
<span className="import-train-schedule-traindetail-step-startend">
{`${step.arrivalTime.slice(-8)} - ${step.departureTime.slice(-8)} `}
</span>
<span className="import-train-schedule-traindetail-step-duration">
{step.duration}s
</span>
<span className="import-train-schedule-traindetail-step-name">{step.name}</span>
</div>
)
)}
</div>
</div>
);
}