Skip to content

Commit f4959e2

Browse files
committed
feat: add roles tab
1 parent 315e5c6 commit f4959e2

3 files changed

Lines changed: 81 additions & 18 deletions

File tree

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

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,25 @@ interface PermissionRowProps {
1717

1818
const PermissionRow = ({ resourceLabel, actions }: PermissionRowProps) => (
1919
<Row className="row align-items-center border px-2 py-2">
20-
<Col md={3}>
20+
<Col md={2}>
2121
<span className="small font-weight-bold">{resourceLabel}</span>
2222
</Col>
2323
<Col>
24-
<div className="w-100 d-flex flex-wrap">
25-
{actions.map(action => (
26-
<Chip
27-
key={action.key}
28-
iconBefore={actionsDictionary[action.key as ActionKey] as ComponentType}
29-
disabled={action.disabled}
30-
className="mr-4 my-2 px-3 bg-primary-100 border-0 permission-chip"
31-
variant="light"
32-
>
33-
{action.label}
34-
</Chip>
24+
<div className="w-100 d-flex flex-wrap align-items-center">
25+
{actions.map((action, index) => (
26+
<>
27+
<Chip
28+
key={action.key}
29+
iconBefore={actionsDictionary[action.key as ActionKey] as ComponentType}
30+
disabled={action.disabled}
31+
className="mx-3 my-2 px-3 bg-primary-100 border-0 permission-chip"
32+
variant="light"
33+
>
34+
{action.label}
35+
</Chip>
36+
{(index === actions.length - 1) ? null
37+
: (<hr className="border-right mx-2" style={{ height: '24px' }} />)}
38+
</>
3539
))}
3640
</div>
3741
</Col>

src/authz-module/libraries-manager/LibrariesTeamManager.test.tsx

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { screen } from '@testing-library/react';
1+
import { fireEvent, screen } from '@testing-library/react';
22
import { renderWrapper } from '@src/setupTest';
33
import { initializeMockApp } from '@edx/frontend-platform/testing';
44
import { useLibrary } from '@src/authz-module/data/hooks';
@@ -29,6 +29,17 @@ jest.mock('./components/AddNewTeamMemberModal', () => ({
2929
AddNewTeamMemberTrigger: () => <div data-testid="add-team-member-trigger">MockAddNewTeamMemberTrigger</div>,
3030
}));
3131

32+
jest.mock('../components/RoleCard', () => ({
33+
__esModule: true,
34+
default: ({ title, description, permissions }: { title: string, description: string, permissions: any[] }) => (
35+
<div data-testid="role-card">
36+
<div>{title}</div>
37+
<div>{description}</div>
38+
<div>{permissions.length} permissions</div>
39+
</div>
40+
),
41+
}));
42+
3243
describe('LibrariesTeamManager', () => {
3344
beforeEach(() => {
3445
initializeMockApp({
@@ -41,8 +52,19 @@ describe('LibrariesTeamManager', () => {
4152
libraryName: 'Mock Library',
4253
libraryOrg: 'MockOrg',
4354
username: 'mockuser',
44-
roles: ['admin'],
45-
permissions: [],
55+
roles: [
56+
{
57+
name: 'Instructor',
58+
description: 'Can manage content.',
59+
userCount: 3,
60+
permissions: ['view', 'edit'],
61+
},
62+
],
63+
permissions: [
64+
{ key: 'view_library', label: 'view', resource: 'library' },
65+
{ key: 'edit_library', name: 'edit', resource: 'library' },
66+
],
67+
resources: [{ key: 'library', displayName: 'Library' }],
4668
canManageTeam: true,
4769
});
4870

@@ -72,4 +94,19 @@ describe('LibrariesTeamManager', () => {
7294
// AddNewTeamMemberTrigger is rendered
7395
expect(screen.getByTestId('add-team-member-trigger')).toBeInTheDocument();
7496
});
97+
98+
it('renders role cards when "Roles" tab is selected', async () => {
99+
renderWrapper(<LibrariesTeamManager />);
100+
101+
// Click on "Roles" tab
102+
const rolesTab = await screen.findByRole('tab', { name: /roles/i });
103+
fireEvent.click(rolesTab);
104+
105+
const roleCards = await screen.findAllByTestId('role-card');
106+
107+
expect(roleCards.length).toBeGreaterThan(0);
108+
expect(screen.getByText('Instructor')).toBeInTheDocument();
109+
expect(screen.getByText(/Can manage content/i)).toBeInTheDocument();
110+
expect(screen.getByText(/1 permissions/i)).toBeInTheDocument();
111+
});
75112
});

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

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,33 @@
1+
import { useMemo } from 'react';
12
import { useIntl } from '@edx/frontend-platform/i18n';
2-
import { Tab, Tabs } from '@openedx/paragon';
3+
import { Container, Tab, Tabs } from '@openedx/paragon';
34
import { useLibrary } from '@src/authz-module/data/hooks';
45
import { useLocation } from 'react-router-dom';
56
import TeamTable from './components/TeamTable';
67
import AuthZLayout from '../components/AuthZLayout';
8+
import RoleCard from '../components/RoleCard';
79
import { useLibraryAuthZ } from './context';
810
import { AddNewTeamMemberTrigger } from './components/AddNewTeamMemberModal';
11+
import { buildPermissionsByRoleMatrix } from './utils';
912

1013
import messages from './messages';
1114

1215
const LibrariesTeamManager = () => {
1316
const intl = useIntl();
1417
const { hash } = useLocation();
15-
const { libraryId, canManageTeam } = useLibraryAuthZ();
18+
const {
19+
libraryId, canManageTeam, roles, permissions, resources,
20+
} = useLibraryAuthZ();
1621
const { data: library } = useLibrary(libraryId);
1722
const rootBradecrumb = intl.formatMessage(messages['library.authz.breadcrumb.root']) || '';
1823
const pageTitle = intl.formatMessage(messages['library.authz.manage.page.title']);
24+
const libraryRoles = useMemo(() => roles.map(role => ({
25+
...role,
26+
permissions: buildPermissionsByRoleMatrix({
27+
rolePermissions: role.permissions, permissions, resources, intl,
28+
}),
29+
})), [roles, permissions, resources, intl]);
30+
1931
return (
2032
<div className="authz-libraries">
2133
<AuthZLayout
@@ -39,7 +51,17 @@ const LibrariesTeamManager = () => {
3951
<TeamTable />
4052
</Tab>
4153
<Tab eventKey="roles" title={intl.formatMessage(messages['library.authz.tabs.roles'])}>
42-
Role tab.
54+
<Container className="p-5">
55+
{libraryRoles && libraryRoles.map(role => (
56+
<RoleCard
57+
key={`${role}-description`}
58+
title={role.name}
59+
userCounter={role.userCount}
60+
description={role.description}
61+
permissions={role.permissions as any[]}
62+
/>
63+
))}
64+
</Container>
4365
</Tab>
4466
<Tab id="libraries-permissions-tab" eventKey="permissions" title={intl.formatMessage(messages['library.authz.tabs.permissions'])}>
4567
Permissions tab.

0 commit comments

Comments
 (0)