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:
* Improve keyboard shortcuts handling
* Larger task form
* Rewrite dialog and confirmation boxes (inline popup)
* Remove TaskGanttCreationController

File diff suppressed because one or more lines are too long

View File

@ -1,9 +1,11 @@
KB.keyboardShortcuts = function () {
function goToLink (selector) {
var element = KB.find(selector);
if (! KB.modal.isOpen()) {
var element = KB.find(selector);
if (element !== null) {
window.location = element.attr('href');
if (element !== null) {
window.location = element.attr('href');
}
}
}
@ -22,7 +24,9 @@ KB.keyboardShortcuts = 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 () {
@ -32,55 +36,75 @@ KB.keyboardShortcuts = function () {
}
});
KB.onKey('Meta+Enter', submitForm, true);
KB.onKey('Control+Enter', submitForm, true);
KB.onKey('Enter', submitForm, true, true);
KB.onKey('Enter', submitForm, true, false, true);
KB.onKey('b', function () {
KB.trigger('board.selector.open');
if (! KB.modal.isOpen()) {
KB.trigger('board.selector.open');
}
});
if (KB.exists('#board')) {
KB.onKey('c', function () {
_KB.get('BoardHorizontalScrolling').toggle();
if (! KB.modal.isOpen()) {
_KB.get('BoardHorizontalScrolling').toggle();
}
});
KB.onKey('s', function () {
_KB.get('BoardCollapsedMode').toggle();
if (! KB.modal.isOpen()) {
_KB.get('BoardCollapsedMode').toggle();
}
});
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')) {
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.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.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.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.focus('#form-search');
if (! KB.modal.isOpen()) {
KB.focus('#form-search');
}
});
KB.onKey('r', function () {
var reset = $(".filter-reset").data("filter");
var input = $("#form-search");
if (! KB.modal.isOpen()) {
var reset = $(".filter-reset").data("filter");
var input = $("#form-search");
input.val(reset);
$("form.search").submit();
input.val(reset);
$("form.search").submit();
}
});
KB.onKey('v+o', function () {

View File

@ -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;
}
}

View File

@ -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 () {