Keyboard navigation for Tree
parent
b9c040d723
commit
58ab99c03d
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<li :class="containerClass">
|
<li :class="containerClass">
|
||||||
<div class="p-treenode-content" tabindex="0" role="treeitem">
|
<div class="p-treenode-content" tabindex="0" role="treeitem" @click="onClick" @keydown="onKeyDown" :aria-expanded="expanded">
|
||||||
<span class="p-tree-toggler p-unselectable-text p-link" @click="toggle">
|
<span class="p-tree-toggler p-unselectable-text p-link" @click="toggle">
|
||||||
<span :class="toggleIcon"></span>
|
<span :class="toggleIcon"></span>
|
||||||
</span>
|
</span>
|
||||||
|
@ -15,6 +15,8 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import DomHandler from '../utils/DomHandler';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'sub-treenode',
|
name: 'sub-treenode',
|
||||||
props: {
|
props: {
|
||||||
|
@ -33,6 +35,100 @@ export default {
|
||||||
},
|
},
|
||||||
onChildNodeToggle(node) {
|
onChildNodeToggle(node) {
|
||||||
this.$emit('toggle', node);
|
this.$emit('toggle', node);
|
||||||
|
},
|
||||||
|
onClick() {
|
||||||
|
|
||||||
|
},
|
||||||
|
onKeyDown(event) {
|
||||||
|
const nodeElement = event.target.parentElement;
|
||||||
|
|
||||||
|
switch (event.which) {
|
||||||
|
//down arrow
|
||||||
|
case 40:
|
||||||
|
const listElement = nodeElement.children[1];
|
||||||
|
if (listElement) {
|
||||||
|
this.focusNode(listElement.children[0]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const nextNodeElement = nodeElement.nextElementSibling;
|
||||||
|
if (nextNodeElement) {
|
||||||
|
this.focusNode(nextNodeElement);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
let nextSiblingAncestor = this.findNextSiblingOfAncestor(nodeElement);
|
||||||
|
if (nextSiblingAncestor) {
|
||||||
|
this.focusNode(nextSiblingAncestor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
break;
|
||||||
|
|
||||||
|
//up arrow
|
||||||
|
case 38:
|
||||||
|
if (nodeElement.previousElementSibling) {
|
||||||
|
this.focusNode(this.findLastVisibleDescendant(nodeElement.previousElementSibling));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
let parentNodeElement = this.getParentNodeElement(nodeElement);
|
||||||
|
if (parentNodeElement) {
|
||||||
|
this.focusNode(parentNodeElement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
break;
|
||||||
|
|
||||||
|
//right-left arrows
|
||||||
|
case 37:
|
||||||
|
case 39:
|
||||||
|
this.$emit('toggle', this.node);
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
break;
|
||||||
|
|
||||||
|
//enter
|
||||||
|
case 13:
|
||||||
|
this.onClick(event);
|
||||||
|
event.preventDefault();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
//no op
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
findNextSiblingOfAncestor(nodeElement) {
|
||||||
|
let parentNodeElement = this.getParentNodeElement(nodeElement);
|
||||||
|
if (parentNodeElement) {
|
||||||
|
if (parentNodeElement.nextElementSibling)
|
||||||
|
return parentNodeElement.nextElementSibling;
|
||||||
|
else
|
||||||
|
return this.findNextSiblingOfAncestor(parentNodeElement);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
findLastVisibleDescendant(nodeElement) {
|
||||||
|
const childrenListElement = nodeElement.children[1];
|
||||||
|
if (childrenListElement) {
|
||||||
|
const lastChildElement = childrenListElement.children[childrenListElement.children.length - 1];
|
||||||
|
|
||||||
|
return this.findLastVisibleDescendant(lastChildElement);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return nodeElement;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getParentNodeElement(nodeElement) {
|
||||||
|
const parentNodeElement = nodeElement.parentElement.parentElement;
|
||||||
|
|
||||||
|
return DomHandler.hasClass(parentNodeElement, 'p-treenode') ? parentNodeElement : null;
|
||||||
|
},
|
||||||
|
focusNode(element) {
|
||||||
|
element.children[0].focus();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
|
Loading…
Reference in New Issue