@@ -16,25 +16,37 @@ function timeToMinutes(time: string) {
16
16
return hours * 60 + minutes + seconds / 60 ;
17
17
}
18
18
19
- function Hours ( props : { startTime : number ; endTime : number } ) {
20
- let startHour = props . startTime / 60 ;
21
- const endHour = props . endTime / 60 ;
19
+ function generateHourEntries (
20
+ startTime : number ,
21
+ endTime : number ,
22
+ isLine : boolean
23
+ ) {
24
+ const startHour = startTime / 60 ;
25
+ const endHour = endTime / 60 ;
22
26
const numberOfHours = endHour - startHour ;
23
27
24
- let hours : any [ ] = [ ] ;
28
+ return Array . from ( { length : numberOfHours + 1 } , ( _ , i ) => {
29
+ const hour = startHour + i ;
30
+ const style = hour === endHour ? { } : { height : `${ 100 / numberOfHours } %` } ;
25
31
26
- for ( ; startHour <= endHour ; startHour ++ ) {
27
- let style =
28
- startHour == endHour ? { } : { height : `${ 100 / numberOfHours } %` } ;
29
- hours . push (
30
- < div key = { startHour } style = { style } className = { styles . hourEntry } >
31
- < span className = { styles . line } />
32
- < p > { `${ startHour } h` } </ p >
32
+ return isLine ? (
33
+ < span key = { hour } style = { style } className = { styles . line } />
34
+ ) : (
35
+ < div key = { hour } style = { style } className = { styles . hourEntry } >
36
+ < p > { `${ hour } h` } </ p >
33
37
</ div >
34
38
) ;
35
- }
39
+ } ) ;
40
+ }
41
+
42
+ function Lines ( props : { startTime : number ; endTime : number } ) {
43
+ const lines = generateHourEntries ( props . startTime , props . endTime , true ) ;
44
+ return < div className = { styles . lines } > { lines } </ div > ;
45
+ }
36
46
37
- return < > { hours } </ > ;
47
+ function Hours ( props : { startTime : number ; endTime : number } ) {
48
+ const hours = generateHourEntries ( props . startTime , props . endTime , false ) ;
49
+ return < div className = { styles . hours } > { hours } </ div > ;
38
50
}
39
51
40
52
function TimeTableEvent ( props : {
@@ -119,17 +131,14 @@ export function Timetable(props: { activities: ICBDActivity[] }) {
119
131
JSON . stringify ( activity . timeslots )
120
132
) ;
121
133
122
- timeslots . forEach ( ( timeslot ) => {
123
- let tStartTime = timeToMinutes ( timeslot . start_time ) ;
134
+ timeslots . forEach ( ( { start_time , end_time , room } ) => {
135
+ let tStartTime = timeToMinutes ( start_time ) ;
124
136
startTime = Math . min ( tStartTime , startTime ) ;
125
- let tEndTime = timeToMinutes ( timeslot . end_time ) ;
137
+ let tEndTime = timeToMinutes ( end_time ) ;
126
138
endTime = Math . max ( tEndTime , endTime ) ;
127
139
128
- let groupKey = timeslot . room ;
129
- if ( ! rooms [ groupKey ] ) {
130
- rooms [ groupKey ] = [ ] ;
131
- }
132
- rooms [ groupKey ] . push ( [ timeslot , activity ] ) ;
140
+ if ( ! rooms [ room ] ) rooms [ room ] = [ ] ;
141
+ rooms [ room ] . push ( [ { start_time, end_time, room } , activity ] ) ;
133
142
} ) ;
134
143
} ) ;
135
144
@@ -138,34 +147,36 @@ export function Timetable(props: { activities: ICBDActivity[] }) {
138
147
let formattedEndTime = hours + ":" + minutes ;
139
148
140
149
return (
141
- < >
142
- < table className = { styles . table } >
143
- < tbody >
144
- < tr >
145
- < th />
146
- { Object . keys ( rooms ) . map ( ( room ) => (
147
- < th className = { styles . header } key = { "header|" + room } >
148
- < p > { room } </ p >
149
- </ th >
150
- ) ) }
151
- </ tr >
152
- < tr >
153
- < td className = { styles . hours } >
154
- < Hours startTime = { startTime } endTime = { endTime } />
155
- </ td >
156
- { Object . keys ( rooms ) . map ( ( room ) => (
157
- < td key = { "entry|" + room } >
158
- < TimetableEntry
159
- timeslots = { rooms [ room ] }
160
- startTime = { startTime }
161
- endTime = { endTime }
162
- />
163
- </ td >
164
- ) ) }
165
- </ tr >
166
- </ tbody >
167
- </ table >
168
- < p > { `${ tt [ "icbd-end-of-event" ] } ${ formattedEndTime } ` } </ p >
169
- </ >
150
+ < div className = { styles . main } >
151
+ < Hours startTime = { startTime } endTime = { endTime } />
152
+ < div className = { styles . timetable } >
153
+ < Lines startTime = { startTime } endTime = { endTime } />
154
+ < table className = { styles . table } >
155
+ < tbody >
156
+ < tr >
157
+ { Object . keys ( rooms ) . map ( ( room ) => (
158
+ < th className = { styles . header } key = { "header|" + room } >
159
+ < p > { room } </ p >
160
+ </ th >
161
+ ) ) }
162
+ </ tr >
163
+ < tr style = { { height : "100%" } } >
164
+ { Object . keys ( rooms ) . map ( ( room ) => (
165
+ < td key = { "entry|" + room } >
166
+ < TimetableEntry
167
+ timeslots = { rooms [ room ] }
168
+ startTime = { startTime }
169
+ endTime = { endTime }
170
+ />
171
+ </ td >
172
+ ) ) }
173
+ </ tr >
174
+ </ tbody >
175
+ </ table >
176
+ </ div >
177
+ < p className = { styles . end } >
178
+ { `${ tt [ "icbd-end-of-event" ] } ${ formattedEndTime } ` }
179
+ </ p >
180
+ </ div >
170
181
) ;
171
182
}
0 commit comments