Added new permission types

This commit is contained in:
Tiago Ribeiro
2024-11-25 11:22:58 +00:00
parent 47762544fc
commit bce3a25dc2
4 changed files with 43 additions and 8 deletions

View File

@@ -10,10 +10,11 @@ interface Props {
onClick?: () => void; onClick?: () => void;
isSelected?: boolean; isSelected?: boolean;
isLoading?: boolean; isLoading?: boolean;
disabled?: boolean
className?: string; className?: string;
} }
export default function IconCard({Icon, label, value, color, tooltip, onClick, className, isLoading, isSelected}: Props) { export default function IconCard({ Icon, label, value, color, tooltip, onClick, className, isLoading, disabled, isSelected }: Props) {
const colorClasses: { [key in typeof color]: string } = { const colorClasses: { [key in typeof color]: string } = {
purple: "mti-purple-light", purple: "mti-purple-light",
red: "mti-red-light", red: "mti-red-light",
@@ -24,8 +25,9 @@ export default function IconCard({Icon, label, value, color, tooltip, onClick, c
return ( return (
<button <button
onClick={onClick} onClick={onClick}
disabled={disabled}
className={clsx( className={clsx(
"bg-white border rounded-xl shadow p-4 flex flex-col gap-4 items-center text-center w-full h-52 justify-center cursor-pointer hover:shadow-lg hover:border-mti-purple-dark transition ease-in-out duration-300", "bg-white border rounded-xl shadow p-4 flex flex-col gap-4 items-center text-center w-full h-52 justify-center cursor-pointer hover:shadow-lg hover:border-mti-purple-dark transition ease-in-out duration-300 disabled:grayscale-0",
tooltip && "tooltip tooltip-bottom", tooltip && "tooltip tooltip-bottom",
isSelected && `border border-solid border-${colorClasses[color]}`, isSelected && `border border-solid border-${colorClasses[color]}`,
className, className,

View File

@@ -43,6 +43,10 @@ const USER_MANAGEMENT: PermissionLayout[] = [
{ label: "Delete Teachers", key: "delete_teachers" }, { label: "Delete Teachers", key: "delete_teachers" },
{ label: "Delete Corporate Accounts", key: "delete_corporates" }, { label: "Delete Corporate Accounts", key: "delete_corporates" },
{ label: "Delete Master Corporate Accounts", key: "delete_mastercorporates" }, { label: "Delete Master Corporate Accounts", key: "delete_mastercorporates" },
{ label: "Create a Single User", key: "create_user" },
{ label: "Create Users in Batch", key: "create_user_batch" },
{ label: "Create a Single Code", key: "create_code" },
{ label: "Create Codes in Batch", key: "create_code_batch" },
] ]
const EXAM_MANAGEMENT: PermissionLayout[] = [ const EXAM_MANAGEMENT: PermissionLayout[] = [

View File

@@ -35,6 +35,7 @@ import { isAdmin } from "@/utils/users";
import { getGradingSystemByEntities, getGradingSystemByEntity } from "@/utils/grading.be"; import { getGradingSystemByEntities, getGradingSystemByEntity } from "@/utils/grading.be";
import { Grading } from "@/interfaces"; import { Grading } from "@/interfaces";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import { useAllowedEntities } from "@/hooks/useEntityPermissions";
export const getServerSideProps = withIronSessionSsr(async ({ req, res }) => { export const getServerSideProps = withIronSessionSsr(async ({ req, res }) => {
const user = await requestUser(req, res) const user = await requestUser(req, res)
@@ -66,6 +67,11 @@ export default function Admin({ user, entities, permissions, allUsers, entitiesG
const [modalOpen, setModalOpen] = useState<string>(); const [modalOpen, setModalOpen] = useState<string>();
const router = useRouter() const router = useRouter()
const entitiesAllowCreateUser = useAllowedEntities(user, entities, 'create_user')
const entitiesAllowCreateUsers = useAllowedEntities(user, entities, 'create_user_batch')
const entitiesAllowCreateCode = useAllowedEntities(user, entities, 'create_code')
const entitiesAllowCreateCodes = useAllowedEntities(user, entities, 'create_code_batch')
return ( return (
<> <>
<Head> <Head>
@@ -80,7 +86,12 @@ export default function Admin({ user, entities, permissions, allUsers, entitiesG
<ToastContainer /> <ToastContainer />
<Layout user={user} className="gap-6"> <Layout user={user} className="gap-6">
<Modal isOpen={modalOpen === "batchCreateUser"} onClose={() => setModalOpen(undefined)} maxWidth="max-w-[85%]"> <Modal isOpen={modalOpen === "batchCreateUser"} onClose={() => setModalOpen(undefined)} maxWidth="max-w-[85%]">
<BatchCreateUser user={user} entities={entities} permissions={permissions} onFinish={() => setModalOpen(undefined)} /> <BatchCreateUser
user={user}
entities={entitiesAllowCreateUser}
permissions={permissions}
onFinish={() => setModalOpen(undefined)}
/>
</Modal> </Modal>
<Modal isOpen={modalOpen === "batchCreateCode"} onClose={() => setModalOpen(undefined)}> <Modal isOpen={modalOpen === "batchCreateCode"} onClose={() => setModalOpen(undefined)}>
<BatchCodeGenerator user={user} users={allUsers} permissions={permissions} onFinish={() => setModalOpen(undefined)} /> <BatchCodeGenerator user={user} users={allUsers} permissions={permissions} onFinish={() => setModalOpen(undefined)} />
@@ -89,7 +100,13 @@ export default function Admin({ user, entities, permissions, allUsers, entitiesG
<CodeGenerator user={user} permissions={permissions} onFinish={() => setModalOpen(undefined)} /> <CodeGenerator user={user} permissions={permissions} onFinish={() => setModalOpen(undefined)} />
</Modal> </Modal>
<Modal isOpen={modalOpen === "createUser"} onClose={() => setModalOpen(undefined)}> <Modal isOpen={modalOpen === "createUser"} onClose={() => setModalOpen(undefined)}>
<UserCreator user={user} entities={entities} users={allUsers} permissions={permissions} onFinish={() => setModalOpen(undefined)} /> <UserCreator
user={user}
entities={entitiesAllowCreateUsers}
users={allUsers}
permissions={permissions}
onFinish={() => setModalOpen(undefined)}
/>
</Modal> </Modal>
<Modal isOpen={modalOpen === "gradingSystem"} onClose={() => setModalOpen(undefined)}> <Modal isOpen={modalOpen === "gradingSystem"} onClose={() => setModalOpen(undefined)}>
<CorporateGradingSystem <CorporateGradingSystem
@@ -110,6 +127,7 @@ export default function Admin({ user, entities, permissions, allUsers, entitiesG
color="purple" color="purple"
className="w-full h-full" className="w-full h-full"
onClick={() => setModalOpen("createCode")} onClick={() => setModalOpen("createCode")}
disabled={entitiesAllowCreateCode.length > 0}
/> />
<IconCard <IconCard
Icon={BsCodeSquare} Icon={BsCodeSquare}
@@ -117,6 +135,7 @@ export default function Admin({ user, entities, permissions, allUsers, entitiesG
color="purple" color="purple"
className="w-full h-full" className="w-full h-full"
onClick={() => setModalOpen("batchCreateCode")} onClick={() => setModalOpen("batchCreateCode")}
disabled={entitiesAllowCreateCodes.length > 0}
/> />
<IconCard <IconCard
Icon={BsPersonFill} Icon={BsPersonFill}
@@ -124,6 +143,7 @@ export default function Admin({ user, entities, permissions, allUsers, entitiesG
color="purple" color="purple"
className="w-full h-full" className="w-full h-full"
onClick={() => setModalOpen("createUser")} onClick={() => setModalOpen("createUser")}
disabled={entitiesAllowCreateUser.length > 0}
/> />
<IconCard <IconCard
Icon={BsPeopleFill} Icon={BsPeopleFill}
@@ -131,6 +151,7 @@ export default function Admin({ user, entities, permissions, allUsers, entitiesG
color="purple" color="purple"
className="w-full h-full" className="w-full h-full"
onClick={() => setModalOpen("batchCreateUser")} onClick={() => setModalOpen("batchCreateUser")}
disabled={entitiesAllowCreateUsers.length > 0}
/> />
{checkAccess(user, ["admin", "corporate", "developer", "mastercorporate"]) && ( {checkAccess(user, ["admin", "corporate", "developer", "mastercorporate"]) && (
<IconCard <IconCard

View File

@@ -49,7 +49,11 @@ export type RolePermission =
"delete_assignment" | "delete_assignment" |
"start_assignment" | "start_assignment" |
"archive_assignment" | "archive_assignment" |
"view_entity_statistics" "view_entity_statistics" |
"create_user" |
"create_user_batch" |
"create_code" |
"create_code_batch"
export const DEFAULT_PERMISSIONS: RolePermission[] = [ export const DEFAULT_PERMISSIONS: RolePermission[] = [
"view_students", "view_students",
@@ -110,5 +114,9 @@ export const ADMIN_PERMISSIONS: RolePermission[] = [
"delete_assignment", "delete_assignment",
"start_assignment", "start_assignment",
"archive_assignment", "archive_assignment",
"view_entity_statistics" "view_entity_statistics",
"create_user",
"create_user_batch",
"create_code",
"create_code_batch"
] ]