import Layout from "@/components/High/Layout"; import Separator from "@/components/Low/Separator"; import AssignmentCard from "@/components/AssignmentCard"; import AssignmentView from "@/components/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 { findBy, 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'))); return { props: serialize({ user, users, entities: allowedEntities, assignments }) }; }, sessionOptions); const SEARCH_FIELDS = [["name"]]; interface Props { assignments: Assignment[]; entities: EntityWithRoles[] user: User; users: User[]; } export default function AssignmentsPage({ assignments, entities, user, users }: 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 ( <>