diff --git a/src/components/CourseDetailPanel.tsx b/src/components/CourseDetailPanel.tsx index 9456179..577283d 100644 --- a/src/components/CourseDetailPanel.tsx +++ b/src/components/CourseDetailPanel.tsx @@ -1,4 +1,4 @@ -import type { Course } from '@/types/course'; +import type { Course, Prereq } from '@/types/course'; import { useEffect, useRef } from 'react'; interface Props { @@ -16,6 +16,82 @@ interface Props { // open/close behaviour (renders nothing when `course` is null), and the drawer // shell. Rendering the actual course fields and styling is in scope for the ticket. +function renderPrereq(node: Prereq, isRoot: boolean): React.ReactNode { + switch (node.kind) { + case 'course': { + if (node.minGrade !== undefined) { + return ( + + {node.code} [Grade ≥ {node.minGrade}] + + ); + } + + return {node.code}; + } + + case 'all': { + if (node.of.length === 1) { + return renderPrereq(node.of[0], false); + } + + return ( + <> +

{isRoot ? 'Complete all of the following: ' : 'All of: '}

+ + + ); + } + + case 'any': { + if (node.of.length === 1) { + return renderPrereq(node.of[0], false); + } + + return ( + <> +

{isRoot ? 'Complete any of the following: ' : 'Any of: '}

+ + + ); + } + + case 'credits': { + return ( + <> +

+ {isRoot + ? `Complete ${node.credits} credit(s) from:` + : `${node.credits} credit(s) from:`} +

+ + + ); + } + + case 'raw': { + return {node.text}; + } + + default: { + const _exhaustive: never = node; + return _exhaustive; + } + } +} + export default function CourseDetailPanel({ course, onClose }: Props) { const panelRef = useRef(null); const prevFocusRef = useRef(null); @@ -84,10 +160,32 @@ export default function CourseDetailPanel({ course, onClose }: Props) { )} + {course.prereqRaw && course.prereq && ( +
+

Prerequisite(s)

+

Calendar text

+

{course.prereqRaw}

+ {course.prereq.kind !== 'raw' && ( + <> +

Structured view

+
{renderPrereq(course.prereq, true)}
+ + )} +
+ )} + {course.prereqRaw && ( +
+

Prerequisite(s)

+

Calendar text

+

{course.prereqRaw}

+
+ )} + + {course.prereqRaw === '' && course.prereq === null && (

Prerequisite(s)

-

{course.prereqRaw}

+

None

)}