import { type MouseEvent } from 'react'; import Checkbox, { type CheckboxProps } from '@mui/material/Checkbox'; import Radio, { type RadioProps } from '@mui/material/Radio'; import Tooltip from '@mui/material/Tooltip'; import { type Theme } from '@mui/material/styles'; import { type MRT_Row, type MRT_RowData, type MRT_TableInstance, } from '../../types'; import { getIsRowSelected, getMRT_RowSelectionHandler, getMRT_SelectAllHandler, } from '../../utils/row.utils'; import { getCommonTooltipProps } from '../../utils/style.utils'; import { parseFromValuesOrFunc } from '../../utils/utils'; export interface MRT_SelectCheckboxProps extends CheckboxProps { row?: MRT_Row; staticRowIndex?: number; table: MRT_TableInstance; } export const MRT_SelectCheckbox = ({ row, staticRowIndex, table, ...rest }: MRT_SelectCheckboxProps) => { const { getState, options: { enableMultiRowSelection, localization, muiSelectAllCheckboxProps, muiSelectCheckboxProps, selectAllMode, }, } = table; const { density, isLoading } = getState(); const selectAll = !row; const allRowsSelected = selectAll ? selectAllMode === 'page' ? table.getIsAllPageRowsSelected() : table.getIsAllRowsSelected() : undefined; const isChecked = selectAll ? allRowsSelected : getIsRowSelected({ row, table }); const checkboxProps = { ...(selectAll ? parseFromValuesOrFunc(muiSelectAllCheckboxProps, { table }) : parseFromValuesOrFunc(muiSelectCheckboxProps, { row, staticRowIndex, table, })), ...rest, }; const onSelectionChange = row ? getMRT_RowSelectionHandler({ row, staticRowIndex, table, }) : undefined; const onSelectAllChange = getMRT_SelectAllHandler({ table }); const commonProps = { 'aria-label': selectAll ? localization.toggleSelectAll : localization.toggleSelectRow, checked: isChecked, disabled: isLoading || (row && !row.getCanSelect()) || row?.id === 'mrt-row-create', inputProps: { 'aria-label': selectAll ? localization.toggleSelectAll : localization.toggleSelectRow, }, onChange: (event) => { event.stopPropagation(); selectAll ? onSelectAllChange(event) : onSelectionChange!(event); }, size: (density === 'compact' ? 'small' : 'medium') as 'medium' | 'small', ...checkboxProps, onClick: (e: MouseEvent) => { e.stopPropagation(); checkboxProps?.onClick?.(e); }, sx: (theme: Theme) => ({ height: density === 'compact' ? '1.75rem' : '2.5rem', m: density !== 'compact' ? '-0.4rem' : undefined, width: density === 'compact' ? '1.75rem' : '2.5rem', zIndex: 0, ...parseFromValuesOrFunc(checkboxProps?.sx, theme), }), title: undefined, } as CheckboxProps | RadioProps; return ( {enableMultiRowSelection === false ? ( ) : ( )} ); };