From 6423923bce5abb32e5a742b0e797b10d7aa37808 Mon Sep 17 00:00:00 2001 From: Claudia Asti Date: Tue, 19 Jul 2022 10:52:56 +0200 Subject: [PATCH] refactor: adapt event text and link, refs #427 --- .../test-edit-grades.component.ts | 6 +- .../services/events-state.service.spec.ts | 3 +- .../events/services/events-state.service.ts | 29 +++---- src/app/events/utils/events.spec.ts | 27 ++++--- src/app/events/utils/events.ts | 78 ++++++++++++++++--- src/spec-builders.ts | 5 +- 6 files changed, 109 insertions(+), 39 deletions(-) diff --git a/src/app/events/components/test-edit-grades/test-edit-grades.component.ts b/src/app/events/components/test-edit-grades/test-edit-grades.component.ts index 440240edf..339b324c4 100644 --- a/src/app/events/components/test-edit-grades/test-edit-grades.component.ts +++ b/src/app/events/components/test-edit-grades/test-edit-grades.component.ts @@ -13,7 +13,7 @@ import { Student } from 'src/app/shared/models/student.model'; import { Test } from '../../../shared/models/test.model'; import { EventsStateService } from '../../services/events-state.service'; import { Filter, TestStateService } from '../../services/test-state.service'; -import { getState } from '../../utils/events'; +import { getEventState } from '../../utils/events'; import { averageGrade, averagePoints } from '../../utils/tests'; import { map, take } from 'rxjs/operators'; import { Observable } from 'rxjs'; @@ -53,7 +53,9 @@ export class TestEditGradesComponent implements OnInit { isEditFinalGradesAllowed(studentGrade: StudentGrade): Observable { return this.state.course$.pipe( map((course) => - Boolean(getState(course) && studentGrade.finalGrade.canGrade) + Boolean( + getEventState(course)?.value && studentGrade.finalGrade.canGrade + ) ) ); } diff --git a/src/app/events/services/events-state.service.spec.ts b/src/app/events/services/events-state.service.spec.ts index 46c0f12cf..182b9febf 100644 --- a/src/app/events/services/events-state.service.spec.ts +++ b/src/app/events/services/events-state.service.spec.ts @@ -124,7 +124,8 @@ describe('EventsStateService', () => { ...evaluationStatus, HasEvaluationStarted: true, }, - [studyClasses[1]] + [studyClasses[1]], + 10300 ), buildCourse( 4, diff --git a/src/app/events/services/events-state.service.ts b/src/app/events/services/events-state.service.ts index 2ad5359a1..731aa6e2b 100644 --- a/src/app/events/services/events-state.service.ts +++ b/src/app/events/services/events-state.service.ts @@ -12,7 +12,7 @@ import { StudyClassesRestService } from 'src/app/shared/services/study-classes-r import { spread } from 'src/app/shared/utils/function'; import { hasRole } from 'src/app/shared/utils/roles'; import { searchEntries } from 'src/app/shared/utils/search'; -import { getState, isRated } from '../utils/events'; +import { EventStateWithLabel, getEventState, isRated } from '../utils/events'; import { EventsRestService } from 'src/app/shared/services/events-rest.service'; export enum EventState { @@ -126,7 +126,7 @@ export class EventsStateService { courses: ReadonlyArray ): ReadonlyArray { return courses.map((course) => { - const state = getState(course); + const state = getEventState(course); return { id: course.Id, @@ -135,31 +135,34 @@ export class EventsStateService { studentCount: course.AttendanceRef.StudentCount || 0, dateFrom: course.DateFrom, dateTo: course.DateTo, - state: state, + state: state?.value || null, evaluationText: this.getEvaluationText( state, course.EvaluationStatusRef.EvaluationUntil ), - evaluationLink: this.getEvaluationLink(course), + evaluationLink: this.getEvaluationLink(state?.value, course), }; }); } private getEvaluationText( - state: Option, + state: Option, date?: Maybe ): string { - return state === null - ? '' - : this.translate.instant(`events.state.${state}`) + - (state === EventState.RatingUntil + const label = state?.label || state?.value; + return label + ? this.translate.instant(`events.state.${label}`) + + (label === EventState.RatingUntil ? ` ${date ? format(date, 'dd.MM.yyyy') : ''}` - : ''); + : '') + : ''; } - private getEvaluationLink(course: Course): Option { - return course.EvaluationStatusRef.HasEvaluationStarted && - !course.EvaluationStatusRef.HasTestGrading + private getEvaluationLink( + state: Maybe, + course: Course + ): Option { + return state && state !== EventState.Tests ? this.buildLink(course.Id, 'evaluation') : null; } diff --git a/src/app/events/utils/events.spec.ts b/src/app/events/utils/events.spec.ts index b968dd086..382f2c65f 100644 --- a/src/app/events/utils/events.spec.ts +++ b/src/app/events/utils/events.spec.ts @@ -1,10 +1,7 @@ -import { canSetFinalGrade, getState, isRated } from './events'; +import { canSetFinalGrade, getEventState, isRated } from './events'; import { buildCourse, buildFinalGrading } from '../../../spec-builders'; import { EventState } from '../services/events-state.service'; -import { - EvaluationStatusRef, - FinalGrading, -} from 'src/app/shared/models/course.model'; +import { EvaluationStatusRef } from 'src/app/shared/models/course.model'; describe('Course utils', () => { describe('Get course state', () => { @@ -35,7 +32,7 @@ describe('Course utils', () => { ); // then - expect(getState(course)).toEqual(null); + expect(getEventState(course)).toEqual(null); }); it('should get state add-tests', () => { @@ -56,7 +53,9 @@ describe('Course utils', () => { ); // then - expect(getState(course)).toEqual(EventState.Tests); + expect(getEventState(course)).toEqual({ + value: EventState.Tests, + }); }); it('should get state rating-until', () => { @@ -64,7 +63,6 @@ describe('Course utils', () => { const evaluationStatusRef = { HasEvaluationStarted: true, EvaluationUntil: new Date(2022, 2, 3), - HasReviewOfEvaluationStarted: false, HasTestGrading: false, Id: 6980, }; @@ -77,7 +75,9 @@ describe('Course utils', () => { ); // then - expect(getState(course)).toEqual(EventState.RatingUntil); + expect(getEventState(course)).toEqual({ + value: EventState.RatingUntil, + }); }); it('should get state intermediate-rating', () => { @@ -85,7 +85,6 @@ describe('Course utils', () => { const evaluationStatusRef = { HasEvaluationStarted: true, EvaluationUntil: null, - HasReviewOfEvaluationStarted: false, HasTestGrading: false, Id: 6980, }; @@ -94,11 +93,15 @@ describe('Course utils', () => { 1234, 'Course in state intermediate-rating', undefined, - evaluationStatusRef + evaluationStatusRef, + undefined, + 10300 ); // then - expect(getState(course)).toEqual(EventState.IntermediateRating); + expect(getEventState(course)).toEqual({ + value: EventState.IntermediateRating, + }); }); }); diff --git a/src/app/events/utils/events.ts b/src/app/events/utils/events.ts index 29ae0d4aa..905f488c3 100644 --- a/src/app/events/utils/events.ts +++ b/src/app/events/utils/events.ts @@ -1,23 +1,83 @@ import { Course } from '../../shared/models/course.model'; import { EventState } from '../services/events-state.service'; -export function getState(course: Course): Option { +export type EventStateWithLabel = { + value: EventState; + label?: string; +}; + +// To understand this logic see +// https://github.com/bkd-mba-fbi/webapp-schulverwaltung/issues/427 +export function getEventState(course: Course): Option { const courseStatus = course.EvaluationStatusRef; if ( - courseStatus.HasEvaluationStarted === false && - courseStatus.HasTestGrading === true + courseStatus.HasEvaluationStarted === true && + (course.StatusId === 14030 || course.StatusId === 10350) ) { - return EventState.Tests; + // Bewertung + return { + value: EventState.Rating, + }; } - if (courseStatus.HasEvaluationStarted === true) { - if (courseStatus.EvaluationUntil == null) { - return EventState.IntermediateRating; + if ( + courseStatus.HasEvaluationStarted === true && + courseStatus.HasTestGrading === false + ) { + if ( + courseStatus.EvaluationUntil && + courseStatus.EvaluationUntil >= new Date() + ) { + // Bewertung bis + return { + value: EventState.RatingUntil, + }; + } + + if ( + (courseStatus.EvaluationUntil === null || + courseStatus.EvaluationUntil === undefined) && + course.StatusId === 10300 + ) { + // Zwischenbewertung + return { + value: EventState.IntermediateRating, + }; } + } - if (courseStatus.EvaluationUntil >= new Date()) { - return EventState.RatingUntil; + if ( + courseStatus.HasEvaluationStarted === false && + courseStatus.HasTestGrading === true && + courseStatus.HasReviewOfEvaluationStarted === false && + course.StatusId !== 10260 + ) { + // Tests erfassen + return { + value: EventState.Tests, + }; + } + + if ( + courseStatus.HasEvaluationStarted === true && + courseStatus.HasTestGrading === true + ) { + if ( + courseStatus.EvaluationUntil === null || + courseStatus.EvaluationUntil === undefined + ) { + // Test erfassen, Label Zwischenbewertung + return { + value: EventState.Tests, + label: EventState.IntermediateRating, + }; + } else if (courseStatus.EvaluationUntil >= new Date()) { + // Test erfassen, Label Bewertung bis + return { + value: EventState.Tests, + label: EventState.RatingUntil, + }; } } diff --git a/src/spec-builders.ts b/src/spec-builders.ts index de9ee555f..b4877b18a 100644 --- a/src/spec-builders.ts +++ b/src/spec-builders.ts @@ -465,7 +465,8 @@ export function buildCourse( designation?: string, attendance?: AttendanceRef, evaluationStatus?: EvaluationStatusRef, - classes?: StudyClass[] + classes?: StudyClass[], + statusId?: number ): Course { return { HRef: '', @@ -495,7 +496,7 @@ export function buildCourse( // IsPublished: t.boolean, // LevelId: t.number, // Level: t.string, - StatusId: 2, + StatusId: statusId || 2, // Status: t.string, // Lessons: null, // EventManagers: null,