'use client'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faPlus } from '@fortawesome/free-solid-svg-icons'; import { Checkbox } from '@/components/ui/checkbox'; import type { RankConfigItem } from '@/types/response/donation/rankConfig'; import { PER_PAGE_OPTIONS } from '@/constants/donation'; import { RANK_PERIODS, RANK_THEMES } from '../constants'; type Props = { items: RankConfigItem[]; loading: boolean; saving: boolean; checkedIDs: Set; setCheckedIDs: React.Dispatch>>; page: number; setPage: React.Dispatch>; perPage: number; setPerPage: React.Dispatch>; onNew: () => void; onEdit: (item: RankConfigItem) => void; onBatchDelete: () => void; }; export default function RankListPanel({ items, loading, saving, checkedIDs, setCheckedIDs, page, setPage, perPage, setPerPage, onNew, onEdit, onBatchDelete }: Props) { // ── 페이징 ─────────────────────────────────────── const totalPages = Math.max(1, Math.ceil(items.length / perPage)); const pagedItems = items.slice((page - 1) * perPage, page * perPage); const handlePerPageChange = (value: number) => { setPerPage(value); setPage(1); }; // ── 전체선택 ───────────────────────────────────── const visibleIDs = pagedItems.map(i => i.id); const checkedCount = visibleIDs.filter(id => checkedIDs.has(id)).length; const allChecked = pagedItems.length > 0 && checkedCount === visibleIDs.length; const isIndeterminate = checkedCount > 0 && checkedCount < visibleIDs.length; const handleSelectAll = () => { setCheckedIDs(prev => { const next = new Set(prev); if (allChecked) { visibleIDs.forEach(id => next.delete(id)); } else { visibleIDs.forEach(id => next.add(id)); } return next; }); }; const handleToggleCheck = (id: number) => { setCheckedIDs(prev => { const next = new Set(prev); if (next.has(id)) { next.delete(id); } else { next.add(id); } return next; }); }; return (
총 {items.length}개 {checkedIDs.size > 0 && ( ({checkedIDs.size}개 선택) )}
{loading ? (
준비 중...
) : items.length === 0 ? (
등록된 순위 설정이 없습니다.
) : ( {pagedItems.map(item => { const isChecked = checkedIDs.has(item.id); return ( ); })}
제목 기간 테마 최대인원 금액표시 활성 비고
handleToggleCheck(item.id)} aria-label={`${item.id} 선택`} /> {item.title} {RANK_PERIODS.find(p => p.value === item.period)?.label ?? item.period} {RANK_THEMES.find(t => t.value === item.theme)?.label ?? item.theme} {item.maxRankCount}명 {item.isShowAmount ? '표시' : '숨김'} {item.isActive ? '활성' : '비활성'}
)}
{totalPages > 1 && (
{Array.from({ length: totalPages }, (_, i) => i + 1).map(p => ( ))}
)}
); }