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