[Hooks] make use of curriculum context

This commit is contained in:
joonas-a
2026-09-29 13:51:15 +03:00
parent ce2a035111
commit fa21354b8b
11 changed files with 60 additions and 80 deletions
@@ -6,12 +6,11 @@ import Typography from '@mui/material/Typography'
import type { Dispatch, SetStateAction } from 'react' import type { Dispatch, SetStateAction } from 'react'
import { StudentAmountLimiter } from '@/components/common/StudentAmountLimiter' import { StudentAmountLimiter } from '@/components/common/StudentAmountLimiter'
import { ExtendedCurriculumDetails } from '@/hooks/useCurriculums' import { useCurriculum } from '@/hooks/useCurriculum'
type CourseTableModeSelectorProps = { type CourseTableModeSelectorProps = {
courseTableMode: 'curriculum' | 'all' courseTableMode: 'curriculum' | 'all'
setCourseTableMode: Dispatch<SetStateAction<'curriculum' | 'all'>> setCourseTableMode: Dispatch<SetStateAction<'curriculum' | 'all'>>
curriculum: ExtendedCurriculumDetails | null
studentAmountLimit: number studentAmountLimit: number
onStudentAmountLimitChange: (input: string) => void onStudentAmountLimitChange: (input: string) => void
} }
@@ -20,47 +19,50 @@ export const CourseTableModeSelector = ({
courseTableMode, courseTableMode,
onStudentAmountLimitChange, onStudentAmountLimitChange,
setCourseTableMode, setCourseTableMode,
curriculum,
studentAmountLimit, studentAmountLimit,
}: CourseTableModeSelectorProps) => ( }: CourseTableModeSelectorProps) => {
<RadioGroup> const { curriculum } = useCurriculum()
<FormControlLabel
control={ return (
<Radio <RadioGroup>
checked={courseTableMode === 'curriculum'}
onChange={() => setCourseTableMode('curriculum')}
size="small"
/>
}
label={
<Stack flexDirection="row" gap={1} sx={{ alignContent: 'center' }}>
<Typography fontWeight={500}>Curriculum</Typography>
<Typography
fontWeight={800}
sx={{
color: courseTableMode === 'curriculum' ? 'text.primary' : 'text.disabled',
}}
>
{curriculum?.name ?? 'unavailable'}
</Typography>
</Stack>
}
/>
<Stack direction="row" sx={{ alignItems: 'center', mt: '0.5em' }}>
<FormControlLabel <FormControlLabel
control={ control={
<> <Radio
<Radio checked={courseTableMode === 'all'} onChange={() => setCourseTableMode('all')} size="small" /> checked={courseTableMode === 'curriculum'}
<StudentAmountLimiter onChange={() => setCourseTableMode('curriculum')}
disabled={courseTableMode !== 'all'} size="small"
onStudentAmountLimitChange={value => onStudentAmountLimitChange(value.toString())} />
studentAmountLimit={studentAmountLimit} }
/> label={
</> <Stack flexDirection="row" gap={1} sx={{ alignContent: 'center' }}>
<Typography fontWeight={500}>Curriculum</Typography>
<Typography
fontWeight={800}
sx={{
color: courseTableMode === 'curriculum' ? 'text.primary' : 'text.disabled',
}}
>
{curriculum?.name ?? 'unavailable'}
</Typography>
</Stack>
} }
label=""
value={'all'}
/> />
</Stack> <Stack direction="row" sx={{ alignItems: 'center', mt: '0.5em' }}>
</RadioGroup> <FormControlLabel
) control={
<>
<Radio checked={courseTableMode === 'all'} onChange={() => setCourseTableMode('all')} size="small" />
<StudentAmountLimiter
disabled={courseTableMode !== 'all'}
onStudentAmountLimitChange={value => onStudentAmountLimitChange(value.toString())}
studentAmountLimit={studentAmountLimit}
/>
</>
}
label=""
value={'all'}
/>
</Stack>
</RadioGroup>
)
}
@@ -5,7 +5,6 @@ import { FilterDegreeCoursesModal } from '@/components/PopulationComponents/Popu
import { PopulationCourseStats } from '@/components/PopulationCourseStats' import { PopulationCourseStats } from '@/components/PopulationCourseStats'
import { PopulationCourseStatsFlat } from '@/components/PopulationCourseStats/PopulationCourseStatsFlat' import { PopulationCourseStatsFlat } from '@/components/PopulationCourseStats/PopulationCourseStatsFlat'
import { SegmentDimmer } from '@/components/SegmentDimmer' import { SegmentDimmer } from '@/components/SegmentDimmer'
import { ExtendedCurriculumDetails } from '@/hooks/useCurriculums'
import { PopulationQuery } from '@/types/populationSearch' import { PopulationQuery } from '@/types/populationSearch'
import { FilteredCourse } from '@/util/coursesOfPopulation' import { FilteredCourse } from '@/util/coursesOfPopulation'
@@ -14,7 +13,6 @@ export const PopulationCourses = ({
query, query,
filteredCourses, filteredCourses,
onlyIamRights, onlyIamRights,
curriculum,
courseTableMode, courseTableMode,
studentAmountLimit, studentAmountLimit,
setShowModules, setShowModules,
@@ -24,7 +22,6 @@ export const PopulationCourses = ({
query: Pick<PopulationQuery, 'programme' | 'years'> query: Pick<PopulationQuery, 'programme' | 'years'>
filteredCourses: FilteredCourse[] filteredCourses: FilteredCourse[]
onlyIamRights: boolean onlyIamRights: boolean
curriculum: ExtendedCurriculumDetails
courseTableMode: 'curriculum' | 'all' courseTableMode: 'curriculum' | 'all'
studentAmountLimit: number studentAmountLimit: number
setShowModules: (input: boolean) => void setShowModules: (input: boolean) => void
@@ -47,7 +44,6 @@ export const PopulationCourses = ({
{courseTableMode === 'curriculum' ? ( {courseTableMode === 'curriculum' ? (
<PopulationCourseStats <PopulationCourseStats
courseTableMode={courseTableMode} courseTableMode={courseTableMode}
curriculum={curriculum}
filteredCourses={filteredCourses} filteredCourses={filteredCourses}
onlyIamRights={onlyIamRights} onlyIamRights={onlyIamRights}
pending={isLoading} pending={isLoading}
@@ -6,14 +6,13 @@ import { OodiTableExcelExport } from '@/components/OodiTable/excelExport'
import { IncludeSubstitutionsToggle } from '@/components/PopulationComponents/Students/IncludeSubstitutionsToggle' import { IncludeSubstitutionsToggle } from '@/components/PopulationComponents/Students/IncludeSubstitutionsToggle'
import { useGetColumnDefinitions } from '@/components/PopulationComponents/Students/Table/CoursesTab/columnDefinitions' import { useGetColumnDefinitions } from '@/components/PopulationComponents/Students/Table/CoursesTab/columnDefinitions'
import { useToggle } from '@/hooks/toggle' import { useToggle } from '@/hooks/toggle'
import { ExtendedCurriculumDetails } from '@/hooks/useCurriculums' import { useCurriculum } from '@/hooks/useCurriculum'
import { FilteredCourse } from '@/util/coursesOfPopulation' import { FilteredCourse } from '@/util/coursesOfPopulation'
import { CreditTypeCode, Name, ProgrammeCourse } from '@oodikone/shared/types' import { CreditTypeCode, Name, ProgrammeCourse } from '@oodikone/shared/types'
import { FormattedStudent, StudentCourse } from '@oodikone/shared/types/studentData' import { FormattedStudent, StudentCourse } from '@oodikone/shared/types/studentData'
import { FilterDegreeCoursesModal } from '@/components/PopulationComponents/PopulationCourses/FilterDegreeCoursesModal' import { FilterDegreeCoursesModal } from '@/components/PopulationComponents/PopulationCourses/FilterDegreeCoursesModal'
type CoursesTabContainerProps = { type CoursesTabContainerProps = {
curriculum: ExtendedCurriculumDetails
students: FormattedStudent[] students: FormattedStudent[]
courses: FilteredCourse[] courses: FilteredCourse[]
idToGroupIdMap: Record<string, string> idToGroupIdMap: Record<string, string>
@@ -263,13 +262,8 @@ const gradeOrdering = ['0', 'Hyl.', 'TT', 'HT', '1', '2', '3', '4', '5', 'Hyv.']
const compareCourseGrades = (previous: StudentCourse, current: StudentCourse) => const compareCourseGrades = (previous: StudentCourse, current: StudentCourse) =>
gradeOrdering.indexOf(previous.grade) <= gradeOrdering.indexOf(current.grade) gradeOrdering.indexOf(previous.grade) <= gradeOrdering.indexOf(current.grade)
export const CoursesTabContainer = ({ export const CoursesTabContainer = ({ students, courses, idToGroupIdMap, programme }: CoursesTabContainerProps) => {
curriculum, const { curriculum } = useCurriculum()
students,
courses,
idToGroupIdMap,
programme,
}: CoursesTabContainerProps) => {
const { visible: namesVisible } = useStudentNameVisibility() const { visible: namesVisible } = useStudentNameVisibility()
const [includeSubstitutions, toggleIncludeSubstitutions] = useToggle(true) const [includeSubstitutions, toggleIncludeSubstitutions] = useToggle(true)
@@ -279,7 +273,10 @@ export const CoursesTabContainer = ({
) )
const curriculumCourses = useMemo( const curriculumCourses = useMemo(
() => [...curriculum.defaultProgrammeCourses, ...curriculum.secondProgrammeCourses].filter(nonVisible), () =>
curriculum
? [...curriculum.defaultProgrammeCourses, ...curriculum.secondProgrammeCourses].filter(nonVisible)
: [],
[curriculum] [curriculum]
) )
@@ -1,7 +1,7 @@
import { useMemo } from 'react' import { useMemo } from 'react'
import { ModulesTab } from '@/components/PopulationComponents/Students/Table/ModulesTab/ModulesTable' import { ModulesTab } from '@/components/PopulationComponents/Students/Table/ModulesTab/ModulesTable'
import { ExtendedCurriculumDetails } from '@/hooks/useCurriculums' import { useCurriculum } from '@/hooks/useCurriculum'
import { FilteredCourse } from '@/util/coursesOfPopulation' import { FilteredCourse } from '@/util/coursesOfPopulation'
import { createLocaleComparator } from '@/util/comparator' import { createLocaleComparator } from '@/util/comparator'
import { formatISODate } from '@/util/timeAndDate' import { formatISODate } from '@/util/timeAndDate'
@@ -86,18 +86,17 @@ const getDegreeProgrammeCodes = (curriculumModules): string[] => {
} }
export const ModulesTabContainer = ({ export const ModulesTabContainer = ({
curriculum,
students, students,
courses, courses,
idToGroupIdMap, idToGroupIdMap,
programme, programme,
}: { }: {
curriculum: ExtendedCurriculumDetails | null | undefined
students: Student[] students: Student[]
courses: FilteredCourse[] courses: FilteredCourse[]
idToGroupIdMap: Record<string, string> idToGroupIdMap: Record<string, string>
programme: string programme: string
}) => { }) => {
const { curriculum } = useCurriculum()
const curriculumModules = useMemo( const curriculumModules = useMemo(
() => (curriculum ? [...curriculum.defaultProgrammeModules, ...curriculum.secondProgrammeModules] : []), () => (curriculum ? [...curriculum.defaultProgrammeModules, ...curriculum.secondProgrammeModules] : []),
[curriculum] [curriculum]
@@ -17,7 +17,7 @@ import { CopyStudentNumbersHeader } from '@/components/OodiTable/common/CopyStud
import { OodiTableExcelExport } from '@/components/OodiTable/excelExport' import { OodiTableExcelExport } from '@/components/OodiTable/excelExport'
import { TableInfo } from '@/components/PopulationComponents/Students/Table/ProgressTab/info' import { TableInfo } from '@/components/PopulationComponents/Students/Table/ProgressTab/info'
import { DateFormat } from '@/constants/date' import { DateFormat } from '@/constants/date'
import { ExtendedCurriculumDetails } from '@/hooks/useCurriculums' import { useCurriculum } from '@/hooks/useCurriculum'
import { useSemesters } from '@/hooks/useSemesters' import { useSemesters } from '@/hooks/useSemesters'
import { useGetProgressCriteriaQuery } from '@/redux/progressCriteria' import { useGetProgressCriteriaQuery } from '@/redux/progressCriteria'
import { CheckIcon, CloseIcon, EditIcon, RemoveIcon, SwapHorizIcon } from '@/theme' import { CheckIcon, CloseIcon, EditIcon, RemoveIcon, SwapHorizIcon } from '@/theme'
@@ -226,14 +226,12 @@ type Label = {
} }
export const ProgressTable = ({ export const ProgressTable = ({
curriculum,
idToGroupIdMap, idToGroupIdMap,
students, students,
months, months,
programme, programme,
studyGuidanceGroupProgramme, studyGuidanceGroupProgramme,
}: { }: {
curriculum?: ExtendedCurriculumDetails | null
idToGroupIdMap: IdToGroupId idToGroupIdMap: IdToGroupId
students: FormattedStudent[] students: FormattedStudent[]
months: number months: number
@@ -242,6 +240,7 @@ export const ProgressTable = ({
}) => { }) => {
const { visible: namesVisible } = useStudentNameVisibility() const { visible: namesVisible } = useStudentNameVisibility()
const { getTextIn } = useLanguage() const { getTextIn } = useLanguage()
const { curriculum } = useCurriculum()
const { data: criteria } = useGetProgressCriteriaQuery({ programmeCode: programme }, { skip: !programme }) const { data: criteria } = useGetProgressCriteriaQuery({ programmeCode: programme }, { skip: !programme })
const { semesters: allSemesters } = useSemesters() const { semesters: allSemesters } = useSemesters()
const isStudyGuidanceGroupProgramme = studyGuidanceGroupProgramme !== '' const isStudyGuidanceGroupProgramme = studyGuidanceGroupProgramme !== ''
@@ -13,7 +13,6 @@ import { type FormattedStudentData, GeneralTab } from '@/components/PopulationCo
import { ModulesTabContainer as ModulesTab } from '@/components/PopulationComponents/Students/Table/ModulesTab' import { ModulesTabContainer as ModulesTab } from '@/components/PopulationComponents/Students/Table/ModulesTab'
import { ProgressTable as ProgressTab } from '@/components/PopulationComponents/Students/Table/ProgressTab' import { ProgressTable as ProgressTab } from '@/components/PopulationComponents/Students/Table/ProgressTab'
import { TagsTab } from '@/components/PopulationComponents/Students/Table/TagsTab' import { TagsTab } from '@/components/PopulationComponents/Students/Table/TagsTab'
import { ExtendedCurriculumDetails } from '@/hooks/useCurriculums'
import { FilteredCourse } from '@/util/coursesOfPopulation' import { FilteredCourse } from '@/util/coursesOfPopulation'
import { useParseQueryParams } from '@/util/queryparams' import { useParseQueryParams } from '@/util/queryparams'
import { isBachelorOrLicentiateProgramme } from '@/util/studyProgramme' import { isBachelorOrLicentiateProgramme } from '@/util/studyProgramme'
@@ -29,7 +28,6 @@ type PopulationDetails = CommonProps & {
variant: 'population' variant: 'population'
programme: string programme: string
combinedProgramme?: string combinedProgramme?: string
curriculum: ExtendedCurriculumDetails | null
filteredCourses: FilteredCourse[] filteredCourses: FilteredCourse[]
idToGroupIdMap: Record<string, string> idToGroupIdMap: Record<string, string>
} }
@@ -40,7 +38,6 @@ type CoursePopulation = CommonProps & {
type StudyGuidanceGroup = CommonProps & { type StudyGuidanceGroup = CommonProps & {
variant: 'studyGuidanceGroupPopulation' variant: 'studyGuidanceGroupPopulation'
curriculum: ExtendedCurriculumDetails | null
studyGuidanceGroup: any studyGuidanceGroup: any
year: string year: string
filteredCourses: FilteredCourse[] filteredCourses: FilteredCourse[]
@@ -63,7 +60,6 @@ export const PopulationStudents = ({
variant, variant,
programme, programme,
combinedProgramme, combinedProgramme,
curriculum,
filteredStudents, filteredStudents,
filteredCourses, filteredCourses,
idToGroupIdMap, idToGroupIdMap,
@@ -101,7 +97,6 @@ export const PopulationStudents = ({
Courses: ( Courses: (
<CoursesTab <CoursesTab
courses={filteredCourses ?? []} courses={filteredCourses ?? []}
curriculum={curriculum} // TODO: add guard for missing curriculum (it should never be missing)
idToGroupIdMap={idToGroupIdMap ?? {}} idToGroupIdMap={idToGroupIdMap ?? {}}
students={filteredStudents} students={filteredStudents}
programme={programme} programme={programme}
@@ -110,7 +105,6 @@ export const PopulationStudents = ({
Modules: ( Modules: (
<ModulesTab <ModulesTab
courses={filteredCourses ?? []} courses={filteredCourses ?? []}
curriculum={curriculum}
idToGroupIdMap={idToGroupIdMap ?? {}} idToGroupIdMap={idToGroupIdMap ?? {}}
students={filteredStudents} students={filteredStudents}
programme={programme} programme={programme}
@@ -119,7 +113,6 @@ export const PopulationStudents = ({
Tags: <TagsTab combinedProgramme={combinedProgramme} programme={programme} students={filteredStudents} />, Tags: <TagsTab combinedProgramme={combinedProgramme} programme={programme} students={filteredStudents} />,
Progress: ( Progress: (
<ProgressTab <ProgressTab
curriculum={curriculum}
idToGroupIdMap={idToGroupIdMap ?? {}} idToGroupIdMap={idToGroupIdMap ?? {}}
months={months ?? Infinity} months={months ?? Infinity}
programme={programme} programme={programme}
@@ -5,7 +5,7 @@ import { useState, useEffect } from 'react'
import { GradeDistribution } from '@/components/PopulationCourseStats/GradeDistribution' import { GradeDistribution } from '@/components/PopulationCourseStats/GradeDistribution'
import { PassFailEnrollments } from '@/components/PopulationCourseStats/PassFailEnrollments' import { PassFailEnrollments } from '@/components/PopulationCourseStats/PassFailEnrollments'
import { PassingSemesters } from '@/components/PopulationCourseStats/PassingSemesters' import { PassingSemesters } from '@/components/PopulationCourseStats/PassingSemesters'
import { ExtendedCurriculumDetails } from '@/hooks/useCurriculums' import { useCurriculum } from '@/hooks/useCurriculum'
import { FilteredCourse, CourseModule, FilteredProgrammeCourse } from '@/util/coursesOfPopulation' import { FilteredCourse, CourseModule, FilteredProgrammeCourse } from '@/util/coursesOfPopulation'
import type { CourseStats } from '@oodikone/shared/routes/populations' import type { CourseStats } from '@oodikone/shared/routes/populations'
import type { Module, CurriculumDetails } from '@oodikone/shared/types' import type { Module, CurriculumDetails } from '@oodikone/shared/types'
@@ -14,7 +14,6 @@ type PopulationCourseStatsProps = {
filteredCourses: FilteredCourse[] filteredCourses: FilteredCourse[]
pending: boolean pending: boolean
onlyIamRights: boolean onlyIamRights: boolean
curriculum: ExtendedCurriculumDetails
courseTableMode: 'all' | 'curriculum' courseTableMode: 'all' | 'curriculum'
showModules: boolean showModules: boolean
setShowModules: (input: boolean) => void setShowModules: (input: boolean) => void
@@ -33,15 +32,17 @@ export const PopulationCourseStats = ({
filteredCourses, filteredCourses,
pending, pending,
onlyIamRights, onlyIamRights,
curriculum,
courseTableMode, courseTableMode,
showModules, showModules,
setShowModules, setShowModules,
}: PopulationCourseStatsProps) => { }: PopulationCourseStatsProps) => {
const { curriculum } = useCurriculum()
const [modules, setModules] = useState<CourseModule[]>([]) const [modules, setModules] = useState<CourseModule[]>([])
const [tab, setTab] = useState(0) const [tab, setTab] = useState(0)
useEffect(() => { useEffect(() => {
if (!curriculum) return
// Change courses type from FilteredCourse[] to FilteredProgrammeCourse[] + add module-field to object so we can deconstruct it below // Change courses type from FilteredCourse[] to FilteredProgrammeCourse[] + add module-field to object so we can deconstruct it below
const modules: Record< const modules: Record<
string, string,
@@ -128,14 +128,12 @@ const PopulationDetailsContent = ({
<> <>
<CourseTableModeSelector <CourseTableModeSelector
courseTableMode={courseTableMode} courseTableMode={courseTableMode}
curriculum={curriculum}
onStudentAmountLimitChange={onStudentAmountLimitChange} onStudentAmountLimitChange={onStudentAmountLimitChange}
setCourseTableMode={setCourseTableMode} setCourseTableMode={setCourseTableMode}
studentAmountLimit={studentAmountLimit} studentAmountLimit={studentAmountLimit}
/> />
<PopulationCourses <PopulationCourses
courseTableMode={courseTableMode} courseTableMode={courseTableMode}
curriculum={curriculum}
filteredCourses={filteredCourses} filteredCourses={filteredCourses}
isLoading={isLoading} isLoading={isLoading}
onlyIamRights={onlyIamRights} onlyIamRights={onlyIamRights}
@@ -153,7 +151,6 @@ const PopulationDetailsContent = ({
content: ( content: (
<PopulationStudents <PopulationStudents
combinedProgramme={combinedProgramme} combinedProgramme={combinedProgramme}
curriculum={curriculum}
filteredCourses={filteredCourses} filteredCourses={filteredCourses}
filteredStudents={filteredStudents} filteredStudents={filteredStudents}
idToGroupIdMap={idToGroupIdMap} idToGroupIdMap={idToGroupIdMap}
@@ -124,7 +124,6 @@ const SingleStudyGuidanceGroupPanelsContent = ({
title: 'Courses of population', title: 'Courses of population',
content: ( content: (
<StudyGuidanceGroupPopulationCourses <StudyGuidanceGroupPopulationCourses
curriculum={curriculum}
filteredCourses={filteredCourses} filteredCourses={filteredCourses}
studyProgramme={group.tags?.studyProgramme ? programme : null} studyProgramme={group.tags?.studyProgramme ? programme : null}
year={groupYear} year={groupYear}
@@ -136,7 +135,6 @@ const SingleStudyGuidanceGroupPanelsContent = ({
content: ( content: (
// @ts-expect-error FIX typing // @ts-expect-error FIX typing
<PopulationStudents <PopulationStudents
curriculum={curriculum}
filteredCourses={filteredCourses} filteredCourses={filteredCourses}
filteredStudents={filteredStudents} filteredStudents={filteredStudents}
generalTabColumnFunction={() => columnsGeneralTab({ group })} generalTabColumnFunction={() => columnsGeneralTab({ group })}
@@ -6,7 +6,7 @@ import { PopulationCourseStats } from '@/components/PopulationCourseStats'
import { PopulationCourseStatsFlat } from '@/components/PopulationCourseStats/PopulationCourseStatsFlat' import { PopulationCourseStatsFlat } from '@/components/PopulationCourseStats/PopulationCourseStatsFlat'
import { useDebouncedState } from '@/hooks/debouncedState' import { useDebouncedState } from '@/hooks/debouncedState'
export const StudyGuidanceGroupPopulationCourses = ({ filteredCourses, studyProgramme, year, curriculum }) => { export const StudyGuidanceGroupPopulationCourses = ({ filteredCourses, studyProgramme, year }) => {
const [studentAmountLimit, setStudentAmountLimit] = useDebouncedState(0, 1000) const [studentAmountLimit, setStudentAmountLimit] = useDebouncedState(0, 1000)
const curriculumsAvailable = studyProgramme && year const curriculumsAvailable = studyProgramme && year
const [courseTableMode, setCourseTableMode] = useState<'all' | 'curriculum'>( const [courseTableMode, setCourseTableMode] = useState<'all' | 'curriculum'>(
@@ -23,7 +23,6 @@ export const StudyGuidanceGroupPopulationCourses = ({ filteredCourses, studyProg
{curriculumsAvailable ? ( {curriculumsAvailable ? (
<CourseTableModeSelector <CourseTableModeSelector
courseTableMode={courseTableMode} courseTableMode={courseTableMode}
curriculum={curriculum}
onStudentAmountLimitChange={onStudentAmountLimitChange} onStudentAmountLimitChange={onStudentAmountLimitChange}
setCourseTableMode={setCourseTableMode} setCourseTableMode={setCourseTableMode}
studentAmountLimit={studentAmountLimit} studentAmountLimit={studentAmountLimit}
@@ -37,7 +36,6 @@ export const StudyGuidanceGroupPopulationCourses = ({ filteredCourses, studyProg
{courseTableMode === 'curriculum' ? ( {courseTableMode === 'curriculum' ? (
<PopulationCourseStats <PopulationCourseStats
courseTableMode={courseTableMode} courseTableMode={courseTableMode}
curriculum={curriculum}
filteredCourses={filteredCourses} filteredCourses={filteredCourses}
onlyIamRights={onlyIamRights} onlyIamRights={onlyIamRights}
pending={false} pending={false}
@@ -30,7 +30,7 @@ export const CurriculumProvider = ({
return <CurriculumContext.Provider value={value}>{children}</CurriculumContext.Provider> return <CurriculumContext.Provider value={value}>{children}</CurriculumContext.Provider>
} }
/** Context variant of the curriculum hook */ /** Context-aware variant of the curriculum hook. Use this in population statistics views. */
export const useCurriculum = () => { export const useCurriculum = () => {
const context = useContext(CurriculumContext) const context = useContext(CurriculumContext)
if (!context) { if (!context) {