/* 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 Layout from "@/components/High/Layout"; import { GroupWithUsers, User } from "@/interfaces/user"; import { shouldRedirectHome } from "@/utils/navigation.disabled"; import { getUserName, isAdmin } from "@/utils/users"; import { convertToUsers, getGroupsForUser } from "@/utils/groups.be"; import { countEntityUsers, getEntityUsers, getSpecificUsers, getUsers } from "@/utils/users.be"; import { checkAccess, findAllowedEntities, getTypesOfUser } from "@/utils/permissions"; import Link from "next/link"; import { uniq } from "lodash"; import { BsBank, BsPlus } from "react-icons/bs"; import CardList from "@/components/High/CardList"; import { getEntitiesWithRoles } from "@/utils/entities.be"; import { EntityWithRoles } from "@/interfaces/entity"; import Separator from "@/components/Low/Separator"; import { requestUser } from "@/utils/api"; import { mapBy, redirect, serialize } from "@/utils"; type EntitiesWithCount = { entity: EntityWithRoles; users: User[]; count: number }; 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(["admin", "developer"].includes(user.type) ? undefined : entityIDs); const allowedEntities = findAllowedEntities(user, entities, 'view_entities') const entitiesWithCount = await Promise.all( allowedEntities.map(async (e) => ({ entity: e, count: await countEntityUsers(e.id, { type: { $in: ["student", "teacher", "corporate", "mastercorporate"] } }), users: await getEntityUsers(e.id, 5, { type: { $in: ["student", "teacher", "corporate", "mastercorporate"] } }) })), ); return { props: serialize({ user, entities: entitiesWithCount }), }; }, sessionOptions); const SEARCH_FIELDS: string[][] = [["entity", "label"]]; interface Props { user: User; entities: EntitiesWithCount[]; } export default function Home({ user, entities }: Props) { const renderCard = ({ entity, users, count }: EntitiesWithCount) => (
Entity {entity.label} Members {count}{isAdmin(user) && ` / ${entity.licenses || 0}`} {users.map(getUserName).join(", ")}{' '} {count > 5 ? and {count - 5} more : ""}
); const firstCard = () => ( Create Entity ); return ( <> Entities | EnCoach

Entities

list={entities} searchFields={SEARCH_FIELDS} renderCard={renderCard} firstCard={["admin", "developer"].includes(user.type) ? firstCard : undefined} />
); }