Skip to content

Commit 120a8e7

Browse files
committed
line graph that displays GPA over time
1 parent 8687579 commit 120a8e7

File tree

4 files changed

+188
-18
lines changed

4 files changed

+188
-18
lines changed

Diff for: package-lock.json

+21-17
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/components/graph/LineGraph/lineGraph.tsx

+164
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
import { Skeleton, ToggleButton, ToggleButtonGroup } from '@mui/material';
2+
import type { ApexOptions } from 'apexcharts';
3+
import React, { useState, useEffect } from 'react';
4+
import Chart from 'react-apexcharts';
5+
6+
import { type SearchQuery, searchQueryLabel } from '@/modules/SearchQuery/SearchQuery';
7+
import type { GenericFetchedData } from '@/pages/dashboard/index';
8+
export type GPATrendType = {
9+
years: string[];
10+
gpa_values: number[];
11+
};
12+
13+
type Props = {
14+
course: SearchQuery;
15+
gpaTrend: GenericFetchedData<GPATrendType>;
16+
};
17+
18+
function GPATrendGraph({ course, gpaTrend }: Props) {
19+
const [chartType, setChartType] = useState<'line' | 'bar'>('line');
20+
const [chartData, setChartData] = useState<{
21+
options: {
22+
chart: {
23+
id: string;
24+
animations: {
25+
enabled: boolean;
26+
easing: string;
27+
speed: number;
28+
};
29+
toolbar: {
30+
show: boolean;
31+
};
32+
};
33+
xaxis: {
34+
categories: string[];
35+
labels: {
36+
rotate: number;
37+
};
38+
};
39+
yaxis: {
40+
min: number;
41+
max: number;
42+
labels: {
43+
formatter: (value: number) => string;
44+
};
45+
};
46+
stroke: {
47+
curve: 'smooth';
48+
};
49+
markers: {
50+
size: number;
51+
};
52+
tooltip: {
53+
y: {
54+
formatter: (value: number) => string;
55+
};
56+
};
57+
};
58+
series: {
59+
name: string;
60+
data: number[];
61+
}[];
62+
}>({
63+
options: {
64+
chart: {
65+
id: 'gpa-trend',
66+
animations: {
67+
enabled: true,
68+
easing: 'easeinout',
69+
speed: 800,
70+
},
71+
toolbar: {
72+
show: false,
73+
},
74+
},
75+
xaxis: {
76+
categories: [] as string[],
77+
labels: {
78+
rotate: -45,
79+
},
80+
},
81+
yaxis: {
82+
min: 1,
83+
max: 4,
84+
labels: {
85+
formatter: (value: number) => value.toFixed(2),
86+
},
87+
},
88+
stroke: {
89+
curve: 'smooth',
90+
},
91+
markers: {
92+
size: 5,
93+
},
94+
tooltip: {
95+
y: {
96+
formatter: (value: number) => value.toFixed(3),
97+
},
98+
},
99+
},
100+
series: [{
101+
name: '',
102+
data: [],
103+
}],
104+
});
105+
106+
useEffect(() => {
107+
if (gpaTrend.state === 'done') {
108+
setChartData({
109+
options: {
110+
...chartData.options,
111+
xaxis: {
112+
categories: gpaTrend.data.years,
113+
labels: { rotate: -45 }
114+
},
115+
},
116+
series: [{
117+
name: searchQueryLabel(course),
118+
data: gpaTrend.data.gpa_values,
119+
}],
120+
});
121+
}
122+
}, [gpaTrend, course]);
123+
124+
const handleChartToggle = (_event: React.MouseEvent<HTMLElement>, newChartType: 'line' | 'bar' | null) => {
125+
if (newChartType) {
126+
setChartType(newChartType);
127+
}
128+
};
129+
130+
if (typeof gpaTrend === 'undefined' || gpaTrend.state === 'error') {
131+
return null;
132+
}
133+
if (gpaTrend.state === 'loading') {
134+
return (
135+
<div className="p-2">
136+
<Skeleton variant="rounded" className="w-full h-60 m-2" />
137+
</div>
138+
);
139+
}
140+
141+
return (
142+
<div className="p-2">
143+
<ToggleButtonGroup
144+
value={chartType}
145+
exclusive
146+
onChange={handleChartToggle}
147+
className="mb-2"
148+
>
149+
<ToggleButton value="bar">📊</ToggleButton>
150+
<ToggleButton value="line">📈</ToggleButton>
151+
</ToggleButtonGroup>
152+
<div className="h-64">
153+
<Chart
154+
options={chartData.options}
155+
series={chartData.series}
156+
type={chartType}
157+
height={250}
158+
/>
159+
</div>
160+
</div>
161+
);
162+
}
163+
164+
export default GPATrendGraph;

Diff for: src/pages/dashboard/index.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -943,4 +943,6 @@ export const Dashboard: NextPage<{ pageTitle: string }> = ({
943943
);
944944
};
945945

946+
947+
946948
export default Dashboard;

Diff for: tsconfig.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"verbatimModuleSyntax": true
2626
},
2727
"include": ["src", "next-env.d.ts", "**/*.ts", "**/*.tsx", "/**/**/*/.tsx"],
28-
"exclude": ["node_modules"],
28+
"exclude": ["node_modules", "**/tailwind.config.js"],
2929
"ts-node": {
3030
"transpileOnly": true,
3131
"moduleTypes": {

0 commit comments

Comments
 (0)