From c91de0b7e3356340563b4afb56cf749e962ca859 Mon Sep 17 00:00:00 2001
From: ievavold <ievavold@wisc.edu>
Date: Thu, 21 Feb 2019 09:30:04 -0600
Subject: [PATCH] ROENROLL-1366

---
 .../course-item/course-item.component.ts      | 35 ++++++++-----------
 .../store/actions/course.actions.ts           | 11 +++---
 src/app/degree-planner/store/reducer.ts       | 33 +++++++++++++++--
 .../term-container.component.ts               | 16 ++++++---
 .../course-details.component.ts               | 11 ++++--
 5 files changed, 71 insertions(+), 35 deletions(-)

diff --git a/src/app/degree-planner/shared/course-item/course-item.component.ts b/src/app/degree-planner/shared/course-item/course-item.component.ts
index 4ae7859..393d006 100644
--- a/src/app/degree-planner/shared/course-item/course-item.component.ts
+++ b/src/app/degree-planner/shared/course-item/course-item.component.ts
@@ -1,25 +1,21 @@
 import { Component, Input, OnInit } from '@angular/core';
 import { MatDialog } from '@angular/material';
 import { Store, select } from '@ngrx/store';
-import { Observable, of } from 'rxjs';
+import { Observable } from 'rxjs';
 import * as utils from '@app/degree-planner/shared/utils';
-
 import {
   AddCourse,
   AddSaveForLater,
   MoveCourseBetweenTerms,
   RemoveSaveForLater,
   RemoveCourse,
-} from './../../store/actions/course.actions';
+} from '@app/degree-planner/store/actions/course.actions';
 import { GlobalState } from '@app/core/state';
 import { Course } from '@app/core/models/course';
 import * as selectors from '@app/degree-planner/store/selectors';
-
 import { DegreePlannerApiService } from '@app/degree-planner/services/api.service';
 import { ConfirmDialogComponent } from '@app/shared/dialogs/confirm-dialog/confirm-dialog.component';
 import { CourseDetailsDialogComponent } from '@app/degree-planner/dialogs/course-details-dialog/course-details-dialog.component';
-// tslint:disable-next-line:max-line-length
-import { RemoveCourseConfirmDialogComponent } from '@app/degree-planner/dialogs/remove-course-confirm-dialog/remove-course-confirm-dialog.component';
 import { distinctUntilChanged } from 'rxjs/operators';
 
 @Component({
@@ -101,12 +97,12 @@ export class CourseItemComponent implements OnInit {
 
       case 'saved':
         const { subjectCode, courseId } = this.course;
-        this.addToTerm(this.course, termCode);
+        this.addToTerm(termCode);
         this.store.dispatch(new RemoveSaveForLater({ subjectCode, courseId }));
         break;
 
       case 'search':
-        this.addToTerm(this.course, termCode);
+        this.addToTerm(termCode);
         break;
     }
   }
@@ -200,19 +196,16 @@ export class CourseItemComponent implements OnInit {
       });
   }
 
-  addToTerm(course, term) {
-    const { subjectCode, courseId } = course;
-
-    const termCode = term;
-    const newIndex = 0;
-    this.store.dispatch(new AddCourse({ subjectCode, courseId, termCode }));
-  }
-
-  switchTerm(course, term) {
-    const { id, termCode: from } = course;
-    const to = term;
-    const newIndex = 0;
-    this.store.dispatch(new MoveCourseBetweenTerms({ to, from, id, newIndex }));
+  addToTerm(toTermCode: string) {
+    this.store.dispatch(
+      new AddCourse({
+        courseId: this.course.courseId,
+        termCode: toTermCode,
+        subjectCode: this.course.subjectCode,
+        title: this.course.title,
+        catalogNumber: this.course.catalogNumber,
+      }),
+    );
   }
 
   openCourseDetailsDialog(course) {
diff --git a/src/app/degree-planner/store/actions/course.actions.ts b/src/app/degree-planner/store/actions/course.actions.ts
index 5f6f44d..28d3c52 100644
--- a/src/app/degree-planner/store/actions/course.actions.ts
+++ b/src/app/degree-planner/store/actions/course.actions.ts
@@ -18,9 +18,6 @@ export enum CourseActionTypes {
   RemoveSaveForLater = '[Course] Remove Save for Later',
   RemoveSaveForLaterSuccess = '[Course] Remove Save for Later (Success)',
 
-  MoveSaveForLaterToTerm = '[Course] Save for Later to Term',
-  MoveSaveForLaterToTermSuccess = '[Course] Save for Later to Term (Success)',
-
   CourseError = '[Course] Error',
 }
 
@@ -34,14 +31,14 @@ export class MoveCourseInsideTerm implements Action {
 export class MoveCourseBetweenTerms implements Action {
   public readonly type = CourseActionTypes.MoveCourseBetweenTerms;
   constructor(
-    public payload: { to: string; from: string; id: number; newIndex: number },
+    public payload: { to: string; from: string; id: number; newIndex?: number },
   ) {}
 }
 
 export class MoveCourseBetweenTermsSuccess implements Action {
   public readonly type = CourseActionTypes.MoveCourseBetweenTermsSuccess;
   constructor(
-    public payload: { to: string; from: string; id: number; newIndex: number },
+    public payload: { to: string; from: string; id: number; newIndex?: number },
   ) {}
 }
 
@@ -49,9 +46,11 @@ export class AddCourse implements Action {
   public readonly type = CourseActionTypes.AddCourse;
   constructor(
     public payload: {
-      subjectCode: string;
       courseId: string;
       termCode: string;
+      subjectCode: string;
+      title: string;
+      catalogNumber: string;
       newIndex?: number;
     },
   ) {}
diff --git a/src/app/degree-planner/store/reducer.ts b/src/app/degree-planner/store/reducer.ts
index 02572ba..7b7d691 100644
--- a/src/app/degree-planner/store/reducer.ts
+++ b/src/app/degree-planner/store/reducer.ts
@@ -24,6 +24,7 @@ import {
   CourseActionTypes,
   RemoveCourse,
   MoveCourseBetweenTerms,
+  AddCourse,
   AddCourseSuccess,
   RemoveSaveForLater,
   AddSaveForLater,
@@ -70,6 +71,7 @@ type SupportedActions =
   | MoveCourseInsideTerm
   | MoveCourseBetweenTerms
   | RemoveCourse
+  | AddCourse
   | AddCourseSuccess
   | RemoveSaveForLater
   | AddSaveForLater
@@ -368,6 +370,32 @@ export function degreePlannerReducer(
       return state;
     }
 
+    case CourseActionTypes.AddCourse: {
+      const { termCode, subjectCode, newIndex } = action.payload;
+
+      const course = {
+        id: null,
+        ...action.payload,
+        subject: state.subjects[subjectCode],
+      } as Course;
+      const { yearCode } = parseTermCode(termCode);
+
+      const year: Year = createYearWithCourse(
+        termCode,
+        course,
+        state.activeTermCodes,
+        state.visibleYears[yearCode],
+        newIndex,
+      );
+
+      const visibleYears: YearMapping = {
+        ...state.visibleYears,
+        [yearCode]: year,
+      };
+
+      return { ...state, visibleYears };
+    }
+
     case CourseActionTypes.AddCourseSuccess: {
       const { course, newIndex } = action.payload;
       const { termCode } = course;
@@ -606,8 +634,9 @@ const createYearWithCourse = (
 ): Year => {
   const { termName } = parseTermCode(termCode);
   const term = year[termName];
-  const courses = term.courses.slice();
-  courses.splice(newIndex !== undefined ? newIndex : courses.length, 0, course);
+  const courses = term.courses.filter(c => c.courseId !== course.courseId);
+  newIndex = newIndex !== undefined ? newIndex : courses.length;
+  courses.splice(newIndex, 0, course);
   return { ...year, [termName]: { ...term, courses } };
 };
 
diff --git a/src/app/degree-planner/term-container/term-container.component.ts b/src/app/degree-planner/term-container/term-container.component.ts
index 12b0b87..cb1da4f 100644
--- a/src/app/degree-planner/term-container/term-container.component.ts
+++ b/src/app/degree-planner/term-container/term-container.component.ts
@@ -155,13 +155,15 @@ export class TermContainerComponent implements OnInit {
       const termCode = newContainer.substr(5);
       const newIndex = event.currentIndex;
       // Pull the course data from the moved item
-      const { subjectCode, courseId } = event.item.data;
+      const { subjectCode, courseId, title, catalogNumber } = event.item.data;
 
       this.store.dispatch(
         new actions.AddCourse({
-          subjectCode,
           courseId,
           termCode,
+          subjectCode,
+          title,
+          catalogNumber,
           newIndex,
         }),
       );
@@ -173,10 +175,16 @@ export class TermContainerComponent implements OnInit {
       newContainer.indexOf('term-') === 0
     ) {
       const termCode = newContainer.substr(5);
-      const { subjectCode, courseId } = event.item.data;
       const newIndex = event.currentIndex;
       this.store.dispatch(
-        new actions.AddCourse({ subjectCode, courseId, termCode, newIndex }),
+        new actions.AddCourse({
+          courseId: event.item.data.courseId,
+          termCode,
+          subjectCode: event.item.data.subjectCode,
+          title: event.item.data.title,
+          catalogNumber: event.item.data.catalogNumber,
+          newIndex,
+        }),
       );
     }
   }
diff --git a/src/app/shared/components/course-details/course-details.component.ts b/src/app/shared/components/course-details/course-details.component.ts
index 47fa4a8..7430fdb 100644
--- a/src/app/shared/components/course-details/course-details.component.ts
+++ b/src/app/shared/components/course-details/course-details.component.ts
@@ -70,14 +70,21 @@ export class CourseDetailsComponent implements OnInit, OnDestroy {
     const termCode = this.termSelector.value.term;
     const subjectCode = this.courseDetails.subject.subjectCode;
     const courseId = this.courseDetails.courseId;
+    const payload = {
+      courseId,
+      termCode,
+      subjectCode,
+      title: this.courseDetails.title,
+      catalogNumber: this.courseDetails.catalogNumber,
+    };
 
     switch (this.type) {
       case 'search':
-        this.store.dispatch(new AddCourse({ subjectCode, courseId, termCode }));
+        this.store.dispatch(new AddCourse(payload));
         break;
 
       case 'saved':
-        this.store.dispatch(new AddCourse({ subjectCode, courseId, termCode }));
+        this.store.dispatch(new AddCourse(payload));
         this.store.dispatch(new RemoveSaveForLater({ subjectCode, courseId }));
         break;
     }
-- 
GitLab