import React, { ChangeEvent, MouseEvent, useCallback, useEffect, useState, } from 'react'; import Collapse from '@mui/material/Collapse'; import IconButton from '@mui/material/IconButton'; import InputAdornment from '@mui/material/InputAdornment'; import TextField from '@mui/material/TextField'; import Tooltip from '@mui/material/Tooltip'; import { debounce } from '@mui/material/utils'; import { MRT_FilterOptionMenu } from '../menus/MRT_FilterOptionMenu'; import type { MRT_TableInstance } from '..'; interface Props = {}> { table: MRT_TableInstance; } export const MRT_GlobalFilterTextField = < TData extends Record = {}, >({ table, }: Props) => { const { getState, setGlobalFilter, options: { enableGlobalFilterModes, icons: { SearchIcon, CloseIcon }, localization, manualFiltering, muiSearchTextFieldProps, }, refs: { searchInputRef }, } = table; const { globalFilter, showGlobalFilter } = getState(); const textFieldProps = muiSearchTextFieldProps instanceof Function ? muiSearchTextFieldProps({ table }) : muiSearchTextFieldProps; const [anchorEl, setAnchorEl] = useState(null); const [searchValue, setSearchValue] = useState(globalFilter ?? ''); const handleChangeDebounced = useCallback( debounce( (event: ChangeEvent) => { setGlobalFilter(event.target.value ?? undefined); }, manualFiltering ? 500 : 250, ), [], ); const handleChange = (event: ChangeEvent) => { setSearchValue(event.target.value); handleChangeDebounced(event); }; const handleGlobalFilterMenuOpen = (event: MouseEvent) => { setAnchorEl(event.currentTarget); }; const handleClear = () => { setSearchValue(''); setGlobalFilter(undefined); }; useEffect(() => { if (globalFilter === undefined) { handleClear(); } }, [globalFilter]); return ( ) : ( ), endAdornment: ( ), }} {...textFieldProps} inputRef={(inputRef) => { searchInputRef.current = inputRef; if (textFieldProps?.inputRef) { textFieldProps.inputRef = inputRef; } }} /> ); };