From 6672e03c2236848a0c9001b95ed4b75005683072 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Thu, 10 Dec 2015 11:21:29 -0500 Subject: [PATCH] (js) Fix batch delete of messages Internal arrays/objects were not properly updated. --- .../js/Mailer/Mailbox.service.js | 34 +++++++++++++++--- .../js/Mailer/MailboxController.js | 36 +++++++++++-------- UI/WebServerResources/js/Mailer/Mailer.app.js | 4 +-- .../js/Mailer/MessageController.js | 2 +- 4 files changed, 55 insertions(+), 21 deletions(-) diff --git a/UI/WebServerResources/js/Mailer/Mailbox.service.js b/UI/WebServerResources/js/Mailer/Mailbox.service.js index 6e0011a48..0f2c18c8c 100644 --- a/UI/WebServerResources/js/Mailer/Mailbox.service.js +++ b/UI/WebServerResources/js/Mailer/Mailbox.service.js @@ -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; + } + }); + }); }; /** diff --git a/UI/WebServerResources/js/Mailer/MailboxController.js b/UI/WebServerResources/js/Mailer/MailboxController.js index 48439f8c6..941718cac 100644 --- a/UI/WebServerResources/js/Mailer/MailboxController.js +++ b/UI/WebServerResources/js/Mailer/MailboxController.js @@ -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) { diff --git a/UI/WebServerResources/js/Mailer/Mailer.app.js b/UI/WebServerResources/js/Mailer/Mailer.app.js index 00e481d51..c35ce34ac 100644 --- a/UI/WebServerResources/js/Mailer/Mailer.app.js +++ b/UI/WebServerResources/js/Mailer/Mailer.app.js @@ -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; diff --git a/UI/WebServerResources/js/Mailer/MessageController.js b/UI/WebServerResources/js/Mailer/MessageController.js index ee2fa10ab..e9c8b1b8b 100644 --- a/UI/WebServerResources/js/Mailer/MessageController.js +++ b/UI/WebServerResources/js/Mailer/MessageController.js @@ -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;