Skip to content

Commit 9943bea

Browse files
committed
feat(audit-trail): implement roles and permissions view
1 parent 1539ce9 commit 9943bea

3 files changed

Lines changed: 125 additions & 1 deletion

File tree

apps/explorer/src/pages/trust-framework/audit-trail-result/AuditTrailContent.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { TransactionsView } from '../common/TransactionsView';
2121
import { AuditTrailSummaryView } from './views/AuditTrailSummaryView';
2222
import { MetadataView } from './views/MetadataView';
2323
import { LockLifecycleView } from './views/lock-lifecycle/LockLifecycleView';
24+
import { RolesView } from './views/roles/RolesView';
2425
import { TagsView } from './views/TagsView';
2526
import { RecordsView } from './views/RecordsView';
2627
import { SideBySidePanels } from '~/components/ui/SideBySidePanels';
@@ -127,7 +128,7 @@ export function AuditTrailContent({ objectId }: AuditTrailContentProps) {
127128
<RecordsView objectId={objectId} auditTrail={auditTrailHandle} />
128129
<SideBySidePanels
129130
ratio="66-34"
130-
firstPanel={<p>Replace by RolesView</p>}
131+
firstPanel={<RolesView roles={auditTrailObject.roles.roles} />}
131132
secondPanel={<TagsView tags={auditTrailObject.tags} />}
132133
/>
133134
<TransactionsView objectId={objectId} />
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// Copyright (c) 2026 IOTA Stiftung
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
import { type ColumnDef } from '@tanstack/react-table';
5+
import { TableCard } from '../../../../../components/ui/TableCard';
6+
import { getPermissionName } from './helper';
7+
import { type RolePermissionsEntry, type RoleTags } from '@iota/audit-trail';
8+
import {
9+
TableCellBase,
10+
TableCellText,
11+
Title,
12+
Panel,
13+
InfoBox,
14+
InfoBoxType,
15+
InfoBoxStyle,
16+
} from '@iota/apps-ui-kit';
17+
import { Info } from '@iota/apps-ui-icons';
18+
19+
interface RolesCardProps {
20+
roles: RolePermissionsEntry[];
21+
}
22+
23+
export function RolesView({ roles }: RolesCardProps) {
24+
return (
25+
<Panel>
26+
<div className="flex w-full flex-col gap-sm">
27+
<Title title="Roles" />
28+
<div className="flex flex-col gap-sm">
29+
{roles.length === 0 ? (
30+
<InfoBox
31+
title="No roles found"
32+
supportingText="This audit trail has no roles configured."
33+
type={InfoBoxType.Default}
34+
style={InfoBoxStyle.Elevated}
35+
icon={<Info />}
36+
/>
37+
) : (
38+
<TableCard
39+
data={roles}
40+
columns={generateRolesColumns()}
41+
defaultSorting={[{ id: 'role', desc: false }]}
42+
/>
43+
)}
44+
</div>
45+
</div>
46+
</Panel>
47+
);
48+
}
49+
50+
export function generateRolesColumns(): ColumnDef<RolePermissionsEntry>[] {
51+
return [
52+
{
53+
header: 'Role Name',
54+
accessorKey: 'name',
55+
cell: ({ getValue }) => {
56+
const role = getValue<string>();
57+
return (
58+
<TableCellBase>
59+
<TableCellText>{role}</TableCellText>
60+
</TableCellBase>
61+
);
62+
},
63+
},
64+
{
65+
header: 'Permissions',
66+
accessorKey: 'permissions',
67+
cell: ({ getValue }) => {
68+
const permissions = getValue<number[]>()
69+
.map((p: number) => getPermissionName(p))
70+
.join(', ');
71+
return (
72+
<TableCellBase>
73+
<TableCellText>{permissions}</TableCellText>
74+
</TableCellBase>
75+
);
76+
},
77+
},
78+
{
79+
header: 'Tags',
80+
accessorKey: 'roleTags',
81+
cell: ({ getValue }) => {
82+
const roleTags = getValue<RoleTags>();
83+
const tags = !roleTags ? 'N/A' : roleTags.tags.join(', ');
84+
return (
85+
<TableCellBase>
86+
<TableCellText>{tags}</TableCellText>
87+
</TableCellBase>
88+
);
89+
},
90+
},
91+
// Note: A column for Tags will be added here in a subsequent step.
92+
];
93+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Copyright (c) 2026 IOTA Stiftung
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
import { Permission } from '@iota/audit-trail';
5+
6+
export const permissionMap = new Map<number, string>([
7+
[Permission.DeleteAuditTrail, 'DeleteAuditTrail'],
8+
[Permission.DeleteAllRecords, 'DeleteAllRecords'],
9+
[Permission.AddRecord, 'AddRecord'],
10+
[Permission.DeleteRecord, 'DeleteRecord'],
11+
[Permission.CorrectRecord, 'CorrectRecord'],
12+
[Permission.UpdateLockingConfig, 'UpdateLockingConfig'],
13+
[Permission.UpdateLockingConfigForDeleteRecord, 'UpdateLockingConfigForDeleteRecord'],
14+
[Permission.UpdateLockingConfigForDeleteTrail, 'UpdateLockingConfigForDeleteTrail'],
15+
[Permission.UpdateLockingConfigForWrite, 'UpdateLockingConfigForWrite'],
16+
[Permission.AddRoles, 'AddRoles'],
17+
[Permission.UpdateRoles, 'UpdateRoles'],
18+
[Permission.DeleteRoles, 'DeleteRoles'],
19+
[Permission.AddCapabilities, 'AddCapabilities'],
20+
[Permission.RevokeCapabilities, 'RevokeCapabilities'],
21+
[Permission.UpdateMetadata, 'UpdateMetadata'],
22+
[Permission.DeleteMetadata, 'DeleteMetadata'],
23+
[Permission.Migrate, 'Migrate'],
24+
[Permission.AddRecordTags, 'AddRecordTags'],
25+
[Permission.DeleteRecordTags, 'DeleteRecordTags'],
26+
]);
27+
28+
export function getPermissionName(code: number): string {
29+
return permissionMap.get(code) ?? 'UnknownPermission';
30+
}

0 commit comments

Comments
 (0)