"use client"; import type { Table } from "@tanstack/react-table"; import { useEffect, useState, forwardRef } from "react"; import type { ComponentPropsWithoutRef } from "react"; import { classNames } from "@calcom/lib"; import { useDebounce } from "@calcom/lib/hooks/useDebounce"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import type { ButtonProps } from "../button"; import { Button } from "../button"; import { Input } from "../form"; interface DataTableToolbarProps extends ComponentPropsWithoutRef<"div"> { children: React.ReactNode; } const Root = forwardRef(function DataTableToolbar( { children, className }, ref ) { return (
{children}
); }); interface SearchBarProps { table: Table; searchKey?: string; onSearch?: (value: string) => void; className?: string; } function SearchBarComponent( { table, searchKey, onSearch, className }: SearchBarProps, ref: React.Ref ) { const [searchTerm, setSearchTerm] = useState(""); const debouncedSearchTerm = useDebounce(searchTerm, 500); useEffect(() => { onSearch?.(debouncedSearchTerm); }, [debouncedSearchTerm, onSearch]); if (onSearch) { return ( setSearchTerm(event.target.value.trim())} /> ); } if (!searchKey) { console.error("searchKey is required if onSearch is not provided"); return null; } return ( { return table.getColumn(searchKey)?.setFilterValue(event.target.value.trim()); }} /> ); } const SearchBar = forwardRef(SearchBarComponent) as ( props: SearchBarProps & { ref?: React.Ref } ) => ReturnType; interface ClearFiltersButtonProps { table: Table; } function ClearFiltersButtonComponent( { table }: ClearFiltersButtonProps, ref: React.Ref ) { const { t } = useLocale(); const isFiltered = table.getState().columnFilters.length > 0; if (!isFiltered) return null; return ( ); } const ClearFiltersButton = forwardRef(ClearFiltersButtonComponent) as ( props: ClearFiltersButtonProps & { ref?: React.Ref } ) => ReturnType; function CTAComponent( { children, onClick, color = "primary", ...rest }: ButtonProps, ref: React.Ref ) { return ( ); } const CTA = forwardRef(CTAComponent) as ( props: ButtonProps & { ref?: React.Ref } ) => ReturnType; export const DataTableToolbar = { Root, SearchBar, ClearFiltersButton, CTA };