/* eslint-disable @next/next/no-img-element */ import Layout from "@/components/High/Layout"; import IconCard from "@/dashboards/IconCard"; import {Module} from "@/interfaces"; import {EntityWithRoles} from "@/interfaces/entity"; import {Assignment} from "@/interfaces/results"; import {Group, Stat, User} from "@/interfaces/user"; import {sessionOptions} from "@/lib/session"; import {dateSorter, filterBy, mapBy, serialize} from "@/utils"; import {getAssignments, getEntitiesAssignments} from "@/utils/assignments.be"; import {getEntitiesWithRoles} from "@/utils/entities.be"; import {getGroups, getGroupsByEntities} 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 {getEntitiesUsers, getUsers} from "@/utils/users.be"; import {withIronSessionSsr} from "iron-session/next"; import {uniqBy} from "lodash"; import moment from "moment"; import Head from "next/head"; import Link from "next/link"; import {useMemo} from "react"; import { BsBank, BsClipboard2Data, BsClock, BsEnvelopePaper, BsPaperclip, BsPencilSquare, BsPeople, BsPeopleFill, BsPersonFill, BsPersonFillGear, } from "react-icons/bs"; import {ToastContainer} from "react-toastify"; interface Props { user: User; users: User[]; entities: EntityWithRoles[]; assignments: Assignment[]; stats: Stat[]; groups: Group[]; } export const getServerSideProps = withIronSessionSsr(async ({req, res}) => { const user = req.session.user as User | undefined; if (!user) { return { redirect: { destination: "/login", permanent: false, }, }; } if (!checkAccess(user, ["admin", "developer"])) return { redirect: { destination: "/dashboard", permanent: false, }, }; const users = await getUsers(); const entities = await getEntitiesWithRoles(); const assignments = await getAssignments(); const stats = await getStatsByUsers(users.map((u) => u.id)); const groups = await getGroups(); return {props: serialize({user, users, entities, assignments, stats, groups})}; }, sessionOptions); export default function Dashboard({user, users, entities, assignments, stats, groups}: Props) { const students = useMemo(() => users.filter((u) => u.type === "student"), [users]); const teachers = useMemo(() => users.filter((u) => u.type === "teacher"), [users]); const corporates = useMemo(() => users.filter((u) => u.type === "corporate"), [users]); const masterCorporates = useMemo(() => users.filter((u) => u.type === "mastercorporate"), [users]); const averageLevelCalculator = (studentStats: Stat[]) => { const formattedStats = studentStats .map((s) => ({ focus: students.find((u) => u.id === s.user)?.focus, score: s.score, module: s.module, })) .filter((f) => !!f.focus); const bandScores = formattedStats.map((s) => ({ module: s.module, level: calculateBandScore(s.score.correct, s.score.total, s.module, s.focus!), })); const levels: {[key in Module]: number} = { reading: 0, listening: 0, writing: 0, speaking: 0, level: 0, }; bandScores.forEach((b) => (levels[b.module] += b.level)); return calculateAverageLevel(levels); }; const UserDisplay = (displayUser: User) => (