Skip to content

Commit 3dfc7c1

Browse files
committed
Add isSystemRole field to RoleEntity and update related logic in RBAC components
1 parent b62817f commit 3dfc7c1

5 files changed

Lines changed: 18 additions & 16 deletions

File tree

prisma/schema.prisma

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ model RoleEntity {
282282
id String @id @default(cuid())
283283
name String @unique
284284
description String?
285+
isSystemRole Boolean @default(false)
285286
createdAt DateTime @default(now())
286287
updatedAt DateTime @updatedAt
287288
rolePermissions RolePermission[]

prisma/seed-rbac.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,8 @@ async function main() {
271271
prisma.roleEntity.create({
272272
data: {
273273
name: roleName,
274-
description: roleDescriptions[roleName]
274+
description: roleDescriptions[roleName],
275+
isSystemRole: true
275276
}
276277
})
277278
)

src/components/rbac/roles-management.tsx

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,12 @@ export default function RolesManagement() {
7575
};
7676

7777
const systemRoles = useMemo(
78-
() => roles.filter((r) => ['ADMIN', 'DOCTOR', 'NURSE', 'PHARMACIST', 'LAB_TECH', 'RECEPTIONIST', 'EMERGENCY'].includes(r.name)),
78+
() => roles.filter((r) => r.isSystemRole),
7979
[roles]
8080
);
8181

8282
const customRoles = useMemo(
83-
() => roles.filter((r) => !['ADMIN', 'DOCTOR', 'NURSE', 'PHARMACIST', 'LAB_TECH', 'RECEPTIONIST', 'EMERGENCY'].includes(r.name)),
83+
() => roles.filter((r) => !r.isSystemRole),
8484
[roles]
8585
);
8686

@@ -122,15 +122,14 @@ export default function RolesManagement() {
122122
>
123123
Edit
124124
</button>
125-
{role.name !== 'ADMIN' && (
126-
<button
127-
onClick={() => handleDelete(role.id)}
128-
className="p-1 text-red-600 hover:bg-red-50 rounded transition"
129-
title="Delete"
130-
>
131-
<Trash2 className="w-4 h-4" />
132-
</button>
133-
)}
125+
<button
126+
onClick={() => handleDelete(role.id)}
127+
disabled={role.isSystemRole || role.name === 'ADMINISTRATOR'}
128+
className="p-1 text-red-600 hover:bg-red-50 disabled:text-gray-400 disabled:cursor-not-allowed rounded transition"
129+
title={role.name === 'ADMINISTRATOR' ? "Admin role cannot be deleted" : role.isSystemRole ? "System roles cannot be deleted" : "Delete"}
130+
>
131+
<Trash2 className="w-4 h-4" />
132+
</button>
134133
</div>
135134
</div>
136135
<div className="flex flex-wrap gap-2">

src/components/rbac/users-management.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ export default function UsersManagement() {
8080
// Prevent deleting admin user
8181
if (user?.roleEntityId) {
8282
const userRole = roles.find((r) => r.id === user.roleEntityId);
83-
if (userRole?.name?.toLowerCase() === 'admin') {
83+
if (userRole?.name === 'ADMINISTRATOR') {
8484
setFormError('Cannot delete admin user');
8585
return;
8686
}
@@ -160,14 +160,14 @@ export default function UsersManagement() {
160160
</button>
161161
<button
162162
onClick={() => handleDelete(user.id)}
163-
disabled={!!(user.roleEntityId && roles.find((r) => r.id === user.roleEntityId)?.name?.toLowerCase() === 'admin')}
163+
disabled={!!(user.roleEntityId && roles.find((r) => r.id === user.roleEntityId)?.name === 'ADMINISTRATOR')}
164164
className={`p-1 rounded transition ${
165-
user.roleEntityId && roles.find((r) => r.id === user.roleEntityId)?.name?.toLowerCase() === 'admin'
165+
user.roleEntityId && roles.find((r) => r.id === user.roleEntityId)?.name === 'ADMINISTRATOR'
166166
? 'text-gray-300 cursor-not-allowed'
167167
: 'text-red-600 hover:bg-red-50'
168168
}`}
169169
title={
170-
user.roleEntityId && roles.find((r) => r.id === user.roleEntityId)?.name?.toLowerCase() === 'admin'
170+
user.roleEntityId && roles.find((r) => r.id === user.roleEntityId)?.name === 'ADMINISTRATOR'
171171
? 'Cannot delete admin user'
172172
: 'Delete'
173173
}

src/hooks/use-rbac.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export interface RoleEntity {
1919
id: string;
2020
name: string;
2121
description?: string;
22+
isSystemRole: boolean;
2223
createdAt: string;
2324
updatedAt: string;
2425
rolePermissions: RolePermission[];

0 commit comments

Comments
 (0)