diff options
author | Frederic Guillot <fred@kanboard.net> | 2016-12-30 20:14:36 -0500 |
---|---|---|
committer | Frederic Guillot <fred@kanboard.net> | 2016-12-30 20:14:36 -0500 |
commit | ff79ec72c16f4a9ad1b36601172a32e48c8b21d1 (patch) | |
tree | 3225f91a9cbcd9b3a74e184c929fe62aaa66863f /assets/js/core/base.js | |
parent | e1344e3e449430ac13ef79b03bfcaa2c0c82d150 (diff) |
Remove dependency on Mousetrap
Diffstat (limited to 'assets/js/core/base.js')
-rw-r--r-- | assets/js/core/base.js | 54 |
1 files changed, 39 insertions, 15 deletions
diff --git a/assets/js/core/base.js b/assets/js/core/base.js index d304d8bd..a4fd00ac 100644 --- a/assets/js/core/base.js +++ b/assets/js/core/base.js @@ -37,12 +37,16 @@ KB.onChange = function (selector, callback) { this.listeners.changes[selector] = callback; }; -KB.onKey = function (key, callback) { - this.listeners.keys[key] = callback; +KB.onKey = function (key, callback, ignoreInputField) { + this.listeners.keys[key] = { + 'callback': callback, + 'ignoreInputField': ignoreInputField || false + }; }; KB.listen = function () { var self = this; + var keysQueue = []; function onClick(e) { for (var selector in self.listeners.clicks) { @@ -61,28 +65,48 @@ KB.listen = function () { } } - function onKeypress(e) { - var key = (typeof e.which === 'number') ? e.which : e.keyCode; - var element = e.target; + function onKeyPressed(e) { + var key = KB.utils.getKey(e); + var isInputField = KB.utils.isInputField(e); - if (element.tagName === 'INPUT' || - element.tagName === 'SELECT' || - element.tagName === 'TEXTAREA' || - element.isContentEditable) { - return; + if (! isInputField || ['Escape', 'Meta', 'Enter', 'Control'].indexOf(key) !== -1) { + keysQueue.push(key); } - for (var keyMap in self.listeners.keys) { - if (self.listeners.keys.hasOwnProperty(keyMap) && key === parseInt(keyMap)) { - e.preventDefault(); - self.listeners.keys[key](e); + if (keysQueue.length > 0) { + var reset = true; + + for (var combination in self.listeners.keys) { + if (self.listeners.keys.hasOwnProperty(combination)) { + var keyboardListener = self.listeners.keys[combination]; + var sequence = combination.split('+'); + + if (KB.utils.arraysIdentical(keysQueue, sequence)) { + if (isInputField && !keyboardListener.ignoreInputField) { + keysQueue = []; + return; + } + + e.preventDefault(); + e.stopPropagation(); + keysQueue = []; + keyboardListener.callback(e); + break; + } else if (KB.utils.arraysStartsWith(keysQueue, sequence)) { + reset = false; + } + } + } + + if (reset) { + keysQueue = []; } } } document.addEventListener('click', onClick, false); document.addEventListener('change', onChange, false); - document.addEventListener('keypress', onKeypress, false); + window.addEventListener('keydown', onKeyPressed, false); }; KB.component = function (name, object) { |