import { type ChangeEvent, type MouseEvent, useCallback, useEffect, useRef, useState, } from 'react'; import Collapse from '@mui/material/Collapse'; import IconButton from '@mui/material/IconButton'; import InputAdornment from '@mui/material/InputAdornment'; import TextField, { type TextFieldProps } from '@mui/material/TextField'; import Tooltip from '@mui/material/Tooltip'; import { debounce } from '@mui/material/utils'; import { type MRT_RowData, type MRT_TableInstance } from '../../types'; import { parseFromValuesOrFunc } from '../../utils/utils'; import { MRT_FilterOptionMenu } from '../menus/MRT_FilterOptionMenu'; export interface MRT_GlobalFilterTextFieldProps extends TextFieldProps<'standard'> { table: MRT_TableInstance; } export const MRT_GlobalFilterTextField = ({ table, ...rest }: MRT_GlobalFilterTextFieldProps) => { const { getState, options: { enableGlobalFilterModes, icons: { CloseIcon, SearchIcon }, localization, manualFiltering, muiSearchTextFieldProps, }, refs: { searchInputRef }, setGlobalFilter, } = table; const { globalFilter, showGlobalFilter } = getState(); const textFieldProps = { ...parseFromValuesOrFunc(muiSearchTextFieldProps, { table, }), ...rest, }; const isMounted = useRef(false); 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 (isMounted.current) { if (globalFilter === undefined) { handleClear(); } else { setSearchValue(globalFilter); } } isMounted.current = true; }, [globalFilter]); return ( ), startAdornment: enableGlobalFilterModes ? ( ) : ( ), ...textFieldProps.InputProps, sx: (theme) => ({ mb: 0, ...(parseFromValuesOrFunc( textFieldProps?.InputProps?.sx, theme, ) as any), }), }} inputRef={(inputRef) => { searchInputRef.current = inputRef; if (textFieldProps?.inputRef) { textFieldProps.inputRef = inputRef; } }} /> ); };