"use client" import * as React from "react" import { type Table } from "@tanstack/react-table" import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, Infinity, } from "lucide-react" import { Button } from "@/components/ui/button" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" interface DataTablePaginationProps { table: Table pageSizeOptions?: Array // 무한 스크롤 관련 props infiniteScroll?: { enabled: boolean hasNextPage: boolean isLoadingMore: boolean totalCount?: number | null onLoadMore?: () => void } // 페이지 크기 변경 콜백 (필수!) onPageSizeChange?: (pageSize: number) => void } export function DataTablePagination({ table, pageSizeOptions = [10, 20, 30, 40, 50, "All"], infiniteScroll, onPageSizeChange, }: DataTablePaginationProps) { // 현재 테이블 pageSize const currentPageSize = table.getState().pagination.pageSize const isInfiniteMode = infiniteScroll?.enabled || currentPageSize >= 1_000_000 // "All"을 1,000,000으로 처리하고, 무한 스크롤 모드 표시 const selectValue = isInfiniteMode ? "All" : String(currentPageSize) const handlePageSizeChange = (value: string) => { if (!onPageSizeChange) { console.warn('DataTablePagination: onPageSizeChange prop is required for page size changes to work') return } if (value === "All") { // "All" 선택 시 무한 스크롤 모드로 전환 onPageSizeChange(1_000_000) // URL 상태 업데이트만 수행 } else { const newSize = Number(value) onPageSizeChange(newSize) // URL 상태 업데이트만 수행 } // table.setPageSize()는 호출하지 않음! // URL 상태 변경이 테이블 상태로 자동 반영됨 } return (
{/* 선택된 행 및 총 개수 정보 */}
{table.getFilteredSelectedRowModel().rows.length} of{" "} {isInfiniteMode ? ( // 무한 스크롤 모드일 때 <> {table.getRowModel().rows.length} row(s) selected. {infiniteScroll?.totalCount !== null && ( Total: {infiniteScroll.totalCount?.toLocaleString()} records ({table.getRowModel().rows.length.toLocaleString()} loaded) )} ) : ( // 페이지네이션 모드일 때 <> {table.getFilteredRowModel().rows.length} row(s) selected. Total: {table.getRowCount()} records )}
{/* Rows per page Select */}

{isInfiniteMode ? "View mode" : "Rows per page"}

{/* 페이지네이션 모드일 때만 페이지 정보 표시 */} {!isInfiniteMode && ( <> {/* 현재 페이지 / 전체 페이지 */}
Page {table.getState().pagination.pageIndex + 1} of{" "} {table.getPageCount()}
{/* 페이지 이동 버튼 */}
)} {/* 무한 스크롤 모드일 때 로드 더 버튼 */} {isInfiniteMode && infiniteScroll && (
{infiniteScroll.hasNextPage && ( )} {!infiniteScroll.hasNextPage && table.getRowModel().rows.length > 0 && ( All data loaded )}
)}
) }