import { Badge, Button, Checkbox, IconButton, Input, InputAdornment, InputAdornmentButton, InputControl, InputRoot, Popover, Separator, SvgUse, } from "@ivtui/base" import clsx from "clsx" import type { JSX } from "react" import { useState } from "react" import type { TableToolbarProps } from "./DataTable.types" export const TableToolbar = ({ searchValue = "", onSearchChange, searchPlaceholder = "Search...", filters = [], className, columns = [], }: Readonly): JSX.Element => { const [openPopover, setOpenPopover] = useState(null) const [viewPopoverOpen, setViewPopoverOpen] = useState(false) const handleFilterChange = ( key: string, value: string, onValueChange?: (value: string[]) => void, ) => { const current = filters.find(f => f.key === key)?.value ?? [] const newValue = current.includes(value) ? current.filter(v => v !== value) : [...current, value] onValueChange?.(newValue) } // Determine if reset should be shown const hasActiveFilters = filters.some(f => f.value && f.value.length > 0) const showReset = !!searchValue || hasActiveFilters return (
{/* Search Input */} {onSearchChange && ( onSearchChange(e.target.value)} /> {searchValue && ( onSearchChange("")} aria-label="Clear search" > )} )} {/* Filters */} {filters.map(filter => { const selected = filter.value ?? [] return ( setOpenPopover(open ? filter.key : null)} >
{filter.label}
{filter.options.length === 0 && (
No options
)} {filter.options.map(option => ( ))}
) })} {/* Reset Button */} {showReset && ( { onSearchChange?.("") for (const f of filters) { f.onValueChange?.([]) } }} > )}
{/* View (column visibility) button */} {columns.length > 0 && (
Toggle columns
{columns.map(col => ( ))}
)}
) }