Skip to content

Commit 4d958e1

Browse files
bra-i-amdcoa
authored andcommitted
feat: update RoleCard to use handleDelete prop and integrate revokeUserRoles functionality
1 parent 33aa0f7 commit 4d958e1

2 files changed

Lines changed: 34 additions & 11 deletions

File tree

src/authz-module/components/RoleCard/index.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ interface CardTitleProps {
1414
interface RoleCardProps extends CardTitleProps {
1515
objectName?: string | null;
1616
description: string;
17-
showDelete?: boolean;
17+
handleDelete?: () => void;
1818
permissions: any[];
1919
}
2020

@@ -31,7 +31,7 @@ const CardTitle = ({ title, userCounter }: CardTitleProps) => (
3131
);
3232

3333
const RoleCard = ({
34-
title, objectName, description, showDelete, permissions, userCounter,
34+
title, objectName, description, handleDelete, permissions, userCounter,
3535
}: RoleCardProps) => {
3636
const intl = useIntl();
3737

@@ -41,7 +41,9 @@ const RoleCard = ({
4141
title={<CardTitle title={title} userCounter={userCounter} />}
4242
subtitle={(objectName && <span className="text-info-400 lead">{objectName}</span>) || ''}
4343
actions={
44-
showDelete && <IconButton variant="danger" alt="Delete role action" src={Delete} />
44+
handleDelete && (
45+
<IconButton variant="danger" onClick={handleDelete} alt="Delete role action" src={Delete} />
46+
)
4547
}
4648
/>
4749
<Card.Section>

src/authz-module/libraries-manager/LibrariesUserManager.tsx

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,31 @@
1-
import { useMemo } from 'react';
2-
import { useParams } from 'react-router-dom';
1+
import { useEffect, useMemo } from 'react';
2+
import { useNavigate, useParams } from 'react-router-dom';
33
import { useIntl } from '@edx/frontend-platform/i18n';
4-
import { Container, Skeleton } from '@openedx/paragon';
4+
import { Container } from '@openedx/paragon';
55
import { ROUTES } from '@src/authz-module/constants';
66
import AuthZLayout from '../components/AuthZLayout';
77
import { useLibraryAuthZ } from './context';
88
import RoleCard from '../components/RoleCard';
99
import { AssignNewRoleTrigger } from './components/AssignNewRoleModal';
10-
import { useLibrary, useTeamMembers } from '../data/hooks';
10+
import { useLibrary, useRevokeUserRoles, useTeamMembers } from '../data/hooks';
1111
import { buildPermissionsByRoleMatrix } from './utils';
1212

1313
import messages from './messages';
1414

1515
const LibrariesUserManager = () => {
1616
const intl = useIntl();
17+
const navigate = useNavigate();
1718
const { username } = useParams();
1819
const {
1920
libraryId, permissions, roles, resources, canManageTeam,
2021
} = useLibraryAuthZ();
2122
const { data: library } = useLibrary(libraryId);
23+
const { mutate: revokeUserRoles } = useRevokeUserRoles();
2224
const rootBreadcrumb = intl.formatMessage(messages['library.authz.breadcrumb.root']) || '';
2325
const pageManageTitle = intl.formatMessage(messages['library.authz.manage.page.title']);
26+
const teamMembersPath = `/authz/${ROUTES.LIBRARIES_TEAM_PATH.replace(':libraryId', libraryId)}`;
2427

25-
const { data: teamMembers, isLoading } = useTeamMembers(libraryId);
28+
const { data: teamMembers, isLoading: isLoadingTeamMembers } = useTeamMembers(libraryId);
2629
const user = teamMembers?.find(member => member.username === username);
2730
const userRoles = useMemo(() => {
2831
const assignedRoles = roles.filter(role => user?.roles.includes(role.role))
@@ -35,11 +38,30 @@ const LibrariesUserManager = () => {
3538
return assignedRoles;
3639
}, [roles, user?.roles, permissions, resources, intl]);
3740

41+
const handleRevokeUserRole = (role: string) => {
42+
if (user) {
43+
const data = {
44+
users: user.username,
45+
role,
46+
scope: libraryId,
47+
};
48+
49+
revokeUserRoles({ data });
50+
}
51+
};
52+
53+
useEffect(() => {
54+
if (!isLoadingTeamMembers && !userRoles.length) {
55+
navigate(teamMembersPath);
56+
}
57+
// eslint-disable-next-line react-hooks/exhaustive-deps
58+
}, [userRoles, libraryId]);
59+
3860
return (
3961
<div className="authz-libraries">
4062
<AuthZLayout
4163
context={{ id: libraryId, title: library.title, org: library.org }}
42-
navLinks={[{ label: rootBreadcrumb }, { label: pageManageTitle, to: `/authz/${ROUTES.LIBRARIES_TEAM_PATH.replace(':libraryId', libraryId)}` }]}
64+
navLinks={[{ label: rootBreadcrumb }, { label: pageManageTitle, to: teamMembersPath }]}
4365
activeLabel={user?.username || ''}
4466
pageTitle={user?.username || ''}
4567
pageSubtitle={<p>{user?.email}</p>}
@@ -52,14 +74,13 @@ const LibrariesUserManager = () => {
5274
: []}
5375
>
5476
<Container className="bg-light-200 p-5">
55-
{isLoading ? <Skeleton count={2} height={200} /> : null}
5677
{userRoles && userRoles.map(role => (
5778
<RoleCard
5879
key={`${role}-${username}`}
5980
title={role.name}
6081
objectName={library.title}
6182
description={role.description}
62-
showDelete
83+
handleDelete={() => handleRevokeUserRole(role.role)}
6384
permissions={role.permissions as any[]}
6485
/>
6586
))}

0 commit comments

Comments
 (0)