/* 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 ( <> EnCoach
router.push("/users?type=student")} Icon={BsPersonFill} label="Students" value={userCounts.student} color="purple" /> router.push("/users?type=teacher")} Icon={BsPencilSquare} label="Teachers" value={userCounts.teacher} color="purple" /> router.push("/users?type=corporate")} Icon={BsBank} label="Corporate Accounts" value={userCounts.corporate} color="purple" /> router.push("/classrooms")} label="Classrooms" value={groupsCount} color="purple" /> router.push("/entities")} label="Entities" value={`${entities.length} - ${totalCount}/${totalLicenses}`} color="purple" /> {allowedStudentPerformance.length > 0 && ( router.push("/users/performance")} label="Student Performance" value={userCounts.student} color="purple" /> )} {allowedEntityStatistics.length > 0 && ( router.push("/statistical")} label="Entity Statistics" value={allowedEntityStatistics.length} color="purple" /> )} router.push("/assignments")} label="Assignments" value={assignmentsCount} className={clsx(allowedEntityStatistics.length === 0 && "col-span-2")} color="purple" />
dateSorter(a, b, "desc", "registrationDate"))} title="Latest Students" /> dateSorter(a, b, "desc", "registrationDate"))} title="Latest Teachers" /> 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" />
); }