/* eslint-disable @next/next/no-img-element */ import Layout from "@/components/High/Layout"; import UserDisplayList from "@/components/UserDisplayList"; import IconCard from "@/components/IconCard"; import { EntityWithRoles } from "@/interfaces/entity"; import { Assignment } from "@/interfaces/results"; import { Group, Stat, Type, User } from "@/interfaces/user"; import { sessionOptions } from "@/lib/session"; import { dateSorter, filterBy, mapBy, redirect, serialize } from "@/utils"; import { requestUser } from "@/utils/api"; import { countEntitiesAssignments, getAssignments } from "@/utils/assignments.be"; import { getEntitiesWithRoles } from "@/utils/entities.be"; import { countGroups, getGroups } from "@/utils/groups.be"; import { checkAccess } from "@/utils/permissions"; import { calculateAverageLevel, calculateBandScore } from "@/utils/score"; import { groupByExam } from "@/utils/stats"; import { getStatsByUsers } from "@/utils/stats.be"; import { countUsers, getUser, getUsers } from "@/utils/users.be"; import { withIronSessionSsr } from "iron-session/next"; import { uniqBy } from "lodash"; import Head from "next/head"; import { useRouter } from "next/router"; import { useMemo } from "react"; import { BsBank, BsClipboard2Data, BsEnvelopePaper, BsPencilSquare, BsPeople, BsPeopleFill, BsPersonFill, BsPersonFillGear, } from "react-icons/bs"; import { ToastContainer } from "react-toastify"; interface Props { user: User; students: User[]; latestStudents: User[] latestTeachers: User[] entities: EntityWithRoles[]; usersCount: { [key in Type]: number } assignmentsCount: number; stats: Stat[]; groupsCount: number; } export const getServerSideProps = withIronSessionSsr(async ({ req, res }) => { const user = await requestUser(req, res) if (!user) return redirect("/login") if (!checkAccess(user, ["admin", "developer"])) return redirect("/") const students = await getUsers({ type: 'student' }); const usersCount = { student: await countUsers({ type: "student" }), teacher: await countUsers({ type: "teacher" }), corporate: await countUsers({ type: "corporate" }), mastercorporate: await countUsers({ type: "mastercorporate" }), } const latestStudents = await getUsers({ type: 'student' }, 10, { registrationDate: -1 }) const latestTeachers = await getUsers({ type: 'teacher' }, 10, { registrationDate: -1 }) const entities = await getEntitiesWithRoles(); const assignmentsCount = await countEntitiesAssignments(mapBy(entities, 'id'), { archived: { $ne: true } }); const groupsCount = await countGroups(); const stats = await getStatsByUsers(mapBy(students, 'id')); return { props: serialize({ user, students, latestStudents, latestTeachers, usersCount, entities, assignmentsCount, stats, groupsCount }) }; }, sessionOptions); export default function Dashboard({ user, students, latestStudents, latestTeachers, usersCount, entities, assignmentsCount, stats, groupsCount }: Props) { const router = useRouter(); return ( <> EnCoach
router.push("/users?type=student")} Icon={BsPersonFill} label="Students" value={usersCount.student} color="purple" /> router.push("/users?type=teacher")} Icon={BsPencilSquare} label="Teachers" value={usersCount.teacher} color="purple" /> router.push("/users?type=corporate")} label="Corporates" value={usersCount.corporate} color="purple" /> router.push("/users?type=mastercorporate")} label="Master Corporates" value={usersCount.mastercorporate} color="purple" /> router.push("/classrooms")} label="Classrooms" value={groupsCount} color="purple" /> router.push("/entities")} label="Entities" value={entities.length} color="purple" /> router.push("/statistical")} label="Entity Statistics" value={entities.length} color="purple" /> router.push("/users/performance")} label="Student Performance" value={students.length} color="purple" /> router.push("/assignments")} label="Assignments" value={assignmentsCount} color="purple" />
calculateAverageLevel(b.levels) - calculateAverageLevel(a.levels))} title="Highest level students" /> Object.keys(groupByExam(filterBy(stats, "user", b))).length - Object.keys(groupByExam(filterBy(stats, "user", a))).length, ) } title="Highest exam count students" />
); }