diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx
index 74cc576b..f89c97b9 100644
--- a/src/components/Sidebar.tsx
+++ b/src/components/Sidebar.tsx
@@ -171,16 +171,17 @@ export default function Sidebar({
badge={totalAssignedTickets}
/>
)}
- {(entitiesAllowGeneration.length > 0 || isAdmin) && (
-
- )}
+ {checkAccess(user, ["admin", "developer", "teacher", 'corporate', 'mastercorporate'])
+ && (entitiesAllowGeneration.length > 0 || isAdmin) && (
+
+ )}
diff --git a/src/interfaces/user.ts b/src/interfaces/user.ts
index db6ae044..8de4bf56 100644
--- a/src/interfaces/user.ts
+++ b/src/interfaces/user.ts
@@ -155,6 +155,7 @@ export interface GroupWithUsers extends Omit
{
export interface Code {
id: string;
code: string;
+ entity: string
creator: string;
expiryDate: Date;
type: Type;
diff --git a/src/pages/(admin)/Lists/index.tsx b/src/pages/(admin)/Lists/index.tsx
index 6015701b..9a3de65a 100644
--- a/src/pages/(admin)/Lists/index.tsx
+++ b/src/pages/(admin)/Lists/index.tsx
@@ -55,7 +55,7 @@ export default function Lists({ user, entities = [], permissions }: Props) {
Exam List
)}
- {checkAccess(user, ["developer", "admin", "corporate"]) && entitiesViewCodes.length > 0 && (
+ {checkAccess(user, ["developer", "admin", "corporate", "mastercorporate"]) && entitiesViewCodes.length > 0 && (
clsx(
diff --git a/src/pages/(status)/PaymentDue.tsx b/src/pages/(status)/PaymentDue.tsx
index a85d52c9..82a081dc 100644
--- a/src/pages/(status)/PaymentDue.tsx
+++ b/src/pages/(status)/PaymentDue.tsx
@@ -15,9 +15,11 @@ import { ToastContainer } from "react-toastify";
import useDiscounts from "@/hooks/useDiscounts";
import PaymobPayment from "@/components/PaymobPayment";
import moment from "moment";
+import { EntityWithRoles } from "@/interfaces/entity";
interface Props {
user: User;
+ entities: EntityWithRoles[]
hasExpired?: boolean;
reload: () => void;
}
diff --git a/src/pages/dashboard/corporate.tsx b/src/pages/dashboard/corporate.tsx
index 1c43c1dc..be404c9e 100644
--- a/src/pages/dashboard/corporate.tsx
+++ b/src/pages/dashboard/corporate.tsx
@@ -36,6 +36,7 @@ import {
BsPersonFillGear,
} from "react-icons/bs";
import { ToastContainer } from "react-toastify";
+import { useAllowedEntities } from "@/hooks/useEntityPermissions";
interface Props {
user: User;
@@ -67,6 +68,8 @@ export default function Dashboard({ user, users, entities, assignments, stats, g
const students = useMemo(() => users.filter((u) => u.type === "student"), [users]);
const teachers = useMemo(() => users.filter((u) => u.type === "teacher"), [users]);
+ const allowedEntityStatistics = useAllowedEntities(user, entities, 'view_entity_statistics')
+
const router = useRouter();
const averageLevelCalculator = (studentStats: Stat[]) => {
@@ -94,16 +97,6 @@ export default function Dashboard({ user, users, entities, assignments, stats, g
return calculateAverageLevel(levels);
};
- const UserDisplay = (displayUser: User) => (
-
-

-
- {displayUser.name}
- {displayUser.email}
-
-
- );
-
return (
<>
@@ -152,7 +145,14 @@ export default function Dashboard({ user, users, entities, assignments, stats, g
color="purple"
/>
-
+ {allowedEntityStatistics.length > 0 && (
+ router.push("/statistical")}
+ label="Entity Statistics"
+ value={allowedEntityStatistics.length}
+ color="purple"
+ />
+ )}
router.push("/users/performance")}
label="Student Performance"
diff --git a/src/pages/dashboard/teacher.tsx b/src/pages/dashboard/teacher.tsx
index b86da522..14b52e48 100644
--- a/src/pages/dashboard/teacher.tsx
+++ b/src/pages/dashboard/teacher.tsx
@@ -21,11 +21,12 @@ import { uniqBy } from "lodash";
import Head from "next/head";
import { useRouter } from "next/router";
import { useMemo } from "react";
-import { BsClipboard2Data, BsEnvelopePaper, BsPaperclip, BsPeople, BsPersonFill } from "react-icons/bs";
+import { BsClipboard2Data, BsEnvelopePaper, BsPaperclip, BsPeople, BsPersonFill, BsPersonFillGear } from "react-icons/bs";
import { ToastContainer } from "react-toastify";
import { requestUser } from "@/utils/api";
import { useAllowedEntities } from "@/hooks/useEntityPermissions";
import { filterAllowedUsers } from "@/utils/users.be";
+import { isAdmin } from "@/utils/users";
interface Props {
user: User;
@@ -44,7 +45,7 @@ export const getServerSideProps = withIronSessionSsr(async ({ req, res }) => {
return redirect("/")
const entityIDS = mapBy(user.entities, "id") || [];
- const entities = await getEntitiesWithRoles(entityIDS);
+ const entities = await getEntitiesWithRoles(isAdmin(user) ? undefined : entityIDS);
const users = await filterAllowedUsers(user, entities)
const assignments = await getEntitiesAssignments(entityIDS);
@@ -58,6 +59,8 @@ export default function Dashboard({ user, users, entities, assignments, stats, g
const students = useMemo(() => users.filter((u) => u.type === "student"), [users]);
const router = useRouter();
+ const allowedEntityStatistics = useAllowedEntities(user, entities, 'view_entity_statistics')
+
const averageLevelCalculator = (studentStats: Stat[]) => {
const formattedStats = studentStats
.map((s) => ({
@@ -83,16 +86,6 @@ export default function Dashboard({ user, users, entities, assignments, stats, g
return calculateAverageLevel(levels);
};
- const UserDisplay = (displayUser: User) => (
-
-

-
- {displayUser.name}
- {displayUser.email}
-
-
- );
-
return (
<>
@@ -128,7 +121,14 @@ export default function Dashboard({ user, users, entities, assignments, stats, g
color="purple"
/>
-
+ {allowedEntityStatistics.length > 0 && (
+ router.push("/statistical")}
+ label="Entity Statistics"
+ value={allowedEntityStatistics.length}
+ color="purple"
+ />
+ )}
router.push("/assignments")}
diff --git a/src/pages/entities/[id]/roles/[role].tsx b/src/pages/entities/[id]/roles/[role].tsx
index 561e00d4..3b0d2f86 100644
--- a/src/pages/entities/[id]/roles/[role].tsx
+++ b/src/pages/entities/[id]/roles/[role].tsx
@@ -92,7 +92,8 @@ const ENTITY_MANAGEMENT: PermissionLayout[] = [
{ label: "Edit Role Permissions", key: "edit_role_permissions" },
{ label: "Assign Role to User", key: "assign_to_role" },
{ label: "Delete Entity Role", key: "delete_entity_role" },
- { label: "Download Statistics Report", key: "download_statistics_report" }
+ { label: "Download Statistics Report", key: "download_statistics_report" },
+ { label: "Edit Grading System", key: "edit_grading_system" }
]
const ASSIGNMENT_MANAGEMENT: PermissionLayout[] = [
diff --git a/src/pages/payment.tsx b/src/pages/payment.tsx
index 4b80f906..49854d22 100644
--- a/src/pages/payment.tsx
+++ b/src/pages/payment.tsx
@@ -1,24 +1,35 @@
/* eslint-disable @next/next/no-img-element */
import Head from "next/head";
-import {withIronSessionSsr} from "iron-session/next";
-import {sessionOptions} from "@/lib/session";
+import { withIronSessionSsr } from "iron-session/next";
+import { sessionOptions } from "@/lib/session";
import useUser from "@/hooks/useUser";
import PaymentDue from "./(status)/PaymentDue";
-import {useRouter} from "next/router";
+import { useRouter } from "next/router";
import { requestUser } from "@/utils/api";
-import { redirect } from "@/utils";
+import { mapBy, redirect, serialize } from "@/utils";
+import { getEntities } from "@/utils/entities.be";
+import { isAdmin } from "@/utils/users";
+import { EntityWithRoles } from "@/interfaces/entity";
+import { User } from "@/interfaces/user";
-export const getServerSideProps = withIronSessionSsr(async ({req, res}) => {
+export const getServerSideProps = withIronSessionSsr(async ({ req, res }) => {
const user = await requestUser(req, res)
if (!user) return redirect("/login")
+ const entityIDs = mapBy(user.entities, 'id')
+ const entities = await getEntities(isAdmin(user) ? undefined : entityIDs)
+
return {
- props: {user},
+ props: serialize({ user, entities }),
};
}, sessionOptions);
-export default function Home() {
- const {user} = useUser({redirectTo: "/login"});
+interface Props {
+ user: User,
+ entities: EntityWithRoles[]
+}
+
+export default function Home({ user, entities }: Props) {
const router = useRouter();
return (
@@ -32,7 +43,7 @@ export default function Home() {
- {user && }
+
>
);
}
diff --git a/src/pages/settings.tsx b/src/pages/settings.tsx
index df2b50ec..5dd67d47 100644
--- a/src/pages/settings.tsx
+++ b/src/pages/settings.tsx
@@ -70,6 +70,7 @@ export default function Admin({ user, entities, permissions, allUsers, entitiesG
const entitiesAllowCreateUsers = useAllowedEntities(user, entities, 'create_user_batch')
const entitiesAllowCreateCode = useAllowedEntities(user, entities, 'create_code')
const entitiesAllowCreateCodes = useAllowedEntities(user, entities, 'create_code_batch')
+ const entitiesAllowEditGrading = useAllowedEntities(user, entities, 'edit_grading_system')
return (
<>
@@ -111,7 +112,7 @@ export default function Admin({ user, entities, permissions, allUsers, entitiesG
router.replace(router.asPath)}
/>
@@ -159,6 +160,7 @@ export default function Admin({ user, entities, permissions, allUsers, entitiesG
color="purple"
className="w-full h-full col-span-2"
onClick={() => setModalOpen("gradingSystem")}
+ disabled={entitiesAllowEditGrading.length === 0}
/>
)}
diff --git a/src/resources/entityPermissions.ts b/src/resources/entityPermissions.ts
index e3e3dcc9..27b94e7e 100644
--- a/src/resources/entityPermissions.ts
+++ b/src/resources/entityPermissions.ts
@@ -57,7 +57,8 @@ export type RolePermission =
"view_code_list" |
"delete_code" |
"view_statistics" |
- "download_statistics_report"
+ "download_statistics_report" |
+ "edit_grading_system"
export const DEFAULT_PERMISSIONS: RolePermission[] = [
"view_students",
@@ -128,5 +129,6 @@ export const ADMIN_PERMISSIONS: RolePermission[] = [
"view_code_list",
"delete_code",
"view_statistics",
- "download_statistics_report"
+ "download_statistics_report",
+ "edit_grading_system"
]