import clsx from 'clsx'; import classes from './MRT_TableHeadCellFilterLabel.module.css'; import { type MouseEvent, useState } from 'react'; import { ActionIcon, type ActionIconProps, Popover, Tooltip, Transition, } from '@mantine/core'; import { MRT_TableHeadCellFilterContainer } from './MRT_TableHeadCellFilterContainer'; import { localizedFilterOption } from '../../fns/filterFns'; import { type MRT_Header, type MRT_RowData, type MRT_TableInstance, } from '../../types'; import { dataVariable } from '../../utils/style.utils'; interface Props extends ActionIconProps { header: MRT_Header; table: MRT_TableInstance; } export const MRT_TableHeadCellFilterLabel = ({ header, table, ...rest }: Props) => { 'use no memo'; const { options: { columnFilterDisplayMode, icons: { IconFilter }, localization, }, refs: { filterInputRefs }, setShowColumnFilters, } = table; const { column } = header; const { columnDef } = column; const filterValue = column.getFilterValue(); const [popoverOpened, setPopoverOpened] = useState(false); const isFilterActive = (Array.isArray(filterValue) && filterValue.some(Boolean)) || (!!filterValue && !Array.isArray(filterValue)); const isRangeFilter = columnDef.filterVariant === 'range' || columnDef.filterVariant === 'date-range' || ['between', 'betweenInclusive', 'inNumberRange'].includes( columnDef._filterFn, ); const currentFilterOption = columnDef._filterFn; const filterValueFn = columnDef.filterTooltipValueFn || ((value) => value as string); type FilterValueType = Parameters[0]; const filterTooltip = columnFilterDisplayMode === 'popover' && !isFilterActive ? localization.filterByColumn?.replace( '{column}', String(columnDef.header), ) : localization.filteringByColumn .replace('{column}', String(columnDef.header)) .replace( '{filterType}', localizedFilterOption(localization, currentFilterOption), ) .replace( '{filterValue}', `"${ Array.isArray(column.getFilterValue()) ? ( column.getFilterValue() as [ FilterValueType, FilterValueType, ] ) .map((v) => filterValueFn(v)) .join( `" ${isRangeFilter ? localization.and : localization.or} "`, ) : filterValueFn(column.getFilterValue()) }"`, ) .replace('" "', ''); return ( <> setPopoverOpened(false)} opened={popoverOpened} position="top" shadow="xl" width={360} withinPortal > {() => ( 40 ? 300 : undefined} withinPortal > ) => { event.stopPropagation(); if (columnFilterDisplayMode === 'popover') { setPopoverOpened((opened) => !opened); } else { setShowColumnFilters(true); } setTimeout(() => { const input = filterInputRefs.current[`${column.id}-0`]; input?.focus(); input?.select(); }, 100); }} {...rest} > )} {columnFilterDisplayMode === 'popover' && ( event.stopPropagation()} onKeyDown={(event) => event.key === 'Enter' && setPopoverOpened(false) } onMouseDown={(event) => event.stopPropagation()} > )} ); };