diff --git a/src/app/degree-planner/degree-planner.component.html b/src/app/degree-planner/degree-planner.component.html index c7587bdb36d874685985baa5f77e8186ee1b495c..fbb22122b2f93a7eeec6513fa8363015a8aedf59 100644 --- a/src/app/degree-planner/degree-planner.component.html +++ b/src/app/degree-planner/degree-planner.component.html @@ -25,12 +25,12 @@ </div> <div fxLayout="column" fxLayoutGap="20px" fxLayoutAlign="start stretch" style="margin: 24px"> - <mat-accordion multi="true"> + <mat-accordion multi="true" *ngIf="(firstActiveTermCode$ | async) as cutoffTermCode"> <ng-container *ngFor="let year of termsByYear$ | async"> <mat-expansion-panel class="year-container"[expanded]="true"> <mat-expansion-panel-header> <mat-panel-title> - {{ year.twoDigitYearCode | academicYearState }} + {{ year.twoDigitYearCode | academicYearState:cutoffTermCode }} </mat-panel-title> </mat-expansion-panel-header> <div fxLayout="row" fxLayout.lt-md="column" fxLayoutGap="20px" fxLayoutAlign="start stretch" class="term-container-wrapper"> diff --git a/src/app/degree-planner/degree-planner.component.ts b/src/app/degree-planner/degree-planner.component.ts index ea74db3c91ba08c67456aafa7f57d7b1d4152cca..58d2f4d8c3712c7e2e9b29a42850a03f5de2876b 100644 --- a/src/app/degree-planner/degree-planner.component.ts +++ b/src/app/degree-planner/degree-planner.component.ts @@ -14,65 +14,68 @@ import { Year } from '@app/core/models/year'; // Selectors import { - getAllDegreePlans, - getVisibleRoadmapId, - getAllVisibleTermsByYear + getAllDegreePlans, + getVisibleRoadmapId, + firstActiveTermCode, + getAllVisibleTermsByYear, } from '@app/degree-planner/selectors'; // Actions import { ChangeVisiblePlanRequest } from '@app/degree-planner/actions/plan.actions'; @Component({ - selector: 'cse-degree-planner', - templateUrl: './degree-planner.component.html', - styleUrls: ['./degree-planner.component.scss'] + selector: 'cse-degree-planner', + templateUrl: './degree-planner.component.html', + styleUrls: ['./degree-planner.component.scss'], }) export class DegreePlannerComponent implements OnInit { - public termsByAcademicYear: Object; - public mobileView: MediaQueryList; - public coursesData$: any; + public termsByAcademicYear: Object; + public mobileView: MediaQueryList; + public coursesData$: any; - public visibleRoadmapId$: Observable<number | undefined>; - public allDegreePlans$: Observable<DegreePlan[]>; - public termsByYear$: Observable<Year[]>; + public visibleRoadmapId$: Observable<number | undefined>; + public allDegreePlans$: Observable<DegreePlan[]>; + public firstActiveTermCode$: Observable<string | undefined>; + public termsByYear$: Observable<Year[]>; - constructor( - private store: Store<GlobalState>, - public mediaMatcher: MediaMatcher - ) { - this.mobileView = mediaMatcher.matchMedia('(max-width: 900px)'); - } + constructor( + private store: Store<GlobalState>, + public mediaMatcher: MediaMatcher, + ) { + this.mobileView = mediaMatcher.matchMedia('(max-width: 900px)'); + } - public ngOnInit() { - this.visibleRoadmapId$ = this.store.pipe(select(getVisibleRoadmapId)); - this.allDegreePlans$ = this.store.pipe(select(getAllDegreePlans)); - this.termsByYear$ = this.store.pipe(select(getAllVisibleTermsByYear)); - } + public ngOnInit() { + this.visibleRoadmapId$ = this.store.pipe(select(getVisibleRoadmapId)); + this.allDegreePlans$ = this.store.pipe(select(getAllDegreePlans)); + this.firstActiveTermCode$ = this.store.pipe(select(firstActiveTermCode)); + this.termsByYear$ = this.store.pipe(select(getAllVisibleTermsByYear)); + } - public handleDegreePlanChange(event: MatSelectChange): void { - if (typeof event.value === 'number') { - this.store.dispatch( - new ChangeVisiblePlanRequest({ newVisibleRoadmapId: event.value }) - ); - } - } + public handleDegreePlanChange(event: MatSelectChange): void { + if (typeof event.value === 'number') { + this.store.dispatch( + new ChangeVisiblePlanRequest({ newVisibleRoadmapId: event.value }), + ); + } + } - public getTermDropZone() { - const termCodes = ['favoriteCourse-dropZone']; + public getTermDropZone() { + const termCodes = ['favoriteCourse-dropZone']; - for (const yearCode in this.termsByAcademicYear) { - if (this.termsByAcademicYear[yearCode]) { - const year = this.termsByAcademicYear[yearCode]; - for (const termKey in year.terms) { - if (year.terms[termKey]) { - const term = year.terms[termKey]; - termCodes.push('term-' + term.termCode); - } - } - } - } - // console.log(termCodes); + for (const yearCode in this.termsByAcademicYear) { + if (this.termsByAcademicYear[yearCode]) { + const year = this.termsByAcademicYear[yearCode]; + for (const termKey in year.terms) { + if (year.terms[termKey]) { + const term = year.terms[termKey]; + termCodes.push('term-' + term.termCode); + } + } + } + } + // console.log(termCodes); - return termCodes; - } + return termCodes; + } } diff --git a/src/app/degree-planner/effects/plan.effects.ts b/src/app/degree-planner/effects/plan.effects.ts index 23def492259c653f64ec3580a231b8390b7a69f6..c6561f51427b26bc7fbd35d4dbd5dc8ecdd99e38 100644 --- a/src/app/degree-planner/effects/plan.effects.ts +++ b/src/app/degree-planner/effects/plan.effects.ts @@ -8,10 +8,7 @@ import { Store } from '@ngrx/store'; // Services import { DegreePlannerApiService } from '@app/degree-planner/services/api.service'; -import { - getDegreePlannerState, - getVisibleRoadmapId, -} from '@app/degree-planner/selectors'; +import { getDegreePlannerState } from '@app/degree-planner/selectors'; // Actions import { diff --git a/src/app/degree-planner/selectors.ts b/src/app/degree-planner/selectors.ts index bcfae8558bc54e9f3a0e390018ca00842cc3f321..b50e15363541e8a037790975907ef03349217b47 100644 --- a/src/app/degree-planner/selectors.ts +++ b/src/app/degree-planner/selectors.ts @@ -17,6 +17,17 @@ export const getSavedForLaterCourses = createSelector( state => state.savedForLaterCourses, ); +export const firstActiveTermCode = createSelector( + getDegreePlannerState, + state => { + if (state.activeTermCodes.length > 0) { + return state.activeTermCodes[0]; + } else { + return undefined; + } + }, +); + export const getAllDegreePlans = createSelector( getDegreePlannerState, state => state.allDegreePlans, diff --git a/src/app/shared/pipes/academic-year-state.pipe.ts b/src/app/shared/pipes/academic-year-state.pipe.ts index 142b1c9b9dfe384e624d62917b135b3336193a9d..cfb3f88e83b24d0b64b2d8c77f32c3b367fc104b 100644 --- a/src/app/shared/pipes/academic-year-state.pipe.ts +++ b/src/app/shared/pipes/academic-year-state.pipe.ts @@ -1,32 +1,19 @@ import { Pipe, PipeTransform } from '@angular/core'; -import { GlobalState } from '@app/core/state'; -import { State, select } from '@ngrx/store'; - -import { getAllVisibleTerms } from './../../degree-planner/selectors'; -import { PlannedTerm } from './../../core/models/planned-term'; @Pipe({ name: 'academicYearState', }) export class AcademicYearStatePipe implements PipeTransform { - terms: PlannedTerm[]; - constructor(private store: State<GlobalState>) { - this.store - .pipe(select(getAllVisibleTerms)) - .subscribe(terms => (this.terms = terms)); - } - - transform(year: string): string { - const termCode = this.terms[0].termCode; + transform(year: string, cutoffTermCode: string): string { let century = 2000; - if (termCode.substr(0, 1) === '0') { + if (cutoffTermCode.substr(0, 1) === '0') { century = 1900; } const YYYY = century + Number(year); - if (year < termCode.substr(1, 2)) { + if (year < cutoffTermCode.substr(1, 2)) { return 'Past: ' + (YYYY - 1) + '-' + YYYY; - } else if (year > termCode.substr(1, 2)) { + } else if (year > cutoffTermCode.substr(1, 2)) { return 'Future: ' + (YYYY - 1) + '-' + YYYY; } else { return 'Current: ' + (YYYY - 1) + '-' + YYYY;