-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Expand file tree
/
Copy pathPermissionsDisplay.tsx
More file actions
107 lines (101 loc) · 3.19 KB
/
PermissionsDisplay.tsx
File metadata and controls
107 lines (101 loc) · 3.19 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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import React from "react";
import {
EuiBadge,
EuiFlexGroup,
EuiFlexItem,
EuiPanel,
EuiText,
EuiTitle,
EuiHorizontalRule,
EuiToolTip,
} from "@elastic/eui";
import { formatPermissions } from "../utils/permissionUtils";
interface PermissionsDisplayProps {
permissions: any[] | undefined;
}
const PermissionsDisplay: React.FC<PermissionsDisplayProps> = ({
permissions,
}) => {
if (!permissions || permissions.length === 0) {
return (
<EuiText>
<p>No permissions defined for this resource.</p>
</EuiText>
);
}
const getActionColor = (action: string) => {
if (action.startsWith("READ")) return "success";
if (action.startsWith("WRITE")) return "warning";
if (action === "CREATE") return "primary";
if (action === "UPDATE") return "accent";
if (action === "DELETE") return "danger";
return "default";
};
return (
<React.Fragment>
{permissions.map((permission, index) => {
const actions = permission.spec?.actions?.map((a: number) => {
const actionNames = [
"CREATE",
"DESCRIBE",
"UPDATE",
"DELETE",
"READ_ONLINE",
"READ_OFFLINE",
"WRITE_ONLINE",
"WRITE_OFFLINE",
];
return actionNames[a] || `Unknown (${a})`;
});
return (
<div key={index} style={{ marginBottom: "8px" }}>
<EuiToolTip
position="top"
content={
<div>
<p>
<strong>Name:</strong> {permission.spec?.name}
</p>
<p>
<strong>Policy:</strong>{" "}
{permission.spec?.policy?.roles
? `Roles: ${permission.spec.policy.roles.join(", ")}`
: "No policy defined"}
</p>
{permission.spec?.name_patterns && (
<p>
<strong>Name Patterns:</strong>{" "}
{Array.isArray(permission.spec.name_patterns)
? permission.spec.name_patterns.join(", ")
: permission.spec.name_patterns}
</p>
)}
{permission.spec?.required_tags && (
<p>
<strong>Required Tags:</strong>{" "}
{Object.entries(permission.spec.required_tags)
.map(([key, value]) => `${key}: ${value}`)
.join(", ")}
</p>
)}
</div>
}
>
<EuiText>
<h4>{permission.spec?.name}</h4>
</EuiText>
</EuiToolTip>
<EuiFlexGroup wrap responsive={false} gutterSize="xs">
{actions.map((action: string, actionIndex: number) => (
<EuiFlexItem grow={false} key={actionIndex}>
<EuiBadge color={getActionColor(action)}>{action}</EuiBadge>
</EuiFlexItem>
))}
</EuiFlexGroup>
</div>
);
})}
</React.Fragment>
);
};
export default PermissionsDisplay;