From b429501780706d15fee3ed42fc6707ce8c3f9446 Mon Sep 17 00:00:00 2001
From: danieldeng2 <danieldeng223@gmail.com>
Date: Sat, 5 Sep 2020 05:05:46 +0100
Subject: [PATCH] Dynamically generate the number of weeks

---
 src/components/pages/Timeline/index.tsx       | 41 +++++++++++--------
 .../pages/Timeline/style.module.scss          |  2 -
 src/utils/functions.ts                        | 10 ++++-
 3 files changed, 33 insertions(+), 20 deletions(-)

diff --git a/src/components/pages/Timeline/index.tsx b/src/components/pages/Timeline/index.tsx
index f32a92029..9687d1632 100644
--- a/src/components/pages/Timeline/index.tsx
+++ b/src/components/pages/Timeline/index.tsx
@@ -6,6 +6,7 @@ import ModuleHeading from "./components/ModuleHeading";
 import WeekHeading from "./components/WeekHeading";
 import { modulesList } from "../ModuleList/list";
 import classNames from "classnames";
+import { addDays } from "utils/functions";
 
 interface TimelineProps {
   initSideBar: () => void;
@@ -23,6 +24,7 @@ type ModuleTracks = {
 interface TimelineState {
   moduleTracks: ModuleTracks;
 }
+
 class Timeline extends React.Component<TimelineProps, TimelineState> {
   constructor(props: TimelineProps) {
     super(props);
@@ -42,18 +44,7 @@ class Timeline extends React.Component<TimelineProps, TimelineState> {
     this.props.revertSideBar();
   }
 
-  addDays(date: Date, days: number) {
-    let result = new Date(date);
-    result.setDate(result.getDate() + days);
-    return result;
-  }
-
-  render() {
-    const termStart = new Date("2020-09-28");
-    const activeDay = new Date("2020-10-07");
-    const numWeeks = 12;
-    const trackHeight = 4.25;
-
+  generateGridItems(numWeeks: number, trackHeight: number) {
     let timelineBackgrounds: ReactElement[] = [];
     let moduleHeadings: ReactElement[] = [];
 
@@ -89,6 +80,18 @@ class Timeline extends React.Component<TimelineProps, TimelineState> {
         }
       }
     }
+    return [moduleHeadings, timelineBackgrounds];
+  }
+
+  render() {
+    const termStart = new Date("2020-09-28");
+    const activeDay = new Date("2020-10-07");
+    const numWeeks = 11;
+    const trackHeight = 4.25;
+    const [moduleHeadings, timelineBackgrounds] = this.generateGridItems(
+      numWeeks,
+      trackHeight
+    );
     return (
       <div className={styles.timelineContainer}>
         <MyBreadcrumbs />
@@ -96,20 +99,26 @@ class Timeline extends React.Component<TimelineProps, TimelineState> {
           <div className={styles.timelineTermSwitcher}>
             <TermSwitcher />
           </div>
-          <div className={styles.timelineWeekRow}>
+          <div
+            className={styles.timelineWeekRow}
+            style={{ gridTemplateColumns: `repeat(${numWeeks}, 15rem)` }}
+          >
             {[...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)}
+                  dateRangeStart={addDays(termStart, i * 7)}
+                  dateRangeEnd={addDays(termStart, i * 7 + 4)}
                   activeDay={activeDay}
                 />
               </div>
             ))}
           </div>
           <div className={styles.timelineModuleColumn}>{moduleHeadings}</div>
-          <div className={styles.timelineWeekBackground}>
+          <div
+            className={styles.timelineWeekBackground}
+            style={{ gridTemplateColumns: `repeat(${numWeeks}, 15rem)` }}
+          >
             {timelineBackgrounds}
           </div>
         </div>
diff --git a/src/components/pages/Timeline/style.module.scss b/src/components/pages/Timeline/style.module.scss
index 231aa360d..d91df054b 100644
--- a/src/components/pages/Timeline/style.module.scss
+++ b/src/components/pages/Timeline/style.module.scss
@@ -69,7 +69,6 @@
   grid-area: weeks;
   display: grid;
   grid-auto-flow: row; 
-  grid-template-columns: repeat(12, 15rem);
   grid-gap: 0.625rem;
 	padding-right: 0.625rem;
   top: 0;
@@ -96,7 +95,6 @@
 .timelineWeekBackground {
   display: grid;
   grid-area: background;
-  grid-template-columns: repeat(12, 15rem);
   grid-template-rows: auto;
 	column-gap: 0.625rem;
   row-gap: 0;
diff --git a/src/utils/functions.ts b/src/utils/functions.ts
index e9ba8cff7..d7c81256a 100644
--- a/src/utils/functions.ts
+++ b/src/utils/functions.ts
@@ -3,5 +3,11 @@ export function titleCase(string: string) {
   for (var i = 0; i < sentence.length; i++) {
     sentence[i] = sentence[i][0].toUpperCase() + sentence[i].slice(1);
   }
-  return sentence.join(' ');
-}
\ No newline at end of file
+  return sentence.join(" ");
+}
+
+export function addDays(date: Date, days: number) {
+  let result = new Date(date);
+  result.setDate(result.getDate() + days);
+  return result;
+}
-- 
GitLab