UNPKG

@taeopia/react-table

Version:

This is a table library for use in React.

98 lines (77 loc) 2.98 kB
// Thirds Party Types... import type { MouseEvent } from "react"; import type { VisibilityState } from "@tanstack/react-table"; // Thirds Party... import { useState } from "react"; import { getCoreRowModel, useReactTable } from "@tanstack/react-table"; // Inner Types... import type { ColumnsType, CreateTableColumns, DataType } from "@/types"; // Utils... import { utils } from "@/lib"; export interface UseTableProps { columns: ColumnsType<any>; data: DataType[]; // 기본적으로 키-값 구조의 객체 queryKey?: CreateTableColumns<number>; options: { caption?: { text?: string; blind?: boolean; }; columnVisibility?: VisibilityState; }; } export const useTable = (props: UseTableProps) => { const { columns, data, queryKey, options } = props; const { columnVisibility = { col0: false }, caption, ...restOptions } = options; const state = { columnVisibility, ...restOptions }; // @tanstack/react-table's table instance const tanstackReactTableInstance = useReactTable({ columns, data, state, getCoreRowModel: getCoreRowModel() }); // When it comes to selected row 'State' const [selectedRow, setSelectedRow] = useState<CreateTableColumns<number>>({}); const parsingRowData = (e: React.MouseEvent) => { const parsedData = utils.getRowDataByClick(e); setSelectedRow(parsedData); return parsedData; }; // A Functions when it clicked table row const onClickRow = (e?: MouseEvent, rawData?: CreateTableColumns<number>) => { let parsedRowData: CreateTableColumns<number>; if (!e) { parsedRowData = rawData!; } else { parsedRowData = parsingRowData(e); } if (!parsedRowData) return; const parsedUrl = utils.getParsedUrl(window.location.href); const newSearchParams = { ...parsedUrl.query, ...Object.keys(queryKey!) .filter((key) => key.startsWith("col")) // "col"로 시작하는 키 필터링 .reduce((acc, key) => { const colKey = queryKey![key as keyof typeof queryKey]; // queryKey의 값 const colValue = parsedRowData[key as keyof typeof parsedRowData]; // row 데이터 if (colValue !== undefined) { acc[colKey] = colValue; // 동적으로 키와 값을 추가 } return acc; }, {} as Record<string, any>), }; const params = new URLSearchParams(newSearchParams); utils.navigate(`?${params.toString()}`, { replace: true, state: parsedRowData }); }; const onClickOutSide = () => { utils.navigate("", { replace: true, state: {} }); }; const onClickNavigate = (param: string) => { console.log("Click Navigate", param); utils.navigate(param, { replace: true, state: {} }); }; return { selectedRow, caption, onClickRow, onClickNavigate, onClickOutSide, ...tanstackReactTableInstance, }; };