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 ?? "—"}`; }