From 1b15a035df6606f10b4b72be8ec07873acad3c27 Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Mon, 23 Dec 2024 09:35:40 +0000 Subject: [PATCH] ENCOA-286 --- src/pages/dashboard/corporate.tsx | 6 ++- src/pages/dashboard/mastercorporate.tsx | 52 +++++++++++++++---------- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/pages/dashboard/corporate.tsx b/src/pages/dashboard/corporate.tsx index 3aa1abc1..40b9c8a2 100644 --- a/src/pages/dashboard/corporate.tsx +++ b/src/pages/dashboard/corporate.tsx @@ -68,6 +68,10 @@ export default function Dashboard({ user, users, userCounts, entities, assignmen 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 allowedEntityStatistics = useAllowedEntities(user, entities, 'view_entity_statistics') const allowedStudentPerformance = useAllowedEntities(user, entities, 'view_student_performance') @@ -117,7 +121,7 @@ export default function Dashboard({ user, users, userCounts, entities, assignmen router.push("/entities")} label="Entities" - value={entities.length} + value={`${entities.length} - ${totalCount}/${totalLicenses}`} color="purple" /> diff --git a/src/pages/dashboard/mastercorporate.tsx b/src/pages/dashboard/mastercorporate.tsx index 8e7d5378..d34f9e1c 100644 --- a/src/pages/dashboard/mastercorporate.tsx +++ b/src/pages/dashboard/mastercorporate.tsx @@ -6,18 +6,18 @@ import { useAllowedEntities } from "@/hooks/useEntityPermissions"; import { Module } from "@/interfaces"; import { EntityWithRoles } from "@/interfaces/entity"; import { Assignment } from "@/interfaces/results"; -import { Group, Stat, User } from "@/interfaces/user"; +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 { getEntitiesAssignments } from "@/utils/assignments.be"; +import { countEntitiesAssignments, getEntitiesAssignments } from "@/utils/assignments.be"; import { getEntitiesWithRoles } from "@/utils/entities.be"; -import { getGroupsByEntities } from "@/utils/groups.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 { filterAllowedUsers } from "@/utils/users.be"; +import { countAllowedUsers, filterAllowedUsers } from "@/utils/users.be"; import { getEntitiesUsers } from "@/utils/users.be"; import { clsx } from "clsx"; import { withIronSessionSsr } from "iron-session/next"; @@ -40,14 +40,16 @@ import { 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[]; - assignments: Assignment[]; + assignmentsCount: number; stats: Stat[]; - groups: Group[]; + groupsCount: number; } export const getServerSideProps = withIronSessionSsr(async ({ req, res }) => { @@ -58,20 +60,25 @@ export const getServerSideProps = withIronSessionSsr(async ({ req, res }) => { return redirect("/") const entityIDS = mapBy(user.entities, "id") || []; - const entities = await getEntitiesWithRoles(entityIDS); + const entities = await getEntitiesWithRoles(isAdmin(user) ? undefined : entityIDS); const users = await filterAllowedUsers(user, entities) - const assignments = await getEntitiesAssignments(entityIDS); - const stats = await getStatsByUsers(users.map((u) => u.id)); - const groups = await getGroupsByEntities(entityIDS); + const userCounts = await countAllowedUsers(user, entities) + const assignmentsCount = await countEntitiesAssignments(mapBy(entities, "id"), { archived: { $ne: true } }); + const groupsCount = await countGroupsByEntities(mapBy(entities, "id")); - return { props: serialize({ user, users, entities, assignments, stats, groups }) }; + 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, entities, assignments, stats, groups }: Props) { +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 corporates = useMemo(() => users.filter((u) => u.type === "corporate"), [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(); @@ -96,29 +103,34 @@ export default function Dashboard({ user, users, entities, assignments, stats, g onClick={() => router.push("/users?type=student")} Icon={BsPersonFill} label="Students" - value={students.length} + value={userCounts.student} color="purple" /> router.push("/users?type=teacher")} Icon={BsPencilSquare} label="Teachers" - value={teachers.length} + value={userCounts.teacher} color="purple" /> router.push("/users?type=corporate")} Icon={BsBank} label="Corporate Accounts" value={corporates.length} color="purple" /> + onClick={() => router.push("/users?type=corporate")} + Icon={BsBank} + label="Corporate Accounts" + value={userCounts.corporate} + color="purple" + /> router.push("/classrooms")} label="Classrooms" - value={groups.length} + value={groupsCount} color="purple" /> router.push("/entities")} label="Entities" - value={entities.length} + value={`${entities.length} - ${totalCount}/${totalLicenses}`} color="purple" /> @@ -126,7 +138,7 @@ export default function Dashboard({ user, users, entities, assignments, stats, g router.push("/users/performance")} label="Student Performance" - value={students.length} + value={userCounts.student} color="purple" /> )} @@ -142,7 +154,7 @@ export default function Dashboard({ user, users, entities, assignments, stats, g Icon={BsEnvelopePaper} onClick={() => router.push("/assignments")} label="Assignments" - value={assignments.filter((a) => !a.archived).length} + value={assignmentsCount} className={clsx(allowedEntityStatistics.length === 0 && "col-span-2")} color="purple" />