import React, { DragEvent, memo, useRef } from 'react'; import TableRow from '@mui/material/TableRow'; import { alpha, darken, lighten } from '@mui/material/styles'; import { Memo_MRT_TableBodyCell, MRT_TableBodyCell } from './MRT_TableBodyCell'; import { MRT_TableDetailPanel } from './MRT_TableDetailPanel'; import type { VirtualItem, Virtualizer } from '@tanstack/react-virtual'; import type { MRT_Cell, MRT_Row, MRT_TableInstance } from '..'; interface Props { columnVirtualizer?: Virtualizer; measureElement?: (element: HTMLTableRowElement) => void; numRows: number; row: MRT_Row; rowIndex: number; table: MRT_TableInstance; virtualColumns?: VirtualItem[]; virtualPaddingLeft?: number; virtualPaddingRight?: number; virtualRow?: VirtualItem; } export const MRT_TableBodyRow = ({ columnVirtualizer, measureElement, numRows, row, rowIndex, table, virtualColumns, virtualPaddingLeft, virtualPaddingRight, virtualRow, }: Props) => { const { getState, options: { enableRowOrdering, layoutMode, memoMode, muiTableBodyRowProps, renderDetailPanel, }, setHoveredRow, } = table; const { draggingColumn, draggingRow, editingCell, editingRow, hoveredRow } = getState(); const tableRowProps = muiTableBodyRowProps instanceof Function ? muiTableBodyRowProps({ row, table }) : muiTableBodyRowProps; const handleDragEnter = (_e: DragEvent) => { if (enableRowOrdering && draggingRow) { setHoveredRow(row); } }; const rowRef = useRef(null); return ( <> { if (node) { rowRef.current = node; measureElement?.(node); } }} {...tableRowProps} sx={(theme) => ({ backgroundColor: lighten(theme.palette.background.default, 0.06), display: layoutMode === 'grid' ? 'flex' : 'table-row', opacity: draggingRow?.id === row.id || hoveredRow?.id === row.id ? 0.5 : 1, position: virtualRow ? 'absolute' : undefined, top: virtualRow ? 0 : undefined, transform: virtualRow ? `translateY(${virtualRow?.start}px)` : undefined, transition: virtualRow ? 'none' : 'all 150ms ease-in-out', width: '100%', '&:hover td': { backgroundColor: tableRowProps?.hover !== false ? row.getIsSelected() ? `${alpha(theme.palette.primary.main, 0.2)}` : theme.palette.mode === 'dark' ? `${lighten(theme.palette.background.default, 0.12)}` : `${darken(theme.palette.background.default, 0.05)}` : undefined, }, ...(tableRowProps?.sx instanceof Function ? tableRowProps.sx(theme) : (tableRowProps?.sx as any)), })} > {virtualPaddingLeft ? ( ) : null} {(virtualColumns ?? row.getVisibleCells()).map((cellOrVirtualCell) => { const cell = columnVirtualizer ? row.getVisibleCells()[(cellOrVirtualCell as VirtualItem).index] : (cellOrVirtualCell as MRT_Cell); const props = { cell, key: cell.id, measureElement: columnVirtualizer?.measureElement, numRows, rowIndex, rowRef, table, virtualCell: columnVirtualizer ? (cellOrVirtualCell as VirtualItem) : undefined, }; return memoMode === 'cells' && cell.column.columnDef.columnDefType === 'data' && !draggingColumn && !draggingRow && editingCell?.id !== cell.id && editingRow?.id !== row.id ? ( ) : ( ); })} {virtualPaddingRight ? ( ) : null} {renderDetailPanel && !row.getIsGrouped() && ( )} ); }; export const Memo_MRT_TableBodyRow = memo( MRT_TableBodyRow, (prev, next) => prev.row === next.row && prev.rowIndex === next.rowIndex, );