"use client";
import React from "react";
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table";
import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge";
import { Shield, ShieldCheck, User as UserIcon, Users, Building2 } from "lucide-react";
interface UserAuthTableProps {
users: any[];
isLoading: boolean;
paginationInfo: {
currentPage: number;
pageSize: number;
totalItems: number;
totalPages: number;
};
onEditAuth: (user: any) => void;
onPageChange: (page: number) => void;
}
/**
* 사용자 권한 테이블 컴포넌트
*
* 사용자 목록과 권한 정보를 표시하고 권한 변경 기능 제공
*/
export function UserAuthTable({ users, isLoading, paginationInfo, onEditAuth, onPageChange }: UserAuthTableProps) {
// 권한 레벨 표시
const getUserTypeInfo = (userType: string) => {
switch (userType) {
case "SUPER_ADMIN":
return {
label: "최고 관리자",
icon: ,
className: "bg-purple-100 text-purple-800 border-purple-300",
};
case "COMPANY_ADMIN":
return {
label: "회사 관리자",
icon: ,
className: "bg-blue-100 text-blue-800 border-blue-300",
};
case "USER":
return {
label: "일반 사용자",
icon: ,
className: "bg-gray-100 text-gray-800 border-gray-300",
};
case "GUEST":
return {
label: "게스트",
icon: ,
className: "bg-green-100 text-green-800 border-green-300",
};
case "PARTNER":
return {
label: "협력업체",
icon: ,
className: "bg-orange-100 text-orange-800 border-orange-300",
};
default:
return {
label: userType || "미지정",
icon: ,
className: "bg-gray-100 text-gray-800 border-gray-300",
};
}
};
// 행 번호 계산
const getRowNumber = (index: number) => {
return (paginationInfo.currentPage - 1) * paginationInfo.pageSize + index + 1;
};
// 로딩 스켈레톤
if (isLoading) {
return (
No
사용자 ID
사용자명
회사
부서
현재 권한
액션
{Array.from({ length: 10 }).map((_, index) => (
))}
);
}
// 빈 상태
if (users.length === 0) {
return (
);
}
// 실제 데이터 렌더링
return (
{/* 데스크톱 테이블 */}
No
사용자 ID
사용자명
회사
부서
현재 권한
액션
{users.map((user, index) => {
const typeInfo = getUserTypeInfo(user.userType);
return (
{getRowNumber(index)}
{user.userId}
{user.userName}
{user.companyName || user.companyCode}
{user.deptName || "-"}
{typeInfo.icon}
{typeInfo.label}
);
})}
{/* 모바일 카드 뷰 */}
{users.map((user, index) => {
const typeInfo = getUserTypeInfo(user.userType);
return (
{/* 헤더 */}
{user.userName}
{user.userId}
{typeInfo.icon}
{typeInfo.label}
{/* 정보 */}
회사
{user.companyName || user.companyCode}
부서
{user.deptName || "-"}
{/* 액션 */}
);
})}
{/* 페이지네이션 */}
{paginationInfo.totalPages > 1 && (
{paginationInfo.currentPage} / {paginationInfo.totalPages}
)}
);
}