"use client" import * as React from "react" import type { DataTableAdvancedFilterField } from "@/types/table" import { type Table } from "@tanstack/react-table" import { LayoutGrid, TableIcon } from "lucide-react" import { Button } from "@/components/ui/button" import { cn } from "@/lib/utils" import { DataTableFilterList } from "@/components/data-table/data-table-filter-list" import { DataTableSortList } from "@/components/data-table/data-table-sort-list" import { DataTableViewOptions } from "@/components/data-table/data-table-view-options" import { DataTablePinList } from "./data-table-pin" import { PinLeftButton } from "./data-table-pin-left" import { PinRightButton } from "./data-table-pin-right" import { DataTableGlobalFilter } from "./data-table-grobal-filter" import { DataTableGroupList } from "./data-table-group-list" // 로컬 스토리지 사용을 위한 훅 const useLocalStorage = (key: string, initialValue: T): [T, (value: T | ((val: T) => T)) => void] => { const [storedValue, setStoredValue] = React.useState(() => { if (typeof window === "undefined") { return initialValue } try { const item = window.localStorage.getItem(key) return item ? JSON.parse(item) : initialValue } catch (error) { console.error(error) return initialValue } }) const setValue = (value: T | ((val: T) => T)) => { try { const valueToStore = value instanceof Function ? value(storedValue) : value setStoredValue(valueToStore) if (typeof window !== "undefined") { window.localStorage.setItem(key, JSON.stringify(valueToStore)) } } catch (error) { console.error(error) } } return [storedValue, setValue] } interface DataTableAdvancedToolbarProps extends React.HTMLAttributes { /** * The table instance returned from useDataTable hook with pagination, sorting, filtering, etc. * @type Table */ table: Table /** * An array of filter field configurations for the data table. * @type DataTableAdvancedFilterField[] * @example * const filterFields = [ * { * id: 'name', * label: 'Name', * type: 'text', * placeholder: 'Filter by name...' * }, * { * id: 'status', * label: 'Status', * type: 'select', * options: [ * { label: 'Active', value: 'active', count: 10 }, * { label: 'Inactive', value: 'inactive', count: 5 } * ] * } * ] */ filterFields: DataTableAdvancedFilterField[] /** * Debounce time (ms) for filter updates to enhance performance during rapid input. * @default 300 */ debounceMs?: number /** * Shallow mode keeps query states client-side, avoiding server calls. * Setting to `false` triggers a network request with the updated querystring. * @default true */ shallow?: boolean /** * 컴팩트 모드를 사용할지 여부 (토글 버튼을 숨기려면 null) * @default true */ enableCompactToggle?: boolean | null /** * 초기 컴팩트 모드 상태 * @default false */ initialCompact?: boolean /** * 컴팩트 모드가 변경될 때 호출될 콜백 함수 */ onCompactChange?: (isCompact: boolean) => void /** * 컴팩트 모드 상태를 저장할 로컬 스토리지 키 * @default "dataTableCompact" */ compactStorageKey?: string } export function DataTableAdvancedToolbar({ table, filterFields = [], debounceMs = 300, shallow = true, enableCompactToggle = true, initialCompact = false, onCompactChange, compactStorageKey = "dataTableCompact", children, className, ...props }: DataTableAdvancedToolbarProps) { // 컴팩트 모드 상태 관리 const [isCompact, setIsCompact] = useLocalStorage( compactStorageKey, initialCompact ) // 컴팩트 모드 변경 시 콜백 호출 React.useEffect(() => { onCompactChange?.(isCompact) }, [isCompact, onCompactChange]) // 컴팩트 모드 토글 핸들러 const handleToggleCompact = React.useCallback(() => { setIsCompact(prev => !prev) }, [setIsCompact]) return (
{enableCompactToggle && ( )}
{/* 컴팩트 모드 토글 버튼 */} {children}
) }