Skip to content
This repository has been archived by the owner on Aug 15, 2019. It is now read-only.

Commit

Permalink
Merge pull request #14 from dannyrb/fix/jquery-hotkeys
Browse files Browse the repository at this point in the history
Fix/jquery hotkeys
  • Loading branch information
dannyrb authored Apr 26, 2019
2 parents 2878ae8 + 4bb59d2 commit 8075517
Show file tree
Hide file tree
Showing 4 changed files with 239 additions and 12 deletions.
1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
"dicomweb-client": "^0.4.2",
"isomorphic-base64": "^1.0.2",
"jquery": "^3.3.1",
"jquery.hotkeys": "^0.1.0",
"lodash.clonedeep": "^4.5.0",
"lodash.merge": "^4.6.1",
"validate.js": "^0.12.0"
Expand Down
16 changes: 10 additions & 6 deletions src/hotkeys.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import { HotkeysManager } from './classes/HotkeysManager';
import jquery from 'jquery';
window.$ = window.jQuery = jquery;
require('jquery.hotkeys');
import { HotkeysManager } from './classes/HotkeysManager'
import jquery from 'jquery'
import jqueryHotkeys from './utils/jquery.hotkeys.js'

// We really, really should not be doing this
// Find all global usage of this and replace it with an appropriate equivellant
window.$ = window.jQuery = jquery
jqueryHotkeys(window.jQuery) // Add `.hotkeys` to global jquery instance

// Create hotkeys namespace using a HotkeysManager class instance
const hotkeys = new HotkeysManager();
const hotkeys = new HotkeysManager()

// Export relevant objects
export default hotkeys;
export default hotkeys
229 changes: 229 additions & 0 deletions src/utils/jquery.hotkeys.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,229 @@
/*jslint browser: true*/
/*jslint jquery: true*/

/*
* jQuery Hotkeys Plugin
* Copyright 2010, John Resig
* Dual licensed under the MIT or GPL Version 2 licenses.
*
* Based upon the plugin by Tzury Bar Yochay:
* https://github.com/tzuryby/jquery.hotkeys
*
* Original idea by:
* Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
*/

/*
* One small change is: now keys are passed by object { keys: '...' }
* Might be useful, when you want to pass some other data to your handler
*/

export default function(jQuery) {
jQuery.hotkeys = {
version: '0.2.0',

specialKeys: {
8: 'backspace',
9: 'tab',
10: 'return',
13: 'return',
16: 'shift',
17: 'ctrl',
18: 'alt',
19: 'pause',
20: 'capslock',
27: 'esc',
32: 'space',
33: 'pageup',
34: 'pagedown',
35: 'end',
36: 'home',
37: 'left',
38: 'up',
39: 'right',
40: 'down',
45: 'insert',
46: 'del',
59: ';',
61: '=',
96: '0',
97: '1',
98: '2',
99: '3',
100: '4',
101: '5',
102: '6',
103: '7',
104: '8',
105: '9',
106: '*',
107: '+',
109: '-',
110: '.',
111: '/',
112: 'f1',
113: 'f2',
114: 'f3',
115: 'f4',
116: 'f5',
117: 'f6',
118: 'f7',
119: 'f8',
120: 'f9',
121: 'f10',
122: 'f11',
123: 'f12',
144: 'numlock',
145: 'scroll',
173: '-',
186: ';',
187: '=',
188: ',',
189: '-',
190: '.',
191: '/',
192: '`',
219: '[',
220: '\\',
221: ']',
222: "'",
},

shiftNums: {
'`': '~',
'1': '!',
'2': '@',
'3': '#',
'4': '$',
'5': '%',
'6': '^',
'7': '&',
'8': '*',
'9': '(',
'0': ')',
'-': '_',
'=': '+',
';': ': ',
"'": '"',
',': '<',
'.': '>',
'/': '?',
'\\': '|',
},

// excludes: button, checkbox, file, hidden, image, password, radio, reset, search, submit, url
textAcceptingInputTypes: [
'text',
'password',
'number',
'email',
'url',
'range',
'date',
'month',
'week',
'time',
'datetime',
'datetime-local',
'search',
'color',
'tel',
],

// default input types not to bind to unless bound directly
textInputTypes: /textarea|input|select/i,

options: {
filterInputAcceptingElements: true,
filterTextInputs: true,
filterContentEditable: true,
},
}

function keyHandler(handleObj) {
if (typeof handleObj.data === 'string') {
handleObj.data = {
keys: handleObj.data,
}
}

// Only care when a possible input has been specified
if (
!handleObj.data ||
!handleObj.data.keys ||
typeof handleObj.data.keys !== 'string'
) {
return
}

var origHandler = handleObj.handler,
keys = handleObj.data.keys.toLowerCase().split(' ')

handleObj.handler = function(event) {
// Don't fire in text-accepting inputs that we didn't directly bind to
if (
this !== event.target &&
((jQuery.hotkeys.options.filterInputAcceptingElements &&
jQuery.hotkeys.textInputTypes.test(event.target.nodeName)) ||
(jQuery.hotkeys.options.filterContentEditable &&
jQuery(event.target).attr('contenteditable')) ||
(jQuery.hotkeys.options.filterTextInputs &&
jQuery.inArray(
event.target.type,
jQuery.hotkeys.textAcceptingInputTypes
) > -1))
) {
return
}

var special =
event.type !== 'keypress' && jQuery.hotkeys.specialKeys[event.which],
character = String.fromCharCode(event.which).toLowerCase(),
modif = '',
possible = {}

jQuery.each(['alt', 'ctrl', 'shift'], function(index, specialKey) {
if (event[specialKey + 'Key'] && special !== specialKey) {
modif += specialKey + '+'
}
})

// metaKey is triggered off ctrlKey erronously
if (event.metaKey && !event.ctrlKey && special !== 'meta') {
modif += 'meta+'
}

if (
event.metaKey &&
special !== 'meta' &&
modif.indexOf('alt+ctrl+shift+') > -1
) {
modif = modif.replace('alt+ctrl+shift+', 'hyper+')
}

if (special) {
possible[modif + special] = true
} else {
possible[modif + character] = true
possible[modif + jQuery.hotkeys.shiftNums[character]] = true

// "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
if (modif === 'shift+') {
possible[jQuery.hotkeys.shiftNums[character]] = true
}
}

for (var i = 0, l = keys.length; i < l; i++) {
if (possible[keys[i]]) {
return origHandler.apply(this, arguments)
}
}
}
}

jQuery.each(['keydown', 'keyup', 'keypress'], function() {
jQuery.event.special[this] = {
add: keyHandler,
}
})
}
5 changes: 0 additions & 5 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -5499,11 +5499,6 @@ jest@^24.7.1:
import-local "^2.0.0"
jest-cli "^24.7.1"

jquery.hotkeys@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/jquery.hotkeys/-/jquery.hotkeys-0.1.0.tgz#a88f636494fe75de41e4b753a059e5a523b83273"
integrity sha1-qI9jZJT+dd5B5LdToFnlpSO4MnM=

jquery@^3.3.1:
version "3.3.1"
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca"
Expand Down

0 comments on commit 8075517

Please sign in to comment.