Skip to content

Commit dfe68ca

Browse files
committed
fix: keep active scroll source during drag
1 parent a17d24f commit dfe68ca

2 files changed

Lines changed: 42 additions & 4 deletions

File tree

src/Table.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -369,9 +369,12 @@ const Table = <RecordType extends DefaultRecordType>(
369369
const scrollBodyContainerRef = React.useRef<HTMLDivElement>(null);
370370
const [hoverEle, setHoverEle] = React.useState<ScrollSource | null>(null);
371371
const onHoverScrollSource = React.useCallback(
372-
(source: ScrollSource) => () => {
373-
setHoverEle(source);
374-
},
372+
(source: ScrollSource): React.MouseEventHandler<HTMLElement> =>
373+
event => {
374+
if (event.buttons === 0) {
375+
setHoverEle(source);
376+
}
377+
},
375378
[],
376379
);
377380
const onLeaveTable = React.useCallback(() => {
@@ -519,7 +522,7 @@ const Table = <RecordType extends DefaultRecordType>(
519522
sticky: undefined,
520523
});
521524

522-
if (source && hoverEle && scrollSource && hoverEle !== scrollSource) {
525+
if (source === 'body' && hoverEle && hoverEle !== 'body') {
523526
return;
524527
}
525528

tests/Virtual.spec.tsx

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,41 @@ describe('Table.Virtual', () => {
263263
expect(setScrollLeft).not.toHaveBeenCalled();
264264
});
265265

266+
it('should not change hovered scroll source while dragging', () => {
267+
const { container } = getTable();
268+
269+
resize(container.querySelector('.rc-table')!);
270+
271+
fireEvent.mouseEnter(container.querySelector('.rc-table-header')!);
272+
fireEvent.mouseEnter(container.querySelector('.rc-table-tbody-virtual')!, {
273+
buttons: 1,
274+
});
275+
276+
setScrollLeft.mockClear();
277+
278+
fireEvent.wheel(container.querySelector('.rc-table-tbody-virtual-holder')!, {
279+
deltaX: 10,
280+
});
281+
282+
expect(setScrollLeft).not.toHaveBeenCalled();
283+
});
284+
285+
it('should process direct header scroll when body is hovered', () => {
286+
const { container } = getTable();
287+
288+
resize(container.querySelector('.rc-table')!);
289+
290+
fireEvent.mouseEnter(container.querySelector('.rc-table-tbody-virtual')!);
291+
292+
setScrollLeft.mockClear();
293+
294+
fireEvent.wheel(container.querySelector('.rc-table-header')!, {
295+
deltaX: 10,
296+
});
297+
298+
expect(setScrollLeft).toHaveBeenCalled();
299+
});
300+
266301
it('should reset hovered scroll source when leaving table', () => {
267302
const { container } = getTable();
268303
const table = container.querySelector('.rc-table') as HTMLElement;

0 commit comments

Comments
 (0)