import Layout from "@/components/High/Layout"; import Separator from "@/components/Low/Separator"; import AssignmentCard from "@/dashboards/AssignmentCard"; import AssignmentView from "@/dashboards/AssignmentView"; import { useAllowedEntities } from "@/hooks/useEntityPermissions"; import {useListSearch} from "@/hooks/useListSearch"; import usePagination from "@/hooks/usePagination"; import { EntityWithRoles } from "@/interfaces/entity"; import {Assignment} from "@/interfaces/results"; import {CorporateUser, Group, User} from "@/interfaces/user"; import {sessionOptions} from "@/lib/session"; import {getUserCompanyName} from "@/resources/user"; import {mapBy, redirect, serialize} from "@/utils"; import { requestUser } from "@/utils/api"; import { activeAssignmentFilter, archivedAssignmentFilter, futureAssignmentFilter, pastAssignmentFilter, startHasExpiredAssignmentFilter, } from "@/utils/assignments"; import {getAssignments, getEntitiesAssignments} from "@/utils/assignments.be"; import {getEntitiesWithRoles} from "@/utils/entities.be"; import {getGroups, getGroupsByEntities} from "@/utils/groups.be"; import {checkAccess, findAllowedEntities} from "@/utils/permissions"; import {getEntitiesUsers, getUsers} from "@/utils/users.be"; import {withIronSessionSsr} from "iron-session/next"; import {groupBy} from "lodash"; import Head from "next/head"; import Link from "next/link"; import {useRouter} from "next/router"; import {useMemo, useState} from "react"; import {BsChevronLeft, BsPlus} from "react-icons/bs"; export const getServerSideProps = withIronSessionSsr(async ({req, res}) => { const user = await requestUser(req, res) if (!user) return redirect("/login") if (!checkAccess(user, ["admin", "developer", "corporate", "teacher", "mastercorporate"])) return redirect("/") const entityIDS = mapBy(user.entities, "id") || []; const entities = await (checkAccess(user, ["developer", "admin"]) ? getEntitiesWithRoles() : getEntitiesWithRoles(entityIDS)); const allowedEntities = findAllowedEntities(user, entities, "view_assignments") const users = await (checkAccess(user, ["developer", "admin"]) ? getUsers() : getEntitiesUsers(mapBy(allowedEntities, 'id'))); const assignments = await (checkAccess(user, ["developer", "admin"]) ? getAssignments() : getEntitiesAssignments(mapBy(allowedEntities, 'id'))); const groups = await (checkAccess(user, ["developer", "admin"]) ? getGroups() : getGroupsByEntities(mapBy(allowedEntities, 'id'))); return {props: serialize({user, users, entities, assignments, groups})}; }, sessionOptions); const SEARCH_FIELDS = [["name"]]; interface Props { assignments: Assignment[]; corporateAssignments?: ({corporate?: CorporateUser} & Assignment)[]; entities: EntityWithRoles[] groups: Group[]; user: User; users: User[]; } export default function AssignmentsPage({assignments, corporateAssignments, entities, user, users, groups}: Props) { const entitiesAllowCreate = useAllowedEntities(user, entities, 'create_assignment') const entitiesAllowEdit = useAllowedEntities(user, entities, 'edit_assignment') const entitiesAllowArchive = useAllowedEntities(user, entities, 'archive_assignment') const activeAssignments = useMemo(() => assignments.filter(activeAssignmentFilter), [assignments]); const plannedAssignments = useMemo(() => assignments.filter(futureAssignmentFilter), [assignments]); const pastAssignments = useMemo(() => assignments.filter(pastAssignmentFilter), [assignments]); const startExpiredAssignments = useMemo(() => assignments.filter(startHasExpiredAssignmentFilter), [assignments]); const archivedAssignments = useMemo(() => assignments.filter(archivedAssignmentFilter), [assignments]); const router = useRouter(); const {rows: activeRows, renderSearch: renderActive} = useListSearch(SEARCH_FIELDS, activeAssignments); const {rows: plannedRows, renderSearch: renderPlanned} = useListSearch(SEARCH_FIELDS, plannedAssignments); const {rows: pastRows, renderSearch: renderPast} = useListSearch(SEARCH_FIELDS, pastAssignments); const {rows: expiredRows, renderSearch: renderExpired} = useListSearch(SEARCH_FIELDS, startExpiredAssignments); const {rows: archivedRows, renderSearch: renderArchived} = useListSearch(SEARCH_FIELDS, archivedAssignments); const {items: activeItems, renderMinimal: paginationActive} = usePagination(activeRows, 16); const {items: plannedItems, renderMinimal: paginationPlanned} = usePagination(plannedRows, 16); const {items: pastItems, renderMinimal: paginationPast} = usePagination(pastRows, 16); const {items: expiredItems, renderMinimal: paginationExpired} = usePagination(expiredRows, 16); const {items: archivedItems, renderMinimal: paginationArchived} = usePagination(archivedRows, 16); return ( <> Assignments | EnCoach

Assignments

Active Assignments Status
Total: {activeAssignments.reduce((acc, curr) => acc + curr.results.length, 0)}/ {activeAssignments.reduce((acc, curr) => curr.exams.length + acc, 0)}

Active Assignments ({activeAssignments.length})

{renderActive()} {paginationActive()}
{activeItems.map((a) => ( router.push(`/assignments/${a.id}`)} key={a.id} /> ))}

Planned Assignments ({plannedAssignments.length})

{renderPlanned()} {paginationPlanned()}
0 ? "/assignments/creator" : ""} className="w-[250px] h-[200px] flex flex-col gap-2 items-center justify-center bg-white hover:bg-mti-purple-ultralight text-mti-purple-light hover:text-mti-purple-dark border border-mti-gray-platinum hover:drop-shadow p-4 cursor-pointer rounded-xl transition ease-in-out duration-300"> New Assignment {plannedItems.map((a) => ( router.push(`/assignments/creator/${a.id}`) : undefined } key={a.id} /> ))}

Past Assignments ({pastAssignments.length})

{renderPast()} {paginationPast()}
{pastItems.map((a) => ( router.push(`/assignments/${a.id}`)} key={a.id} allowDownload allowArchive={mapBy(entitiesAllowArchive, 'id').includes(a.entity || "")} allowExcelDownload /> ))}

Assignments start expired ({startExpiredAssignments.length})

{renderExpired()} {paginationExpired()}
{expiredItems.map((a) => ( router.push(`/assignments/${a.id}`)} key={a.id} allowDownload allowArchive={mapBy(entitiesAllowArchive, 'id').includes(a.entity || "")} allowExcelDownload /> ))}

Archived Assignments ({archivedAssignments.length})

{renderArchived()} {paginationArchived()}
{archivedItems.map((a) => ( router.push(`/assignments/${a.id}`)} key={a.id} allowDownload allowUnarchive allowExcelDownload /> ))}
); }