From 51760bbfebbf84f47a7c73c72ec7f491cd1af226 Mon Sep 17 00:00:00 2001
From: pnogal <paulina.nogal@wisc.edu>
Date: Tue, 12 Feb 2019 12:29:28 -0600
Subject: [PATCH] Create AddAcademicYear action

---
 .../sidenav-menu-item.component.html          |  1 +
 .../sidenav-menu-item.component.ts            | 17 +++++++---
 .../store/actions/addAcademicYear.actions.ts  |  9 ++++++
 src/app/degree-planner/store/reducer.ts       | 31 +++++++++++++++++++
 4 files changed, 54 insertions(+), 4 deletions(-)
 create mode 100644 src/app/degree-planner/store/actions/addAcademicYear.actions.ts

diff --git a/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.html b/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.html
index 2a92def..f016068 100644
--- a/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.html
+++ b/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.html
@@ -32,6 +32,7 @@
 			<button mat-button class="sidenav-link-btn"><i class="material-icons">print</i>Print</button>
 			<button mat-button class="sidenav-link-btn"><i class="material-icons">email</i> Share Plan</button>
 			<button mat-button class="sidenav-link-btn"><i class="material-icons">add_box</i> Add Degree Plan</button>
+			<button mat-button class="sidenav-link-btn" (click)="addAcademicYear()"><i class="material-icons">add_box</i> Add Academic Year</button>
 		</div>
 	</mat-expansion-panel>
 </div>
\ No newline at end of file
diff --git a/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.ts b/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.ts
index 32afc44..de404e6 100644
--- a/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.ts
+++ b/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.ts
@@ -1,12 +1,21 @@
-import { Component, OnInit } from '@angular/core';
+// Libraries
+import { Component } from '@angular/core';
+import { Store } from '@ngrx/store';
+
+// State management
+import { GlobalState } from '@app/core/state';
+import { AddAcademicYearRequest } from '@app/degree-planner/store/actions/addAcademicYear.actions';
 
 @Component({
   selector: 'cse-sidenav-menu-item',
   templateUrl: './sidenav-menu-item.component.html',
   styleUrls: ['./sidenav-menu-item.component.scss'],
 })
-export class SidenavMenuItemComponent implements OnInit {
-  constructor() {}
 
-  ngOnInit() {}
+export class SidenavMenuItemComponent {
+  constructor(private store: Store<GlobalState>) {}
+
+  public addAcademicYear() {
+    this.store.dispatch(new AddAcademicYearRequest());
+  }
 }
diff --git a/src/app/degree-planner/store/actions/addAcademicYear.actions.ts b/src/app/degree-planner/store/actions/addAcademicYear.actions.ts
new file mode 100644
index 0000000..aa3398e
--- /dev/null
+++ b/src/app/degree-planner/store/actions/addAcademicYear.actions.ts
@@ -0,0 +1,9 @@
+import { Action } from '@ngrx/store';
+
+export enum AddAcademicYearActionTypes {
+    AddAcademicYearRequest = '[AcademicYear] Add Academic Year Request',
+}
+
+export class AddAcademicYearRequest implements Action {
+    public readonly type = AddAcademicYearActionTypes.AddAcademicYearRequest;
+}
diff --git a/src/app/degree-planner/store/reducer.ts b/src/app/degree-planner/store/reducer.ts
index 3f3beb6..39f3209 100644
--- a/src/app/degree-planner/store/reducer.ts
+++ b/src/app/degree-planner/store/reducer.ts
@@ -23,6 +23,10 @@ import {
   WriteNoteSuccess,
   DeleteNoteSuccess,
 } from '@app/degree-planner/store/actions/note.actions';
+import {
+  AddAcademicYearActionTypes,
+  AddAcademicYearRequest,
+ } from '@app/degree-planner/store/actions/addAcademicYear.actions';
 import { SavedForLaterCourse } from '@app/core/models/saved-for-later-course';
 import { DegreePlan } from '@app/core/models/degree-plan';
 
@@ -36,6 +40,7 @@ type SupportedActions =
   | AddCourseSuccess
   | RemoveSaveForLaterSuccess
   | AddSaveForLaterSuccess
+  | AddAcademicYearRequest
   | MakePlanPrimary
   | MakePlanPrimarySuccess
   | MakePlanPrimaryFailure;
@@ -64,6 +69,32 @@ export function degreePlannerReducer(
       return { ...state, ...action.payload };
     }
 
+    /**
+     * The `AddAcademicYearRequest` action is triggered after `addAcademicYear()`
+     * function runs. A new academic year container with three terms will be created.
+    */
+    case AddAcademicYearActionTypes.AddAcademicYearRequest: {
+      const originalTerms = state.visibleTerms.map( term => {
+        return parseInt(term.termCode.substr(0, 3), 10);
+      });
+
+      const newAcademicYearCode = Math.max(...originalTerms) + 1;
+
+      const newVisibleTerms = [
+        ...state.visibleTerms,
+        { termCode: `${newAcademicYearCode}2`,
+          courses: []
+        },
+        { termCode: `${newAcademicYearCode}4`,
+          courses: []
+        },
+        { termCode: `${newAcademicYearCode}6`,
+          courses: []
+        }
+      ];
+      return { ...state, visibleTerms: newVisibleTerms };
+    }
+
     /**
      * The `WriteNoteResponse` action is dispatched by the `Note.write$` effect
      * upon a successful response from the `updateNote` or `createNote` API
-- 
GitLab