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 { 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) {
......
......@@ -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;
},
) {}
......
......@@ -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 } };
};
......
......@@ -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,
}),
);
}
}
......
......@@ -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;
}
......
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