/* eslint-disable @next/next/no-img-element */ import Head from "next/head"; import { withIronSessionSsr } from "iron-session/next"; import { sessionOptions } from "@/lib/session"; import { ToastContainer } from "react-toastify"; import { GroupWithUsers, User } from "@/interfaces/user"; import { shouldRedirectHome } from "@/utils/navigation.disabled"; import { getUserName, isAdmin } from "@/utils/users"; import { convertToUsers, getGroupsForEntities } from "@/utils/groups.be"; import { getSpecificUsers } from "@/utils/users.be"; import Link from "next/link"; import { uniq } from "lodash"; import { BsPlus } from "react-icons/bs"; import CardList from "@/components/High/CardList"; import Separator from "@/components/Low/Separator"; import { findBy, mapBy, redirect, serialize } from "@/utils"; import { requestUser } from "@/utils/api"; import { findAllowedEntities } from "@/utils/permissions"; import { getEntitiesWithRoles } from "@/utils/entities.be"; import { useAllowedEntities } from "@/hooks/useEntityPermissions"; import { EntityWithRoles } from "@/interfaces/entity"; import { FaPersonChalkboard } from "react-icons/fa6"; import { FaFileUpload } from "react-icons/fa"; import clsx from "clsx"; import { useState } from "react"; import StudentClassroomTransfer from "@/components/Imports/StudentClassroomTransfer"; import Modal from "@/components/Modal"; export const getServerSideProps = withIronSessionSsr(async ({ req, res }) => { const user = await requestUser(req, res); if (!user) return redirect("/login"); if (shouldRedirectHome(user)) return redirect("/"); const entityIDS = mapBy(user.entities, "id"); const entities = await getEntitiesWithRoles( isAdmin(user) ? undefined : entityIDS ); const allowedEntities = findAllowedEntities( user, entities, "view_classrooms" ); const groups = await getGroupsForEntities(mapBy(allowedEntities, "id")); const users = await getSpecificUsers( uniq(groups.flatMap((g) => [...g.participants, g.admin])), { _id: 0, id: 1, name: 1, email: 1, corporateInformation: 1, type: 1 } ); const groupsWithUsers: GroupWithUsers[] = groups.map((g) => convertToUsers( g, users.filter((x) => (isAdmin(user) ? true : !isAdmin(x))) ) ); return { props: serialize({ user, groups: groupsWithUsers, entities: allowedEntities, }), }; }, sessionOptions); const SEARCH_FIELDS = [ ["name"], ["admin", "name"], ["admin", "email"], ["admin", "corporateInformation", "companyInformation", "name"], ["participants", "name"], ["participants", "email"], ["participants", "corporateInformation", "companyInformation", "name"], ]; interface Props { user: User; groups: GroupWithUsers[]; entities: EntityWithRoles[]; } export default function Home({ user, groups, entities }: Props) { const entitiesAllowCreate = useAllowedEntities( user, entities, "create_classroom" ); const [showImport, setShowImport] = useState(false); const renderCard = (group: GroupWithUsers) => (
Classroom {group.name} Admin {getUserName(group.admin)} {!!group.entity && ( Entity {findBy(entities, "id", group.entity)?.label} )} Participants {group.participants.length} {group.participants.slice(0, 3).map(getUserName).join(", ")}{" "} {group.participants.length > 3 ? ( and {group.participants.length - 3} more ) : ( "" )}
); const firstCard = () => ( Create Classroom ); return ( <> Classrooms | EnCoach <>
setShowImport(false)} maxWidth="max-w-[85%]" > setShowImport(false)} />

Classrooms

{entitiesAllowCreate.length !== 0 && ( )}
list={groups} searchFields={SEARCH_FIELDS} renderCard={renderCard} firstCard={entitiesAllowCreate.length === 0 ? undefined : firstCard} />
); }