"use client" import * as React from "react" import type { DataTableFilterField } from "@/types/table" import type { Table } from "@tanstack/react-table" import { X } from "lucide-react" import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { DataTableFacetedFilter } from "@/components/data-table/data-table-faceted-filter" import { DataTableViewOptions } from "@/components/data-table/data-table-view-options" interface DataTableToolbarProps extends React.HTMLAttributes { table: Table /** * An array of filter field configurations for the data table. * When options are provided, a faceted filter is rendered. * Otherwise, a search filter is rendered. * * @example * const filterFields = [ * { * id: 'name', * label: 'Name', * placeholder: 'Filter by name...' * }, * { * id: 'status', * label: 'Status', * options: [ * { label: 'Active', value: 'active', icon: ActiveIcon, count: 10 }, * { label: 'Inactive', value: 'inactive', icon: InactiveIcon, count: 5 } * ] * } * ] */ filterFields?: DataTableFilterField[] } export function DataTableToolbar({ table, filterFields = [], children, className, ...props }: DataTableToolbarProps) { const isFiltered = table.getState().columnFilters.length > 0 // Memoize computation of searchableColumns and filterableColumns const { searchableColumns, filterableColumns } = React.useMemo(() => { return { searchableColumns: filterFields.filter((field) => !field.options), filterableColumns: filterFields.filter((field) => field.options), } }, [filterFields]) return (
{searchableColumns.length > 0 && searchableColumns.map( (column) => table.getColumn(column.id ? String(column.id) : "") && ( table .getColumn(String(column.id)) ?.setFilterValue(event.target.value) } className="h-8 w-40 lg:w-64" /> ) )} {filterableColumns.length > 0 && filterableColumns.map( (column) => table.getColumn(column.id ? String(column.id) : "") && ( ) )} {isFiltered && ( )}
{children}
) }