feat(viewpane): block keypress on inputs and .nokey elements
# What's changed? * revert keypress listener on input elements (except button) * skip keypress events on elements with `.nokey` classname
This commit is contained in:
@@ -2,6 +2,16 @@ import type { Ref } from 'vue'
|
|||||||
import type { KeyFilter } from '@vueuse/core'
|
import type { KeyFilter } from '@vueuse/core'
|
||||||
import useWindow from './useWindow'
|
import useWindow from './useWindow'
|
||||||
|
|
||||||
|
function isInputDOMNode(event: KeyboardEvent): boolean {
|
||||||
|
const target = event.target as HTMLElement
|
||||||
|
|
||||||
|
return (
|
||||||
|
['INPUT', 'SELECT', 'TEXTAREA'].includes(target?.nodeName) ||
|
||||||
|
target?.hasAttribute('contenteditable') ||
|
||||||
|
!!target?.closest('.nokey')
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
export default (keyFilter: KeyFilter, onChange?: (keyPressed: boolean) => void): Ref<boolean> => {
|
export default (keyFilter: KeyFilter, onChange?: (keyPressed: boolean) => void): Ref<boolean> => {
|
||||||
const window = useWindow()
|
const window = useWindow()
|
||||||
|
|
||||||
@@ -14,6 +24,8 @@ export default (keyFilter: KeyFilter, onChange?: (keyPressed: boolean) => void):
|
|||||||
onKeyStroke(
|
onKeyStroke(
|
||||||
keyFilter,
|
keyFilter,
|
||||||
(e) => {
|
(e) => {
|
||||||
|
if (isInputDOMNode(e)) return
|
||||||
|
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
isPressed = true
|
isPressed = true
|
||||||
},
|
},
|
||||||
@@ -23,6 +35,8 @@ export default (keyFilter: KeyFilter, onChange?: (keyPressed: boolean) => void):
|
|||||||
onKeyStroke(
|
onKeyStroke(
|
||||||
keyFilter,
|
keyFilter,
|
||||||
(e) => {
|
(e) => {
|
||||||
|
if (isInputDOMNode(e)) return
|
||||||
|
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
isPressed = false
|
isPressed = false
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -41,6 +41,8 @@ const onMouseLeave = (event: MouseEvent) => emits.paneMouseLeave(event)
|
|||||||
const onMouseMove = (event: MouseEvent) => emits.paneMouseMove(event)
|
const onMouseMove = (event: MouseEvent) => emits.paneMouseMove(event)
|
||||||
|
|
||||||
useKeyPress(deleteKeyCode, (keyPressed) => {
|
useKeyPress(deleteKeyCode, (keyPressed) => {
|
||||||
|
if (!keyPressed) return
|
||||||
|
|
||||||
const nodesToRemove = getNodes.reduce<GraphNode[]>((res, node) => {
|
const nodesToRemove = getNodes.reduce<GraphNode[]>((res, node) => {
|
||||||
if (!node.selected && node.parentNode && res.find((n) => n.id === node.parentNode)) {
|
if (!node.selected && node.parentNode && res.find((n) => n.id === node.parentNode)) {
|
||||||
res.push(node)
|
res.push(node)
|
||||||
@@ -53,7 +55,7 @@ useKeyPress(deleteKeyCode, (keyPressed) => {
|
|||||||
|
|
||||||
const selectedEdges = edges.filter((e) => e.selected)
|
const selectedEdges = edges.filter((e) => e.selected)
|
||||||
|
|
||||||
if (keyPressed && (nodesToRemove || selectedEdges)) {
|
if (nodesToRemove || selectedEdges) {
|
||||||
if (selectedEdges.length > 0) {
|
if (selectedEdges.length > 0) {
|
||||||
removeEdges(selectedEdges)
|
removeEdges(selectedEdges)
|
||||||
}
|
}
|
||||||
@@ -78,6 +80,7 @@ useKeyPress(multiSelectionKeyCode, (keyPressed) => {
|
|||||||
|
|
||||||
const selectionKeyPressed = useKeyPress(selectionKeyCode, (keyPressed) => {
|
const selectionKeyPressed = useKeyPress(selectionKeyCode, (keyPressed) => {
|
||||||
if (userSelectionActive && keyPressed) return
|
if (userSelectionActive && keyPressed) return
|
||||||
|
|
||||||
setState({
|
setState({
|
||||||
userSelectionActive: keyPressed && elementsSelectable,
|
userSelectionActive: keyPressed && elementsSelectable,
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user