@@ -16,6 +16,43 @@ export default function AcademicsSidebar({
1616 subjects,
1717 isSyllabusSelected,
1818} : AcademicsSidebarProps ) {
19+ const formattedSubjects = React . useMemo ( ( ) => {
20+ // Helper: extract Roman numeral from name/code
21+ const getElectiveNumber = ( text ?: string ) : number => {
22+ if ( ! text ) return 99 ;
23+ const match = text . match ( / e l e c t i v e [ - \s ] * ( i { 1 , 3 } | i v | v | v i ) / i) ;
24+ const map : Record < string , number > = {
25+ i : 1 ,
26+ ii : 2 ,
27+ iii : 3 ,
28+ iv : 4 ,
29+ v : 5 ,
30+ vi : 6 ,
31+ } ;
32+ return match ? map [ match [ 1 ] . toLowerCase ( ) ] || 99 : 99 ;
33+ } ;
34+
35+ const normal = subjects . filter (
36+ ( s ) =>
37+ ! s . code ?. toLowerCase ( ) . includes ( "elective" ) &&
38+ ! s . name ?. toLowerCase ( ) . includes ( "elective" )
39+ ) ;
40+
41+ const electives = subjects
42+ . filter (
43+ ( s ) =>
44+ s . code ?. toLowerCase ( ) . includes ( "elective" ) ||
45+ s . name ?. toLowerCase ( ) . includes ( "elective" )
46+ )
47+ . sort (
48+ ( a , b ) =>
49+ getElectiveNumber ( a . code || a . name ) -
50+ getElectiveNumber ( b . code || b . name )
51+ ) ;
52+
53+ return [ ...normal , ...electives ] ;
54+ } , [ subjects ] ) ;
55+
1956 return (
2057 < div className = "h-full flex flex-col bg-card border-r" >
2158 < div className = "p-3 border-b" >
@@ -24,16 +61,16 @@ export default function AcademicsSidebar({
2461
2562 < ScrollArea className = "flex-1" >
2663 < div className = "p-2" >
27- { subjects . length > 0 &&
28- subjects . map ( ( subject ) => (
64+ { formattedSubjects . length > 0 &&
65+ formattedSubjects . map ( ( subject ) => (
2966 < SubjectTreeItem
3067 key = { subject . _id }
3168 subject = { subject }
3269 onFileSelect = { onFileSelect }
3370 />
3471 ) ) }
3572
36- { isSyllabusSelected && subjects . length === 0 && (
73+ { isSyllabusSelected && formattedSubjects . length === 0 && (
3774 < div className = "p-4 text-center text-sm text-muted-foreground" >
3875 No subjects found for this syllabus.
3976 </ div >
0 commit comments