Improve keyboard shortcuts handling
This commit is contained in:
@@ -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
|
||||||
|
|||||||
6
assets/js/app.min.js
vendored
6
assets/js/app.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -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 () {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 () {
|
||||||
|
|||||||
Reference in New Issue
Block a user