diff --git a/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.html b/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.html index 2a92def1b52263e2b26fed427bb24f5bb5b6a1ee..f0160683835b06a45864d88bd53d9a8bb213eecb 100644 --- a/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.html +++ b/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.html @@ -32,6 +32,7 @@ <button mat-button class="sidenav-link-btn"><i class="material-icons">print</i>Print</button> <button mat-button class="sidenav-link-btn"><i class="material-icons">email</i> Share Plan</button> <button mat-button class="sidenav-link-btn"><i class="material-icons">add_box</i> Add Degree Plan</button> + <button mat-button class="sidenav-link-btn" (click)="addAcademicYear()"><i class="material-icons">add_box</i> Add Academic Year</button> </div> </mat-expansion-panel> </div> \ No newline at end of file diff --git a/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.ts b/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.ts index 32afc442de96078b5c80ea8a5bc0e685374a2445..de404e61fdc9bd0b21404f8bee256d26aa9ad340 100644 --- a/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.ts +++ b/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.ts @@ -1,12 +1,21 @@ -import { Component, OnInit } from '@angular/core'; +// Libraries +import { Component } from '@angular/core'; +import { Store } from '@ngrx/store'; + +// State management +import { GlobalState } from '@app/core/state'; +import { AddAcademicYearRequest } from '@app/degree-planner/store/actions/addAcademicYear.actions'; @Component({ selector: 'cse-sidenav-menu-item', templateUrl: './sidenav-menu-item.component.html', styleUrls: ['./sidenav-menu-item.component.scss'], }) -export class SidenavMenuItemComponent implements OnInit { - constructor() {} - ngOnInit() {} +export class SidenavMenuItemComponent { + constructor(private store: Store<GlobalState>) {} + + public addAcademicYear() { + this.store.dispatch(new AddAcademicYearRequest()); + } } diff --git a/src/app/degree-planner/store/actions/addAcademicYear.actions.ts b/src/app/degree-planner/store/actions/addAcademicYear.actions.ts new file mode 100644 index 0000000000000000000000000000000000000000..aa3398e5e2bba74c20c61fdee3c9d43f1a4c5349 --- /dev/null +++ b/src/app/degree-planner/store/actions/addAcademicYear.actions.ts @@ -0,0 +1,9 @@ +import { Action } from '@ngrx/store'; + +export enum AddAcademicYearActionTypes { + AddAcademicYearRequest = '[AcademicYear] Add Academic Year Request', +} + +export class AddAcademicYearRequest implements Action { + public readonly type = AddAcademicYearActionTypes.AddAcademicYearRequest; +} diff --git a/src/app/degree-planner/store/reducer.ts b/src/app/degree-planner/store/reducer.ts index 3f3beb6520261b4c87f429c4c4f87c51f728e581..39f3209813f5f049b3c3810edae6e262762728a5 100644 --- a/src/app/degree-planner/store/reducer.ts +++ b/src/app/degree-planner/store/reducer.ts @@ -23,6 +23,10 @@ import { WriteNoteSuccess, DeleteNoteSuccess, } from '@app/degree-planner/store/actions/note.actions'; +import { + AddAcademicYearActionTypes, + AddAcademicYearRequest, + } from '@app/degree-planner/store/actions/addAcademicYear.actions'; import { SavedForLaterCourse } from '@app/core/models/saved-for-later-course'; import { DegreePlan } from '@app/core/models/degree-plan'; @@ -36,6 +40,7 @@ type SupportedActions = | AddCourseSuccess | RemoveSaveForLaterSuccess | AddSaveForLaterSuccess + | AddAcademicYearRequest | MakePlanPrimary | MakePlanPrimarySuccess | MakePlanPrimaryFailure; @@ -64,6 +69,32 @@ export function degreePlannerReducer( return { ...state, ...action.payload }; } + /** + * The `AddAcademicYearRequest` action is triggered after `addAcademicYear()` + * function runs. A new academic year container with three terms will be created. + */ + case AddAcademicYearActionTypes.AddAcademicYearRequest: { + const originalTerms = state.visibleTerms.map( term => { + return parseInt(term.termCode.substr(0, 3), 10); + }); + + const newAcademicYearCode = Math.max(...originalTerms) + 1; + + const newVisibleTerms = [ + ...state.visibleTerms, + { termCode: `${newAcademicYearCode}2`, + courses: [] + }, + { termCode: `${newAcademicYearCode}4`, + courses: [] + }, + { termCode: `${newAcademicYearCode}6`, + courses: [] + } + ]; + return { ...state, visibleTerms: newVisibleTerms }; + } + /** * The `WriteNoteResponse` action is dispatched by the `Note.write$` effect * upon a successful response from the `updateNote` or `createNote` API