| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- import { Cross2Icon } from '@radix-ui/react-icons'
- import { type Table } from '@tanstack/react-table'
- import { Button } from '@/components/ui/button'
- import { Input } from '@/components/ui/input'
- import { DataTableFacetedFilter } from './faceted-filter'
- import { DataTableViewOptions } from './view-options'
- type DataTableToolbarProps<TData> = {
- table: Table<TData>
- searchPlaceholder?: string
- searchKey?: string
- filters?: {
- columnId: string
- title: string
- options: {
- label: string
- value: string
- icon?: React.ComponentType<{ className?: string }>
- }[]
- }[]
- }
- export function DataTableToolbar<TData>({
- table,
- searchPlaceholder = 'Filter...',
- searchKey,
- filters = [],
- }: DataTableToolbarProps<TData>) {
- const isFiltered =
- table.getState().columnFilters.length > 0 || table.getState().globalFilter
- return (
- <div className='flex items-center justify-between'>
- <div className='flex flex-1 flex-col-reverse items-start gap-y-2 sm:flex-row sm:items-center sm:space-x-2'>
- {searchKey ? (
- <Input
- placeholder={searchPlaceholder}
- value={
- (table.getColumn(searchKey)?.getFilterValue() as string) ?? ''
- }
- onChange={(event) =>
- table.getColumn(searchKey)?.setFilterValue(event.target.value)
- }
- className='h-8 w-[150px] lg:w-[250px]'
- />
- ) : (
- <Input
- placeholder={searchPlaceholder}
- value={table.getState().globalFilter ?? ''}
- onChange={(event) => table.setGlobalFilter(event.target.value)}
- className='h-8 w-[150px] lg:w-[250px]'
- />
- )}
- <div className='flex gap-x-2'>
- {filters.map((filter) => {
- const column = table.getColumn(filter.columnId)
- if (!column) return null
- return (
- <DataTableFacetedFilter
- key={filter.columnId}
- column={column}
- title={filter.title}
- options={filter.options}
- />
- )
- })}
- </div>
- {isFiltered && (
- <Button
- variant='ghost'
- onClick={() => {
- table.resetColumnFilters()
- table.setGlobalFilter('')
- }}
- className='h-8 px-2 lg:px-3'
- >
- Reset
- <Cross2Icon className='ms-2 h-4 w-4' />
- </Button>
- )}
- </div>
- <DataTableViewOptions table={table} />
- </div>
- )
- }
|