Skip to content

Commit 4150364

Browse files
authored
feat: Allow scroll events to be added on certain table components (#8150)
* feat: Allow scroll and context menu events to be added on certain table components * add types for the props * fix lint * Code review comments * self review comments * another self review comment
1 parent ea7f3e6 commit 4150364

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

packages/react-aria-components/src/Table.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -540,7 +540,7 @@ export interface TableHeaderRenderProps {
540540
isHovered: boolean
541541
}
542542

543-
export interface TableHeaderProps<T> extends StyleRenderProps<TableHeaderRenderProps>, HoverEvents {
543+
export interface TableHeaderProps<T> extends StyleRenderProps<TableHeaderRenderProps>, HoverEvents, Pick<React.HTMLAttributes<HTMLTableSectionElement>, 'onScroll'> {
544544
/** A list of table columns. */
545545
columns?: Iterable<T>,
546546
/** A list of `Column(s)` or a function. If the latter, a list of columns must be provided using the `columns` prop. */
@@ -589,6 +589,7 @@ export const TableHeader = /*#__PURE__*/ createBranchComponent(
589589
<THead
590590
{...mergeProps(filterDOMProps(props as any), rowGroupProps, hoverProps)}
591591
{...renderProps}
592+
onScroll={props.onScroll}
592593
ref={ref}
593594
data-hovered={isHovered || undefined}>
594595
{headerRows}
@@ -915,7 +916,7 @@ export interface TableBodyRenderProps {
915916
isDropTarget: boolean
916917
}
917918

918-
export interface TableBodyProps<T> extends Omit<CollectionProps<T>, 'disabledKeys'>, StyleRenderProps<TableBodyRenderProps> {
919+
export interface TableBodyProps<T> extends Omit<CollectionProps<T>, 'disabledKeys'>, StyleRenderProps<TableBodyRenderProps>, Pick<React.HTMLAttributes<HTMLTableSectionElement>, 'onScroll'> {
919920
/** Provides content to display when there are no rows in the table. */
920921
renderEmptyState?: (props: TableBodyRenderProps) => ReactNode
921922
}
@@ -979,6 +980,7 @@ export const TableBody = /*#__PURE__*/ createBranchComponent('tablebody', <T ext
979980
<TBody
980981
{...mergeProps(filterDOMProps(props as any), rowGroupProps)}
981982
{...renderProps}
983+
onScroll={props.onScroll}
982984
ref={ref}
983985
data-empty={isEmpty || undefined}>
984986
{isDroppable && <RootDropIndicator />}

packages/react-aria-components/test/Table.test.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -300,12 +300,14 @@ describe('Table', () => {
300300
}
301301
});
302302

303-
it('should support DOM props', () => {
303+
it('should support DOM props', async () => {
304+
const onScrollHeader = jest.fn();
305+
const onScrollBody = jest.fn();
304306
let {getByRole, getAllByRole} = renderTable({
305307
tableProps: {'data-testid': 'table'},
306-
tableHeaderProps: {'data-testid': 'table-header'},
308+
tableHeaderProps: {'data-testid': 'table-header', onScroll: onScrollHeader},
307309
columnProps: {'data-testid': 'column'},
308-
tableBodyProps: {'data-testid': 'table-body'},
310+
tableBodyProps: {'data-testid': 'table-body', onScroll: onScrollBody},
309311
rowProps: {'data-testid': 'row'},
310312
cellProps: {'data-testid': 'cell'}
311313
});
@@ -332,6 +334,12 @@ describe('Table', () => {
332334
for (let cell of getAllByRole('gridcell')) {
333335
expect(cell).toHaveAttribute('data-testid', 'cell');
334336
}
337+
338+
// trigger scrolls
339+
fireEvent.scroll(rowGroups[0]);
340+
fireEvent.scroll(rowGroups[1]);
341+
expect(onScrollHeader).toBeCalledTimes(1);
342+
expect(onScrollBody).toBeCalledTimes(1);
335343
});
336344

337345
it('should render checkboxes for selection', async () => {

0 commit comments

Comments
 (0)