(js) Fix batch delete of messages

Internal arrays/objects were not properly updated.
pull/186/head
Francis Lachapelle 2015-12-10 11:21:29 -05:00
parent ccd031693e
commit 6672e03c22
4 changed files with 55 additions and 21 deletions

View File

@ -193,7 +193,6 @@
if (this.$loadMessage(message.uid))
return message;
}
return null;
};
@ -254,7 +253,9 @@
if (!angular.isDefined(this.unseenCount))
this.unseenCount = 0;
this.$isLoading = true;
Mailbox.$timeout(function() {
_this.$isLoading = true;
});
return Mailbox.$Preferences.ready().then(function() {
@ -508,8 +509,33 @@
* @desc Delete multiple messages from mailbox.
* @return a promise of the HTTP operation
*/
Mailbox.prototype.$deleteMessages = function(uids) {
return Mailbox.$$resource.post(this.id, 'batchDelete', {uids: uids});
Mailbox.prototype.$deleteMessages = function(messages) {
var _this = this, uids;
uids = _.pluck(messages, 'uid');
return Mailbox.$$resource.post(this.id, 'batchDelete', {uids: uids})
.then(function() {
var selectedMessages, selectedUIDs, unseen;
// Decrement the unseenCount accordingly
unseen = _.filter(messages, function(message, i) { return !message.isread; });
_this.unseenCount -= unseen.length;
// Remove messages from $messages and uidsMap
_.forEachRight(_this.$messages, function(message, index) {
var selectedIndex = _.findIndex(uids, function(uid) {
return message.uid == uid;
});
if (selectedIndex > -1) {
uids.splice(selectedIndex, 1);
delete _this.uidsMap[message.uid];
if (message.uid == _this.selectedMessage)
delete _this.selectedMessage;
_this.$messages.splice(index, 1);
}
else {
_this.uidsMap[message.uid] -= uids.length;
}
});
});
};
/**

View File

@ -54,15 +54,27 @@
l('Are you sure you want to delete the selected messages?'))
.then(function() {
// User confirmed the deletion
var selectedMessages = _.filter(vm.selectedFolder.$messages, function(message) { return message.selected; });
var selectedUIDs = _.pluck(selectedMessages, 'uid');
vm.selectedFolder.$deleteMessages(selectedUIDs).then(function() {
// Decrement the unseenCount accordingly
var unseenCount = _.filter(selectedMessages, function(message) { return !message.isread; });
vm.selectedFolder.$messages = _.difference(vm.selectedFolder.$messages, selectedMessages);
vm.selectedFolder.unseenCount =- unseenCount;
}, function(error) {
Dialog.alert(l('Error'), error);
var unselectMessage = false;
var selectedMessages = _.filter(vm.selectedFolder.$messages, function(message) {
if (message.uid == vm.selectedFolder.selectedMessage)
unselectMessage = true;
return message.selected;
});
vm.selectedFolder.$deleteMessages(selectedMessages).then(function() {
if (unselectMessage) {
if (Mailbox.$virtualMode)
$state.go('mail.account.virtualMailbox',
{
accountId: stateAccount.id,
mailboxId: encodeUriFilter(vm.selectedFolder.path)
});
else
$state.go('mail.account.mailbox',
{
accountId: stateAccount.id,
mailboxId: encodeUriFilter(vm.selectedFolder.path)
});
}
});
});
}
@ -70,11 +82,7 @@
function copySelectedMessages(folder) {
var selectedMessages = _.filter(vm.selectedFolder.$messages, function(message) { return message.selected; });
var selectedUIDs = _.pluck(selectedMessages, 'uid');
vm.selectedFolder.$copyMessages(selectedUIDs, '/' + folder).then(function() {
// TODO: refresh target mailbox?
}, function(error) {
Dialog.alert(l('Error'), error);
});
vm.selectedFolder.$copyMessages(selectedUIDs, '/' + folder);
}
// function moveSelectedMessages(folder) {

View File

@ -172,8 +172,8 @@
/**
* @ngInject
*/
stateMailbox.$inject = ['Mailbox', '$stateParams', 'stateAccount', 'decodeUriFilter'];
function stateMailbox(Mailbox, $stateParams, stateAccount, decodeUriFilter) {
stateMailbox.$inject = ['$stateParams', 'stateAccount', 'decodeUriFilter'];
function stateMailbox($stateParams, stateAccount, decodeUriFilter) {
var mailboxId = decodeUriFilter($stateParams.mailboxId),
_find;

View File

@ -48,7 +48,7 @@
}
function doDelete() {
stateMailbox.$deleteMessages([stateMessage.uid]).then(function() {
stateMailbox.$deleteMessages([stateMessage]).then(function() {
// Remove message from list of messages
var index = _.findIndex(stateMailbox.$messages, function(o) {
return o.uid == stateMessage.uid;