Improve keyboard shortcuts handling

This commit is contained in:
Frederic Guillot
2017-01-11 22:07:19 -05:00
parent d459bec035
commit d0dad82a27
5 changed files with 73 additions and 45 deletions

View File

@@ -3,6 +3,7 @@ Version 1.0.37 (unreleased)
Improvements: Improvements:
* Improve keyboard shortcuts handling
* Larger task form * Larger task form
* Rewrite dialog and confirmation boxes (inline popup) * Rewrite dialog and confirmation boxes (inline popup)
* Remove TaskGanttCreationController * Remove TaskGanttCreationController

File diff suppressed because one or more lines are too long

View File

@@ -1,9 +1,11 @@
KB.keyboardShortcuts = function () { KB.keyboardShortcuts = function () {
function goToLink (selector) { function goToLink (selector) {
var element = KB.find(selector); if (! KB.modal.isOpen()) {
var element = KB.find(selector);
if (element !== null) { if (element !== null) {
window.location = element.attr('href'); window.location = element.attr('href');
}
} }
} }
@@ -22,7 +24,9 @@ KB.keyboardShortcuts = function () {
} }
KB.onKey('?', function () { KB.onKey('?', function () {
KB.modal.open(KB.find('body').data('keyboardShortcutUrl')); if (! KB.modal.isOpen()) {
KB.modal.open(KB.find('body').data('keyboardShortcutUrl'));
}
}); });
KB.onKey('Escape', function () { KB.onKey('Escape', function () {
@@ -32,55 +36,75 @@ KB.keyboardShortcuts = function () {
} }
}); });
KB.onKey('Meta+Enter', submitForm, true); KB.onKey('Enter', submitForm, true, true);
KB.onKey('Control+Enter', submitForm, true); KB.onKey('Enter', submitForm, true, false, true);
KB.onKey('b', function () { KB.onKey('b', function () {
KB.trigger('board.selector.open'); if (! KB.modal.isOpen()) {
KB.trigger('board.selector.open');
}
}); });
if (KB.exists('#board')) { if (KB.exists('#board')) {
KB.onKey('c', function () { KB.onKey('c', function () {
_KB.get('BoardHorizontalScrolling').toggle(); if (! KB.modal.isOpen()) {
_KB.get('BoardHorizontalScrolling').toggle();
}
}); });
KB.onKey('s', function () { KB.onKey('s', function () {
_KB.get('BoardCollapsedMode').toggle(); if (! KB.modal.isOpen()) {
_KB.get('BoardCollapsedMode').toggle();
}
}); });
KB.onKey('n', function () { KB.onKey('n', function () {
KB.modal.open(KB.find('#board').data('taskCreationUrl'), 'large', false); if (! KB.modal.isOpen()) {
KB.modal.open(KB.find('#board').data('taskCreationUrl'), 'large', false);
}
}); });
} }
if (KB.exists('#task-view')) { if (KB.exists('#task-view')) {
KB.onKey('e', function () { KB.onKey('e', function () {
KB.modal.open(KB.find('#task-view').data('editUrl'), 'large'); if (! KB.modal.isOpen()) {
KB.modal.open(KB.find('#task-view').data('editUrl'), 'large', false);
}
}); });
KB.onKey('c', function () { KB.onKey('c', function () {
KB.modal.open(KB.find('#task-view').data('commentUrl')); if (! KB.modal.isOpen()) {
KB.modal.open(KB.find('#task-view').data('commentUrl'), 'medium', false);
}
}); });
KB.onKey('s', function () { KB.onKey('s', function () {
KB.modal.open(KB.find('#task-view').data('subtaskUrl')); if (! KB.modal.isOpen()) {
KB.modal.open(KB.find('#task-view').data('subtaskUrl'), 'medium', false);
}
}); });
KB.onKey('l', function () { KB.onKey('l', function () {
KB.modal.open(KB.find('#task-view').data('internalLinkUrl')); if (! KB.modal.isOpen()) {
KB.modal.open(KB.find('#task-view').data('internalLinkUrl'), 'medium', false);
}
}); });
} }
KB.onKey('f', function () { KB.onKey('f', function () {
KB.focus('#form-search'); if (! KB.modal.isOpen()) {
KB.focus('#form-search');
}
}); });
KB.onKey('r', function () { KB.onKey('r', function () {
var reset = $(".filter-reset").data("filter"); if (! KB.modal.isOpen()) {
var input = $("#form-search"); var reset = $(".filter-reset").data("filter");
var input = $("#form-search");
input.val(reset); input.val(reset);
$("form.search").submit(); $("form.search").submit();
}
}); });
KB.onKey('v+o', function () { KB.onKey('v+o', function () {

View File

@@ -6,7 +6,7 @@ var KB = {
listeners: { listeners: {
clicks: {}, clicks: {},
changes: {}, changes: {},
keys: {}, keys: [],
internals: {} internals: {}
} }
}; };
@@ -35,11 +35,14 @@ KB.onChange = function (selector, callback) {
this.listeners.changes[selector] = callback; this.listeners.changes[selector] = callback;
}; };
KB.onKey = function (key, callback, ignoreInputField) { KB.onKey = function (combination, callback, ignoreInputField, ctrlKey, metaKey) {
this.listeners.keys[key] = { this.listeners.keys.push({
'combination': combination,
'callback': callback, 'callback': callback,
'ignoreInputField': ignoreInputField || false 'ignoreInputField': ignoreInputField || false,
}; 'ctrlKey': ctrlKey || false,
'metaKey': metaKey || false
});
}; };
KB.listen = function () { KB.listen = function () {
@@ -67,32 +70,32 @@ KB.listen = function () {
var key = KB.utils.getKey(e); var key = KB.utils.getKey(e);
var isInputField = KB.utils.isInputField(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); keysQueue.push(key);
} }
if (keysQueue.length > 0) { if (keysQueue.length > 0) {
var reset = true; var reset = true;
for (var combination in self.listeners.keys) { for (var i = 0; i < self.listeners.keys.length; i++) {
if (self.listeners.keys.hasOwnProperty(combination)) { var params = self.listeners.keys[i];
var keyboardListener = self.listeners.keys[combination]; var combination = params.combination;
var sequence = combination.split('+'); var sequence = combination.split('+');
if (KB.utils.arraysIdentical(keysQueue, sequence)) { if (KB.utils.arraysIdentical(keysQueue, sequence) &&
if (isInputField && !keyboardListener.ignoreInputField) { e.ctrlKey === params.ctrlKey && e.metaKey === params.metaKey) {
keysQueue = []; if (isInputField && !params.ignoreInputField) {
return;
}
e.preventDefault();
e.stopPropagation();
keysQueue = []; keysQueue = [];
keyboardListener.callback(e); return;
break;
} else if (KB.utils.arraysStartsWith(keysQueue, sequence)) {
reset = false;
} }
e.preventDefault();
e.stopPropagation();
keysQueue = [];
params.callback(e);
break;
} else if (KB.utils.arraysStartsWith(keysQueue, sequence) && keysQueue.length < sequence.length) {
reset = false;
} }
} }

View File

@@ -113,6 +113,7 @@
} }
function destroy() { function destroy() {
isOpen = false;
var overlayElement = KB.find('#modal-overlay'); var overlayElement = KB.find('#modal-overlay');
if (overlayElement) { if (overlayElement) {
@@ -156,7 +157,6 @@
}); });
}, },
close: function () { close: function () {
isOpen = false;
destroy(); destroy();
}, },
isOpen: function () { isOpen: function () {