Skip to content
Snippets Groups Projects
new-audit-options.component.ts 5.76 KiB
Newer Older
Paulina Nogal's avatar
Paulina Nogal committed
import { Component, OnInit, Inject } from '@angular/core';
Paulina Nogal's avatar
Paulina Nogal committed
import { MatDialogRef, MatSnackBar } from '@angular/material';
Paulina Nogal's avatar
Paulina Nogal committed
import { DarsApiService } from '../services/api.service';
Isaac Evavold's avatar
Isaac Evavold committed
import { DegreeProgram, DegreePrograms } from '../models/degree-program';
import { SingleAuditRequest } from '../models/single-audit-request';
Paulina Nogal's avatar
Paulina Nogal committed
import { StudentDegreeProgram } from '../models/student-degree-program';
Paulina Nogal's avatar
Paulina Nogal committed
import { Observable } from 'rxjs';
import { Store, select } from '@ngrx/store';
import { GlobalState } from '@app/core/state';
import * as selectors from '../store/selectors';
import * as darsActions from '../store/actions';
Paulina Nogal's avatar
Paulina Nogal committed
import { DARSState } from '../store/state';
import { MAT_DIALOG_DATA } from '@angular/material';
Paulina Nogal's avatar
Paulina Nogal committed
import {
  FormBuilder,
  FormGroup,
  FormControl,
  AbstractControl,
} from '@angular/forms';
Isaac Evavold's avatar
Isaac Evavold committed
import { HonorsOption } from '../models/honors-option';
import { DegreePlan } from '@app/core/models/degree-plan';
import { CourseBase } from '@app/core/models/course';
Paulina Nogal's avatar
Paulina Nogal committed

@Component({
  selector: 'cse-new-audit-options',
  templateUrl: './new-audit-options.component.html',
  styleUrls: ['./new-audit-options.component.scss'],
})
export class NewAuditOptionsComponent implements OnInit {
  public newAuditForm: FormGroup;
Paulina Nogal's avatar
Paulina Nogal committed
  public degreeProgram: DegreeProgram;
Isaac Evavold's avatar
Isaac Evavold committed
  public degreePrograms: DegreePrograms;
Paulina Nogal's avatar
Paulina Nogal committed
  public programOfStudy: string;
  public studentDegreeProgram: StudentDegreeProgram[];
Isaac Evavold's avatar
Isaac Evavold committed
  public DARSprograms: DegreeProgram[] = [];
  public honorsOptions: HonorsOption[] = [];
  public courses: { termCode: string; courses: CourseBase[] }[];
Paulina Nogal's avatar
Paulina Nogal committed
  public degreePlans$: Observable<DARSState['degreePlans']>;
  public singleAuditRequest$: Observable<SingleAuditRequest>;
Isaac Evavold's avatar
Isaac Evavold committed
  public degreePlans: DegreePlan[];
  public primaryPlan: DegreePlan[];
Paulina Nogal's avatar
Paulina Nogal committed
  public hasVariableCredits: boolean;
Isaac Evavold's avatar
Isaac Evavold committed
  public creditsRange: (CourseBase & { creditRange: number[] })[];
Paulina Nogal's avatar
Paulina Nogal committed
  public isLoaded: boolean;
  public selectedAuditType: string;
Isaac Evavold's avatar
Isaac Evavold committed
  public termsToInclude: { name: string; id: string; value: string }[];
Paulina Nogal's avatar
Paulina Nogal committed
  get formArray(): AbstractControl | null {
    return this.newAuditForm.get('formArray');
  }

Paulina Nogal's avatar
Paulina Nogal committed
  constructor(
    private fb: FormBuilder,
    private dialogRef: MatDialogRef<NewAuditOptionsComponent>,
    private snackBar: MatSnackBar,
Paulina Nogal's avatar
Paulina Nogal committed
    private api: DarsApiService,
Paulina Nogal's avatar
Paulina Nogal committed
    private store: Store<GlobalState>,
    @Inject(MAT_DIALOG_DATA)
    data: {
      selectedAuditType: string;
    },
  ) {
    this.selectedAuditType = 'declaredMajorAudit';
    this.termsToInclude = [
      {
        name: 'Previous, current, future, and planned terms',
        id: 'future-whatif',
        value: 'future',
      },
      {
        name: 'Previous, current, future',
        id: 'future-degree',
        value: 'future',
      },
      { name: 'Previous, current', id: 'current', value: 'current' },
      { name: 'Previous', id: 'previous', value: 'previous' },
    ];
Paulina Nogal's avatar
Paulina Nogal committed
  }
Paulina Nogal's avatar
Paulina Nogal committed

  ngOnInit() {
    // Get Degree plans
    this.degreePlans$ = this.store.pipe(select(selectors.degreePlans));
    this.degreePlans$.subscribe(plans => {
      this.degreePlans = plans;
      this.primaryPlan = plans.filter(function(plan) {
        return plan.primary === true;
      });
      this.primaryPlanId = this.primaryPlan[0].roadmapId.toString();
    });
Paulina Nogal's avatar
Paulina Nogal committed
    // Get student degree programs
    this.api.getStudentDegreePrograms().subscribe(studentDegreeProgram => {
      this.studentDegreeProgram = studentDegreeProgram;
    });

Paulina Nogal's avatar
Paulina Nogal committed
    this.api.getStaticData().subscribe(degreePrograms => {
      this.degreePrograms = degreePrograms;
Isaac Evavold's avatar
Isaac Evavold committed

      for (const institution of Object.values(degreePrograms)) {
        this.programOfStudy = institution.darsInstitutionCodeDescription;
        this.honorsOptions.push(...institution.honorsOptions);
        this.DARSprograms.push(...institution.programs);
Paulina Nogal's avatar
Paulina Nogal committed
    this.newAuditForm = this.fb.group({
      formArray: this.fb.array([
        this.fb.group({
Paulina Nogal's avatar
Paulina Nogal committed
          auditType: new FormControl(''),
Paulina Nogal's avatar
Paulina Nogal committed
        }),
        this.fb.group({
Paulina Nogal's avatar
Paulina Nogal committed
          darsDegreeProgram: new FormControl(''),
          darsInstitution: new FormControl(''),
          darsInstitutionProgram: new FormControl(''),
Paulina Nogal's avatar
Paulina Nogal committed
        }),
        this.fb.group({
Paulina Nogal's avatar
Paulina Nogal committed
          honors: new FormControl('Keep current status'),
            this.selectedAuditType === 'declaredMajorAudit'
              ? this.termsToInclude[1]
              : this.termsToInclude[0],
          ),
          runAgainst: new FormControl(this.primaryPlanId),
Paulina Nogal's avatar
Paulina Nogal committed
        }),
        this.fb.group({
          credits: new FormControl(''),
        }),
      ]),
    });
Paulina Nogal's avatar
Paulina Nogal committed
  }

  public getCoursesList(roadmapId) {
    this.isLoaded = false;

    this.api.getAllCourses(roadmapId).subscribe(courses => {
      this.courses = courses;
      this.creditsRange = [];
Isaac Evavold's avatar
Isaac Evavold committed
      this.isLoaded = true;
      this.hasVariableCredits = false;
Isaac Evavold's avatar
Isaac Evavold committed
      courses.forEach(term => {
        term.courses.forEach(course => {
          const { creditMin: min, creditMax: max } = course;
          if (min !== undefined && max !== undefined && min < max) {
            this.hasVariableCredits = true;
            const creditRange: number[] = [];
            for (let i = min; i <= max; i++) {
              creditRange.push(i);
            }
            this.creditsRange.push({ ...course, creditRange });
          }
        });
      });
Paulina Nogal's avatar
Paulina Nogal committed
  public runDARSAudit() {
    const {
      auditType,
      programOfStudy,
      academicProgram,
      honors,
      includeCoursesFrom,
      runAgainst,
      credits,
    } = this.newAuditForm.value;

    this.store.dispatch(
      new darsActions.StartSendingAudit({
        darsInstitutionCode: programOfStudy,
        darsDegreeProgramCode: academicProgram,
      }),
    );

Paulina Nogal's avatar
Paulina Nogal committed
    this.dialogRef.close();
    this.snackBar.open(
      'Audit in progress. You will be notified when the audit is ready to be viewed.',
    );
  }
Paulina Nogal's avatar
Paulina Nogal committed
}