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: '}
+{isRoot ? 'Complete any of the following: ' : 'Any of: '}
++ {isRoot + ? `Complete ${node.credits} credit(s) from:` + : `${node.credits} credit(s) from:`} +
+{course.prereqRaw}
+ {course.prereq.kind !== 'raw' && ( + <> +{course.prereqRaw}
+{course.prereqRaw}
+None