Skip to content

Commit 02420e6

Browse files
committed
sort subjects according to name in academics sidebar
1 parent 713e680 commit 02420e6

2 files changed

Lines changed: 67 additions & 25 deletions

File tree

app/(main)/academics/AcademicsSidebar.tsx

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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(/elective[-\s]*(i{1,3}|iv|v|vi)/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>

app/(main)/academics/SubjectTreeItem.tsx

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ import { Button } from "@/components/ui/button";
1111
import { Loader2, ChevronRight, Folder, FileText } from "lucide-react";
1212
import { ActiveFile, File } from "@/types/file";
1313
import { Subject } from "@/types/subject";
14-
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
14+
import {
15+
Tooltip,
16+
TooltipContent,
17+
TooltipProvider,
18+
TooltipTrigger,
19+
} from "@/components/ui/tooltip";
1520

1621
// ✨ CHANGED: Imported types
1722

@@ -116,27 +121,27 @@ export function SubjectTreeItem({
116121
return (
117122
<Collapsible onOpenChange={handleOpen} className="group">
118123
<CollapsibleTrigger asChild>
119-
<TooltipProvider>
120-
<CollapsibleTrigger asChild>
121-
<Button variant="ghost" className="w-full justify-start gap-2 pr-2 h-9">
122-
<Tooltip>
123-
<TooltipTrigger asChild>
124-
<span className="flex w-full items-center gap-2">
125-
<Folder className="h-4 w-4" />
126-
<span className="flex-1 text-left truncate font-medium">
127-
{subject.code}
128-
</span>
129-
<ChevronRight className="h-4 w-4 shrink-0 transition-transform duration-200 group-data-[state=open]:rotate-90" />
130-
</span>
131-
</TooltipTrigger>
132-
<TooltipContent>
133-
{subject.name}
134-
</TooltipContent>
135-
</Tooltip>
136-
</Button>
137-
</CollapsibleTrigger>
138-
</TooltipProvider>
139-
124+
<TooltipProvider>
125+
<CollapsibleTrigger asChild>
126+
<Button
127+
variant="ghost"
128+
className="w-full justify-start gap-2 pr-2 h-9"
129+
>
130+
<Tooltip>
131+
<TooltipTrigger asChild>
132+
<span className="flex w-full items-center gap-2">
133+
<Folder className="h-4 w-4" />
134+
<span className="flex-1 text-left truncate font-medium">
135+
{subject.code}
136+
</span>
137+
<ChevronRight className="h-4 w-4 shrink-0 transition-transform duration-200 group-data-[state=open]:rotate-90" />
138+
</span>
139+
</TooltipTrigger>
140+
<TooltipContent>{subject.name}</TooltipContent>
141+
</Tooltip>
142+
</Button>
143+
</CollapsibleTrigger>
144+
</TooltipProvider>
140145
</CollapsibleTrigger>
141146
<CollapsibleContent>
142147
<div className="pl-6 border-l border-muted ml-[11px] py-1 space-y-0.5">

0 commit comments

Comments
 (0)