Skip to content
Snippets Groups Projects
Forked from an inaccessible project.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
saved-for-later-container.component.ts 2.96 KiB
import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { Store, select } from '@ngrx/store';
import * as utils from '@app/degree-planner/shared/utils';
import { SavedForLaterCourse } from '@app/core/models/saved-for-later-course';
import { Course } from '@app/core/models/course';
import { DegreePlannerState } from '@app/degree-planner/store/state';
import {
  AddSaveForLater,
  RemoveCourse,
  MoveCourseInsideSFL,
} from '@app/degree-planner/store/actions/course.actions';
import * as selectors from '@app/degree-planner/store/selectors';
import { distinctUntilChanged } from 'rxjs/operators';
import { MediaMatcher } from '@angular/cdk/layout';
import { TermCodeFactory } from '../services/termcode.factory';

@Component({
  selector: 'cse-saved-for-later-container',
  templateUrl: './saved-for-later-container.component.html',
  styleUrls: ['./saved-for-later-container.component.scss'],
})
export class SavedForLaterContainerComponent implements OnInit {
  public courses$: Observable<ReadonlyArray<SavedForLaterCourse>>;
  public dropZoneIds$: Observable<string[]>;
  public mobileView: MediaQueryList;
  public hasItemDraggedOver: boolean;

  constructor(
    private store: Store<{ degreePlanner: DegreePlannerState }>,
    private termCodeService: TermCodeFactory,
    mediaMatcher: MediaMatcher,
  ) {
    this.mobileView = mediaMatcher.matchMedia('(max-width: 900px)');
  }

  public ngOnInit() {
    this.hasItemDraggedOver = false;
    this.dropZoneIds$ = this.store.pipe(
      select(selectors.selectAllVisibleYears),
      utils.yearsToDropZoneIds(),
      distinctUntilChanged(utils.compareStringArrays),
    );

    this.courses$ = this.store.pipe(select(selectors.getSavedForLaterCourses));
  }

  drop(event: any) {
    const newContainerId = event.container.id;
    const previousContainerId = event.previousContainer.id;
    const fromTerm = previousContainerId.indexOf('term-') === 0;
    const fromDifferentContainer = newContainerId !== previousContainerId;

    this.hasItemDraggedOver = false;

    if (fromDifferentContainer && fromTerm) {
      const course = event.item.data as Course;

      this.store.dispatch(
        new AddSaveForLater({
          courseId: course.courseId,
          subjectCode: course.subjectCode,
          title: course.title,
          catalogNumber: course.catalogNumber,
          newIndex: event.currentIndex,
        }),
      );

      this.store.dispatch(
        new RemoveCourse({
          fromTermCode: this.termCodeService.fromString(course.termCode),
          recordId: course.id as number,
        }),
      );
    } else if (newContainerId === previousContainerId) {
      const course = event.item.data as SavedForLaterCourse;
      this.store.dispatch(
        new MoveCourseInsideSFL({
          courseId: course.courseId,
          newIndex: event.currentIndex,
        }),
      );
    }
  }

  dragEnter() {
    this.hasItemDraggedOver = true;
  }

  dragExit() {
    this.hasItemDraggedOver = false;
  }
}