From 442e4be3ad22e2f23731a69b065c7ac783d65bce Mon Sep 17 00:00:00 2001 From: amahajan Date: Mon, 23 Feb 2026 10:31:12 -0600 Subject: [PATCH 1/3] Move row selection logic to TreeGrid, add `renderSummaryRow` --- src/DataGrid.tsx | 67 +++++++++----------- src/GroupRow.tsx | 5 +- src/Row.tsx | 7 +- src/SummaryRow.tsx | 48 ++++++-------- src/TreeDataGrid.tsx | 40 ++++++++++-- src/index.ts | 2 + src/style/row.ts | 20 +++--- src/types.ts | 17 ++++- test/browser/renderers.test.tsx | 109 +++++++++++++++++++++++++------- 9 files changed, 202 insertions(+), 113 deletions(-) diff --git a/src/DataGrid.tsx b/src/DataGrid.tsx index ebaeb25d86..48dac82f3c 100644 --- a/src/DataGrid.tsx +++ b/src/DataGrid.tsx @@ -70,7 +70,7 @@ import ScrollToCell from './ScrollToCell'; import { default as defaultRenderSortStatus } from './sortStatus'; import { cellDragHandleClassname, cellDragHandleFrozenClassname } from './style/cell'; import { rootClassname, viewportDraggingClassname } from './style/core'; -import SummaryRow from './SummaryRow'; +import { defaultSummaryRenderRow } from './SummaryRow'; export interface SelectCellState extends Position { readonly mode: 'SELECT'; @@ -298,6 +298,8 @@ export function DataGrid(props: DataGridPr const headerRowHeight = rawHeaderRowHeight ?? (typeof rowHeight === 'number' ? rowHeight : 35); const summaryRowHeight = rawSummaryRowHeight ?? (typeof rowHeight === 'number' ? rowHeight : 35); const renderRow = renderers?.renderRow ?? defaultRenderers?.renderRow ?? defaultRenderRow; + const renderSummaryRow = + renderers?.renderSummaryRow ?? defaultRenderers?.renderSummaryRow ?? defaultSummaryRenderRow; const renderCell = renderers?.renderCell ?? defaultRenderers?.renderCell ?? defaultRenderCell; const renderSortStatus = renderers?.renderSortStatus ?? defaultRenderers?.renderSortStatus ?? defaultRenderSortStatus; @@ -1129,8 +1131,7 @@ export function DataGrid(props: DataGridPr lastFrozenColumnIndex, onRowChange: handleFormatterRowChangeLatest, selectCell: selectCellLatest, - selectedCellEditor: getCellEditor(rowIdx), - isTreeGrid + selectedCellEditor: getCellEditor(rowIdx) }) ); } @@ -1245,23 +1246,19 @@ export function DataGrid(props: DataGridPr const isSummaryRowSelected = selectedPosition.rowIdx === summaryRowIdx; const top = headerRowsHeight + summaryRowHeight * rowIdx; - return ( - - ); + return renderSummaryRow(rowIdx, { + 'aria-rowindex': gridRowStart, + rowIdx: summaryRowIdx, + gridRowStart, + row, + top, + bottom: undefined, + viewportColumns: getRowViewportColumns(summaryRowIdx), + lastFrozenColumnIndex, + selectedCellIdx: isSummaryRowSelected ? selectedPosition.idx : undefined, + isTop: true, + selectCell: selectCellLatest + }); })} {getViewportRows()} @@ -1279,23 +1276,19 @@ export function DataGrid(props: DataGridPr ? summaryRowHeight * (bottomSummaryRows.length - 1 - rowIdx) : undefined; - return ( - - ); + return renderSummaryRow(rowIdx, { + 'aria-rowindex': ariaRowCount - bottomSummaryRowsCount + rowIdx + 1, + rowIdx: summaryRowIdx, + gridRowStart, + row, + top, + bottom, + viewportColumns: getRowViewportColumns(summaryRowIdx), + lastFrozenColumnIndex, + selectedCellIdx: isSummaryRowSelected ? selectedPosition.idx : undefined, + isTop: false, + selectCell: selectCellLatest + }); })} )} diff --git a/src/GroupRow.tsx b/src/GroupRow.tsx index 7c2c453c6b..c32b24fc2e 100644 --- a/src/GroupRow.tsx +++ b/src/GroupRow.tsx @@ -7,7 +7,7 @@ import type { BaseRenderRowProps, GroupRow } from './types'; import { SELECT_COLUMN_KEY } from './Columns'; import GroupCell from './GroupCell'; import { cell, cellFrozen } from './style/cell'; -import { rowClassname, rowSelectedClassname } from './style/row'; +import { rowClassname } from './style/row'; const groupRow = css` @layer rdg.GroupedRow { @@ -44,7 +44,6 @@ function GroupedRow({ isRowSelectionDisabled: _isRowSelectionDisabled, ...props }: GroupRowRendererProps) { - const isPositionOnRow = selectedCellIdx === -1; // Select is always the first column const idx = viewportColumns[0].key === SELECT_COLUMN_KEY ? row.level + 1 : row.level; @@ -65,12 +64,10 @@ function GroupedRow({ aria-setsize={row.setSize} aria-posinset={row.posInSet + 1} // aria-posinset is 1-based aria-expanded={row.isExpanded} - tabIndex={isPositionOnRow ? 0 : -1} className={classnames( rowClassname, groupRowClassname, `rdg-row-${rowIdx % 2 === 0 ? 'even' : 'odd'}`, - isPositionOnRow && rowSelectedClassname, className )} onMouseDown={handleSelectGroup} diff --git a/src/Row.tsx b/src/Row.tsx index d38ea2bc5d..82f3b34720 100644 --- a/src/Row.tsx +++ b/src/Row.tsx @@ -4,7 +4,7 @@ import { RowSelectionContext, useLatestFunc, type RowSelectionContextValue } fro import { classnames, getColSpan } from './utils'; import type { CalculatedColumn, RenderRowProps } from './types'; import { useDefaultRenderers } from './DataGridDefaultRenderersContext'; -import { rowClassname, rowSelectedClassname } from './style/row'; +import { rowClassname } from './style/row'; function Row({ className, @@ -18,7 +18,6 @@ function Row({ row, viewportColumns, selectedCellEditor, - isTreeGrid, onCellMouseDown, onCellClick, onCellDoubleClick, @@ -35,12 +34,9 @@ function Row({ onRowChange(column, rowIdx, newRow); }); - const isPositionOnRow = selectedCellIdx === -1; - className = classnames( rowClassname, `rdg-row-${rowIdx % 2 === 0 ? 'even' : 'odd'}`, - isPositionOnRow && rowSelectedClassname, rowClass?.(row, rowIdx), className ); @@ -88,7 +84,6 @@ function Row({
= Pick< - RenderRowProps, - 'viewportColumns' | 'rowIdx' | 'gridRowStart' | 'selectCell' | 'isTreeGrid' ->; - -interface SummaryRowProps extends SharedRenderRowProps { - 'aria-rowindex': number; - row: SR; - top: number | undefined; - bottom: number | undefined; - lastFrozenColumnIndex: number; - selectedCellIdx: number | undefined; - isTop: boolean; -} - const summaryRow = css` @layer rdg.SummaryRow { position: sticky; @@ -36,6 +16,8 @@ const summaryRow = css` const summaryRowClassname = `rdg-summary-row ${summaryRow}`; function SummaryRow({ + tabIndex, + className, rowIdx, gridRowStart, row, @@ -46,11 +28,8 @@ function SummaryRow({ selectedCellIdx, isTop, selectCell, - isTreeGrid, 'aria-rowindex': ariaRowIndex -}: SummaryRowProps) { - const isPositionOnRow = selectedCellIdx === -1; - +}: RenderSummaryRowProps) { const cells = []; for (let index = 0; index < viewportColumns.length; index++) { @@ -79,13 +58,13 @@ function SummaryRow({
({ ); } -export default memo(SummaryRow) as (props: SummaryRowProps) => React.JSX.Element; +const SummaryRowComponent = memo(SummaryRow) as ( + props: RenderSummaryRowProps +) => React.JSX.Element; + +export default SummaryRowComponent; + +export function defaultSummaryRenderRow( + key: React.Key, + props: RenderSummaryRowProps +) { + return ; +} diff --git a/src/TreeDataGrid.tsx b/src/TreeDataGrid.tsx index 9f6845cad5..4d40018fef 100644 --- a/src/TreeDataGrid.tsx +++ b/src/TreeDataGrid.tsx @@ -2,7 +2,7 @@ import { useCallback, useMemo } from 'react'; import type { Key } from 'react'; import { useLatestFunc } from './hooks'; -import { assertIsValidKeyGetter, getLeftRightKey } from './utils'; +import { assertIsValidKeyGetter, classnames, getLeftRightKey } from './utils'; import type { CellClipboardEvent, CellCopyArgs, @@ -14,6 +14,7 @@ import type { Maybe, Omit, RenderRowProps, + RenderSummaryRowProps, RowHeightArgs, RowsChangeData } from './types'; @@ -24,6 +25,8 @@ import type { DataGridProps } from './DataGrid'; import { useDefaultRenderers } from './DataGridDefaultRenderersContext'; import GroupedRow from './GroupRow'; import { defaultRenderRow } from './Row'; +import { rowFocusable, rowSelectedClassname } from './style/row'; +import SummaryRowComponent from './SummaryRow'; export interface TreeDataGridProps extends Omit< DataGridProps, @@ -381,10 +384,14 @@ export function TreeDataGrid({ lastFrozenColumnIndex, draggedOverCellIdx, selectedCellEditor, - isTreeGrid, + className, ...rowProps }: RenderRowProps ) { + const isPositionOnRow = rowProps.selectedCellIdx === -1; + const tabIndex = isPositionOnRow ? 0 : -1; + className = classnames(className, rowFocusable, isPositionOnRow && rowSelectedClassname); + if (isGroupRow(row)) { const { startRowIndex } = row; return ( @@ -392,6 +399,8 @@ export function TreeDataGrid({ key={key} {...rowProps} aria-rowindex={headerAndTopSummaryRowsCount + startRowIndex + 1} + className={className} + tabIndex={tabIndex} row={row} groupBy={groupBy} toggleGroup={toggleGroupLatest} @@ -412,6 +421,8 @@ export function TreeDataGrid({ 'aria-rowindex': ariaRowIndex, row, rowClass, + className, + tabIndex, onCellMouseDown, onCellClick, onCellDoubleClick, @@ -419,8 +430,7 @@ export function TreeDataGrid({ onRowChange, lastFrozenColumnIndex, draggedOverCellIdx, - selectedCellEditor, - isTreeGrid + selectedCellEditor }); } @@ -443,7 +453,8 @@ export function TreeDataGrid({ onCellPaste={rawOnCellPaste ? handleCellPaste : undefined} renderers={{ ...renderers, - renderRow + renderRow, + renderSummaryRow }} /> ); @@ -453,6 +464,25 @@ function defaultGroupIdGetter(groupKey: string, parentId: string | undefined) { return parentId !== undefined ? `${parentId}__${groupKey}` : groupKey; } +function renderSummaryRow( + key: React.Key, + { selectedCellIdx, className, ...props }: RenderSummaryRowProps +) { + const isPositionOnRow = selectedCellIdx === -1; + const tabIndex = isPositionOnRow ? 0 : -1; + className = classnames(className, rowFocusable, isPositionOnRow && rowSelectedClassname); + + return ( + + ); +} + function isReadonlyArray(arr: unknown): arr is readonly unknown[] { return Array.isArray(arr); } diff --git a/src/index.ts b/src/index.ts index e7cccaae47..924c6aabfe 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,6 +10,7 @@ export { TreeDataGrid, type TreeDataGridProps } from './TreeDataGrid'; export { DataGridDefaultRenderersContext } from './DataGridDefaultRenderersContext'; export { default as Row } from './Row'; export { default as Cell } from './Cell'; +export { default as SummaryRow } from './SummaryRow'; export * from './Columns'; export * from './cellRenderers'; export { default as renderTextEditor } from './editors/renderTextEditor'; @@ -47,6 +48,7 @@ export type { RenderSortPriorityProps, RenderSortStatusProps, RenderSummaryCellProps, + RenderSummaryRowProps, RowHeightArgs, RowsChangeData, SelectCellOptions, diff --git a/src/style/row.ts b/src/style/row.ts index 7eaf1a43b0..7234258499 100644 --- a/src/style/row.ts +++ b/src/style/row.ts @@ -13,6 +13,18 @@ export const row = css` background-color: var(--rdg-row-hover-background-color); } + &[aria-selected='true'] { + background-color: var(--rdg-row-selected-background-color); + + &:hover { + background-color: var(--rdg-row-selected-hover-background-color); + } + } + } +`; + +export const rowFocusable = css` + @layer rdg.Row { &:focus { outline: none; } @@ -36,14 +48,6 @@ export const row = css` border-inline-start: var(--rdg-selection-width) solid var(--rdg-selection-color); } } - - &[aria-selected='true'] { - background-color: var(--rdg-row-selected-background-color); - - &:hover { - background-color: var(--rdg-row-selected-hover-background-color); - } - } } `; diff --git a/src/types.ts b/src/types.ts index 53d4f4b019..1b8cd9b82f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -254,7 +254,19 @@ export interface RenderRowProps extends BaseRenderR selectedCellEditor: ReactElement> | undefined; onRowChange: (column: CalculatedColumn, rowIdx: number, newRow: TRow) => void; rowClass: Maybe<(row: TRow, rowIdx: number) => Maybe>; - isTreeGrid: boolean; +} + +export interface RenderSummaryRowProps extends Pick< + BaseRenderRowProps, + 'className' | 'tabIndex' | 'viewportColumns' | 'rowIdx' | 'gridRowStart' | 'selectCell' +> { + 'aria-rowindex': number; + row: TSummaryRow; + top: number | undefined; + bottom: number | undefined; + lastFrozenColumnIndex: number; + selectedCellIdx: number | undefined; + isTop: boolean; } export interface RowsChangeData { @@ -337,6 +349,9 @@ export interface Renderers { renderCell?: Maybe<(key: Key, props: CellRendererProps) => ReactNode>; renderCheckbox?: Maybe<(props: RenderCheckboxProps) => ReactNode>; renderRow?: Maybe<(key: Key, props: RenderRowProps) => ReactNode>; + renderSummaryRow?: Maybe< + (key: Key, props: RenderSummaryRowProps) => ReactNode + >; renderSortStatus?: Maybe<(props: RenderSortStatusProps) => ReactNode>; noRowsFallback?: Maybe; } diff --git a/test/browser/renderers.test.tsx b/test/browser/renderers.test.tsx index 54059ee126..3e0d4369bc 100644 --- a/test/browser/renderers.test.tsx +++ b/test/browser/renderers.test.tsx @@ -6,6 +6,7 @@ import { DataGrid, DataGridDefaultRenderersContext, Row as DefaultRow, + SummaryRow as DefaultSummaryRow, renderSortIcon, SelectColumn } from '../../src'; @@ -14,6 +15,7 @@ import type { Column, DataGridProps, RenderRowProps, + RenderSummaryRowProps, RenderSortStatusProps, SortColumn } from '../../src'; @@ -24,15 +26,17 @@ interface Row { col1: string; col2: string; } +type SummaryRow = undefined; const noRows: readonly Row[] = []; -const columns: readonly Column[] = [ +const columns: readonly Column[] = [ SelectColumn, { key: 'col1', name: 'Column1', - sortable: true + sortable: true, + renderSummaryCell: () => 'summary' }, { key: 'col2', @@ -41,22 +45,30 @@ const columns: readonly Column[] = [ } ]; -function renderGlobalCell(key: React.Key, props: CellRendererProps) { +function renderGlobalCell(key: React.Key, props: CellRendererProps) { return ; } -function renderLocalCell(key: React.Key, props: CellRendererProps) { +function renderLocalCell(key: React.Key, props: CellRendererProps) { return ; } -function renderGlobalRow(key: React.Key, props: RenderRowProps) { +function renderGlobalRow(key: React.Key, props: RenderRowProps) { return ; } -function renderLocalRow(key: React.Key, props: RenderRowProps) { +function renderLocalRow(key: React.Key, props: RenderRowProps) { return ; } +function renderGlobalSummaryRow(key: React.Key, props: RenderSummaryRowProps) { + return ; +} + +function renderLocalSummaryRow(key: React.Key, props: RenderSummaryRowProps) { + return ; +} + function NoRowsFallback() { return
Local no rows fallback
; } @@ -97,7 +109,7 @@ function TestGrid(props: DataGridProps) { return ; } -function setupContext(props: DataGridProps) { +function setupContext(props: DataGridProps) { return page.render( (props: DataGridProps renderCheckbox: renderGlobalCheckbox, renderSortStatus: renderGlobalSortStatus, renderCell: renderGlobalCell, - renderRow: renderGlobalRow + renderRow: renderGlobalRow, + renderSummaryRow: renderGlobalSummaryRow }} > @@ -114,28 +127,36 @@ function setupContext(props: DataGridProps } test('fallback defined using renderers prop with no rows', async () => { - await setup({ columns, rows: noRows, renderers: { noRowsFallback: } }); + await setup({ + columns, + rows: noRows, + renderers: { noRowsFallback: } + }); await testRowCount(0); await expect.element(page.getByText('Local no rows fallback')).toBeInTheDocument(); }); test('fallback defined using context with no rows', async () => { - await setupContext({ columns, rows: noRows }); + await setupContext({ columns, rows: noRows }); await testRowCount(0); await expect.element(page.getByText('Global no rows fallback')).toBeInTheDocument(); }); test('fallback defined using both context and renderers with no rows', async () => { - await setupContext({ columns, rows: noRows, renderers: { noRowsFallback: } }); + await setupContext({ + columns, + rows: noRows, + renderers: { noRowsFallback: } + }); await testRowCount(0); await expect.element(page.getByText('Local no rows fallback')).toBeInTheDocument(); }); test('fallback defined using renderers prop with a row', async () => { - await setup({ + await setup({ columns, rows: [{ id: 1, col1: 'value 1', col2: 'value 2' }], renderers: { noRowsFallback: } @@ -146,14 +167,17 @@ test('fallback defined using renderers prop with a row', async () => { }); test('fallback defined using context with a row', async () => { - await setupContext({ columns, rows: [{ id: 1, col1: 'value 1', col2: 'value 2' }] }); + await setupContext({ + columns, + rows: [{ id: 1, col1: 'value 1', col2: 'value 2' }] + }); await testRowCount(1); await expect.element(page.getByText('Global no rows fallback')).not.toBeInTheDocument(); }); test('fallback defined using both context and renderers with a row', async () => { - await setupContext({ + await setupContext({ columns, rows: [{ id: 1, col1: 'value 1', col2: 'value 2' }], renderers: { noRowsFallback: } @@ -165,21 +189,29 @@ test('fallback defined using both context and renderers with a row', async () => }); test('checkbox defined using renderers prop', async () => { - await setup({ columns, rows: noRows, renderers: { renderCheckbox: renderLocalCheckbox } }); + await setup({ + columns, + rows: noRows, + renderers: { renderCheckbox: renderLocalCheckbox } + }); await testRowCount(0); await expect.element(page.getByText('Local checkbox')).toBeInTheDocument(); }); test('checkbox defined using context', async () => { - await setupContext({ columns, rows: noRows }); + await setupContext({ columns, rows: noRows }); await testRowCount(0); await expect.element(page.getByText('Global checkbox')).toBeInTheDocument(); }); test('checkbox defined using both context and renderers', async () => { - await setupContext({ columns, rows: noRows, renderers: { renderCheckbox: renderLocalCheckbox } }); + await setupContext({ + columns, + rows: noRows, + renderers: { renderCheckbox: renderLocalCheckbox } + }); await testRowCount(0); await expect.element(page.getByText('Local checkbox')).toBeInTheDocument(); @@ -187,7 +219,7 @@ test('checkbox defined using both context and renderers', async () => { }); test('sortPriority defined using both contexts', async () => { - await setupContext({ columns, rows: noRows }); + await setupContext({ columns, rows: noRows }); const column1 = page.getHeaderCell({ name: 'Column1' }); const column2 = page.getHeaderCell({ name: 'Column2' }); @@ -204,7 +236,7 @@ test('sortPriority defined using both contexts', async () => { }); test('sortPriority defined using both contexts and renderers', async () => { - await setupContext({ + await setupContext({ columns, rows: noRows, renderers: { renderSortStatus: renderLocalSortStatus } @@ -225,7 +257,10 @@ test('sortPriority defined using both contexts and renderers', async () => { }); test('renderCell defined using context', async () => { - await setupContext({ columns, rows: [{ id: 1, col1: 'value 1', col2: 'value 2' }] }); + await setupContext({ + columns, + rows: [{ id: 1, col1: 'value 1', col2: 'value 2' }] + }); const cell1 = page.getCell({ name: 'value 1' }); const cell2 = page.getCell({ name: 'value 2' }); @@ -239,7 +274,7 @@ test('renderCell defined using context', async () => { }); test('renderCell defined using both contexts and renderers', async () => { - await setupContext({ + await setupContext({ columns, rows: [{ id: 1, col1: 'value 1', col2: 'value 2' }], renderers: { renderCell: renderLocalCell } @@ -257,7 +292,10 @@ test('renderCell defined using both contexts and renderers', async () => { }); test('renderRow defined using context', async () => { - await setupContext({ columns, rows: [{ id: 1, col1: 'value 1', col2: 'value 2' }] }); + await setupContext({ + columns, + rows: [{ id: 1, col1: 'value 1', col2: 'value 2' }] + }); const row = getRowWithCell(page.getCell({ name: 'value 1' })); await expect.element(row).toHaveClass('global'); @@ -265,7 +303,7 @@ test('renderRow defined using context', async () => { }); test('renderRow defined using both contexts and renderers', async () => { - await setupContext({ + await setupContext({ columns, rows: [{ id: 1, col1: 'value 1', col2: 'value 2' }], renderers: { renderRow: renderLocalRow } @@ -275,3 +313,28 @@ test('renderRow defined using both contexts and renderers', async () => { await expect.element(row).toHaveClass('local'); await expect.element(row).not.toHaveClass('global'); }); + +test('renderSummaryRow defined using context', async () => { + await setupContext({ + columns, + rows: [{ id: 10, col1: 'value 10', col2: 'value 20' }], + topSummaryRows: [undefined] + }); + + const row = getRowWithCell(page.getCell({ name: 'summary' })); + await expect.element(row).toHaveClass('global'); + await expect.element(row).not.toHaveClass('local'); +}); + +test('renderSummaryRow defined using both contexts and renderers', async () => { + await setupContext({ + columns, + rows: [{ id: 10, col1: 'value 10', col2: 'value 20' }], + bottomSummaryRows: [undefined], + renderers: { renderSummaryRow: renderLocalSummaryRow } + }); + + const row = getRowWithCell(page.getCell({ name: 'summary' })); + await expect.element(row).toHaveClass('local'); + await expect.element(row).not.toHaveClass('global'); +}); From 4ca38de4be88af3fa75673dc9b789c30aaae83f4 Mon Sep 17 00:00:00 2001 From: amahajan Date: Mon, 23 Feb 2026 10:39:12 -0600 Subject: [PATCH 2/3] Rename --- src/DataGrid.tsx | 4 ++-- src/SummaryRow.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/DataGrid.tsx b/src/DataGrid.tsx index 48dac82f3c..da06e4a57a 100644 --- a/src/DataGrid.tsx +++ b/src/DataGrid.tsx @@ -70,7 +70,7 @@ import ScrollToCell from './ScrollToCell'; import { default as defaultRenderSortStatus } from './sortStatus'; import { cellDragHandleClassname, cellDragHandleFrozenClassname } from './style/cell'; import { rootClassname, viewportDraggingClassname } from './style/core'; -import { defaultSummaryRenderRow } from './SummaryRow'; +import { defaultRenderSummaryRow } from './SummaryRow'; export interface SelectCellState extends Position { readonly mode: 'SELECT'; @@ -299,7 +299,7 @@ export function DataGrid(props: DataGridPr const summaryRowHeight = rawSummaryRowHeight ?? (typeof rowHeight === 'number' ? rowHeight : 35); const renderRow = renderers?.renderRow ?? defaultRenderers?.renderRow ?? defaultRenderRow; const renderSummaryRow = - renderers?.renderSummaryRow ?? defaultRenderers?.renderSummaryRow ?? defaultSummaryRenderRow; + renderers?.renderSummaryRow ?? defaultRenderers?.renderSummaryRow ?? defaultRenderSummaryRow; const renderCell = renderers?.renderCell ?? defaultRenderers?.renderCell ?? defaultRenderCell; const renderSortStatus = renderers?.renderSortStatus ?? defaultRenderers?.renderSortStatus ?? defaultRenderSortStatus; diff --git a/src/SummaryRow.tsx b/src/SummaryRow.tsx index fa8fc77f66..ead7f4f891 100644 --- a/src/SummaryRow.tsx +++ b/src/SummaryRow.tsx @@ -83,7 +83,7 @@ const SummaryRowComponent = memo(SummaryRow) as ( export default SummaryRowComponent; -export function defaultSummaryRenderRow( +export function defaultRenderSummaryRow( key: React.Key, props: RenderSummaryRowProps ) { From 3b23533db229125df5f70be4a57fb2a5e919f12c Mon Sep 17 00:00:00 2001 From: amahajan Date: Mon, 23 Feb 2026 10:58:35 -0600 Subject: [PATCH 3/3] Header row is not focusable --- src/HeaderRow.tsx | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/HeaderRow.tsx b/src/HeaderRow.tsx index 3c9fe6217a..0c75cf4f69 100644 --- a/src/HeaderRow.tsx +++ b/src/HeaderRow.tsx @@ -6,7 +6,6 @@ import type { CalculatedColumn, Direction, Maybe, Position, ResizedWidth } from import type { DataGridProps } from './DataGrid'; import HeaderCell from './HeaderCell'; import { cell, cellFrozen } from './style/cell'; -import { rowSelectedClassname } from './style/row'; type SharedDataGridProps = Pick< DataGridProps, @@ -62,7 +61,6 @@ function HeaderRow({ direction }: HeaderRowProps) { const [draggedColumnKey, setDraggedColumnKey] = useState(); - const isPositionOnRow = selectedCellIdx === -1; const cells = []; for (let index = 0; index < columns.length; index++) { @@ -97,11 +95,7 @@ function HeaderRow({
{cells}