Skip to content

Commit f10ec2b

Browse files
committed
feat: add Assign Role button and update messages for role assignment navigation
1 parent 4ef2d95 commit f10ec2b

5 files changed

Lines changed: 26 additions & 63 deletions

File tree

src/authz-module/authz-home/index.tsx

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import { useIntl } from '@edx/frontend-platform/i18n';
2-
import { Tab, Tabs } from '@openedx/paragon';
3-
import { useLocation } from 'react-router-dom';
2+
import { Button, Tab, Tabs } from '@openedx/paragon';
3+
import { Plus } from '@openedx/paragon/icons';
4+
import { useLocation, useNavigate } from 'react-router-dom';
45
import RolesPermissions from '../roles-permissions/RolesPermissions';
56
import AuthZLayout from '../components/AuthZLayout';
67

78
import messages from './messages';
89

910
const AuthzHome = () => {
1011
const { hash } = useLocation();
12+
const navigate = useNavigate();
1113
const intl = useIntl();
1214

1315
const rootBreadcrumb = intl.formatMessage(messages['authz.breadcrumb.root']) || '';
@@ -21,13 +23,16 @@ const AuthzHome = () => {
2123
activeLabel={pageTitle}
2224
pageTitle={pageTitle}
2325
pageSubtitle=""
24-
actions={
25-
[]
26-
// this needs to be enable again once is refactored to be used outside of library context
27-
// [
28-
// <AddNewTeamMemberTrigger libraryId="" key="add-new-member" />,
29-
// ]
30-
}
26+
actions={[
27+
<Button
28+
iconBefore={Plus}
29+
variant="primary"
30+
onClick={() => navigate('/authz/assign-role')}
31+
key="assign-role"
32+
>
33+
{intl.formatMessage(messages['authz.manage.assign.role.button'])}
34+
</Button>,
35+
]}
3136
>
3237
<Tabs
3338
variant="tabs"

src/authz-module/authz-home/messages.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ const messages = defineMessages({
2121
defaultMessage: 'Roles and Permissions',
2222
description: 'Libraries AuthZ title for the roles tab',
2323
},
24+
'authz.manage.assign.role.button': {
25+
id: 'authz.manage.assign.role.button',
26+
defaultMessage: 'Assign Role',
27+
description: 'Button to navigate to the assign role wizard',
28+
},
2429
});
2530

2631
export default messages;

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

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import { useMemo } from 'react';
22
import { useIntl } from '@edx/frontend-platform/i18n';
33
import {
4-
Container, Skeleton, Tab, Tabs, Button,
4+
Container, Skeleton, Tab, Tabs,
55
} from '@openedx/paragon';
66
import { useLibrary } from '@src/authz-module/data/hooks';
7-
import { useLocation, useNavigate } from 'react-router-dom';
7+
import { useLocation } from 'react-router-dom';
88
import { ROUTES } from '@src/authz-module/constants';
9-
import { Plus } from '@openedx/paragon/icons';
109
import TeamTable from './components/TeamTable';
1110
import AuthZLayout from '../components/AuthZLayout';
1211
import RoleCard from '../components/RoleCard';
@@ -19,20 +18,14 @@ import messages from './messages';
1918
const LibrariesTeamManager = () => {
2019
const intl = useIntl();
2120
const { hash } = useLocation();
22-
const navigate = useNavigate();
2321
const {
24-
libraryId, canManageTeam, roles, permissions, resources,
22+
libraryId, roles, permissions, resources,
2523
} = useLibraryAuthZ();
2624
const { data: library } = useLibrary(libraryId);
2725
const rootBreadcrumb = intl.formatMessage(messages['library.authz.breadcrumb.root']) || '';
2826
const pageTitle = intl.formatMessage(messages['library.authz.manage.page.title']);
2927
const teamMembersPath = `/authz${ROUTES.LIBRARIES_TEAM_PATH.replace(':libraryId', libraryId)}`;
3028

31-
// Handler to navigate to Assign Role Wizard
32-
const handleNavigateToWizard = () => {
33-
navigate(`/authz/assign-role?scope=${libraryId}`);
34-
};
35-
3629
const [libraryPermissionsByRole, libraryPermissionsByResource] = useMemo(() => {
3730
if (!roles && !permissions && !resources) { return [null, null]; }
3831
const permissionsByRole = buildPermissionMatrixByRole({
@@ -55,20 +48,7 @@ const LibrariesTeamManager = () => {
5548
activeLabel={pageTitle}
5649
pageTitle={pageTitle}
5750
pageSubtitle={libraryId}
58-
actions={
59-
canManageTeam
60-
? [
61-
<Button
62-
iconBefore={Plus}
63-
variant="primary"
64-
onClick={handleNavigateToWizard}
65-
key="add-new-role"
66-
>
67-
{intl.formatMessage(messages['library.authz.manage.add.role.button'])}
68-
</Button>,
69-
]
70-
: []
71-
}
51+
actions={[]}
7252
>
7353
<Tabs
7454
variant="tabs"

src/authz-module/libraries-manager/components/AddNewTeamMemberModal/AddNewTeamMemberTrigger.tsx

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Button, useToggle } from '@openedx/paragon';
44
import { Plus } from '@openedx/paragon/icons';
55

66
import { PutAssignTeamMembersRoleResponse } from 'authz-module/data/api';
7-
import { useAssignTeamMembersRole, useValidateUsers } from '@src/authz-module/data/hooks';
7+
import { useAssignTeamMembersRole } from '@src/authz-module/data/hooks';
88
import { RoleOperationErrorStatus } from '@src/authz-module/constants';
99
import { AppToast, useToastManager } from '@src/authz-module/libraries-manager/ToastManagerContext';
1010
import { DEFAULT_TOAST_DELAY } from '@src/authz-module/libraries-manager/constants';
@@ -28,9 +28,7 @@ const AddNewTeamMemberTrigger = ({ libraryId }: AddNewTeamMemberTriggerProps) =>
2828
const [isError, setIsError] = useState(false);
2929
const [errorUsers, setErrorUsers] = useState<string[]>([]);
3030

31-
const { mutate: assignTeamMembersRole, isPending: isAssigning } = useAssignTeamMembersRole();
32-
const { mutateAsync: validateUsersAsync, isPending: isValidating } = useValidateUsers();
33-
const isPending = isAssigning || isValidating;
31+
const { mutate: assignTeamMembersRole, isPending } = useAssignTeamMembersRole();
3432
const {
3533
showToast, showErrorToast, Bold, Br,
3634
} = useToastManager();
@@ -130,34 +128,14 @@ const AddNewTeamMemberTrigger = ({ libraryId }: AddNewTeamMemberTriggerProps) =>
130128
};
131129
};
132130

133-
const handleAddTeamMember = async () => {
131+
const handleAddTeamMember = () => {
134132
const normalizedUsers = [...new Set(
135133
formValues.users
136134
.split(',')
137135
.map((u) => u.trim())
138136
.filter(Boolean),
139137
)];
140138

141-
const { invalidUsers } = await validateUsersAsync({ data: { users: normalizedUsers } })
142-
.catch(() => ({ invalidUsers: [] }));
143-
144-
if (invalidUsers.length > 0) {
145-
const notFoundMessage = intl.formatMessage(
146-
messages['libraries.authz.manage.add.member.failure.not.found'],
147-
{
148-
count: invalidUsers.length,
149-
userIds: invalidUsers.join(', '),
150-
Bold,
151-
Br,
152-
},
153-
);
154-
showToast({ message: notFoundMessage, type: 'error', delay: DEFAULT_TOAST_DELAY });
155-
setErrorUsers(invalidUsers);
156-
setIsError(true);
157-
setFormValues((prev) => ({ ...prev, users: invalidUsers.join(', ') }));
158-
return;
159-
}
160-
161139
if (normalizedUsers.length === 0) { return; }
162140

163141
const payload = {

src/authz-module/libraries-manager/messages.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@ const messages = defineMessages({
1111
defaultMessage: 'Manage Access',
1212
description: 'Libreries AuthZ root breafcrumb',
1313
},
14-
'library.authz.manage.add.role.button': {
15-
id: 'library.authz.manage.add.role.button',
16-
defaultMessage: 'Assign Role',
17-
description: 'Button to add a new role',
18-
},
1914
'library.authz.tabs.team': {
2015
id: 'library.authz.tabs.team',
2116
defaultMessage: 'Team Members',

0 commit comments

Comments
 (0)