(js) Initial support for keyboard shortcuts

This commit is contained in:
Francis Lachapelle committed 2016-09-23 17:17:25 -04:00
1 parent 93de7b9ab3
commit a2e3807a3a
5 files changed
+545 -27

No files matched your search

@@ -6,10 +6,11 @@
/**
* @ngInject
*/
MailboxController.$inject = ['$window', '$scope', '$timeout', '$q', '$state', '$mdDialog', '$mdToast', 'stateAccounts', 'stateAccount', 'stateMailbox', 'encodeUriFilter', 'sgFocus', 'Dialog', 'Account', 'Mailbox'];
function MailboxController($window, $scope, $timeout, $q, $state, $mdDialog, $mdToast, stateAccounts, stateAccount, stateMailbox, encodeUriFilter, focus, Dialog, Account, Mailbox) {
MailboxController.$inject = ['$window', '$scope', '$timeout', '$q', '$state', '$mdDialog', '$mdToast', 'stateAccounts', 'stateAccount', 'stateMailbox', 'sgHotkeys', 'encodeUriFilter', 'sgFocus', 'Dialog', 'Account', 'Mailbox'];
function MailboxController($window, $scope, $timeout, $q, $state, $mdDialog, $mdToast, stateAccounts, stateAccount, stateMailbox, sgHotkeys, encodeUriFilter, focus, Dialog, Account, Mailbox) {
var vm = this, messageDialog = null,
defaultWindowTitle = angular.element($window.document).find('title').attr('sg-default') || "SOGo";
defaultWindowTitle = angular.element($window.document).find('title').attr('sg-default') || "SOGo",
hotkeys = [];
// Expose controller for eventual popup windows
$window.$mailboxController = vm;
@@ -41,6 +42,10 @@
angular.element($window).on('beforeunload', _compactBeforeUnload);
$scope.$on('$destroy', function() {
angular.element($window).off('beforeunload', _compactBeforeUnload);
// Deregister hotkeys
_.forEach(hotkeys, function(key) {
sgHotkeys.deregisterHotkey(key);
});
});
// Update window's title with unseen messages count of selected mailbox
@@ -52,6 +57,49 @@
$window.document.title = title;
});
_registerHotkeys(hotkeys);
function _registerHotkeys(keys) {
keys.push(sgHotkeys.createHotkey({
key: 'c',
callback: newMessage
}));
keys.push(sgHotkeys.createHotkey({
key: 'space',
callback: toggleMessageSelection
}));
keys.push(sgHotkeys.createHotkey({
key: 'up',
callback: _nextMessage,
preventInClass: ['sg-mail-part']
}));
keys.push(sgHotkeys.createHotkey({
key: 'down',
callback: _previousMessage,
preventInClass: ['sg-mail-part']
}));
keys.push(sgHotkeys.createHotkey({
key: 'shift+up',
callback: _addNextMessageToSelection,
preventInClass: ['sg-mail-part']
}));
keys.push(sgHotkeys.createHotkey({
key: 'shift+down',
callback: _addPreviousMessageToSelection,
preventInClass: ['sg-mail-part']
}));
keys.push(sgHotkeys.createHotkey({
key: 'backspace',
callback: confirmDeleteSelectedMessages
}));
// Register the hotkeys
_.forEach(hotkeys, function(key) {
sgHotkeys.registerHotkey(key);
});
}
function _compactBeforeUnload(event) {
return vm.selectedFolder.$compact();
}
@@ -106,6 +154,68 @@
}
}
/**
* User has pressed up arrow key
*/
function _nextMessage($event) {
var index = vm.selectedFolder.$selectedMessageIndex();
if (angular.isDefined(index))
index--;
else
// No message is selected, show oldest message
index = vm.selectedFolder.getLength() - 1;
if (index > -1)
selectMessage(vm.selectedFolder.$messages[index]);
$event.preventDefault();
return index;
}
/**
* User has pressed the down arrow key
*/
function _previousMessage($event) {
var index = vm.selectedFolder.$selectedMessageIndex();
if (angular.isDefined(index))
index++;
else
// No message is selected, show newest
index = 0;
if (index < vm.selectedFolder.getLength())
selectMessage(vm.selectedFolder.$messages[index]);
else
index = -1;
$event.preventDefault();
return index;
}
function _addNextMessageToSelection($event) {
var index;
if (vm.selectedFolder.hasSelectedMessage()) {
index = _nextMessage($event);
if (index >= 0)
toggleMessageSelection($event, vm.selectedFolder.$messages[index]);
}
}
function _addPreviousMessageToSelection($event) {
var index;
if (vm.selectedFolder.hasSelectedMessage()) {
index = _previousMessage($event);
if (index >= 0)
toggleMessageSelection($event, vm.selectedFolder.$messages[index]);
}
}
function selectMessage(message) {
if (Mailbox.$virtualMode)
$state.go('mail.account.virtualMailbox.message', {mailboxId: encodeUriFilter(message.$mailbox.path), messageId: message.uid});
@@ -114,6 +224,7 @@
}
function toggleMessageSelection($event, message) {
if (!message) message = vm.selectedFolder.$selectedMessage();
message.selected = !message.selected;
vm.mode.multiple += message.selected? 1 : -1;
$event.preventDefault();
@@ -170,27 +281,30 @@
}
}
function confirmDeleteSelectedMessages() {
Dialog.confirm(l('Warning'),
l('Are you sure you want to delete the selected messages?'),
{ ok: l('Delete') })
function confirmDeleteSelectedMessages($event) {
var selectedMessages = vm.selectedFolder.$selectedMessages();
if (_.size(selectedMessages) > 0)
Dialog.confirm(l('Warning'),
l('Are you sure you want to delete the selected messages?'),
{ ok: l('Delete') })
.then(function() {
var deleteSelectedMessage = vm.selectedFolder.hasSelectedMessage();
var selectedMessages = vm.selectedFolder.$selectedMessages();
if (_.size(selectedMessages) > 0)
vm.selectedFolder.$deleteMessages(selectedMessages).then(function(index) {
if (Mailbox.$virtualMode) {
// When performing an advanced search, we refresh the view if the selected message
// was deleted, but only once all promises have completed.
if (deleteSelectedMessage)
$state.go('mail.account.virtualMailbox');
}
else {
// In normal mode, we immediately unselect the selected message.
_unselectMessage(deleteSelectedMessage, index);
}
});
vm.selectedFolder.$deleteMessages(selectedMessages).then(function(index) {
if (Mailbox.$virtualMode) {
// When performing an advanced search, we refresh the view if the selected message
// was deleted, but only once all promises have completed.
if (deleteSelectedMessage)
$state.go('mail.account.virtualMailbox');
}
else {
// In normal mode, we immediately unselect the selected message.
_unselectMessage(deleteSelectedMessage, index);
}
});
});
$event.preventDefault();
}
function markOrUnMarkMessagesAsJunk() {
@@ -1,4 +1,4 @@
/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* -*- Mode: js; indent-tabs-mode: nil; js-indent-level: 2; -*- */
(function() {
'use strict';
@@ -366,7 +366,7 @@
}
function refreshUnseenCount() {
var unseenCountFolders = window.unseenCountFolders;
var unseenCountFolders = $window.unseenCountFolders;
_.forEach(vm.accounts, function(account) {
@@ -357,7 +357,9 @@
}
}
};
_visit(this.parts);
if (this.parts)
_visit(this.parts);
return parts;
};
@@ -6,9 +6,9 @@
/**
* @ngInject
*/
MessageController.$inject = ['$window', '$scope', '$state', '$mdMedia', '$mdDialog', 'sgConstant', 'stateAccounts', 'stateAccount', 'stateMailbox', 'stateMessage', 'encodeUriFilter', 'sgSettings', 'sgFocus', 'Dialog', 'Calendar', 'Component', 'Account', 'Mailbox', 'Message'];
function MessageController($window, $scope, $state, $mdMedia, $mdDialog, sgConstant, stateAccounts, stateAccount, stateMailbox, stateMessage, encodeUriFilter, sgSettings, focus, Dialog, Calendar, Component, Account, Mailbox, Message) {
var vm = this, messageDialog = null, popupWindow = null;
MessageController.$inject = ['$window', '$scope', '$state', '$mdMedia', '$mdDialog', 'sgConstant', 'stateAccounts', 'stateAccount', 'stateMailbox', 'stateMessage', 'sgHotkeys', 'encodeUriFilter', 'sgSettings', 'sgFocus', 'Dialog', 'Calendar', 'Component', 'Account', 'Mailbox', 'Message'];
function MessageController($window, $scope, $state, $mdMedia, $mdDialog, sgConstant, stateAccounts, stateAccount, stateMailbox, stateMessage, sgHotkeys, encodeUriFilter, sgSettings, focus, Dialog, Calendar, Component, Account, Mailbox, Message) {
var vm = this, messageDialog = null, popupWindow = null, hotkeys = [];
// Expose controller
$window.$messageController = vm;
@@ -93,6 +93,32 @@
});
}
$scope.$on('$destroy', function() {
// Deregister hotkeys
_.forEach(hotkeys, function(key) {
sgHotkeys.deregisterHotkey(key);
});
});
_registerHotkeys(hotkeys);
function _registerHotkeys(keys) {
keys.push(sgHotkeys.createHotkey({
key: 'backspace',
callback: function($event) {
if (vm.mailbox.$selectedCount() === 0)
deleteMessage();
$event.preventDefault();
}
}));
// Register the hotkeys
_.forEach(hotkeys, function(key) {
sgHotkeys.registerHotkey(key);
});
}
/**
* If this is a popup window, retrieve the matching controllers (mailbox and message) of the parent window.
*/