Skip to content

Commit ad1649a

Browse files
committed
merge
2 parents 0bb0497 + 74185de commit ad1649a

File tree

6 files changed

+108
-21
lines changed

6 files changed

+108
-21
lines changed

.DS_Store

6 KB
Binary file not shown.

overload/src/app/CourseFilter.tsx

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
'use client'
2+
import React from 'react';
3+
import { FilterObject } from './course-rating/page';
4+
5+
type CourseFilterProps = {
6+
filterOn: FilterObject;
7+
setFilterOn: React.Dispatch<React.SetStateAction<FilterObject>>;
8+
}
9+
10+
export const CourseFilter = ({ filterOn, setFilterOn }: CourseFilterProps) => {
11+
const handleCheckboxChange = (target: string) => {
12+
setFilterOn(prev => ({ ...prev, [target]: !prev[target] }))
13+
};
14+
15+
16+
return (
17+
<div className="ml-20 mt-5 flex bg-white w-1/4 justify-center rounded-md">
18+
<label className="space-x-10 ml-3 mr-3">
19+
<input
20+
type="checkbox"
21+
checked={filterOn['Term 1']}
22+
onChange={() => handleCheckboxChange('Term 1')}
23+
className="mr-2 ml-2"
24+
/>
25+
Term 1
26+
</label>
27+
<label className="space-x-10 ml-3 mr-3">
28+
<input
29+
type="checkbox"
30+
checked={filterOn['Term 2']}
31+
onChange={() => handleCheckboxChange('Term 2')}
32+
className="mr-2 ml-2"
33+
/>
34+
Term 2
35+
</label>
36+
<label className="-x-10 ml-3 mr-3">
37+
<input
38+
type="checkbox"
39+
checked={filterOn['Term 3']}
40+
onChange={() => handleCheckboxChange('Term 3')}
41+
className="mr-2 ml-2"
42+
/>
43+
Term 3
44+
</label>
45+
</div>
46+
)
47+
}

overload/src/app/api/home/route.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@ import { NextRequest, NextResponse } from 'next/server';
22
import prisma from '../../../../prisma/client';
33

44
export async function GET(request: NextRequest) {
5-
const courses = await prisma.term.findMany({
6-
where: {
7-
term: 'Term 2'
8-
},
5+
const courses = await prisma.course.findMany({
96
include: {
10-
course: true
7+
termsOffered: true
118
}
129
})
1310
return NextResponse.json(courses);

overload/src/app/components/SearchBar.tsx

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
'use client';
2-
import React from 'react';
2+
import React, { useMemo } from 'react';
33
import CourseCard from './CourseCard';
4+
import { CourseFilter } from '../CourseFilter';
5+
import { FilterObject } from '../course-rating/page';
46

57
type Course = {
68
courseCode: string;
79
courseName: string;
10+
termsOffered: Term[]
811
};
912

1013
type Term = {
@@ -14,9 +17,15 @@ type Term = {
1417
course: Course;
1518
};
1619

17-
export const SearchBar = () => {
20+
type SearchBarProps = {
21+
setFilterOn: React.Dispatch<React.SetStateAction<FilterObject>>;
22+
filterOn: FilterObject;
23+
};
24+
25+
26+
export const SearchBar = ({ filterOn, setFilterOn }: SearchBarProps) => {
1827
const [searchTerm, setSearchTerm] = React.useState('');
19-
const [dataList, setDataList] = React.useState([]);
28+
const [dataList, setDataList] = React.useState<Course[]>([]);
2029

2130
React.useEffect(() => {
2231
// Fetch the term list
@@ -31,17 +40,35 @@ export const SearchBar = () => {
3140
});
3241
}, []);
3342

34-
const filteredData: Term[] = dataList.filter((item: Term) =>
35-
item.course.courseName.toLowerCase().includes(searchTerm.toLowerCase()) ||
36-
item.course.courseCode.toLowerCase().includes(searchTerm.toLowerCase())
37-
);
43+
const filteredData = useMemo(() => {
44+
let result = dataList;
45+
46+
// Filter by search
47+
if (searchTerm) {
48+
result = result.filter(item =>
49+
item.courseName.toLowerCase().includes(searchTerm.toLowerCase()) ||
50+
item.courseCode.toLowerCase().includes(searchTerm.toLowerCase())
51+
);
52+
}
53+
54+
// Filter by checkboxes
55+
Object.keys(filterOn).forEach(termKey => {
56+
if (filterOn[termKey]) {
57+
result = result.filter(item =>
58+
item.termsOffered.some(term => term.term === termKey)
59+
);
60+
}
61+
});
62+
63+
return result;
64+
}, [dataList, searchTerm, filterOn]);
3865

3966
const courseCards = filteredData.map((item, idx) => {
4067
return (
4168
<div key={idx}>
4269
<CourseCard
43-
courseCode={item.course.courseCode}
44-
courseName={item.course.courseName}
70+
courseCode={item.courseCode}
71+
courseName={item.courseName}
4572
/>
4673
</div>
4774
);
@@ -58,7 +85,14 @@ export const SearchBar = () => {
5885
onChange={(e) => setSearchTerm(e.target.value)}
5986
/>
6087
</div>
88+
<CourseFilter
89+
setFilterOn={setFilterOn}
90+
filterOn={filterOn}
91+
/>
6192
<ul className="flex flex-wrap justify-center">{courseCards}</ul>
6293
</div>
6394
);
6495
};
96+
97+
// pull filter
98+
// for each thingy

overload/src/app/course-details/[...courseCode]/page.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export default function Page({ params }: { params: { courseCode: string } }) {
1111
doomness: 0,
1212
});
1313
const [isModalOpen, setIsModalOpen] = useState(false);
14+
const doomColors: { [key: number]: string } = { 1: 'bg-green-500', 2: 'bg-yellow-500', 3: 'bg-red-500' }
1415

1516
useEffect(() => {
1617
const populatePage = async () => {
@@ -30,17 +31,15 @@ export default function Page({ params }: { params: { courseCode: string } }) {
3031
}, [params.courseCode]);
3132

3233
return (
33-
<div className="flex bg-black h-screen text-white px-28 py-20 gap-48">
34+
<div className="flex bg-[#221f1f] h-screen text-white px-28 py-20 gap-48">
3435
<div>
3536
<div className="text-4xl font-bold mb-10">{courseData.courseCode}</div>
3637
<div>{courseData.description}</div>
3738
</div>
3839
<div className="flex flex-col items-center flex-grow">
3940
<div className="text-4xl font-bold mb-10">OverLoad Scale</div>
4041
<div
41-
className={`w-80 h-80 rounded-full object-cover ${
42-
courseData.doomness == 1 ? 'bg-green-500' : 'bg-red-500'
43-
}`}
42+
className={`w-80 h-80 rounded-full object-cover ${doomColors[courseData.doomness]}`}
4443
>
4544
<Image src={skullSvg} alt="skull-logo"></Image>
4645
</div>

overload/src/app/course-rating/page.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,29 @@
1+
'use client';
12
import React from 'react'
23
import { SearchBar } from "../components/SearchBar"
4+
5+
export type FilterObject = {
6+
[key: string]: boolean
7+
}
8+
39
export default function CourseRatingPage() {
10+
const [filterOn, setFilterOn] = React.useState<FilterObject>({ 'Term 1': false, 'Term 2': false, 'Term 3': false });
411
return (
5-
<div className="@apply bg-[#221f1f] h-screen">
12+
<div className="@apply bg-[#221f1f] min-h-screen">
613
{/* <NavBar/> */}
714
<h1 className="pt-20 font-sans text-5xl text-white font-semibold p-5 text-left px-20">OverLoad</h1>
8-
<SearchBar/>
15+
<SearchBar
16+
filterOn={filterOn}
17+
setFilterOn={setFilterOn}
18+
/>
919
{/* <SortButton/> */}
1020
</div>
1121
)
1222
}
1323

1424
// Plan
1525
// navbar
16-
// search bar (look at to do list for inspo)
26+
// search bar (look at to do list for inspo)
1727
// array of CourseCards
1828
// sort button
1929
//

0 commit comments

Comments
 (0)