/* * JQuery zTree keyboard navigation extension * zTree v3.5.42 or later * http://www.xbrlquery.com/ * * Copyright (c) 2019 Bill Seddon * * Licensed same as jquery - MIT License * http://www.opensource.org/licenses/mit-license.php * * Date: 2020-02-18 */ ( function ($) { /** * Dummy function to provide a placeholder for the destroy function */ $.fn.zTreeKeyboardNavigationDestroy = function() { } /** * Creates a function that adds keyboard navigation: * Home: home key (keycode 36) Goes to the first root element is visible * End: end key (keycode 35) Goes to the last leaf node and will expand nodes and scroll the element into view * Down: right cursor key (keycode 39) Goes to the next visible node in the tree following the hierarchy * Next: down cursor key (keycode 40) Goes to the next visible node at the same level * Up: up cursor key (keycode 37) Goes to the prior visible node at the same level * Previous: left cursor key (keycode 38) Goes to the prior visible node following the hierarchy * Toggle: space key (keycode 32) Toggles the expand/collapse state of a parent node * @param {IxTreeObj} zTree * @param {string|JQuery i + 65 ).includes( keyCode & 95 ) ) return false; var nodes = zTree.transformToArray(rootNodes); nodes = nodes.filter( node => { return 'accesskey' in node && node.accesskey.length && ( node.accesskey.charCodeAt(0) & 95 ) == keyCode; } ); if ( ! nodes.length ) return false; var selectedNodes = zTree.getSelectedNodes(); if ( ! selectedNodes.length ) return false; if ( selectedNodes[0] == nodes[0] ) return false; zTree.selectNode( nodes[0] ); return true; } // console.log('before'); // console.log(document.activeElement); switch ( e.keyCode ) { case 32: /* Toggle parent nodes */ processSpace(); return; case 36: /* Home - go to the root node */ processHome(); break; case 35: /* End - go to the last node */ processEnd(); break; case 33: /* PageUp */ // Do nothing break; case 34: /* PageDown */ // Do nothing break; case 37: /* Left */ processOut(); break; case 38: /* Up */ processUp(); break; case 39: /* Right */ processIn(); break; case 40: /* Down */ processDown(); break; default: if ( ! processLetter( e.keyCode & 95 ) ) return; break; } // console.log('after'); // console.log(document.activeElement); focusSelectedNode(); } ); if ( selectedNodes && selectedNodes.length ) { zTree.selectNode( selectedNodes[0] ); focusSelectedNode(); } else { $(element).trigger({ type : 'keydown', which : 36, keyCode: 36 }); } } } )(jQuery);