Newer
Older
Isaac Evavold
committed
import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { Store, select } from '@ngrx/store';
Isaac Evavold
committed
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';

Scott Berg
committed
import {
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';

Scott Berg
committed
selector: 'cse-saved-for-later-container',
templateUrl: './saved-for-later-container.component.html',
styleUrls: ['./saved-for-later-container.component.scss'],
Isaac Evavold
committed
export class SavedForLaterContainerComponent implements OnInit {
public courses$: Observable<ReadonlyArray<SavedForLaterCourse>>;
public mobileView: MediaQueryList;
public hasItemDraggedOver: boolean;
constructor(
private store: Store<{ degreePlanner: DegreePlannerState }>,
private termCodeService: TermCodeFactory,
mediaMatcher: MediaMatcher,
) {
this.mobileView = mediaMatcher.matchMedia('(max-width: 900px)');
}
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;
if (fromDifferentContainer && fromTerm) {
const course = event.item.data as Course;
courseId: course.courseId,
subjectCode: course.subjectCode,
title: course.title,
catalogNumber: course.catalogNumber,
newIndex: event.currentIndex,
fromTermCode: this.termCodeService.fromString(course.termCode),
} 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;
}