Skip to content
Snippets Groups Projects
Commit c91de0b7 authored by Isaac Evavold's avatar Isaac Evavold Committed by Isaac Evavold
Browse files

ROENROLL-1366

parent cf6703f7
No related branches found
No related tags found
No related merge requests found
import { Component, Input, OnInit } from '@angular/core'; import { Component, Input, OnInit } from '@angular/core';
import { MatDialog } from '@angular/material'; import { MatDialog } from '@angular/material';
import { Store, select } from '@ngrx/store'; 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 * as utils from '@app/degree-planner/shared/utils';
import { import {
AddCourse, AddCourse,
AddSaveForLater, AddSaveForLater,
MoveCourseBetweenTerms, MoveCourseBetweenTerms,
RemoveSaveForLater, RemoveSaveForLater,
RemoveCourse, RemoveCourse,
} from './../../store/actions/course.actions'; } from '@app/degree-planner/store/actions/course.actions';
import { GlobalState } from '@app/core/state'; import { GlobalState } from '@app/core/state';
import { Course } from '@app/core/models/course'; import { Course } from '@app/core/models/course';
import * as selectors from '@app/degree-planner/store/selectors'; import * as selectors from '@app/degree-planner/store/selectors';
import { DegreePlannerApiService } from '@app/degree-planner/services/api.service'; import { DegreePlannerApiService } from '@app/degree-planner/services/api.service';
import { ConfirmDialogComponent } from '@app/shared/dialogs/confirm-dialog/confirm-dialog.component'; 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'; 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'; import { distinctUntilChanged } from 'rxjs/operators';
@Component({ @Component({
...@@ -101,12 +97,12 @@ export class CourseItemComponent implements OnInit { ...@@ -101,12 +97,12 @@ export class CourseItemComponent implements OnInit {
case 'saved': case 'saved':
const { subjectCode, courseId } = this.course; const { subjectCode, courseId } = this.course;
this.addToTerm(this.course, termCode); this.addToTerm(termCode);
this.store.dispatch(new RemoveSaveForLater({ subjectCode, courseId })); this.store.dispatch(new RemoveSaveForLater({ subjectCode, courseId }));
break; break;
case 'search': case 'search':
this.addToTerm(this.course, termCode); this.addToTerm(termCode);
break; break;
} }
} }
...@@ -200,19 +196,16 @@ export class CourseItemComponent implements OnInit { ...@@ -200,19 +196,16 @@ export class CourseItemComponent implements OnInit {
}); });
} }
addToTerm(course, term) { addToTerm(toTermCode: string) {
const { subjectCode, courseId } = course; this.store.dispatch(
new AddCourse({
const termCode = term; courseId: this.course.courseId,
const newIndex = 0; termCode: toTermCode,
this.store.dispatch(new AddCourse({ subjectCode, courseId, termCode })); subjectCode: this.course.subjectCode,
} title: this.course.title,
catalogNumber: this.course.catalogNumber,
switchTerm(course, term) { }),
const { id, termCode: from } = course; );
const to = term;
const newIndex = 0;
this.store.dispatch(new MoveCourseBetweenTerms({ to, from, id, newIndex }));
} }
openCourseDetailsDialog(course) { openCourseDetailsDialog(course) {
......
...@@ -18,9 +18,6 @@ export enum CourseActionTypes { ...@@ -18,9 +18,6 @@ export enum CourseActionTypes {
RemoveSaveForLater = '[Course] Remove Save for Later', RemoveSaveForLater = '[Course] Remove Save for Later',
RemoveSaveForLaterSuccess = '[Course] Remove Save for Later (Success)', 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', CourseError = '[Course] Error',
} }
...@@ -34,14 +31,14 @@ export class MoveCourseInsideTerm implements Action { ...@@ -34,14 +31,14 @@ export class MoveCourseInsideTerm implements Action {
export class MoveCourseBetweenTerms implements Action { export class MoveCourseBetweenTerms implements Action {
public readonly type = CourseActionTypes.MoveCourseBetweenTerms; public readonly type = CourseActionTypes.MoveCourseBetweenTerms;
constructor( 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 { export class MoveCourseBetweenTermsSuccess implements Action {
public readonly type = CourseActionTypes.MoveCourseBetweenTermsSuccess; public readonly type = CourseActionTypes.MoveCourseBetweenTermsSuccess;
constructor( 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 { ...@@ -49,9 +46,11 @@ export class AddCourse implements Action {
public readonly type = CourseActionTypes.AddCourse; public readonly type = CourseActionTypes.AddCourse;
constructor( constructor(
public payload: { public payload: {
subjectCode: string;
courseId: string; courseId: string;
termCode: string; termCode: string;
subjectCode: string;
title: string;
catalogNumber: string;
newIndex?: number; newIndex?: number;
}, },
) {} ) {}
......
...@@ -24,6 +24,7 @@ import { ...@@ -24,6 +24,7 @@ import {
CourseActionTypes, CourseActionTypes,
RemoveCourse, RemoveCourse,
MoveCourseBetweenTerms, MoveCourseBetweenTerms,
AddCourse,
AddCourseSuccess, AddCourseSuccess,
RemoveSaveForLater, RemoveSaveForLater,
AddSaveForLater, AddSaveForLater,
...@@ -70,6 +71,7 @@ type SupportedActions = ...@@ -70,6 +71,7 @@ type SupportedActions =
| MoveCourseInsideTerm | MoveCourseInsideTerm
| MoveCourseBetweenTerms | MoveCourseBetweenTerms
| RemoveCourse | RemoveCourse
| AddCourse
| AddCourseSuccess | AddCourseSuccess
| RemoveSaveForLater | RemoveSaveForLater
| AddSaveForLater | AddSaveForLater
...@@ -368,6 +370,32 @@ export function degreePlannerReducer( ...@@ -368,6 +370,32 @@ export function degreePlannerReducer(
return state; 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: { case CourseActionTypes.AddCourseSuccess: {
const { course, newIndex } = action.payload; const { course, newIndex } = action.payload;
const { termCode } = course; const { termCode } = course;
...@@ -606,8 +634,9 @@ const createYearWithCourse = ( ...@@ -606,8 +634,9 @@ const createYearWithCourse = (
): Year => { ): Year => {
const { termName } = parseTermCode(termCode); const { termName } = parseTermCode(termCode);
const term = year[termName]; const term = year[termName];
const courses = term.courses.slice(); const courses = term.courses.filter(c => c.courseId !== course.courseId);
courses.splice(newIndex !== undefined ? newIndex : courses.length, 0, course); newIndex = newIndex !== undefined ? newIndex : courses.length;
courses.splice(newIndex, 0, course);
return { ...year, [termName]: { ...term, courses } }; return { ...year, [termName]: { ...term, courses } };
}; };
......
...@@ -155,13 +155,15 @@ export class TermContainerComponent implements OnInit { ...@@ -155,13 +155,15 @@ export class TermContainerComponent implements OnInit {
const termCode = newContainer.substr(5); const termCode = newContainer.substr(5);
const newIndex = event.currentIndex; const newIndex = event.currentIndex;
// Pull the course data from the moved item // 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( this.store.dispatch(
new actions.AddCourse({ new actions.AddCourse({
subjectCode,
courseId, courseId,
termCode, termCode,
subjectCode,
title,
catalogNumber,
newIndex, newIndex,
}), }),
); );
...@@ -173,10 +175,16 @@ export class TermContainerComponent implements OnInit { ...@@ -173,10 +175,16 @@ export class TermContainerComponent implements OnInit {
newContainer.indexOf('term-') === 0 newContainer.indexOf('term-') === 0
) { ) {
const termCode = newContainer.substr(5); const termCode = newContainer.substr(5);
const { subjectCode, courseId } = event.item.data;
const newIndex = event.currentIndex; const newIndex = event.currentIndex;
this.store.dispatch( 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,
}),
); );
} }
} }
......
...@@ -70,14 +70,21 @@ export class CourseDetailsComponent implements OnInit, OnDestroy { ...@@ -70,14 +70,21 @@ export class CourseDetailsComponent implements OnInit, OnDestroy {
const termCode = this.termSelector.value.term; const termCode = this.termSelector.value.term;
const subjectCode = this.courseDetails.subject.subjectCode; const subjectCode = this.courseDetails.subject.subjectCode;
const courseId = this.courseDetails.courseId; const courseId = this.courseDetails.courseId;
const payload = {
courseId,
termCode,
subjectCode,
title: this.courseDetails.title,
catalogNumber: this.courseDetails.catalogNumber,
};
switch (this.type) { switch (this.type) {
case 'search': case 'search':
this.store.dispatch(new AddCourse({ subjectCode, courseId, termCode })); this.store.dispatch(new AddCourse(payload));
break; break;
case 'saved': case 'saved':
this.store.dispatch(new AddCourse({ subjectCode, courseId, termCode })); this.store.dispatch(new AddCourse(payload));
this.store.dispatch(new RemoveSaveForLater({ subjectCode, courseId })); this.store.dispatch(new RemoveSaveForLater({ subjectCode, courseId }));
break; break;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment