Spaces:
Running
Running
Update pages/Reports.tsx
Browse files- pages/Reports.tsx +10 -9
pages/Reports.tsx
CHANGED
|
@@ -32,30 +32,31 @@ export const Reports: React.FC = () => {
|
|
| 32 |
// 1. Class Averages
|
| 33 |
// Group students by class
|
| 34 |
const classMap: Record<string, string[]> = {}; // ClassName -> [StudentNos]
|
| 35 |
-
studentData.forEach(s => {
|
| 36 |
if (!classMap[s.className]) classMap[s.className] = [];
|
| 37 |
classMap[s.className].push(s.studentNo);
|
| 38 |
});
|
| 39 |
|
| 40 |
// Calculate avg score for each class (aggregated across all subjects)
|
| 41 |
-
const cData = classData.map(cls => {
|
| 42 |
const fullClassName = cls.grade + cls.className;
|
| 43 |
const studentNos = classMap[fullClassName] || [];
|
| 44 |
// Find scores for these students
|
| 45 |
-
const classScores = scoreData.filter(s => studentNos.includes(s.studentNo));
|
| 46 |
-
const total = classScores.reduce((sum, s) => sum + s.score, 0);
|
| 47 |
const avg = classScores.length > 0 ? Math.round(total / classScores.length) : 0;
|
| 48 |
return { name: fullClassName, avg };
|
| 49 |
});
|
| 50 |
setClassAvgData(cData);
|
| 51 |
|
| 52 |
// 2. Subject Averages
|
| 53 |
-
const subjects = Array.from(new Set(scoreData.map(s => s.courseName)));
|
| 54 |
-
const sData = subjects.map(subj => {
|
| 55 |
-
const
|
| 56 |
-
const
|
|
|
|
| 57 |
const avg = subjScores.length > 0 ? Math.round(total / subjScores.length) : 0;
|
| 58 |
-
return { name:
|
| 59 |
});
|
| 60 |
setSubjectAvgData(sData);
|
| 61 |
|
|
|
|
| 32 |
// 1. Class Averages
|
| 33 |
// Group students by class
|
| 34 |
const classMap: Record<string, string[]> = {}; // ClassName -> [StudentNos]
|
| 35 |
+
studentData.forEach((s: Student) => {
|
| 36 |
if (!classMap[s.className]) classMap[s.className] = [];
|
| 37 |
classMap[s.className].push(s.studentNo);
|
| 38 |
});
|
| 39 |
|
| 40 |
// Calculate avg score for each class (aggregated across all subjects)
|
| 41 |
+
const cData = classData.map((cls: ClassInfo) => {
|
| 42 |
const fullClassName = cls.grade + cls.className;
|
| 43 |
const studentNos = classMap[fullClassName] || [];
|
| 44 |
// Find scores for these students
|
| 45 |
+
const classScores = scoreData.filter((s: Score) => studentNos.includes(s.studentNo));
|
| 46 |
+
const total = classScores.reduce((sum: number, s: Score) => sum + s.score, 0);
|
| 47 |
const avg = classScores.length > 0 ? Math.round(total / classScores.length) : 0;
|
| 48 |
return { name: fullClassName, avg };
|
| 49 |
});
|
| 50 |
setClassAvgData(cData);
|
| 51 |
|
| 52 |
// 2. Subject Averages
|
| 53 |
+
const subjects = Array.from(new Set(scoreData.map((s: Score) => s.courseName)));
|
| 54 |
+
const sData = subjects.map((subj: any) => {
|
| 55 |
+
const subjectName = String(subj);
|
| 56 |
+
const subjScores = scoreData.filter((s: Score) => s.courseName === subjectName);
|
| 57 |
+
const total = subjScores.reduce((sum: number, s: Score) => sum + s.score, 0);
|
| 58 |
const avg = subjScores.length > 0 ? Math.round(total / subjScores.length) : 0;
|
| 59 |
+
return { name: subjectName, avg };
|
| 60 |
});
|
| 61 |
setSubjectAvgData(sData);
|
| 62 |
|