@@ -5,15 +5,16 @@ import {
55import { useIntl } from '@edx/frontend-platform/i18n' ;
66import { AppContext } from '@edx/frontend-platform/react' ;
77import type { AppContextType } from '@edx/frontend-platform/react' ;
8- import debounce from 'lodash.debounce' ;
98import {
109 Container , DataTable ,
1110} from '@openedx/paragon' ;
1211import TableFooter from '@src/authz-module/components/TableFooter/TableFooter' ;
13- import { AUTHZ_HOME_PATH , TABLE_DEFAULT_PAGE_SIZE } from '@src/authz-module/constants' ;
12+ import {
13+ AUTHZ_HOME_PATH , TABLE_DEFAULT_PAGE_SIZE ,
14+ } from '@src/authz-module/constants' ;
1415import AuthZLayout from '@src/authz-module/components/AuthZLayout' ;
1516import { useNavigate , useParams } from 'react-router-dom' ;
16- import { useUserAccount } from '@src/data/hooks' ;
17+ import { useUserAccount , useValidateUserPermissionsNonSuspense } from '@src/data/hooks' ;
1718import baseMessages from '@src/authz-module/messages' ;
1819import AddRoleButton from '@src/authz-module/components/AddRoleButton' ;
1920import {
@@ -30,7 +31,7 @@ import RolesFilter from '@src/authz-module/components/TableControlBar/RolesFilte
3031import TableControlBar from '@src/authz-module/components/TableControlBar/TableControlBar' ;
3132import messages from './messages' ;
3233import ConfirmDeletionModal from '../components/ConfirmDeletionModal' ;
33- import { getCellHeader } from '../components /utils' ;
34+ import { getCellHeader , getScopeManageActionPermission } from '../utils' ;
3435
3536const AuditUserPage = ( ) => {
3637 const { formatMessage } = useIntl ( ) ;
@@ -52,7 +53,30 @@ const AuditUserPage = () => {
5253 } = useToastManager ( ) ;
5354 const { mutate : revokeUserRoles , isPending : isRevokingUserRolePending } = useRevokeUserRoles ( ) ;
5455
55- const fetchData = useMemo ( ( ) => debounce ( handleTableFetch , 500 ) , [ handleTableFetch ] ) ;
56+ const deletePermissions = useMemo ( ( ) => {
57+ const uniqueScopes = [ ...new Set ( userAssignments . map ( assignment => assignment . scope ) ) ] ;
58+ return uniqueScopes . map ( scope => getScopeManageActionPermission ( scope ) ) ;
59+ } , [ userAssignments ] ) ;
60+
61+ const {
62+ data : permissionsToManageScope ,
63+ } = useValidateUserPermissionsNonSuspense ( deletePermissions ) ;
64+
65+ const rowsWithPermissions = useMemo ( ( ) => {
66+ if ( ! permissionsToManageScope ) { return userAssignments ; }
67+
68+ return userAssignments . map ( assignment => {
69+ const canManageScope = permissionsToManageScope . some (
70+ permission => permission . scope === assignment . scope && permission . allowed ,
71+ ) ;
72+ return {
73+ ...assignment ,
74+ canManageScope,
75+ } ;
76+ } ) ;
77+ } , [ userAssignments , permissionsToManageScope ] ) ;
78+
79+ const fetchData = useMemo ( ( ) => handleTableFetch , [ handleTableFetch ] ) ;
5680
5781 useEffect ( ( ) => {
5882 if ( ! user && ! isLoadingUser ) {
@@ -63,8 +87,6 @@ const AuditUserPage = () => {
6387 }
6488 } , [ user , isLoadingUser , navigate , isErrorUser , errorUser ] ) ;
6589
66- useEffect ( ( ) => ( ) => fetchData . cancel ( ) , [ fetchData ] ) ;
67-
6890 const handleShowConfirmDeletionModal = useCallback ( ( role : RoleToDelete ) => {
6991 if ( isRevokingUserRolePending ) { return ; }
7092
@@ -227,7 +249,7 @@ const AuditUserPage = () => {
227249 isFilterable
228250 isSortable
229251 manualPagination
230- data = { userAssignments }
252+ data = { rowsWithPermissions }
231253 manualFilters
232254 manualSortBy
233255 fetchData = { fetchData }
0 commit comments