1+ import React from 'react' ;
12import { useIntl } from '@edx/frontend-platform/i18n' ;
23import { Check , Close } from '@openedx/paragon/icons' ;
3- import { Card , Icon } from '@openedx/paragon' ;
4+ import {
5+ Card , Icon , OverlayTrigger , Tooltip ,
6+ } from '@openedx/paragon' ;
47import { PermissionsResourceGrouped , Role } from '@src/types' ;
58import { actionsDictionary } from './RoleCard/constants' ;
69import ResourceTooltip from './ResourceTooltip' ;
@@ -9,28 +12,55 @@ import messages from './messages';
912type PermissionTableProps = {
1013 roles : Role [ ] ;
1114 permissionsTable : PermissionsResourceGrouped [ ] ;
15+ title ?: string ;
1216} ;
1317
14- const PermissionTable = ( { permissionsTable, roles } : PermissionTableProps ) => {
18+ const PermissionTable = ( { permissionsTable, roles, title } : PermissionTableProps ) => {
1519 const { formatMessage } = useIntl ( ) ;
1620 return (
1721 < Card >
1822 < table className = "permission-table w-100" >
1923 < thead >
2024 < tr >
21- < th className = "" aria-hidden = "true" />
25+ < th className = "sticky-top bg-white px-4 py-3" >
26+ { title }
27+ </ th >
2228 { roles . map ( role => (
23- < th key = { role . name } className = "text-center py-3" > { role . name } </ th >
29+ < th
30+ key = { role . name }
31+ className = { `text-center py-3 sticky-top bg-white ${ role . disabled ? 'text-gray-200' : '' } ` }
32+ >
33+ { role . disabled ? (
34+ < OverlayTrigger
35+ placement = "top"
36+ overlay = { (
37+ < Tooltip
38+ id = { `tooltip-${ role . name } ` }
39+ variant = "light"
40+ >
41+ { formatMessage ( messages [ 'authz.role.card.permission.for.role.status.disabled' ] ) }
42+ </ Tooltip >
43+ ) }
44+ >
45+ < span style = { { cursor : 'help' } } > { role . name } </ span >
46+ </ OverlayTrigger >
47+ ) : (
48+ role . name
49+ ) }
50+ </ th >
2451 ) ) }
2552 </ tr >
2653 </ thead >
2754 < tbody >
2855 { permissionsTable . map ( resourceGroup => (
29- < >
56+ < React . Fragment key = { resourceGroup . key } >
3057 < tr className = "bg-info-100 text-primary" >
3158 < td colSpan = { roles . length + 1 } className = "text-start py-3 px-4" >
32- < strong > { resourceGroup . label } </ strong >
33- < ResourceTooltip resourceGroup = { resourceGroup } />
59+ < div className = "d-flex align-items-center" >
60+ { resourceGroup . icon && < Icon className = "d-inline-block mr-2" size = "xs" src = { resourceGroup . icon } /> }
61+ < strong > { resourceGroup . label } </ strong >
62+ < ResourceTooltip resourceGroup = { resourceGroup } />
63+ </ div >
3464 </ td >
3565 </ tr >
3666 { resourceGroup . permissions . map ( permission => (
@@ -40,12 +70,12 @@ const PermissionTable = ({ permissionsTable, roles }: PermissionTableProps) => {
4070 { permission . label }
4171 </ td >
4272 { roles . map ( role => (
43- < td key = { role . name } className = " text-center" >
73+ < td key = { role . name } className = { ` text-center ${ role . disabled ? 'text-gray-200' : '' } ` } >
4474 {
4575 permission . roles [ role . name ]
4676 ? (
4777 < Icon
48- className = " d-inline-block"
78+ className = { ` d-inline-block ${ role . disabled ? 'text-gray-200' : 'text-success' } ` }
4979 src = { Check }
5080 aria-label = { formatMessage ( messages [ 'authz.role.card.permission.for.role.status.granted' ] , {
5181 roleName : role . name ,
@@ -57,12 +87,12 @@ const PermissionTable = ({ permissionsTable, roles }: PermissionTableProps) => {
5787 )
5888 : (
5989 < Icon
60- className = "text-danger d-inline-block"
90+ className = { ` d-inline-block ${ role . disabled ? 'text-gray-200' : 'text-danger' } ` }
6191 src = { Close }
62- aria-label = { formatMessage ( messages [ 'authz.role.card.permission.for.role.status.denied ' ] , {
92+ aria-label = { formatMessage ( messages [ 'authz.role.card.permission.for.role.status.not.granted ' ] , {
6393 roleName : role . name ,
6494 } ) }
65- screenReaderText = { formatMessage ( messages [ 'authz.role.card.permission.for.role.status.denied ' ] , {
95+ screenReaderText = { formatMessage ( messages [ 'authz.role.card.permission.for.role.status.not.granted ' ] , {
6696 roleName : role . name ,
6797 } ) }
6898 />
@@ -72,7 +102,7 @@ const PermissionTable = ({ permissionsTable, roles }: PermissionTableProps) => {
72102 ) ) }
73103 </ tr >
74104 ) ) }
75- </ >
105+ </ React . Fragment >
76106 ) ) }
77107 </ tbody >
78108 </ table >
0 commit comments