From f8f5c4ba325725a3dc4c1534e860ddb3eeacc3fd Mon Sep 17 00:00:00 2001 From: Aaro Koivukangas Date: Tue, 1 Sep 2026 11:36:22 +0300 Subject: [PATCH] [Filters][Grade] Fix No grade option not working --- .../src/components/FilterView/filters/grade.tsx | 13 +++++++++---- services/frontend/tests/unit/filters/grade.test.ts | 14 +++++++++++++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/services/frontend/src/components/FilterView/filters/grade.tsx b/services/frontend/src/components/FilterView/filters/grade.tsx index 894fd4d13..669c7a747 100644 --- a/services/frontend/src/components/FilterView/filters/grade.tsx +++ b/services/frontend/src/components/FilterView/filters/grade.tsx @@ -6,6 +6,7 @@ import Typography from '@mui/material/Typography' import { getHighestGradeOfCourseBetweenRange } from '@/common' import { createFilter, FilterTrayProps } from '@/components/FilterView/filters/createFilter' import { FormattedStudent } from '@oodikone/shared/types' +import { dateIsBetween } from '@oodikone/shared/util/datetime' type Options = any type Args = any @@ -76,17 +77,21 @@ export const gradeFilter = createFilter({ student => [ student.studentNumber, - student.courses.filter((course: any) => args.courseCodes.includes(course.course_code)), + student.courses.filter( + (course: any) => + args.courseCodes.includes(course.course_code) && + dateIsBetween(course.date, new Date(args.from), new Date(args.to)) + ), ] as [string, FormattedStudent['courses']] ) .map(([studentNumber, courses]) => [ studentNumber, getHighestGradeOfCourseBetweenRange(courses, args.from, args.to), ]) - .filter(([_, grade]) => grade !== undefined) .reduce((acc, [studentNumber, grade]) => { - acc[grade!] ??= [] - acc[grade!].push(studentNumber) + const fixedGrade = grade ?? 'No grade' + acc[fixedGrade] ??= [] + acc[fixedGrade].push(studentNumber) return acc }, {}), } diff --git a/services/frontend/tests/unit/filters/grade.test.ts b/services/frontend/tests/unit/filters/grade.test.ts index 4180dff28..cfa85c6d2 100644 --- a/services/frontend/tests/unit/filters/grade.test.ts +++ b/services/frontend/tests/unit/filters/grade.test.ts @@ -27,7 +27,7 @@ void describe('gradeFilter', () => { const precomputed = gradeFilter().precompute!({ students: [student], options: { selected: [] }, args: ARGS }) - assert.deepStrictEqual(precomputed.grades, {}) + assert.deepStrictEqual(precomputed.grades, { 'No grade': [student.studentNumber] }) }) void it('should include a student whose grade is selected', () => { @@ -54,6 +54,18 @@ void describe('gradeFilter', () => { assert.strictEqual(result, false) }) + void it('should include student with no grade in No grade', () => { + const student = createStudent({ courses: [] }) + + const result = gradeFilter().filter(student, { + args: ARGS, + options: { selected: ['No grade'] }, + precomputed: { grades: { 'No grade': [student.studentNumber] } }, + }) + + assert.strictEqual(result, true) + }) + void it('isActive should match the filter state', () => { assert.strictEqual(gradeFilter().isActive({ selected: ['5'] }, undefined), true) assert.strictEqual(gradeFilter().isActive({ selected: [] }, undefined), false)