From 411675c34450c48cfd80dc17b7e81b107916b3ce Mon Sep 17 00:00:00 2001 From: danieldeng2 <danieldeng223@gmail.com> Date: Sat, 5 Sep 2020 19:43:53 +0100 Subject: [PATCH] Separate component for Event cards --- .../components/DayIndicatorGrid/index.tsx | 22 +++++++--------- .../Timeline/components/EventGrid/index.tsx | 26 ++++++++++++------- .../components/EventGrid/style.module.scss | 16 +----------- .../components/TimelineEventCard/index.tsx | 26 +++++++++++++++++++ .../TimelineEventCard/style.module.scss | 13 ++++++++++ src/components/pages/Timeline/eventsData.ts | 19 ++++++++++++++ src/components/pages/Timeline/index.tsx | 25 +++++++++++++----- 7 files changed, 102 insertions(+), 45 deletions(-) create mode 100644 src/components/pages/Timeline/components/TimelineEventCard/index.tsx create mode 100644 src/components/pages/Timeline/components/TimelineEventCard/style.module.scss create mode 100644 src/components/pages/Timeline/eventsData.ts diff --git a/src/components/pages/Timeline/components/DayIndicatorGrid/index.tsx b/src/components/pages/Timeline/components/DayIndicatorGrid/index.tsx index e5ca7c8d7..7ba38e49a 100644 --- a/src/components/pages/Timeline/components/DayIndicatorGrid/index.tsx +++ b/src/components/pages/Timeline/components/DayIndicatorGrid/index.tsx @@ -1,21 +1,17 @@ import React from "react"; import styles from "./style.module.scss"; -export interface ModuleHeadingprops { - numWeeks: number; - activeDay: Date; - termStart: Date; + +export interface DayIndicatorGridProps { + numWeeks: number; + activeDay: Date; + activeColumn: number; } -const DayIndicatorGrid: React.FC<ModuleHeadingprops> = ({ - numWeeks, - activeDay, - termStart, +const DayIndicatorGrid: React.FC<DayIndicatorGridProps> = ({ + numWeeks, + activeDay, + activeColumn, }) => { - const activeColumn = - Math.ceil( - ((activeDay.getTime() - termStart.getTime()) / 86400000 / 7) * 6 - ) + 1; - return ( <div className={styles.dayIndicatorGrid} diff --git a/src/components/pages/Timeline/components/EventGrid/index.tsx b/src/components/pages/Timeline/components/EventGrid/index.tsx index 74532e8b3..8974451ad 100644 --- a/src/components/pages/Timeline/components/EventGrid/index.tsx +++ b/src/components/pages/Timeline/components/EventGrid/index.tsx @@ -1,11 +1,18 @@ import React from "react"; import styles from "./style.module.scss"; +import { TimelineEvent } from "../.."; +import TimelineEventCard from "../TimelineEventCard"; export interface EventGridProps { numWeeks: number; trackHeight: number; + events: TimelineEvent[]; } -const EventGrid: React.FC<EventGridProps> = ({ numWeeks, trackHeight }) => { +const EventGrid: React.FC<EventGridProps> = ({ + numWeeks, + trackHeight, + events, +}) => { return ( <div className={styles.timelineCardGrid} @@ -14,15 +21,14 @@ const EventGrid: React.FC<EventGridProps> = ({ numWeeks, trackHeight }) => { gridTemplateRows: `${trackHeight}rem ${trackHeight}rem 0.3125rem repeat(${7}, ${trackHeight}rem ${trackHeight}rem 0.625rem) ${trackHeight}rem ${trackHeight}rem 0.3125rem`, }} > - <div className={styles.timelineEvent} style={{ gridColumn: `1 / 9` }}> - <span className={styles.eventTitle}>Title of the first event</span> - </div> - <div - className={styles.timelineEvent} - style={{ gridColumn: `3 / 24`, gridRow: `2` }} - > - <span className={styles.eventTitle}>Title of the second event</span> - </div> + {events.map(({ title }, i) => ( + <TimelineEventCard + title={title} + startColumn={i + 1} + endColumn={i + 8} + rowNumber={2 * i} + /> + ))} </div> ); }; diff --git a/src/components/pages/Timeline/components/EventGrid/style.module.scss b/src/components/pages/Timeline/components/EventGrid/style.module.scss index d384862be..ecd72b27b 100644 --- a/src/components/pages/Timeline/components/EventGrid/style.module.scss +++ b/src/components/pages/Timeline/components/EventGrid/style.module.scss @@ -3,18 +3,4 @@ display: grid; grid-area: background; z-index: 3; -} - -.timelineEvent { - background: red; - margin: 0.5rem; - border-radius: 0.5rem; - padding: 0.5rem; - display: flex; - align-items: center; -} - -.eventTitle { - color: var(--primary-text-color); - font-size: 1rem; -} +} \ No newline at end of file diff --git a/src/components/pages/Timeline/components/TimelineEventCard/index.tsx b/src/components/pages/Timeline/components/TimelineEventCard/index.tsx new file mode 100644 index 000000000..5c6b07de1 --- /dev/null +++ b/src/components/pages/Timeline/components/TimelineEventCard/index.tsx @@ -0,0 +1,26 @@ +import React from "react"; +import styles from "./style.module.scss"; +export interface TimelineEventProps { + title: string; + startColumn: number; + endColumn: number; + rowNumber: number; +} + +const TimelineEventCard: React.FC<TimelineEventProps> = ({ + title, + startColumn, + endColumn, + rowNumber, +}) => { + return ( + <div + className={styles.timelineEvent} + style={{ gridColumn: `${startColumn} / ${endColumn}`, gridRow: `${rowNumber}` }} + > + <span className={styles.eventTitle}>{title}</span> + </div> + ); +}; + +export default TimelineEventCard; diff --git a/src/components/pages/Timeline/components/TimelineEventCard/style.module.scss b/src/components/pages/Timeline/components/TimelineEventCard/style.module.scss new file mode 100644 index 000000000..a8c5c2092 --- /dev/null +++ b/src/components/pages/Timeline/components/TimelineEventCard/style.module.scss @@ -0,0 +1,13 @@ +.timelineEvent { + background: red; + margin: 0.5rem; + border-radius: 0.5rem; + padding: 0.5rem; + display: flex; + align-items: center; +} + +.eventTitle { + color: var(--primary-text-color); + font-size: 1rem; +} diff --git a/src/components/pages/Timeline/eventsData.ts b/src/components/pages/Timeline/eventsData.ts new file mode 100644 index 000000000..895a31eaa --- /dev/null +++ b/src/components/pages/Timeline/eventsData.ts @@ -0,0 +1,19 @@ +import { TimelineEvent } from "."; + + +export const eventsData : TimelineEvent[] = [ + { + title: "Logic Exercise", + id: 0, + startDate: new Date("2020-10-01"), + endDate: new Date("2020-10-08"), + moduleCode: "CO140" + }, + { + title: "Circuit Analysis", + id: 0, + startDate: new Date("2020-10-04"), + endDate: new Date("2020-10-09"), + moduleCode: "CO112" + } +] \ No newline at end of file diff --git a/src/components/pages/Timeline/index.tsx b/src/components/pages/Timeline/index.tsx index e3e625872..ac29254e2 100644 --- a/src/components/pages/Timeline/index.tsx +++ b/src/components/pages/Timeline/index.tsx @@ -7,18 +7,23 @@ import WeekRow from "./components/WeekRow"; import ModuleRows from "./components/ModuleRows"; import DayIndicatorGrid from "./components/DayIndicatorGrid"; import EventGrid from "./components/EventGrid"; +import { eventsData } from "./eventsData"; interface TimelineProps { initSideBar: () => void; revertSideBar: () => void; } -interface Event { - title: string; +export interface TimelineEvent { + title: string; + id: number; + moduleCode: string; + startDate: Date; + endDate: Date; } export type ModuleTracks = { - [index: string]: Event[][]; + [index: string]: TimelineEvent[][]; }; interface TimelineState { @@ -44,6 +49,12 @@ class Timeline extends React.Component<TimelineProps, TimelineState> { this.props.revertSideBar(); } + dateToColumn(day: Date, termStart: Date) { + return ( + Math.ceil(((day.getTime() - termStart.getTime()) / 86400000 / 7) * 6) + 1 + ); + } + render() { const termStart = new Date("2020-09-28"); const activeDay = new Date("2020-10-12"); @@ -68,12 +79,12 @@ class Timeline extends React.Component<TimelineProps, TimelineState> { /> <DayIndicatorGrid - numWeeks={numWeeks} - activeDay={activeDay} - termStart={termStart} + numWeeks={numWeeks} + activeDay={activeDay} + activeColumn={this.dateToColumn(activeDay, termStart)} /> - <EventGrid numWeeks={numWeeks} trackHeight={trackHeight} /> + <EventGrid numWeeks={numWeeks} trackHeight={trackHeight} events={eventsData}/> </div> </div> ); -- GitLab