"use client"; import React from "react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Shield, ShieldCheck, User as UserIcon, Users, Building2 } from "lucide-react"; import { ResponsiveDataView, RDVColumn, RDVCardField } from "@/components/common/ResponsiveDataView"; 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-primary/20 text-primary border-primary/30", }; case "COMPANY_ADMIN": return { label: "회사 관리자", icon: , className: "bg-primary/20 text-primary border-primary/30", }; case "USER": return { label: "일반 사용자", icon: , className: "bg-muted/50 text-muted-foreground border-border", }; case "GUEST": return { label: "게스트", icon: , className: "bg-success/20 text-success border-success/30", }; case "PARTNER": return { label: "협력업체", icon: , className: "bg-warning/20 text-warning border-warning/30", }; default: return { label: userType || "미지정", icon: , className: "bg-muted/50 text-muted-foreground border-border", }; } }; // 행 번호 계산 const getRowNumber = (index: number) => { return (paginationInfo.currentPage - 1) * paginationInfo.pageSize + index + 1; }; // 데스크톱 테이블 컬럼 정의 const columns: RDVColumn[] = [ { key: "no", label: "No", width: "80px", className: "text-center", render: (_value, _row, index) => {getRowNumber(index)}, }, { key: "userId", label: "사용자 ID", render: (value) => {value}, }, { key: "userName", label: "사용자명", }, { key: "companyName", label: "회사", hideOnMobile: true, render: (_value, row) => {row.companyName || row.companyCode}, }, { key: "deptName", label: "부서", hideOnMobile: true, render: (value) => {value || "-"}, }, { key: "userType", label: "현재 권한", className: "text-center", render: (_value, row) => { const typeInfo = getUserTypeInfo(row.userType); return ( {typeInfo.icon} {typeInfo.label} ); }, }, ]; // 모바일 카드 필드 정의 const cardFields: RDVCardField[] = [ { label: "회사", render: (user) => {user.companyName || user.companyCode}, }, { label: "부서", render: (user) => {user.deptName || "-"}, }, ]; return (
data={users} columns={columns} keyExtractor={(u) => u.userId} isLoading={isLoading} emptyMessage="등록된 사용자가 없습니다." skeletonCount={10} cardTitle={(u) => u.userName} cardSubtitle={(u) => {u.userId}} cardHeaderRight={(u) => { const typeInfo = getUserTypeInfo(u.userType); return ( {typeInfo.icon} {typeInfo.label} ); }} cardFields={cardFields} actionsLabel="액션" actionsWidth="120px" renderActions={(user) => ( )} /> {/* 페이지네이션 */} {paginationInfo.totalPages > 1 && (
{paginationInfo.currentPage} / {paginationInfo.totalPages}
)}
); }