diff --git a/src/components/UserCard.tsx b/src/components/UserCard.tsx
index cd5faaaf..1580272d 100644
--- a/src/components/UserCard.tsx
+++ b/src/components/UserCard.tsx
@@ -157,7 +157,7 @@ const UserCard = ({user, loggedInUser, onClose, onViewStudents, onViewTeachers,
{
icon: ,
value: stats.length,
- label: "Exercises",
+ label: "Modules",
},
{
icon: ,
diff --git a/src/dashboards/Student.tsx b/src/dashboards/Student.tsx
index 40b376b0..3e5f5999 100644
--- a/src/dashboards/Student.tsx
+++ b/src/dashboards/Student.tsx
@@ -13,7 +13,7 @@ import {CorporateUser, User} from "@/interfaces/user";
import useExamStore from "@/stores/examStore";
import {getExamById} from "@/utils/exams";
import {getUserCorporate} from "@/utils/groups";
-import {MODULE_ARRAY, sortByModule, sortByModuleName} from "@/utils/moduleUtils";
+import {countExamModules, countFullExams, MODULE_ARRAY, sortByModule, sortByModuleName} from "@/utils/moduleUtils";
import {getLevelLabel, getLevelScore} from "@/utils/score";
import {averageScore, groupBySession} from "@/utils/stats";
import {CreateOrderActions, CreateOrderData, OnApproveActions, OnApproveData, OrderResponseBody} from "@paypal/paypal-js";
@@ -84,16 +84,16 @@ export default function StudentDashboard({user}: Props) {
user={user}
items={[
{
- icon: ,
- value: Object.keys(groupBySession(stats)).length,
+ icon: ,
+ value: countFullExams(stats),
label: "Exams",
tooltip: "Number of all conducted completed exams",
},
{
- icon: ,
- value: stats.length,
- label: "Exercises",
- tooltip: "Number of all conducted exercises including Level Test",
+ icon: ,
+ value: countExamModules(stats),
+ label: "Modules",
+ tooltip: "Number of all exam modules performed including Level Test",
},
{
icon: ,
diff --git a/src/pages/stats.tsx b/src/pages/stats.tsx
index fdb36314..e19324c9 100644
--- a/src/pages/stats.tsx
+++ b/src/pages/stats.tsx
@@ -14,7 +14,7 @@ import {Module} from "@/interfaces";
import ProgressBar from "@/components/Low/ProgressBar";
import Layout from "@/components/High/Layout";
import {calculateAverageLevel, calculateBandScore} from "@/utils/score";
-import {MODULE_ARRAY, sortByModule} from "@/utils/moduleUtils";
+import {countExamModules, countFullExams, MODULE_ARRAY, sortByModule} from "@/utils/moduleUtils";
import {Chart} from "react-chartjs-2";
import useUsers from "@/hooks/useUsers";
import Select from "react-select";
@@ -39,7 +39,7 @@ export const getServerSideProps = withIronSessionSsr(({req, res}) => {
redirect: {
destination: "/login",
permanent: false,
- }
+ },
};
}
@@ -48,7 +48,7 @@ export const getServerSideProps = withIronSessionSsr(({req, res}) => {
redirect: {
destination: "/",
permanent: false,
- }
+ },
};
}
@@ -164,21 +164,21 @@ export default function Stats() {
items={[
{
icon: ,
- value: Object.keys(groupBySession(userStats)).length,
+ value: countFullExams(userStats),
label: "Exams",
- tooltip: 'Number of all conducted completed exams',
+ tooltip: "Number of all conducted completed exams",
},
{
icon: ,
- value: userStats.length,
- label: "Exercises",
- tooltip: 'Number of all conducted exercises including Level Test',
+ value: countExamModules(userStats),
+ label: "Modules",
+ tooltip: "Number of all exam modules performed including Level Test",
},
{
icon: ,
value: `${userStats.length > 0 ? averageScore(userStats) : 0}%`,
label: "Average Score",
- tooltip: 'Average success rate for questions responded',
+ tooltip: "Average success rate for questions responded",
},
]}
/>
diff --git a/src/utils/moduleUtils.ts b/src/utils/moduleUtils.ts
index 8abafbd8..9fd8ccf8 100644
--- a/src/utils/moduleUtils.ts
+++ b/src/utils/moduleUtils.ts
@@ -1,5 +1,8 @@
import {Module} from "@/interfaces";
import {Exercise} from "@/interfaces/exam";
+import {Stat} from "@/interfaces/user";
+import {uniq} from "lodash";
+import {groupBySession} from "./stats";
export const MODULE_ARRAY: Module[] = ["reading", "listening", "writing", "speaking", "level"];
@@ -29,3 +32,30 @@ export const countExercises = (exercises: Exercise[]) => {
return lengthMap.reduce((accumulator, current) => accumulator + current, 0);
};
+
+export const countFullExams = (stats: Stat[]) => {
+ const sessionExams = groupBySession(stats);
+ return Object.keys(sessionExams).filter((x) => {
+ const sessionStats = sessionExams[x as keyof typeof sessionExams];
+ const sessionModules = uniq(sessionStats.map((x) => x.module));
+
+ return (
+ sessionModules.includes("reading") &&
+ sessionModules.includes("listening") &&
+ sessionModules.includes("writing") &&
+ sessionModules.includes("speaking")
+ );
+ }).length;
+};
+
+export const countExamModules = (stats: Stat[]) => {
+ const sessionExams = groupBySession(stats);
+ const modulesPerSession = Object.keys(sessionExams).map((x) => {
+ const sessionStats = sessionExams[x as keyof typeof sessionExams];
+ const sessionModules = uniq(sessionStats.map((x) => x.module));
+
+ return sessionModules.length;
+ });
+
+ return modulesPerSession.reduce((acc, curr) => curr + acc, 0);
+};