Skip to content
Snippets Groups Projects
course-item.component.ts 3.04 KiB
Newer Older
jvanboxtel@wisc.edu's avatar
jvanboxtel@wisc.edu committed
import { Component, Input, OnInit } from '@angular/core';
import { MatDialog } from '@angular/material';
import { Store, select } from '@ngrx/store';
import {
  AddCourse,
  AddSaveForLater,
  MoveCourseBetweenTerms,
} from './../../store/actions/course.actions';
import { getDropableTerms } from '@app/degree-planner/store/selectors';
import { GlobalState } from '@app/core/state';
jvanboxtel@wisc.edu's avatar
jvanboxtel@wisc.edu committed
import { Course } from '@app/core/models/course';

jvanboxtel@wisc.edu's avatar
jvanboxtel@wisc.edu committed
import { DegreePlannerApiService } from '@app/degree-planner/services/api.service';
jvanboxtel@wisc.edu's avatar
jvanboxtel@wisc.edu committed
// tslint:disable-next-line:max-line-length
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';

@Component({
jvanboxtel@wisc.edu's avatar
jvanboxtel@wisc.edu committed
  selector: 'cse-course-item',
  templateUrl: './course-item.component.html',
  styleUrls: ['./course-item.component.scss'],
export class CourseItemComponent implements OnInit {
jvanboxtel@wisc.edu's avatar
jvanboxtel@wisc.edu committed
  @Input() course: Course;
  @Input() isCurrentTerm: boolean;
  @Input() isPastTerm: boolean;
  @Input() disabled: boolean;
jvanboxtel@wisc.edu's avatar
jvanboxtel@wisc.edu committed
  @Input() type: 'saved' | 'course' | 'search';
  visibleTerms: any;
  constructor(
    private api: DegreePlannerApiService,
    public dialog: MatDialog,
    private store: Store<GlobalState>,
  ) {}
  ngOnInit() {
    switch (true) {
      case this.course.studentEnrollmentStatus === 'Enrolled' &&
        this.isCurrentTerm:
        this.status = 'Enrolled';
        break;
      case this.course.studentEnrollmentStatus === 'Waitlisted':
        this.status = 'Waitlisted';
        break;
      case !this.course.grade && this.isPastTerm:
        this.status = 'Incomplete';
        break;
      default:
        this.status = '';
    }
  }
  onMenuOpen() {
    this.store
      .pipe(select(getDropableTerms))
      .subscribe(terms => (this.visibleTerms = terms));
  }

jvanboxtel@wisc.edu's avatar
jvanboxtel@wisc.edu committed
  moveToSavedForLater(course) {
    this.store.dispatch(
      new AddSaveForLater({
        courseId: course.courseId,
        subjectCode: course.subjectCode,
        title: course.title,
        catalogNumber: course.catalogNumber,
      }),
    );
  }

  addToTerm(course, term) {
    const { subjectCode, courseId } = course;
    const termCode = term;
    this.store.dispatch(new AddCourse({ subjectCode, courseId, termCode }));
  }

  switchTerm(course, term) {
    const { id, termCode: from } = course;
    const to = term;
    this.store.dispatch(new MoveCourseBetweenTerms({ to, from, id }));
  }

jvanboxtel@wisc.edu's avatar
jvanboxtel@wisc.edu committed
  openCourseDetailsDialog(course) {
jvanboxtel@wisc.edu's avatar
jvanboxtel@wisc.edu committed
    this.api
      .getCourseDetails(course.subjectCode, course.courseId)
jvanboxtel@wisc.edu's avatar
jvanboxtel@wisc.edu committed
      .subscribe(courseDetails => {
        const dialogRef = this.dialog.open(CourseDetailsDialogComponent, {
          data: { courseDetails: courseDetails },
        });
      });
  }
jvanboxtel@wisc.edu's avatar
jvanboxtel@wisc.edu committed
  openRemoveConfirmationDialog() {
    const dialogRef = this.dialog.open(RemoveCourseConfirmDialogComponent, {
      data: { course: this.course, type: this.type },
    });
  }