diff options
author | Frederic Guillot <fred@kanboard.net> | 2017-01-11 22:07:19 -0500 |
---|---|---|
committer | Frederic Guillot <fred@kanboard.net> | 2017-01-11 22:07:19 -0500 |
commit | d0dad82a278af213f56a279804d9f40348921b5e (patch) | |
tree | cca894c104831c27c2b43ff759e1917d05abc555 /assets/js/core | |
parent | d459bec035acaa8a03de6de1b33cb1048361d8d0 (diff) |
Improve keyboard shortcuts handling
Diffstat (limited to 'assets/js/core')
-rw-r--r-- | assets/js/core/base.js | 47 | ||||
-rw-r--r-- | assets/js/core/modal.js | 2 |
2 files changed, 26 insertions, 23 deletions
diff --git a/assets/js/core/base.js b/assets/js/core/base.js index 033be0a7..0ab06d78 100644 --- a/assets/js/core/base.js +++ b/assets/js/core/base.js @@ -6,7 +6,7 @@ var KB = { listeners: { clicks: {}, changes: {}, - keys: {}, + keys: [], internals: {} } }; @@ -35,11 +35,14 @@ KB.onChange = function (selector, callback) { this.listeners.changes[selector] = callback; }; -KB.onKey = function (key, callback, ignoreInputField) { - this.listeners.keys[key] = { +KB.onKey = function (combination, callback, ignoreInputField, ctrlKey, metaKey) { + this.listeners.keys.push({ + 'combination': combination, 'callback': callback, - 'ignoreInputField': ignoreInputField || false - }; + 'ignoreInputField': ignoreInputField || false, + 'ctrlKey': ctrlKey || false, + 'metaKey': metaKey || false + }); }; KB.listen = function () { @@ -67,32 +70,32 @@ KB.listen = function () { var key = KB.utils.getKey(e); var isInputField = KB.utils.isInputField(e); - if (! isInputField || ['Escape', 'Meta', 'Enter', 'Control'].indexOf(key) !== -1) { + if (! isInputField || ['Escape', 'Enter'].indexOf(key) !== -1) { keysQueue.push(key); } 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('+'); + for (var i = 0; i < self.listeners.keys.length; i++) { + var params = self.listeners.keys[i]; + var combination = params.combination; + var sequence = combination.split('+'); - if (KB.utils.arraysIdentical(keysQueue, sequence)) { - if (isInputField && !keyboardListener.ignoreInputField) { - keysQueue = []; - return; - } - - e.preventDefault(); - e.stopPropagation(); + if (KB.utils.arraysIdentical(keysQueue, sequence) && + e.ctrlKey === params.ctrlKey && e.metaKey === params.metaKey) { + if (isInputField && !params.ignoreInputField) { keysQueue = []; - keyboardListener.callback(e); - break; - } else if (KB.utils.arraysStartsWith(keysQueue, sequence)) { - reset = false; + return; } + + e.preventDefault(); + e.stopPropagation(); + keysQueue = []; + params.callback(e); + break; + } else if (KB.utils.arraysStartsWith(keysQueue, sequence) && keysQueue.length < sequence.length) { + reset = false; } } diff --git a/assets/js/core/modal.js b/assets/js/core/modal.js index ed9fb574..6c43f051 100644 --- a/assets/js/core/modal.js +++ b/assets/js/core/modal.js @@ -113,6 +113,7 @@ } function destroy() { + isOpen = false; var overlayElement = KB.find('#modal-overlay'); if (overlayElement) { @@ -156,7 +157,6 @@ }); }, close: function () { - isOpen = false; destroy(); }, isOpen: function () { |