diff --git a/src/app/events/services/test-state.service.ts b/src/app/events/services/test-state.service.ts index 1fef9dff7..0b4621b3b 100644 --- a/src/app/events/services/test-state.service.ts +++ b/src/app/events/services/test-state.service.ts @@ -4,6 +4,7 @@ import { combineLatest, merge, Observable, + of, ReplaySubject, scan, shareReplay, @@ -123,18 +124,22 @@ export class TestStateService { this.gradingScaleIds$ ); + private UNDEFINED_GRADINGSCALE_ID = -1; private gradingScalesOptions$: Observable = this.gradingScales$.pipe( map((gradingScales) => gradingScales .map((gradingScale) => { - return { - id: gradingScale.Id, - options: gradingScale.Grades.map((gradeOption) => { + const id = gradingScale?.Id || this.UNDEFINED_GRADINGSCALE_ID; + const options = + gradingScale?.Grades.map((gradeOption) => { return { Key: gradeOption.Id, Value: gradeOption.Designation, }; - }), + }) || []; + return { + id, + options, }; }) .reduce( @@ -287,7 +292,8 @@ export class TestStateService { }); } - private gradingOptions$(gradingScaleId: number) { + private gradingOptions$(gradingScaleId: number | null) { + if (gradingScaleId === null) return of(null); return this.gradingScalesOptions$.pipe( map((gradingScaleOptions) => gradingScaleOptions[gradingScaleId]), shareReplay(1) @@ -300,6 +306,7 @@ export class TestStateService { ): Observable { return this.course$.pipe( map((course: Course) => { + if (course.GradingScaleId === null) return null; if (gradingScaleOptions[course.GradingScaleId] === undefined) return null; const scale = gradingScaleOptions[course.GradingScaleId]!; diff --git a/src/app/shared/models/course.model.ts b/src/app/shared/models/course.model.ts index 1cf53726a..6361c651c 100644 --- a/src/app/shared/models/course.model.ts +++ b/src/app/shared/models/course.model.ts @@ -103,7 +103,7 @@ const Course = t.type({ // EventManagers: null, // MainEventManagers: null, // TimetableEntries: null, - GradingScaleId: t.number, + GradingScaleId: Option(t.number), FinalGrades: Option(t.array(FinalGrading)), Gradings: Option(t.array(Grading)), Tests: Option(t.array(Test)), diff --git a/src/app/shared/services/grading-scales-rest.service.ts b/src/app/shared/services/grading-scales-rest.service.ts index 6007fc420..f962aa6fd 100644 --- a/src/app/shared/services/grading-scales-rest.service.ts +++ b/src/app/shared/services/grading-scales-rest.service.ts @@ -1,6 +1,6 @@ import { HttpClient } from '@angular/common/http'; import { Inject, Injectable } from '@angular/core'; -import { forkJoin, Observable, shareReplay, switchMap } from 'rxjs'; +import { forkJoin, Observable, of, shareReplay, switchMap } from 'rxjs'; import { Settings, SETTINGS } from 'src/app/settings'; import { GradingScale } from '../models/grading-scale.model'; import { decode } from '../utils/decode'; @@ -14,18 +14,19 @@ export class GradingScalesRestService extends RestService { super(http, settings, GradingScale, 'GradingScales'); } - getGradingScale(id: number): Observable { + getGradingScale(id: number | null): Observable { + if (id === null) return of(null); return this.http .get(`${this.baseUrl}/${id}`) .pipe(switchMap(decode(GradingScale))); } loadGradingScales( - observable: Observable - ): Observable> { + observable: Observable<(number | null)[]> + ): Observable> { return observable.pipe( switchMap((ids) => - forkJoin(ids.map((id: number) => this.getGradingScale(id))) + forkJoin(ids.map((id: number | null) => this.getGradingScale(id))) ), shareReplay(1) );