Added new permission types
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import clsx from "clsx";
|
import clsx from "clsx";
|
||||||
import {IconType} from "react-icons";
|
import { IconType } from "react-icons";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
Icon: IconType;
|
Icon: IconType;
|
||||||
@@ -10,11 +10,12 @@ 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",
|
||||||
rose: "mti-rose-light",
|
rose: "mti-rose-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,
|
||||||
|
|||||||
@@ -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[] = [
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user