(js) Fix some operations in advanced mail search

Fixes #4478
This commit is contained in:
Francis Lachapelle
2018-06-14 22:34:38 -04:00
parent 70d0408230
commit a69a5b77be
6 changed files with 104 additions and 29 deletions
@@ -240,7 +240,7 @@
}
if (index > -1)
vm.selectMessage(vm.selectedFolder.$messages[index]);
vm.selectMessage(vm.selectedFolder.getItemAtIndex(index));
$event.preventDefault();
@@ -263,7 +263,7 @@
index = 0;
if (index < vm.selectedFolder.getLength())
vm.selectMessage(vm.selectedFolder.$messages[index]);
vm.selectMessage(vm.selectedFolder.getItemAtIndex(index));
else
index = -1;
@@ -6,8 +6,8 @@
/**
* @ngInject
*/
MailboxesController.$inject = ['$scope', '$state', '$transitions', '$timeout', '$window', '$mdDialog', '$mdToast', 'sgFocus', 'encodeUriFilter', 'Dialog', 'sgSettings', 'sgHotkeys', 'Account', 'Mailbox', 'VirtualMailbox', 'User', 'Preferences', 'stateAccounts'];
function MailboxesController($scope, $state, $transitions, $timeout, $window, $mdDialog, $mdToast, focus, encodeUriFilter, Dialog, Settings, sgHotkeys, Account, Mailbox, VirtualMailbox, User, Preferences, stateAccounts) {
MailboxesController.$inject = ['$scope', '$state', '$transitions', '$timeout', '$window', '$mdMedia', '$mdSidenav', '$mdDialog', '$mdToast', 'sgConstant', 'sgFocus', 'encodeUriFilter', 'Dialog', 'sgSettings', 'sgHotkeys', 'Account', 'Mailbox', 'VirtualMailbox', 'User', 'Preferences', 'stateAccounts'];
function MailboxesController($scope, $state, $transitions, $timeout, $window, $mdMedia, $mdSidenav, $mdDialog, $mdToast, sgConstant, focus, encodeUriFilter, Dialog, Settings, sgHotkeys, Account, Mailbox, VirtualMailbox, User, Preferences, stateAccounts) {
var vm = this,
account,
mailbox,
@@ -84,7 +84,8 @@
var root, mailboxes = [],
_visit = function(folders) {
_.forEach(folders, function(o) {
mailboxes.push(o);
if (!o.isNoSelect())
mailboxes.push(o);
if (o.children && o.children.length > 0) {
_visit(o.children);
}
@@ -102,14 +103,16 @@
Mailbox.selectedFolder = vm.virtualMailbox;
Mailbox.$virtualMode = true;
if (angular.isDefined(Mailbox.$virtualPath)) {
if (Mailbox.$virtualPath.length) {
root = vm.accounts[0].$getMailboxByPath(Mailbox.$virtualPath);
mailboxes.push(root);
if (vm.search.subfolders && root.children.length)
_visit(root.children);
}
else {
mailboxes = vm.accounts[0].$flattenMailboxes();
mailboxes = _.filter(vm.accounts[0].$flattenMailboxes({ all: true }), function(mailbox) {
return !mailbox.isNoSelect();
});
}
vm.virtualMailbox.setMailboxes(mailboxes);
@@ -187,6 +190,13 @@
}
};
this.showAdvancedSearch = function() {
Mailbox.$virtualPath = '';
// Close sidenav on small devices
if (!$mdMedia(sgConstant['gt-md']))
$mdSidenav('left').close();
};
this.newFolder = function(parentFolder) {
Dialog.prompt(l('New Folder...'),
l('Enter the new name of your folder'))
@@ -215,6 +215,9 @@
message = stateMessage;
state = $state;
}
if (Mailbox.$virtualMode) {
mailbox = Mailbox.selectedFolder; // the VirtualMailbox instance
}
mailbox.$deleteMessages([message]).then(function(index) {
var nextIndex = index;
@@ -224,10 +227,10 @@
// Select either the next or previous message
if (index > 0) {
nextIndex -= 1;
nextMessage = mailbox.$messages[nextIndex];
nextMessage = mailbox.getItemAtIndex(nextIndex);
}
if (index < mailbox.$messages.length)
previousMessage = mailbox.$messages[index];
if (index < mailbox.getLength())
previousMessage = mailbox.getItemAtIndex(index);
if (nextMessage) {
if (nextMessage.isread && previousMessage && !previousMessage.isread) {
@@ -242,7 +245,10 @@
try {
if (nextMessage && $mdMedia(sgConstant['gt-md'])) {
state.go('mail.account.mailbox.message', { messageId: nextMessage.uid });
if (Mailbox.$virtualMode)
state.go('mail.account.virtualMailbox.message', {mailboxId: encodeUriFilter(nextMessage.$mailbox.path), messageId: nextMessage.uid});
else
state.go('mail.account.mailbox.message', {messageId: nextMessage.uid});
if (nextIndex < mailbox.$topIndex)
mailbox.$topIndex = nextIndex;
else if (nextIndex > mailbox.$lastVisibleIndex)
@@ -185,8 +185,8 @@
for (j = 0; j < this.$mailboxes.length; j++) {
mailbox = this.$mailboxes[j];
for (k = 0; k < mailbox.$messages.length; i++, k++) {
message = mailbox.$messages[k];
if (i == index) {
message = mailbox.$messages[k];
if (mailbox.$loadMessage(message.uid))
return message;
}
@@ -207,6 +207,26 @@
return VirtualMailbox.$absolutePath(this.$account.id);
};
/**
* @function $selectedMessageIndex
* @memberof Mailbox.prototype
* @desc Return the index of the currently visible message.
* @returns a number or undefined if no message is selected
*/
VirtualMailbox.prototype.$selectedMessageIndex = function() {
var offset = 0;
var selectedMailbox = _.find(this.$mailboxes, function(mailbox) {
if (angular.isDefined(mailbox.selectedMessage)) {
return true;
}
else {
offset += mailbox.getLength();
return false;
}
});
return offset + selectedMailbox.uidsMap[selectedMailbox.selectedMessage];
};
/**
* @function $selectedMessages
* @memberof VirtualMailbox.prototype
@@ -215,9 +235,11 @@
*/
VirtualMailbox.prototype.$selectedMessages = function() {
var messagesMap = {};
return _.transform(this.$mailboxes, function(messagesMap, mailbox) {
return _.filter(_.transform(this.$mailboxes, function(messagesMap, mailbox) {
messagesMap[mailbox.id] = mailbox.$selectedMessages();
}, {});
}, {}), function(o) {
return _.size(o) > 0;
});
};
/**
@@ -264,22 +286,43 @@
/**
* @function $deleteMessages
* @memberof VirtualMailbox.prototype
* @desc Delete multiple messages from mailbox.
* @desc Delete one or multiple messages from mailbox.
* @param {object} messagesMap
* @return a promise of the HTTP operation
*/
VirtualMailbox.prototype.$deleteMessages = function(messagesMap) {
var promises = [];
var _this = this, promises = [];
_.forEach(messagesMap, function(messages, id) {
if (messages.length > 0) {
var mailbox = messages[0].$mailbox;
var promise = mailbox.$deleteMessages(messages);
promises.push(promise);
}
});
if (_.isArray(messagesMap) && messagesMap.length === 1) {
// Deleting one message
var message = messagesMap[0];
var mailbox = message.$mailbox;
return mailbox.$deleteMessages([message]).then(function(index) {
var offset = 0;
_.find(_this.$mailboxes, function(currentMailbox) {
if (currentMailbox.id === mailbox.id) {
return true;
}
else {
offset += currentMailbox.getLength();
return false;
}
});
return offset + index;
});
}
else {
// Deleting multiple messages from different mailboxes
_.forEach(messagesMap, function(messages, id) {
if (messages.length > 0) {
var mailbox = messages[0].$mailbox;
var promise = mailbox.$deleteMessages(messages);
promises.push(promise);
}
});
return VirtualMailbox.$q.all(promises);
return VirtualMailbox.$q.all(promises);
}
};
/**
@@ -347,4 +390,13 @@
return VirtualMailbox.$q.all(promises);
};
/**
* @function $compact
* @memberof VirtualMailbox.prototype
* @desc Called when leaving the Mailer module. No-op when in advanced search.
*/
VirtualMailbox.prototype.$comact = function() {
return true;
};
})();