Skip to content

Commit 35f16f0

Browse files
committed
feat: fix toggleSelectItem not being rebindable (#363)
1 parent 04b1eba commit 35f16f0

9 files changed

+63
-11
lines changed

next-release-notes.md

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
### Bug Fixes and Improvements
22
- Improved keyboard-controlled drag and drop behavior to not show redundant drop target directly below opened folder item (#363)
3+
- Fixed an issue where the `toggleSelectItem` (Ctrl + Space) hotkey could not be rebounded or disabled (#363)
34

45
### Other Changes
56
- Added some documentation on the data structure required by a StaticDataProvider.

packages/core/src/hotkeys/defaultKeyboardBindings.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export const defaultKeyboardBindings: Required<KeyboardBindings> = {
77
primaryAction: ['enter'],
88
renameItem: ['f2'],
99
abortRenameItem: ['escape'],
10-
toggleSelectItem: ['control+space'],
10+
toggleSelectItem: ['control+ '],
1111
abortSearch: ['escape', 'enter'],
1212
startSearch: [],
1313
selectAll: ['control+a'],

packages/core/src/interactionMode/ClickArrowToExpandInteractionManager.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@ export class ClickArrowToExpandInteractionManager
2828
): HTMLProps<HTMLElement> {
2929
return {
3030
onClick: e => {
31+
const isSpacebarEvent = e.detail === 0;
3132
actions.focusItem();
32-
if (e.shiftKey) {
33+
if (e.shiftKey && !isSpacebarEvent) {
3334
actions.selectUpTo(!isControlKey(e));
34-
} else if (isControlKey(e)) {
35+
} else if (isControlKey(e) && !isSpacebarEvent) {
3536
if (renderFlags.isSelected) {
3637
actions.unselectItem();
3738
} else {

packages/core/src/interactionMode/ClickItemToExpandInteractionManager.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,11 @@ export class ClickItemToExpandInteractionManager implements InteractionManager {
2626
): HTMLProps<HTMLElement> {
2727
return {
2828
onClick: e => {
29+
const isSpacebarEvent = e.detail === 0;
2930
actions.focusItem();
30-
if (e.shiftKey) {
31+
if (e.shiftKey && !isSpacebarEvent) {
3132
actions.selectUpTo(!isControlKey(e));
32-
} else if (isControlKey(e)) {
33+
} else if (isControlKey(e) && !isSpacebarEvent) {
3334
if (renderFlags.isSelected) {
3435
actions.unselectItem();
3536
} else {

packages/core/src/interactionMode/DoubleClickItemToExpandInteractionManager.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@ export class DoubleClickItemToExpandInteractionManager
2828
): HTMLProps<HTMLElement> {
2929
return {
3030
onClick: e => {
31+
const isSpacebarEvent = e.detail === 0;
3132
actions.focusItem();
32-
if (e.shiftKey) {
33+
if (e.shiftKey && !isSpacebarEvent) {
3334
actions.selectUpTo(!isControlKey(e));
34-
} else if (isControlKey(e)) {
35+
} else if (isControlKey(e) && !isSpacebarEvent) {
3536
if (renderFlags.isSelected) {
3637
actions.unselectItem();
3738
} else {

packages/core/src/stories/BasicExamples.stories.tsx

+44
Original file line numberDiff line numberDiff line change
@@ -703,3 +703,47 @@ export const ItemContainersWithMargin = () => (
703703
<Tree treeId="tree-1" rootItem="root" treeLabel="Tree Example" />
704704
</UncontrolledTreeEnvironment>
705705
);
706+
707+
export const HotkeysDisabled = () => (
708+
<UncontrolledTreeEnvironment<string>
709+
canDragAndDrop
710+
canDropOnFolder
711+
canReorderItems
712+
keyboardBindings={{
713+
primaryAction: [],
714+
moveFocusToFirstItem: [],
715+
moveFocusToLastItem: [],
716+
expandSiblings: [],
717+
renameItem: [],
718+
abortRenameItem: [],
719+
toggleSelectItem: [],
720+
abortSearch: [],
721+
startSearch: [],
722+
selectAll: [],
723+
startProgrammaticDnd: [],
724+
abortProgrammaticDnd: [],
725+
completeProgrammaticDnd: [],
726+
}}
727+
dataProvider={
728+
new StaticTreeDataProvider(longTree.items, (item, data) => ({
729+
...item,
730+
data,
731+
}))
732+
}
733+
getItemTitle={item => item.data}
734+
viewState={{
735+
'tree-1': {
736+
expandedItems: [
737+
'Fruit',
738+
'Meals',
739+
'America',
740+
'Europe',
741+
'Asia',
742+
'Desserts',
743+
],
744+
},
745+
}}
746+
>
747+
<Tree treeId="tree-1" rootItem="root" treeLabel="Tree Example" />
748+
</UncontrolledTreeEnvironment>
749+
);

packages/core/src/tree/useTreeKeyboardBindings.ts

+1
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ export const useTreeKeyboardBindings = () => {
135135
'toggleSelectItem',
136136
e => {
137137
e.preventDefault();
138+
e.stopPropagation();
138139
if (viewState.focusedItem !== undefined) {
139140
if (
140141
viewState.selectedItems &&

packages/core/test/helpers/TestUtil.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,15 @@ export class TestUtil {
8585
public async clickItem(title: string) {
8686
await this.expectVisible(title);
8787
await act(async () => {
88-
fireEvent.click(await this.renderProps!.findByText(title));
88+
fireEvent.click(await this.renderProps!.findByText(title), { detail: 1 });
8989
});
9090
}
9191

9292
public async controlClick(title: string) {
9393
await act(async () => {
9494
fireEvent.click(await this.renderProps!.findByText(title), {
9595
ctrlKey: true,
96+
detail: 1,
9697
});
9798
});
9899
}
@@ -102,6 +103,7 @@ export class TestUtil {
102103
fireEvent.click(await this.renderProps!.findByText(title), {
103104
ctrlKey: true,
104105
shiftKey: true,
106+
detail: 1,
105107
});
106108
});
107109
}
@@ -110,6 +112,7 @@ export class TestUtil {
110112
await act(async () => {
111113
fireEvent.click(await this.renderProps!.findByText(title), {
112114
shiftKey: true,
115+
detail: 1,
113116
});
114117
});
115118
}

packages/core/test/selection.spec.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,12 @@ describe('selection', () => {
104104
await test.focusTree();
105105
await test.clickItem('before');
106106
await test.pressKeys('ArrowDown');
107-
await test.pressKeys('Control', 'Space');
107+
await test.pressKeys('Control', ' ');
108108
await test.pressKeys('ArrowDown');
109-
await test.pressKeys('Control', 'Space');
109+
await test.pressKeys('Control', ' ');
110110
await test.pressKeys('ArrowDown');
111111
await test.pressKeys('ArrowDown');
112-
await test.pressKeys('Control', 'Space');
112+
await test.pressKeys('Control', ' ');
113113
await test.expectFocused('aa');
114114
await test.expectSelected('before', 'target', 'after', 'aa');
115115
await test.expectTreeUnchanged();

0 commit comments

Comments
 (0)