Skip to content

Commit 967569a

Browse files
committed
fix(core): add button to elements to ignore in useKeyPress (#1807)
* fix(core): add button to elements to ignore in useKeyPress Signed-off-by: braks <[email protected]> * chore(changeset): add Signed-off-by: braks <[email protected]> * fix(core): add prevent default option to useKeyPress Signed-off-by: braks <[email protected]> --------- Signed-off-by: braks <[email protected]>
1 parent 44b06bb commit 967569a

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

.changeset/lemon-terms-joke.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@vue-flow/core": patch
3+
---
4+
5+
Prevent keypress events from being swallowed when a button element is focused.

packages/core/src/composables/useKeyPress.ts

+14-4
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@ type PressedKeys = Set<string>
77
type KeyOrCode = 'key' | 'code'
88

99
export interface UseKeyPressOptions {
10-
actInsideInputWithModifier?: MaybeRefOrGetter<boolean>
1110
target?: MaybeRefOrGetter<EventTarget | null | undefined>
11+
actInsideInputWithModifier?: MaybeRefOrGetter<boolean>
12+
preventDefault?: MaybeRefOrGetter<boolean>
1213
}
1314

15+
const inputTags = ['INPUT', 'SELECT', 'TEXTAREA']
16+
1417
export function isInputDOMNode(event: KeyboardEvent): boolean {
1518
const target = (event.composedPath?.()?.[0] || event.target) as HTMLElement
1619

@@ -19,12 +22,12 @@ export function isInputDOMNode(event: KeyboardEvent): boolean {
1922
const closest = typeof target?.closest === 'function' ? target.closest('.nokey') : null
2023

2124
// when an input field is focused we don't want to trigger deletion or movement of nodes
22-
return ['INPUT', 'SELECT', 'TEXTAREA'].includes(target?.nodeName) || hasAttribute || !!closest
25+
return inputTags.includes(target?.nodeName) || hasAttribute || !!closest
2326
}
2427

2528
// we want to be able to do a multi selection event if we are in an input field
2629
function wasModifierPressed(event: KeyboardEvent) {
27-
return event.ctrlKey || event.metaKey || event.shiftKey
30+
return event.ctrlKey || event.metaKey || event.shiftKey || event.altKey
2831
}
2932

3033
function isKeyMatch(pressedKey: string, keyToMatch: string, pressedKeys: Set<string>, isKeyUp: boolean) {
@@ -88,6 +91,8 @@ export function useKeyPress(keyFilter: MaybeRefOrGetter<KeyFilter | boolean | nu
8891

8992
const target = toRef(() => toValue(options?.target) ?? window)
9093

94+
const preventDefault = toRef(() => toValue(options?.preventDefault) ?? true)
95+
9196
const isPressed = ref(toValue(keyFilter) === true)
9297

9398
let modifierPressed = false
@@ -124,7 +129,12 @@ export function useKeyPress(keyFilter: MaybeRefOrGetter<KeyFilter | boolean | nu
124129
return
125130
}
126131

127-
e.preventDefault()
132+
const target = (e.composedPath?.()?.[0] || e.target) as Element | null
133+
const isInteractiveElement = target?.nodeName === 'BUTTON' || target?.nodeName === 'A'
134+
135+
if (!preventDefault.value && (modifierPressed || !isInteractiveElement)) {
136+
e.preventDefault()
137+
}
128138

129139
isPressed.value = true
130140
},

0 commit comments

Comments
 (0)