-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathindex.tsx
More file actions
78 lines (71 loc) · 2.29 KB
/
index.tsx
File metadata and controls
78 lines (71 loc) · 2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import { useIntl } from '@edx/frontend-platform/i18n';
import {
Card, Collapsible, Container, Icon, IconButton,
} from '@openedx/paragon';
import { Delete, Person } from '@openedx/paragon/icons';
import { RoleResourceGroup } from '@src/types';
import PermissionRow from './PermissionsRow';
import messages from './messages';
interface CardTitleProps {
title: string;
userCounter?: number | null;
}
interface RoleCardProps extends CardTitleProps {
objectName?: string | null;
description: string;
handleDelete?: () => void;
permissionsByResource: RoleResourceGroup[];
}
const CardTitle = ({ title, userCounter = null }: CardTitleProps) => {
const { formatMessage } = useIntl();
return (
<div className="d-flex align-items-center">
<span className="mr-4 text-primary">{title}</span>
{userCounter !== null && (
<span className="d-flex align-items-center font-weight-normal">
<Icon
src={Person}
className="mr-1"
aria-label={formatMessage(messages['authz.role.card.userCounter'])}
screenReaderText={formatMessage(messages['authz.role.card.userCounter'])}
/>
{userCounter}
</span>
)}
</div>
);
};
const RoleCard = ({
title, objectName, description, handleDelete, permissionsByResource, userCounter,
}: RoleCardProps) => {
const intl = useIntl();
return (
<Card className="container-mw-lg mx-auto mb-4">
<Card.Header
title={<CardTitle title={title} userCounter={userCounter} />}
subtitle={(objectName && <span className="text-info-400 lead">{objectName}</span>) || ''}
actions={
handleDelete && (
<IconButton variant="danger" onClick={handleDelete} alt={intl.formatMessage(messages['authz.role.card.delete.action.alt'])} src={Delete} />
)
}
/>
<Card.Section>
{description}
</Card.Section>
<Collapsible
title={intl.formatMessage(messages['authz.permissions.title'])}
>
<Container>
{permissionsByResource.map((resourceGroup) => (
<PermissionRow
key={`${title}-${resourceGroup.key}`}
resource={resourceGroup}
/>
))}
</Container>
</Collapsible>
</Card>
);
};
export default RoleCard;