Some quick changes to permissions
This commit is contained in:
@@ -27,7 +27,7 @@ import useTicketsListener from "@/hooks/useTicketsListener";
|
||||
import { checkAccess, getTypesOfUser } from "@/utils/permissions";
|
||||
import usePermissions from "@/hooks/usePermissions";
|
||||
import { EntityWithRoles } from "@/interfaces/entity";
|
||||
import { useAllowedEntitiesSomePermissions } from "@/hooks/useEntityPermissions";
|
||||
import { useAllowedEntities, useAllowedEntitiesSomePermissions } from "@/hooks/useEntityPermissions";
|
||||
import { useMemo } from "react";
|
||||
|
||||
interface Props {
|
||||
@@ -95,6 +95,8 @@ export default function Sidebar({
|
||||
const { totalAssignedTickets } = useTicketsListener(user.id);
|
||||
const { permissions } = usePermissions(user.id);
|
||||
|
||||
const entitiesAllowStatistics = useAllowedEntities(user, entities, "view_statistics")
|
||||
|
||||
const entitiesAllowGeneration = useAllowedEntitiesSomePermissions(user, entities, [
|
||||
"generate_reading", "generate_listening", "generate_writing", "generate_speaking", "generate_level"
|
||||
])
|
||||
@@ -119,7 +121,7 @@ export default function Sidebar({
|
||||
{checkAccess(user, ["student", "teacher", "developer"], permissions, "viewExams") && (
|
||||
<Nav disabled={disableNavigation} Icon={BsFileEarmarkText} label="Practice" path={path} keyPath="/exam" isMinimized={isMinimized} />
|
||||
)}
|
||||
{checkAccess(user, getTypesOfUser(["agent"]), permissions, "viewStats") && (
|
||||
{checkAccess(user, getTypesOfUser(["agent"])) && entitiesAllowStatistics.length > 0 && (
|
||||
<Nav disabled={disableNavigation} Icon={BsGraphUp} label="Stats" path={path} keyPath="/stats" isMinimized={isMinimized} />
|
||||
)}
|
||||
{checkAccess(user, ["developer", "admin", "mastercorporate", "corporate", "teacher", "student"], permissions) && (
|
||||
|
||||
@@ -34,7 +34,7 @@ const CreatorCell = ({id, users}: {id: string; users: User[]}) => {
|
||||
);
|
||||
};
|
||||
|
||||
export default function CodeList({user}: {user: User}) {
|
||||
export default function CodeList({ user, canDeleteCodes }: { user: User, canDeleteCodes?: boolean }) {
|
||||
const [selectedCodes, setSelectedCodes] = useState<string[]>([]);
|
||||
|
||||
const [filteredCorporate, setFilteredCorporate] = useState<User | undefined>(user?.type === "corporate" ? user : undefined);
|
||||
@@ -42,8 +42,6 @@ export default function CodeList({user}: {user: User}) {
|
||||
|
||||
const { permissions } = usePermissions(user?.id || "");
|
||||
|
||||
// const [filteredCodes, setFilteredCodes] = useState<Code[]>([]);
|
||||
|
||||
const { users } = useUsers();
|
||||
const { codes, reload } = useCodes(user?.type === "corporate" ? user?.id : undefined);
|
||||
|
||||
@@ -80,6 +78,7 @@ export default function CodeList({user}: {user: User}) {
|
||||
};
|
||||
|
||||
const deleteCodes = async (codes: string[]) => {
|
||||
if (!canDeleteCodes) return
|
||||
if (!confirm(`Are you sure you want to delete these ${codes.length} code(s)?`)) return;
|
||||
|
||||
const params = new URLSearchParams();
|
||||
@@ -108,6 +107,7 @@ export default function CodeList({user}: {user: User}) {
|
||||
};
|
||||
|
||||
const deleteCode = async (code: Code) => {
|
||||
if (!canDeleteCodes) return
|
||||
if (!confirm(`Are you sure you want to delete this "${code.code}" code?`)) return;
|
||||
|
||||
axios
|
||||
@@ -129,8 +129,6 @@ export default function CodeList({user}: {user: User}) {
|
||||
.finally(reload);
|
||||
};
|
||||
|
||||
const allowedToDelete = checkAccess(user, ["developer", "admin", "corporate", "mastercorporate"], permissions, "deleteCodes");
|
||||
|
||||
const defaultColumns = [
|
||||
columnHelper.accessor("code", {
|
||||
id: "codeCheckbox",
|
||||
@@ -186,7 +184,7 @@ export default function CodeList({user}: {user: User}) {
|
||||
cell: ({ row }: { row: { original: Code } }) => {
|
||||
return (
|
||||
<div className="flex gap-4">
|
||||
{allowedToDelete && !row.original.userId && (
|
||||
{canDeleteCodes && !row.original.userId && (
|
||||
<div data-tip="Delete" className="cursor-pointer tooltip" onClick={() => deleteCode(row.original)}>
|
||||
<BsTrash className="hover:text-mti-purple-light transition ease-in-out duration-300" />
|
||||
</div>
|
||||
@@ -215,8 +213,7 @@ export default function CodeList({user}: {user: User}) {
|
||||
value={
|
||||
filteredCorporate
|
||||
? {
|
||||
label: `${
|
||||
filteredCorporate?.type === "corporate"
|
||||
label: `${filteredCorporate?.type === "corporate"
|
||||
? filteredCorporate.corporateInformation?.companyInformation?.name || filteredCorporate.name
|
||||
: filteredCorporate.name
|
||||
} (${USER_TYPE_LABELS[filteredCorporate?.type]})`,
|
||||
@@ -227,8 +224,7 @@ export default function CodeList({user}: {user: User}) {
|
||||
options={users
|
||||
.filter((x) => ["admin", "developer", "corporate"].includes(x.type))
|
||||
.map((x) => ({
|
||||
label: `${x.type === "corporate" ? x.corporateInformation?.companyInformation?.name || x.name : x.name} (${
|
||||
USER_TYPE_LABELS[x.type]
|
||||
label: `${x.type === "corporate" ? x.corporateInformation?.companyInformation?.name || x.name : x.name} (${USER_TYPE_LABELS[x.type]
|
||||
})`,
|
||||
value: x.id,
|
||||
user: x,
|
||||
@@ -266,7 +262,7 @@ export default function CodeList({user}: {user: User}) {
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
{allowedToDelete && (
|
||||
{canDeleteCodes && (
|
||||
<div className="flex gap-4 items-center">
|
||||
<span>{selectedCodes.length} code(s) selected</span>
|
||||
<Button
|
||||
|
||||
@@ -10,7 +10,7 @@ import UserList from "./UserList";
|
||||
import { checkAccess } from "@/utils/permissions";
|
||||
import { PermissionType } from "@/interfaces/permissions";
|
||||
import { EntityWithRoles } from "@/interfaces/entity";
|
||||
import { useAllowedEntitiesSomePermissions } from "@/hooks/useEntityPermissions";
|
||||
import { useAllowedEntities, useAllowedEntitiesSomePermissions } from "@/hooks/useEntityPermissions";
|
||||
import { useMemo } from "react";
|
||||
|
||||
interface Props {
|
||||
@@ -20,6 +20,8 @@ interface Props {
|
||||
}
|
||||
|
||||
export default function Lists({ user, entities = [], permissions }: Props) {
|
||||
const entitiesViewCodes = useAllowedEntities(user, entities, 'view_code_list')
|
||||
const entitiesDeleteCodes = useAllowedEntities(user, entities, 'delete_code')
|
||||
const entitiesViewExams = useAllowedEntitiesSomePermissions(user, entities, [
|
||||
'view_reading', 'view_listening', 'view_writing', 'view_speaking', 'view_level'
|
||||
])
|
||||
@@ -53,7 +55,7 @@ export default function Lists({user, entities = [], permissions}: Props) {
|
||||
Exam List
|
||||
</Tab>
|
||||
)}
|
||||
{checkAccess(user, ["developer", "admin", "corporate"]) && (
|
||||
{checkAccess(user, ["developer", "admin", "corporate"]) && entitiesViewCodes.length > 0 && (
|
||||
<Tab
|
||||
className={({ selected }) =>
|
||||
clsx(
|
||||
@@ -102,9 +104,9 @@ export default function Lists({user, entities = [], permissions}: Props) {
|
||||
<ExamList user={user} entities={entities} />
|
||||
</TabPanel>
|
||||
)}
|
||||
{checkAccess(user, ["developer", "admin", "corporate", "mastercorporate"], permissions, "viewCodes") && (
|
||||
{checkAccess(user, ["developer", "admin", "corporate", "mastercorporate"]) && entitiesViewCodes.length > 0 && (
|
||||
<TabPanel className="overflow-y-scroll max-h-[600px] rounded-xl scrollbar-hide">
|
||||
<CodeList user={user} />
|
||||
<CodeList user={user} canDeleteCodes={entitiesDeleteCodes.length > 0} />
|
||||
</TabPanel>
|
||||
)}
|
||||
{checkAccess(user, ["developer", "admin"]) && (
|
||||
|
||||
@@ -47,6 +47,8 @@ const USER_MANAGEMENT: PermissionLayout[] = [
|
||||
{ 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" },
|
||||
{ label: "View Code List", key: "view_code_list" },
|
||||
{ label: "Delete Code", key: "delete_code" },
|
||||
]
|
||||
|
||||
const EXAM_MANAGEMENT: PermissionLayout[] = [
|
||||
@@ -65,6 +67,8 @@ const EXAM_MANAGEMENT: PermissionLayout[] = [
|
||||
{ label: "View Level", key: "view_level" },
|
||||
{ label: "Generate Level", key: "generate_level" },
|
||||
{ label: "Delete Level", key: "delete_level" },
|
||||
{ label: "View Statistics", key: "view_statistics" },
|
||||
{ label: "Download Statistics Report", key: "download_statistics_report" }
|
||||
]
|
||||
|
||||
const CLASSROOM_MANAGEMENT: PermissionLayout[] = [
|
||||
|
||||
@@ -53,14 +53,20 @@ export type RolePermission =
|
||||
"create_user" |
|
||||
"create_user_batch" |
|
||||
"create_code" |
|
||||
"create_code_batch"
|
||||
"create_code_batch" |
|
||||
"view_code_list" |
|
||||
"delete_code" |
|
||||
"view_statistics" |
|
||||
"download_statistics_report"
|
||||
|
||||
export const DEFAULT_PERMISSIONS: RolePermission[] = [
|
||||
"view_students",
|
||||
"view_teachers",
|
||||
"view_assignments",
|
||||
"view_classrooms",
|
||||
"view_entity_roles"
|
||||
"view_entity_roles",
|
||||
"view_statistics",
|
||||
"download_statistics_report"
|
||||
]
|
||||
|
||||
export const ADMIN_PERMISSIONS: RolePermission[] = [
|
||||
@@ -118,5 +124,9 @@ export const ADMIN_PERMISSIONS: RolePermission[] = [
|
||||
"create_user",
|
||||
"create_user_batch",
|
||||
"create_code",
|
||||
"create_code_batch"
|
||||
"create_code_batch",
|
||||
"view_code_list",
|
||||
"delete_code",
|
||||
"view_statistics",
|
||||
"download_statistics_report"
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user