import { useState } from 'react' import { Cross2Icon } from '@radix-ui/react-icons' import { type Table } from '@tanstack/react-table' import { SlidersHorizontal } from 'lucide-react' import { useTranslation } from 'react-i18next' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { DataTableFacetedFilter } from './faceted-filter' import { DataTableViewOptions } from './view-options' type DataTableToolbarProps = { table: Table searchPlaceholder?: string searchKey?: string filters?: { columnId: string title: string options: { label: string value: string icon?: React.ComponentType<{ className?: string }> }[] singleSelect?: boolean }[] /** Custom search component to replace the default input */ customSearch?: React.ReactNode /** Additional search input to show alongside the main search */ additionalSearch?: React.ReactNode /** Whether additional filters are active (for showing reset button) */ hasAdditionalFilters?: boolean /** Callback when reset button is clicked (for clearing additional filters) */ onReset?: () => void } export function DataTableToolbar({ table, searchPlaceholder, searchKey, filters = [], customSearch, additionalSearch, hasAdditionalFilters = false, onReset, }: DataTableToolbarProps) { const { t } = useTranslation() const [mobileFiltersOpen, setMobileFiltersOpen] = useState(false) const resolvedSearchPlaceholder = searchPlaceholder ?? t('Filter...') const isFiltered = table.getState().columnFilters.length > 0 || table.getState().globalFilter || hasAdditionalFilters const activeFilterCount = table.getState().columnFilters.length + (hasAdditionalFilters ? 1 : 0) const hasFilterContent = filters.length > 0 || additionalSearch != null const searchInput = searchKey ? ( table.getColumn(searchKey)?.setFilterValue(event.target.value) } className='h-8 w-full sm:w-[150px] lg:w-[250px]' /> ) : ( table.setGlobalFilter(event.target.value)} className='h-8 w-full sm:w-[150px] lg:w-[250px]' /> ) const filterChips = filters.map((filter) => { const column = table.getColumn(filter.columnId) if (!column) return null return ( ) }) const resetButton = isFiltered ? ( ) : null return (
{/* Search input */} {customSearch !== undefined ? customSearch : searchInput} {/* Desktop: filters inline */} {additionalSearch && (
{additionalSearch}
)}
{filterChips}
{resetButton}
{/* Mobile: filter toggle button */} {hasFilterContent && ( )}
{/* Mobile: collapsible filter area */} {hasFilterContent && mobileFiltersOpen && (
{additionalSearch &&
{additionalSearch}
} {filterChips} {resetButton}
)}
) }