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:
braks
2022-08-03 16:33:40 +02:00
committed by Braks
parent 3638e598e4
commit 250965d18f
2 changed files with 18 additions and 1 deletions
@@ -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,
}) })