Skip to content

Commit be59ade

Browse files
committed
fix: Support range selection with grid/table checkboxes
1 parent f90f489 commit be59ade

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

packages/@react-aria/grid/src/useGridSelectionCheckbox.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {GridState} from '@react-stately/grid';
44
// @ts-ignore
55
import intlMessages from '../intl/*.json';
66
import {Key} from '@react-types/shared';
7+
import {useEffect, useRef} from 'react';
78
import {useId} from '@react-aria/utils';
89
import {useLocalizedStringFormatter} from '@react-aria/i18n';
910

@@ -31,8 +32,30 @@ export function useGridSelectionCheckbox<T, C extends GridCollection<T>>(props:
3132
let isDisabled = !state.selectionManager.canSelectItem(key);
3233
let isSelected = state.selectionManager.isSelected(key);
3334

35+
let isShiftDown = useRef(false);
36+
useEffect(() => {
37+
let trackKeyDown = (e: KeyboardEvent) => {
38+
if (e.key === 'Shift') {
39+
isShiftDown.current = true;
40+
}
41+
};
42+
let trackKeyUp = (e: KeyboardEvent) => {
43+
if (e.key === 'Shift') {
44+
isShiftDown.current = false;
45+
}
46+
};
47+
48+
document.addEventListener('keydown', trackKeyDown);
49+
document.addEventListener('keyup', trackKeyUp);
50+
51+
return () => {
52+
document.removeEventListener('keydown', trackKeyDown);
53+
document.removeEventListener('keyup', trackKeyUp);
54+
};
55+
});
56+
3457
// Checkbox should always toggle selection, regardless of selectionBehavior.
35-
let onChange = () => manager.toggleSelection(key);
58+
let onChange = () => isShiftDown.current ? manager.extendSelection(key) : manager.toggleSelection(key);
3659

3760
const stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-aria/grid');
3861

0 commit comments

Comments
 (0)