diff options
Diffstat (limited to 'lib/avl/table/avl-detail-table.tsx')
| -rw-r--r-- | lib/avl/table/avl-detail-table.tsx | 64 |
1 files changed, 45 insertions, 19 deletions
diff --git a/lib/avl/table/avl-detail-table.tsx b/lib/avl/table/avl-detail-table.tsx index ca3ba7e7..407535db 100644 --- a/lib/avl/table/avl-detail-table.tsx +++ b/lib/avl/table/avl-detail-table.tsx @@ -10,6 +10,7 @@ import { toast } from "sonner" import { columns } from "./columns-detail" import type { AvlDetailItem } from "../types" import { BackButton } from "@/components/ui/back-button" +import { exportTableToExcel } from "@/lib/export_all" interface AvlDetailTableProps { data: AvlDetailItem[] @@ -33,7 +34,42 @@ export function AvlDetailTable({ }: AvlDetailTableProps) { - // 액션 핸들러 + // 데이터 테이블 설정 (초기 meta는 없음) + const { table } = useDataTable({ + data, + columns, + pageCount: pageCount ?? 1, + initialState: { + sorting: [{ id: "no", desc: false }], + pagination: { + pageIndex: 0, + pageSize: 10, + }, + }, + getRowId: (row) => String(row.id), + // meta는 useEffect에서 설정 + // 정적 데이터이므로 무한 스크롤 설정하지 않음 (클라이언트 측 소팅 활성화) + infiniteScrollConfig: undefined, + }) + + // Excel export 핸들러 + const handleExcelExport = React.useCallback(async () => { + try { + toast.info("엑셀 파일을 생성 중입니다...") + await exportTableToExcel(table, { + filename: `AVL_상세내역_${new Date().toISOString().split('T')[0]}`, + allPages: true, + excludeColumns: ["select", "actions"], + useGroupHeader: true, + }) + toast.success("엑셀 파일이 다운로드되었습니다.") + } catch (error) { + console.error("Excel export error:", error) + toast.error("엑셀 파일 생성 중 오류가 발생했습니다.") + } + }, [table]) + + // 액션 핸들러 (table을 직접 사용하지 않는 액션들) const handleAction = React.useCallback(async (action: string) => { switch (action) { case 'vendor-pool': @@ -55,29 +91,15 @@ export function AvlDetailTable({ } }, []) - // 테이블 메타 설정 const tableMeta = React.useMemo(() => ({ onAction: handleAction, }), [handleAction]) - // 데이터 테이블 설정 - const { table } = useDataTable({ - data, - columns, - pageCount: pageCount ?? 1, - initialState: { - sorting: [{ id: "no", desc: false }], - pagination: { - pageIndex: 0, - pageSize: 10, - }, - }, - getRowId: (row) => String(row.id), - meta: tableMeta, - // 정적 데이터이므로 무한 스크롤 설정하지 않음 (클라이언트 측 소팅 활성화) - infiniteScrollConfig: undefined, - }) + // table의 meta 설정 + React.useEffect(() => { + table.options.meta = tableMeta + }, [table, tableMeta]) return ( <div className="space-y-4"> @@ -101,6 +123,10 @@ export function AvlDetailTable({ {/* 상단 버튼 영역 */} <div className="flex items-center gap-2 ml-auto justify-end"> + {/* Excel Export 버튼 */} + <Button variant="outline" size="sm" onClick={handleExcelExport}> + Excel Export + </Button> {/* 단순 이동 버튼 */} <Button variant="outline" size="sm" onClick={() => handleAction('vendor-pool')}> Vendor Pool |
