keyboard.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. (function() {
  2. var keyHandler = {
  3. 38: moveUp, // Up
  4. 40: moveDown, // Down
  5. 37: closeDropdown, // Left
  6. 39: openDropdown, // Right
  7. 72: closeDropdown, // h
  8. 74: moveDown, // j
  9. 75: moveUp, // k
  10. 76: openDropdown, // l
  11. 191: showKeyboardHelp, // /
  12. 63: showKeyboardHelp, // ?
  13. 48: 'js-direct', // 0
  14. 83: 'js-system', // s
  15. 69: 'js-external', // e
  16. 65: 'js-addrule', // a
  17. 187: 'js-addrule', // +, =
  18. 84: 'js-temprule', // t
  19. 79: 'js-option', // o
  20. 82: 'js-reqinfo', // r
  21. };
  22. for (i = 1; i <= 9; i++) {
  23. keyHandler[48 + i] = 'js-profile-' + i;
  24. }
  25. var walker;
  26. return init();
  27. function init() {
  28. walker = document.createTreeWalker(
  29. document.querySelector('.om-nav'),
  30. NodeFilter.SHOW_ELEMENT,
  31. {acceptNode: tabbableElementsOnly}
  32. );
  33. window.addEventListener('keydown', function(e) {
  34. var handler = keyHandler[e.keyCode];
  35. if (!handler) console.log(e.keyCode);
  36. if (handler == null) return;
  37. if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return;
  38. if (typeof handler === 'string') {
  39. clickById(handler);
  40. } else {
  41. handler();
  42. }
  43. });
  44. $script.ready('om-profile-items', function() {
  45. var activeNavLink = document.querySelector('.om-nav-item.om-active > a');
  46. if (activeNavLink) activeNavLink.focus();
  47. });
  48. }
  49. function tabbableElementsOnly(node) {
  50. if (node.classList.contains('om-hidden')) {
  51. return NodeFilter.FILTER_REJECT;
  52. } else if (node.classList.contains('om-dropdown') &&
  53. !node.parentElement.classList.contains('om-open')) {
  54. return NodeFilter.FILTER_REJECT;
  55. } else if (node.tabIndex >= 0) {
  56. return NodeFilter.FILTER_ACCEPT;
  57. } else {
  58. return NodeFilter.FILTER_SKIP;
  59. }
  60. }
  61. function moveUp() {
  62. walker.currentNode = document.activeElement;
  63. var result = null;
  64. if (walker.currentNode) {
  65. result = walker.previousNode();
  66. }
  67. if (!result) {
  68. walker.currentNode = walker.root.lastElementChild;
  69. walker.previousNode();
  70. walker.nextNode();
  71. }
  72. walker.currentNode.focus();
  73. }
  74. function moveDown() {
  75. walker.currentNode = document.activeElement;
  76. var result = null;
  77. if (walker.currentNode) {
  78. result = walker.nextNode();
  79. }
  80. if (!result) {
  81. walker.currentNode = walker.root;
  82. walker.nextNode();
  83. }
  84. walker.currentNode.focus();
  85. }
  86. function openDropdown() {
  87. var container = document.querySelector('.om-open');
  88. if (container) {
  89. // Existing dropdown. Just move to it.
  90. container.querySelector('a').focus();
  91. return;
  92. }
  93. var selectedItem = document.activeElement;
  94. if (!selectedItem || !selectedItem.parentElement) return;
  95. if (selectedItem.parentElement.classList.contains('om-has-dropdown')) {
  96. var toggle = selectedItem.querySelector('.om-edit-toggle');
  97. if (toggle) {
  98. toggle.click();
  99. } else {
  100. selectedItem.click();
  101. }
  102. }
  103. }
  104. function closeDropdown() {
  105. var container = document.querySelector('.om-open');
  106. if (container) {
  107. container.classList.remove('om-open');
  108. container.querySelector('a').focus();
  109. }
  110. }
  111. function showKeyboardHelp() {
  112. $script('js/keyboard_help.js');
  113. }
  114. function clickById(id) {
  115. var element = document.getElementById(id);
  116. if (element) element.click();
  117. }
  118. })();