Skip to content

Commit 3d6f063

Browse files
feat(web): update course selection card to show added (#98)
Co-authored-by: Chenxin Yan <[email protected]>
1 parent 701416a commit 3d6f063

File tree

4 files changed

+34
-11
lines changed

4 files changed

+34
-11
lines changed

apps/web/src/app/dashboard/register/page.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ const RegisterPage = () => {
4545
isAuthenticated ? {} : "skip",
4646
);
4747

48+
const selectedClassNumbers = allClasses?.map((c) => c.classNumber) || [];
49+
4850
const { results, status, loadMore } = usePaginatedQuery(
4951
api.courseOfferings.getCourseOfferings,
5052
isAuthenticated && currentTerm && currentYear
@@ -99,6 +101,7 @@ const RegisterPage = () => {
99101
loadMore={loadMore}
100102
status={status}
101103
isSearching={isSearching}
104+
selectedClassNumbers={selectedClassNumbers}
102105
/>
103106
) : (
104107
<div className="h-full">
@@ -117,6 +120,7 @@ const RegisterPage = () => {
117120
loadMore={loadMore}
118121
status={status}
119122
isSearching={isSearching}
123+
selectedClassNumbers={selectedClassNumbers}
120124
/>
121125

122126
<div className="flex-1 min-w-0">

apps/web/src/modules/course-selection/CourseSelector.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ interface CourseSelectorComponentProps {
1919
loadMore: (numItems: number) => void;
2020
status: "LoadingFirstPage" | "CanLoadMore" | "LoadingMore" | "Exhausted";
2121
isSearching?: boolean;
22+
selectedClassNumbers?: number[];
2223
}
2324

2425
const CourseSelector = ({
@@ -29,6 +30,7 @@ const CourseSelector = ({
2930
loadMore,
3031
status,
3132
isSearching = false,
33+
selectedClassNumbers,
3234
}: CourseSelectorComponentProps) => {
3335
const { searchValue: filtersParam, setSearchValue: setFiltersParam } =
3436
useSearchParam({ paramKey: "filters", debounceDelay: 0 });
@@ -162,6 +164,7 @@ const CourseSelector = ({
162164
<CourseCard
163165
course={course}
164166
isExpanded={isExpanded(course.code)}
167+
selectedClassNumbers={selectedClassNumbers}
165168
onToggleExpand={toggleCourseExpansion}
166169
onSectionSelect={handleSectionSelect}
167170
onSectionHover={setHoveredSection}

apps/web/src/modules/course-selection/components/CourseCard.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { CourseSectionItem } from "./CourseSectionItem";
1818
interface CourseCardProps {
1919
course: CourseWithOfferings;
2020
isExpanded: boolean;
21+
selectedClassNumbers?: number[];
2122
onToggleExpand: (courseCode: string) => void;
2223
onSectionSelect?: (offering: CourseOffering) => void;
2324
onSectionHover?: (offering: CourseOffering | null) => void;
@@ -26,6 +27,7 @@ interface CourseCardProps {
2627
export const CourseCard = ({
2728
course,
2829
isExpanded,
30+
selectedClassNumbers,
2931
onToggleExpand,
3032
onSectionSelect,
3133
onSectionHover,
@@ -87,6 +89,7 @@ export const CourseCard = ({
8789
<CourseSectionItem
8890
key={offering._id}
8991
offering={offering}
92+
selectedClassNumbers={selectedClassNumbers}
9093
onSelect={onSectionSelect}
9194
onHover={onSectionHover}
9295
/>

apps/web/src/modules/course-selection/components/CourseSectionItem.tsx

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,18 @@ import type { CourseOffering } from "../types";
33

44
interface CourseSectionItemProps {
55
offering: CourseOffering;
6+
selectedClassNumbers?: number[];
67
onSelect?: (offering: CourseOffering) => void;
78
onHover?: (offering: CourseOffering | null) => void;
89
}
910

1011
export const CourseSectionItem = ({
1112
offering,
13+
selectedClassNumbers,
1214
onSelect,
1315
onHover,
1416
}: CourseSectionItemProps) => {
17+
const isSelected = selectedClassNumbers?.includes(offering.classNumber);
1518
return (
1619
<button
1720
type="button"
@@ -29,18 +32,28 @@ export const CourseSectionItem = ({
2932
<span className="font-semibold text-sm">
3033
Section {offering.section}
3134
</span>
32-
<span
33-
className={clsx(
34-
"text-xs px-2 py-1 rounded-full font-medium capitalize",
35-
offering.status === "open" && "bg-green-100 text-green-800",
36-
offering.status === "closed" && "bg-red-100 text-red-800",
37-
offering.status === "waitlist" && "bg-yellow-100 text-yellow-800",
35+
<div className="flex items-center gap-2">
36+
{isSelected && (
37+
<span
38+
className="text-xs px-2 py-1 rounded-full font-medium bg-violet-100 text-violet-800 dark:bg-violet-900
39+
dark:text-violet-200"
40+
>
41+
Selected
42+
</span>
3843
)}
39-
>
40-
{offering.status === "waitlist"
41-
? `Waitlist (${offering.waitlistNum || 0})`
42-
: offering.status}
43-
</span>
44+
<span
45+
className={clsx(
46+
"text-xs px-2 py-1 rounded-full font-medium capitalize",
47+
offering.status === "open" && "bg-green-100 text-green-800",
48+
offering.status === "closed" && "bg-red-100 text-red-800",
49+
offering.status === "waitlist" && "bg-yellow-100 text-yellow-800",
50+
)}
51+
>
52+
{offering.status === "waitlist"
53+
? `Waitlist (${offering.waitlistNum || 0})`
54+
: offering.status}
55+
</span>
56+
</div>
4457
</div>
4558
<div className="text-xs text-muted-foreground space-y-1">
4659
<div>{offering.instructor}</div>

0 commit comments

Comments
 (0)