ERP-node/frontend/components/admin/CompanyTable.tsx

137 lines
3.9 KiB
TypeScript
Raw Normal View History

2025-11-03 16:31:03 +09:00
import { Edit, Trash2, HardDrive, FileText, Users } from "lucide-react";
2025-08-21 09:41:46 +09:00
import { Company } from "@/types/company";
import { Button } from "@/components/ui/button";
import { ResponsiveDataView, RDVColumn, RDVCardField } from "@/components/common/ResponsiveDataView";
2025-11-03 16:31:03 +09:00
import { useRouter } from "next/navigation";
2025-08-21 09:41:46 +09:00
interface CompanyTableProps {
companies: Company[];
isLoading: boolean;
onEdit: (company: Company) => void;
onDelete: (company: Company) => void;
}
/**
*
*/
export function CompanyTable({ companies, isLoading, onEdit, onDelete }: CompanyTableProps) {
2025-11-03 16:31:03 +09:00
const router = useRouter();
// 부서 관리 페이지로 이동
const handleManageDepartments = (company: Company) => {
router.push(`/admin/userMng/companyList/${company.company_code}/departments`);
2025-11-03 16:31:03 +09:00
};
2025-09-05 14:52:10 +09:00
// 디스크 사용량 포맷팅 함수
const formatDiskUsage = (company: Company) => {
if (!company.diskUsage) {
return (
2025-11-03 16:31:03 +09:00
<div className="text-muted-foreground flex items-center gap-1">
2025-09-05 14:52:10 +09:00
<HardDrive className="h-3 w-3" />
<span className="text-xs"> </span>
</div>
);
}
const { fileCount, totalSizeMB } = company.diskUsage;
return (
<div className="flex flex-col gap-1">
<div className="flex items-center gap-1">
2025-11-03 16:31:03 +09:00
<FileText className="text-primary h-3 w-3" />
2025-09-05 14:52:10 +09:00
<span className="text-xs font-medium">{fileCount} </span>
</div>
<div className="flex items-center gap-1">
2025-11-03 16:31:03 +09:00
<HardDrive className="text-primary h-3 w-3" />
2025-09-05 14:52:10 +09:00
<span className="text-xs">{totalSizeMB.toFixed(1)} MB</span>
</div>
</div>
);
};
2025-10-22 14:52:13 +09:00
// 데스크톱 테이블 컬럼 정의
const columns: RDVColumn<Company>[] = [
{
key: "company_code",
label: "회사코드",
width: "150px",
render: (value) => <span className="font-mono">{value}</span>,
},
{
key: "company_name",
label: "회사명",
render: (value) => <span className="font-medium">{value}</span>,
},
{
key: "writer",
label: "등록자",
width: "200px",
},
{
key: "diskUsage",
label: "디스크 사용량",
hideOnMobile: true,
render: (_value, row) => formatDiskUsage(row),
},
];
2025-08-21 09:41:46 +09:00
// 모바일 카드 필드 정의
const cardFields: RDVCardField<Company>[] = [
{
label: "작성자",
render: (company) => <span className="font-medium">{company.writer}</span>,
},
{
label: "디스크 사용량",
render: (company) => formatDiskUsage(company),
},
];
2025-10-22 14:52:13 +09:00
return (
<ResponsiveDataView<Company>
data={companies}
columns={columns}
keyExtractor={(c) => c.regdate + c.company_code}
isLoading={isLoading}
emptyMessage="등록된 회사가 없습니다."
skeletonCount={10}
cardTitle={(c) => c.company_name}
cardSubtitle={(c) => <span className="font-mono">{c.company_code}</span>}
cardFields={cardFields}
actionsLabel="작업"
actionsWidth="180px"
renderActions={(company) => (
<>
<Button
variant="ghost"
size="icon"
onClick={() => handleManageDepartments(company)}
className="h-8 w-8"
aria-label="부서관리"
2025-10-22 14:52:13 +09:00
>
<Users className="h-4 w-4" />
</Button>
<Button
variant="ghost"
size="icon"
onClick={() => onEdit(company)}
className="h-8 w-8"
aria-label="수정"
>
<Edit className="h-4 w-4" />
</Button>
<Button
variant="ghost"
size="icon"
onClick={() => onDelete(company)}
className="text-destructive hover:bg-destructive/10 hover:text-destructive h-8 w-8"
aria-label="삭제"
>
<Trash2 className="h-4 w-4" />
</Button>
</>
)}
/>
2025-08-21 09:41:46 +09:00
);
}