Skip to content

Commit 4ed8b3d

Browse files
committed
[LanguageCenter] Add a course name/code filter
1 parent d6c55ed commit 4ed8b3d

File tree

5 files changed

+55
-4
lines changed

5 files changed

+55
-4
lines changed

services/frontend/src/components/ColorizedCoursesTable/FacultiesTab/index.jsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import { getFilteredRowModel } from '@tanstack/react-table'
12
import { useMemo } from 'react'
23

34
import {
45
calculateTotals,
56
emptyFields,
67
useColorizedCoursesTableContext,
8+
CourseFilter,
79
} from '@/components/ColorizedCoursesTable/common'
810
import '@/components/ColorizedCoursesTable/index.css'
911
import {
@@ -14,6 +16,7 @@ import {
1416
import { useLanguage } from '@/components/LanguagePicker/useLanguage'
1517
import { OodiTable } from '@/components/OodiTable'
1618
import { OodiTableExcelExport } from '@/components/OodiTable/excelExport'
19+
import { useDebouncedState } from '@/hooks/debouncedState'
1720
import { useGetFacultiesQuery } from '@/redux/facultyStats'
1821
import { useColumns } from './logic'
1922

@@ -24,6 +27,8 @@ export const FacultiesTab = () => {
2427
const { getTextIn } = useLanguage()
2528
const facultyQuery = useGetFacultiesQuery()
2629

30+
const [courseFilter, setCourseFilter] = useDebouncedState('', 250)
31+
2732
const facultyMap = useMemo(
2833
() =>
2934
facultyQuery.data?.reduce((obj, cur) => {
@@ -91,7 +96,10 @@ export const FacultiesTab = () => {
9196
initialState: { columnPinning: { left: ['Course'] } },
9297
state: {
9398
useZebrastripes: colorMode === 'none',
99+
columnFilters: [{ id: 'Course', value: courseFilter }],
94100
},
101+
onColumnFiltersChange: setCourseFilter,
102+
getFilteredRowModel: getFilteredRowModel(),
95103
}
96104

97105
return (
@@ -106,7 +114,12 @@ export const FacultiesTab = () => {
106114
cy="ooditable-faculties"
107115
data={tableData}
108116
options={tableOptions}
109-
toolbarContent={<OodiTableExcelExport data={excelData} exportColumnKeys={cols.map(({ id }) => id)} />}
117+
toolbarContent={
118+
<>
119+
<OodiTableExcelExport data={excelData} exportColumnKeys={cols.map(({ id }) => id)} />
120+
<CourseFilter setCourseFilter={setCourseFilter} />
121+
</>
122+
}
110123
/>
111124
</div>
112125
)

services/frontend/src/components/ColorizedCoursesTable/FacultiesTab/logic.jsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ export const useColumns = (getTextIn, faculties, numberMode, colorMode, facultyM
3737
},
3838
aggregationRows: () => [{ id: 'total', value: undefined }],
3939
aggregatedCell: () => <CourseContainer code="Total" getTextIn={getTextIn} name={{ en: 'All courses total' }} />,
40+
// TODO: pls DRY. This is same as in SemesterTab
41+
filterFn: (row, columnId, filterValue) => {
42+
const { code, name } = row.original
43+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
44+
return code.toLowerCase().includes(filterValue) || getTextIn(name).toLowerCase().includes(filterValue)
45+
},
4046
}),
4147
columnHelper.accessor('total-column', {
4248
id: 'Total',

services/frontend/src/components/ColorizedCoursesTable/SemestersTab/index.jsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import { getFilteredRowModel } from '@tanstack/react-table'
12
import { useMemo } from 'react'
23

34
import {
45
calculateNewTotalColumnValues,
56
calculateTotals,
67
useColorizedCoursesTableContext,
8+
CourseFilter,
79
} from '@/components/ColorizedCoursesTable/common'
810
import {
911
ColorModeSelector,
@@ -14,11 +16,13 @@ import '@/components/ColorizedCoursesTable/index.css'
1416
import { useLanguage } from '@/components/LanguagePicker/useLanguage'
1517
import { OodiTable } from '@/components/OodiTable'
1618
import { OodiTableExcelExport } from '@/components/OodiTable/excelExport'
19+
import { useDebouncedState } from '@/hooks/debouncedState'
1720
import { useColumns } from './logic'
1821

1922
export const SemestersTab = () => {
2023
const { getTextIn } = useLanguage()
2124
const { semesters, numberMode, colorMode, selectedSemesters, data } = useColorizedCoursesTableContext()
25+
const [courseFilter, setCourseFilter] = useDebouncedState('', 250)
2226

2327
const totalRow = useMemo(() => {
2428
if (!data) return {}
@@ -50,10 +54,13 @@ export const SemestersTab = () => {
5054
)
5155

5256
const tableOptions = {
53-
initialState: { columnPinning: { left: ['code'] } },
57+
initialState: { columnPinning: { left: ['Course'] } },
5458
state: {
5559
useZebrastripes: colorMode === 'none',
60+
columnFilters: [{ id: 'Course', value: courseFilter }],
5661
},
62+
onColumnFiltersChange: setCourseFilter,
63+
getFilteredRowModel: getFilteredRowModel(),
5764
}
5865

5966
return (
@@ -68,7 +75,12 @@ export const SemestersTab = () => {
6875
cy="ooditable-semesters"
6976
data={tableData}
7077
options={tableOptions}
71-
toolbarContent={<OodiTableExcelExport data={excelData} exportColumnKeys={cols.map(({ header }) => header)} />}
78+
toolbarContent={
79+
<>
80+
<OodiTableExcelExport data={excelData} exportColumnKeys={cols.map(({ header }) => header)} />
81+
<CourseFilter setCourseFilter={setCourseFilter} />
82+
</>
83+
}
7284
/>
7385
</div>
7486
)

services/frontend/src/components/ColorizedCoursesTable/SemestersTab/logic.jsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,20 @@ export const useColumns = (getTextIn, semesters, numberMode, colorMode, allTotal
2020
return useMemo(
2121
() => [
2222
columnHelper.accessor('code', {
23+
id: 'Course',
2324
header: 'Course',
2425
cell: ({ row }) => {
2526
const { code, name } = row.original
2627
return <CourseContainer code={code} getTextIn={getTextIn} name={name} />
2728
},
2829
aggregationRows: () => [{ id: 'total', value: undefined }],
2930
aggregatedCell: () => <CourseContainer code="Total" getTextIn={getTextIn} name={{ en: 'All courses total' }} />,
31+
// TODO: pls DRY. This is same as in FacultiesTab
32+
filterFn: (row, columnId, filterValue) => {
33+
const { code, name } = row.original
34+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
35+
return code.toLowerCase().includes(filterValue) || getTextIn(name).toLowerCase().includes(filterValue)
36+
},
3037
}),
3138
columnHelper.accessor('all', {
3239
header: 'Total',

services/frontend/src/components/ColorizedCoursesTable/common.js renamed to services/frontend/src/components/ColorizedCoursesTable/common.jsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { createContext, useContext } from 'react'
1+
import TextField from '@mui/material/TextField'
2+
import { createContext, useContext, useState, useEffect } from 'react'
23

34
export const ColorizedCoursesTableContext = createContext(null)
45

@@ -82,3 +83,15 @@ export const getColor = (stats, columnAmount, colorMode, numberMode, courseTotal
8283
backgroundColor: `rgba(${color},${Math.min(1.0, relativeAlphaValue)}) !important`,
8384
}
8485
}
86+
87+
// NOTE: Give setCourseFilter as a useDebouncedState to make the text box work nicely
88+
export const CourseFilter = ({ setCourseFilter }) => {
89+
const [textField, setTextField] = useState('')
90+
useEffect(() => {
91+
setCourseFilter(textField)
92+
}, [textField])
93+
94+
return (
95+
<TextField label="Course name/code filter" onChange={event => setTextField(event.target.value)} value={textField} />
96+
)
97+
}

0 commit comments

Comments
 (0)