From 87d7d6f12b6170d58f970ba7dfbd2e4cde6a0b0e Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Thu, 17 Oct 2024 22:41:20 +0100 Subject: [PATCH] Added more filters to the classroom --- src/pages/assignments/[id].tsx | 12 ++++++-- src/pages/assignments/creator/[id].tsx | 11 ++++++- src/pages/assignments/creator/index.tsx | 5 +-- src/pages/classrooms/[id].tsx | 30 ++++++++++++++++-- src/pages/classrooms/create.tsx | 41 ++++++++++++++++++++++--- src/pages/classrooms/index.tsx | 4 +-- src/utils/users.ts | 2 ++ 7 files changed, 90 insertions(+), 15 deletions(-) diff --git a/src/pages/assignments/[id].tsx b/src/pages/assignments/[id].tsx index 07e2f010..712a02e9 100644 --- a/src/pages/assignments/[id].tsx +++ b/src/pages/assignments/[id].tsx @@ -52,8 +52,7 @@ export const getServerSideProps = withIronSessionSsr(async ({req, res, params}) const entity = await getEntityWithRoles(assignment.entity || "") if (!entity) return redirect("/assignments") - if (!doesEntityAllow(user, entity, 'view_assignments') && !["admin", "developer"].includes(user.type)) - return redirect("/assignments") + if (!doesEntityAllow(user, entity, 'view_assignments')) return redirect("/assignments") const users = await (checkAccess(user, ["developer", "admin"]) ? getUsers() : getEntityUsers(entity.id)); @@ -296,6 +295,12 @@ export default function AssignmentView({user, users, entity, assignment}: Props) return false; }; + const copyLink = async () => { + const origin = window.location.origin + await navigator.clipboard.writeText(`${origin}/exam?assignment=${assignment.id}`) + toast.success("The URL to the assignment has been copied to your clipboard!") + } + return ( <> @@ -388,6 +393,9 @@ export default function AssignmentView({user, users, entity, assignment}: Props)
+ {assignment && (assignment.results.length === assignment.assignees.length || moment().isAfter(moment(assignment.endDate))) && (
+
+
+ {['student', 'teacher', 'corporate'].map((type) => ( + + ))} +
diff --git a/src/pages/classrooms/create.tsx b/src/pages/classrooms/create.tsx index c62682e8..b0192c08 100644 --- a/src/pages/classrooms/create.tsx +++ b/src/pages/classrooms/create.tsx @@ -12,7 +12,7 @@ import {USER_TYPE_LABELS} from "@/resources/user"; import {filterBy, mapBy, redirect, serialize} from "@/utils"; import {getEntities, getEntitiesWithRoles} from "@/utils/entities.be"; import {shouldRedirectHome} from "@/utils/navigation.disabled"; -import {getUserName} from "@/utils/users"; +import {getUserName, isAdmin} from "@/utils/users"; import {getEntitiesUsers, getLinkedUsers} from "@/utils/users.be"; import axios from "axios"; import clsx from "clsx"; @@ -22,11 +22,12 @@ import Head from "next/head"; import Link from "next/link"; import {useRouter} from "next/router"; import {Divider} from "primereact/divider"; -import {useMemo, useState} from "react"; +import {useEffect, useMemo, useState} from "react"; import {BsCheck, BsChevronLeft, BsClockFill, BsEnvelopeFill, BsStopwatchFill} from "react-icons/bs"; import {toast, ToastContainer} from "react-toastify"; import { requestUser } from "@/utils/api"; import { findAllowedEntities } from "@/utils/permissions"; +import { capitalize } from "lodash"; export const getServerSideProps = withIronSessionSsr(async ({req, res}) => { const user = await requestUser(req, res) @@ -34,8 +35,8 @@ export const getServerSideProps = withIronSessionSsr(async ({req, res}) => { if (shouldRedirectHome(user)) return redirect("/") - const users = await getEntitiesUsers(mapBy(user.entities, 'id')) - const entities = await getEntitiesWithRoles(mapBy(user.entities, "id")); + const entities = await getEntitiesWithRoles(isAdmin(user) ? undefined : mapBy(user.entities, "id")); + const users = await getEntitiesUsers(mapBy(entities, 'id')) const allowedEntities = findAllowedEntities(user, entities, "create_classroom") return { @@ -57,11 +58,16 @@ export default function Home({user, users, entities}: Props) { const entityUsers = useMemo(() => !entity ? users : users.filter(u => mapBy(u.entities, 'id').includes(entity)), [entity, users]) - const {rows, renderSearch} = useListSearch([["name"], ["corporateInformation", "companyInformation", "name"]], entityUsers); + const {rows, renderSearch} = useListSearch( + [["name"], ["type"], ["corporateInformation", "companyInformation", "name"]], entityUsers + ); + const {items, renderMinimal} = usePagination(rows, 16); const router = useRouter(); + useEffect(() => setSelectedUsers([]), [entity]) + const createGroup = () => { if (!name.trim()) return; if (!entity) return; @@ -140,6 +146,31 @@ export default function Home({user, users, entities}: Props) { {renderSearch()} {renderMinimal()} +
+ {['student', 'teacher', 'corporate'].map((type) => ( + + ))} +
diff --git a/src/pages/classrooms/index.tsx b/src/pages/classrooms/index.tsx index a30561bf..657c49df 100644 --- a/src/pages/classrooms/index.tsx +++ b/src/pages/classrooms/index.tsx @@ -6,7 +6,7 @@ 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} from "@/utils/users"; +import {getUserName, isAdmin} from "@/utils/users"; import {convertToUsers, getGroupsForEntities} from "@/utils/groups.be"; import {getSpecificUsers} from "@/utils/users.be"; import Link from "next/link"; @@ -28,7 +28,7 @@ export const getServerSideProps = withIronSessionSsr(async ({req, res}) => { if (shouldRedirectHome(user)) return redirect("/") const entityIDS = mapBy(user.entities, "id"); - const entities = await getEntitiesWithRoles(entityIDS) + const entities = await getEntitiesWithRoles(isAdmin(user) ? undefined : entityIDS) const allowedEntities = findAllowedEntities(user, entities, "view_classrooms") const groups = await getGroupsForEntities(mapBy(allowedEntities, 'id')); diff --git a/src/utils/users.ts b/src/utils/users.ts index 89b1353b..dae4fd80 100644 --- a/src/utils/users.ts +++ b/src/utils/users.ts @@ -44,3 +44,5 @@ export const getUserName = (user?: User) => { if (user.type === "corporate" || user.type === "mastercorporate") return user.corporateInformation?.companyInformation?.name || user.name; return user.name; }; + +export const isAdmin = (user: User) => ["admin", "developer"].includes(user.type)