/* eslint-disable @next/next/no-img-element */ import Layout from "@/components/High/Layout"; import UserDisplayList from "@/components/UserDisplayList"; import IconCard from "@/components/IconCard"; import { useAllowedEntities } from "@/hooks/useEntityPermissions"; import { Module } from "@/interfaces"; 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, getEntitiesAssignments } from "@/utils/assignments.be"; import { getEntitiesWithRoles } from "@/utils/entities.be"; import { countGroupsByEntities, getGroupsByEntities } from "@/utils/groups.be"; import { checkAccess, findAllowedEntities } from "@/utils/permissions"; import { calculateAverageLevel, calculateBandScore } from "@/utils/score"; import { groupByExam } from "@/utils/stats"; import { getStatsByUsers } from "@/utils/stats.be"; import { countAllowedUsers, filterAllowedUsers } from "@/utils/users.be"; import { getEntitiesUsers } from "@/utils/users.be"; import { clsx } from "clsx"; 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 { useRouter } from "next/router"; import { useMemo } from "react"; import { BsBank, BsClipboard2Data, BsClock, BsEnvelopePaper, BsPaperclip, BsPencilSquare, BsPeople, BsPeopleFill, BsPersonFill, BsPersonFillGear, } from "react-icons/bs"; import { ToastContainer } from "react-toastify"; import { isAdmin } from "@/utils/users"; interface Props { user: User; users: User[]; userCounts: { [key in Type]: number } entities: EntityWithRoles[]; assignmentsCount: number; stats: Stat[]; groupsCount: number; } export const getServerSideProps = withIronSessionSsr(async ({ req, res }) => { const user = await requestUser(req, res) if (!user || !user.isVerified) return redirect("/login") if (!checkAccess(user, ["admin", "developer", "mastercorporate"])) return redirect("/") const entityIDS = mapBy(user.entities, "id") || []; const entities = await getEntitiesWithRoles(isAdmin(user) ? undefined : entityIDS); const users = await filterAllowedUsers(user, entities) const userCounts = await countAllowedUsers(user, entities) const assignmentsCount = await countEntitiesAssignments(mapBy(entities, "id"), { archived: { $ne: true } }); const groupsCount = await countGroupsByEntities(mapBy(entities, "id")); const stats = await getStatsByUsers(users.map((u) => u.id)); return { props: serialize({ user, users, userCounts, entities, assignmentsCount, stats, groupsCount }) }; }, sessionOptions); export default function Dashboard({ user, users, userCounts, entities, assignmentsCount, stats, groupsCount }: Props) { const students = useMemo(() => users.filter((u) => u.type === "student"), [users]); const teachers = useMemo(() => users.filter((u) => u.type === "teacher"), [users]); const totalCount = useMemo(() => userCounts.corporate + userCounts.mastercorporate + userCounts.student + userCounts.teacher, [userCounts]) const totalLicenses = useMemo(() => entities.reduce((acc, curr) => acc + curr.licenses, 0), [entities]) const router = useRouter(); const allowedEntityStatistics = useAllowedEntities(user, entities, 'view_entity_statistics') const allowedStudentPerformance = useAllowedEntities(user, entities, 'view_student_performance') return ( <>