Newer
Older
import React, { ReactElement } from "react";
import MyBreadcrumbs from "components/atoms/MyBreadcrumbs";
import styles from "./style.module.scss";
import TermSwitcher from "./components/TermSwitcher";
import ModuleHeading from "./components/ModuleHeading";
import WeekHeading from "./components/WeekHeading";
import { modulesList } from "../ModuleList/list";
import classNames from "classnames";
initSideBar: () => void;
revertSideBar: () => void;
interface Event {
title: string;
}
type ModuleTracks = {
[index: string]: Event[][];
};
interface TimelineState {
moduleTracks: ModuleTracks;
}
class Timeline extends React.Component<TimelineProps, TimelineState> {
constructor(props: TimelineProps) {
super(props);
this.state = { moduleTracks: {} };
}
componentDidMount() {
this.props.initSideBar();
let moduleTracks: ModuleTracks = {};
modulesList.forEach(({ code }) => {
});
this.setState({ moduleTracks: moduleTracks });
}
componentWillUnmount() {
this.props.revertSideBar();
}
addDays(date: Date, days: number) {
let result = new Date(date);
result.setDate(result.getDate() + days);
return result;
}
const termStart = new Date("2020-09-28");
const activeDay = new Date("2020-10-07");
const numWeeks = 12;
const trackHeight = 4.25;
let timelineBackgrounds: ReactElement[] = [];
let moduleHeadings: ReactElement[] = [];
for (let i = 0; i < modulesList.length; i++) {
const code = modulesList[i].code;
const tracks = this.state.moduleTracks[code];
if (tracks) {
moduleHeadings.push(
style={{ height: `${tracks.length * trackHeight}rem` }}
moduleCode={code}
title={modulesList[i].title}
/>
const timelineBackgroundsClass = classNames(
i % 2 === 0
? styles.timelineBackgroundEven
: styles.timelineBackgroundOdd,
i === 0 ? styles.timelineBackgroundFirst : "",
i === modulesList.length - 1 ? styles.timelineBackgroundLast : ""
);
const offset =
i === modulesList.length - 1 || i === 0 ? 0.625 / 2 : 0.625;
for (let j = 0; j < numWeeks; j++) {
timelineBackgrounds.push(
<div
key={code + j}
style={{ height: `${tracks.length * trackHeight + offset}rem` }}
className={timelineBackgroundsClass}
></div>
);
}
<div className={styles.timelineContainer}>
<MyBreadcrumbs />
<div className={styles.timelineGrid}>
<div className={styles.timelineTermSwitcher}>
<TermSwitcher />
</div>
<div className={styles.timelineWeekRow}>
{[...Array(numWeeks)].map((_, i) => (
<div className={styles.weekHeading} key={i}>
<WeekHeading
weekNumber={i + 1}
dateRangeStart={this.addDays(termStart, i * 7)}
dateRangeEnd={this.addDays(termStart, i * 7 + 4)}
activeDay={activeDay}
<div className={styles.timelineModuleColumn}>{moduleHeadings}</div>
<div className={styles.timelineWeekBackground}>