diff --git a/frontend/app/features/PermissionsPage.tsx b/frontend/app/features/PermissionsPage.tsx
index a7b8252..83a39e4 100644
--- a/frontend/app/features/PermissionsPage.tsx
+++ b/frontend/app/features/PermissionsPage.tsx
@@ -96,10 +96,14 @@ export function PermissionsPage({ notify }: { notify: (message: string) => void
async function revoke(permission: PermissionGrant) {
if (!resourceId) return;
- const resourceLabel = resources.find((item) => String(item.id) === resourceId)?.label ?? resourceId;
- const message = `${resourceType === "documents" ? "문서" : "컬렉션"} “${resourceLabel}”에서 ${targetLabel(permission)}의 ${permission.permissionType} 권한을 회수할까요?`;
- if (!window.confirm(message)) return;
+ const target = targetLabel(permission, roles, departments);
+ const resourceName = resourceType === "documents"
+ ? documents.find((item) => item.documentId === Number(resourceId))?.title
+ : collections.find((item) => item.collectionId === Number(resourceId))?.name;
+ const resourceLabel = resourceName ?? `${resourceType === "documents" ? "문서" : "컬렉션"} #${resourceId}`;
+ if (!window.confirm(`${resourceLabel}에서 ${target}의 ${permission.permissionType} 권한을 회수할까요?`)) return;
setBusy(true);
+ setError("");
try {
await apiRequest(`/permissions/${resourceType}/${resourceId}/${permission.permissionId}`, { method: "DELETE" });
notify("권한을 회수했습니다.");
@@ -135,13 +139,20 @@ export function PermissionsPage({ notify }: { notify: (message: string) => void
{permissionsLoading ? : null}
{!permissionsLoading && permissionsError ? 직접 권한 목록을 조회할 수 없습니다. {permissionsError} : null}
{!permissionsLoading && !permissionsError && !directPermissions.length ? 이 리소스에 직접 부여된 권한이 없습니다. : null}
- {!permissionsLoading && directPermissions.length ?
대상권한만료
{directPermissions.map((permission) =>
{targetLabel(permission)}#{permission.permissionId} · user #{permission.grantedBy} · {formatDate(permission.grantedAt)}{permission.expiresAt ? formatDate(permission.expiresAt) : "제한 없음"}
)}
: null}
+ {!permissionsLoading && directPermissions.length ? 대상권한만료
{directPermissions.map((permission) =>
{targetLabel(permission, roles, departments)}#{permission.permissionId} · user #{permission.grantedBy} · {formatDate(permission.grantedAt)}{permission.expiresAt ? formatDate(permission.expiresAt) : "제한 없음"}
)}
: null}
> : null}
;
}
-function targetLabel(permission: PermissionGrant) {
- const targetId = permission.userId ?? permission.roleId ?? permission.departmentId;
- return `${permission.targetType} #${targetId ?? "—"}`;
+function targetLabel(permission: PermissionGrant, roles: Role[], departments: Department[]) {
+ if (permission.targetType === "ROLE") {
+ const role = roles.find((item) => item.id === permission.roleId);
+ return role ? `ROLE ${role.name}` : `ROLE #${permission.roleId ?? "—"}`;
+ }
+ if (permission.targetType === "DEPARTMENT") {
+ const department = departments.find((item) => item.id === permission.departmentId);
+ return department ? `DEPARTMENT ${department.name}` : `DEPARTMENT #${permission.departmentId ?? "—"}`;
+ }
+ return `USER #${permission.userId ?? "—"}`;
}