"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"; // 컴포넌트 내부 기본 텍스트 (t prop이 없을 때 사용) const USER_AUTH_TABLE_DEFAULTS: Record = { "role.super_admin": "최고 관리자", "role.company_admin": "회사 관리자", "role.user": "일반 사용자", "role.guest": "게스트", "role.partner": "협력업체", "role.unassigned": "미지정", "table.userId": "사용자 ID", "table.userName": "사용자명", "table.company": "회사", "table.dept": "부서", "table.currentAuth": "현재 권한", "table.empty": "등록된 사용자가 없습니다.", "table.actions": "액션", "action.change.auth": "권한 변경", "pagination.prev": "이전", "pagination.next": "다음", }; interface UserAuthTableProps { users: any[]; isLoading: boolean; isSuperAdmin?: boolean; paginationInfo: { currentPage: number; pageSize: number; totalItems: number; totalPages: number; }; onEditAuth: (user: any) => void; onPageChange: (page: number) => void; t?: (key: string, params?: Record) => string; } /** * 사용자 권한 테이블 컴포넌트 * * 사용자 목록과 권한 정보를 표시하고 권한 변경 기능 제공 */ export function UserAuthTable({ users, isLoading, isSuperAdmin, paginationInfo, onEditAuth, onPageChange, t }: UserAuthTableProps) { // 다국어 래퍼 (t prop이 없으면 기본 텍스트 사용) const _t = t || ((key: string) => USER_AUTH_TABLE_DEFAULTS[key] || key); // 권한 레벨 표시 const getUserTypeInfo = (userType: string) => { switch (userType) { case "SUPER_ADMIN": return { label: _t("role.super_admin"), icon: , className: "bg-primary/20 text-primary border-primary/30", }; case "COMPANY_ADMIN": return { label: _t("role.company_admin"), icon: , className: "bg-primary/20 text-primary border-primary/30", }; case "USER": return { label: _t("role.user"), icon: , className: "bg-muted/50 text-muted-foreground border-border", }; case "GUEST": return { label: _t("role.guest"), icon: , className: "bg-success/20 text-success border-success/30", }; case "PARTNER": return { label: _t("role.partner"), icon: , className: "bg-warning/20 text-warning border-warning/30", }; default: return { label: userType || _t("role.unassigned"), 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: _t("table.userId"), render: (value) => {value}, }, { key: "userName", label: _t("table.userName"), }, ...(isSuperAdmin ? [ { key: "companyName", label: _t("table.company"), hideOnMobile: true, render: (_value: any, row: any) => {row.companyName || row.companyCode}, } as RDVColumn, ] : []), { key: "deptName", label: _t("table.dept"), hideOnMobile: true, render: (value) => {value || "-"}, }, { key: "userType", label: _t("table.currentAuth"), className: "text-center", render: (_value, row) => { const typeInfo = getUserTypeInfo(row.userType); return ( {typeInfo.icon} {typeInfo.label} ); }, }, ]; // 모바일 카드 필드 정의 const cardFields: RDVCardField[] = [ ...(isSuperAdmin ? [ { label: _t("table.company"), render: (user: any) => {user.companyName || user.companyCode}, } as RDVCardField, ] : []), { label: _t("table.dept"), render: (user) => {user.deptName || "-"}, }, ]; return (
data={users} columns={columns} keyExtractor={(u) => u.userId} isLoading={isLoading} emptyMessage={_t("table.empty")} 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={_t("table.actions")} actionsWidth="120px" renderActions={(user) => ( )} /> {/* 페이지네이션 */} {paginationInfo.totalPages > 1 && (
{paginationInfo.currentPage} / {paginationInfo.totalPages}
)}
); }