(js) Improve message selection when deleting msgs

This commit is contained in:
Francis Lachapelle
2016-01-08 16:31:06 -05:00
parent 5f9c87cae3
commit 1bcdac328a
5 changed files with 96 additions and 33 deletions
@@ -212,7 +212,7 @@
<span ng-switch-default="true">{{mailbox.service.selectedFolder.getLength()}} <var:string label:value="messages"/></span>
</span>
</md-subheader>
<md-virtual-repeat-container class="md-flex">
<md-virtual-repeat-container class="md-flex" md-top-index="mailbox.selectedFolder.$topIndex">
<md-list class="sg-section-list">
<md-list-item
class="md-default-theme md-background md-hue-1"
@@ -528,7 +528,7 @@
uids = _.pluck(messages, 'uid');
return Mailbox.$$resource.post(this.id, 'batchDelete', {uids: uids})
.then(function(data) {
var selectedMessages, selectedUIDs, unseen;
var selectedMessages, selectedUIDs, unseen, firstIndex = _this.$messages.length;
// Decrement the unseenCount accordingly
unseen = _.filter(messages, function(message, i) { return !message.isread; });
_this.unseenCount -= unseen.length;
@@ -543,6 +543,8 @@
if (message.uid == _this.selectedMessage)
delete _this.selectedMessage;
_this.$messages.splice(index, 1);
if (index < firstIndex)
firstIndex = index;
}
else {
_this.uidsMap[message.uid] -= uids.length;
@@ -551,6 +553,8 @@
// Update inbox quota
if (data.quotas)
_this.$account.updateQuota(data.quotas);
return firstIndex;
});
};
@@ -6,8 +6,8 @@
/**
* @ngInject
*/
MailboxController.$inject = ['$window', '$state', '$timeout', '$mdDialog', 'stateAccounts', 'stateAccount', 'stateMailbox', 'encodeUriFilter', 'Dialog', 'Account', 'Mailbox'];
function MailboxController($window, $state, $timeout, $mdDialog, stateAccounts, stateAccount, stateMailbox, encodeUriFilter, Dialog, Account, Mailbox) {
MailboxController.$inject = ['$window', '$state', '$mdDialog', 'stateAccounts', 'stateAccount', 'stateMailbox', 'encodeUriFilter', 'Dialog', 'Account', 'Mailbox'];
function MailboxController($window, $state, $mdDialog, stateAccounts, stateAccount, stateMailbox, encodeUriFilter, Dialog, Account, Mailbox) {
var vm = this, messageDialog = null;
// Expose controller
@@ -59,24 +59,43 @@
// User confirmed the deletion
var unselectMessage = false;
var selectedMessages = _.filter(vm.selectedFolder.$messages, function(message) {
if (message.uid == vm.selectedFolder.selectedMessage)
if (message.selected &&
message.uid == vm.selectedFolder.selectedMessage)
unselectMessage = true;
return message.selected;
});
vm.selectedFolder.$deleteMessages(selectedMessages).then(function() {
vm.selectedFolder.$deleteMessages(selectedMessages).then(function(index) {
var nextMessage, previousMessage, nextIndex = index;
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)
});
if (Mailbox.$virtualMode) {
$state.go('mail.account.virtualMailbox');
}
else {
// Select either the next or previous message
if (index > 0) {
nextIndex -= 1;
nextMessage = vm.selectedFolder.$messages[nextIndex];
}
if (index < vm.selectedFolder.$messages.length)
previousMessage = vm.selectedFolder.$messages[index];
if (nextMessage) {
if (nextMessage.isread && previousMessage && !previousMessage.isread) {
nextIndex = index;
nextMessage = previousMessage;
}
}
else if (previousMessage) {
nextIndex = index;
nextMessage = previousMessage;
}
if (nextMessage) {
$state.go('mail.account.mailbox.message', { messageId: nextMessage.uid });
vm.selectedFolder.$topIndex = nextIndex;
}
else {
$state.go('mail.account.mailbox');
}
}
}
});
});
@@ -174,6 +193,26 @@
}
}
angular
.module('material.components.virtualRepeat')
.decorator('mdVirtualRepeatContainerDirective', mdVirtualRepeatContainerDirectiveDecorator);
/**
* @ngInject
*/
mdVirtualRepeatContainerDirectiveDecorator.$inject = ['$delegate'];
function mdVirtualRepeatContainerDirectiveDecorator($delegate) {
$delegate[0].controller.prototype.resetScroll = function() {
// Don't scroll to top if current virtual repeater is the messages list
// but do update the container size
if (this.$element.parent().attr('id') == 'messagesList')
this.updateSize();
else
this.scrollTo(0);
};
return $delegate;
}
angular
.module('SOGo.MailerUI')
.controller('MailboxController', MailboxController);
@@ -177,9 +177,6 @@
var mailboxId = decodeUriFilter($stateParams.mailboxId),
_find;
if (Mailbox.selectedFolder)
Mailbox.selectedFolder.$isLoading = true;
// Recursive find function
_find = function(mailboxes) {
var mailbox = _.find(mailboxes, function(o) {
@@ -195,6 +192,9 @@
return mailbox;
};
if (Mailbox.selectedFolder)
Mailbox.selectedFolder.$isLoading = true;
return _find(stateAccount.$mailboxes);
}
@@ -255,11 +255,11 @@
var message;
message = _.find(stateMailbox.$messages, function(messageObject) {
return messageObject.uid == $stateParams.messageId;
return messageObject.uid == parseInt($stateParams.messageId);
});
if (message) {
stateMailbox.selectedMessage = $stateParams.messageId;
stateMailbox.selectedMessage = parseInt($stateParams.messageId);
return message.$reload();
}
else {
@@ -92,7 +92,8 @@
}
function doDelete() {
var parentCtrls = $parentControllers(), mailbox, message, state;
var mailbox, message, state, nextMessage, previousMessage,
parentCtrls = $parentControllers();
if (parentCtrls.messageCtrl) {
mailbox = parentCtrls.mailboxCtrl.selectedFolder;
@@ -105,19 +106,38 @@
state = $state;
}
mailbox.$deleteMessages([message]).then(function() {
// Remove message from list of messages
var index = _.findIndex(mailbox.$messages, function(o) {
return o.uid == message.uid;
});
if (index != -1)
mailbox.$messages.splice(index, 1);
mailbox.$deleteMessages([message]).then(function(index) {
var nextIndex = index;
// Remove message object from scope
message = null;
// Navigate to mailbox if not in popup window
if (angular.isDefined(state)) {
// Select either the next or previous message
if (index > 0) {
nextIndex -= 1;
nextMessage = mailbox.$messages[nextIndex];
}
if (index < mailbox.$messages.length)
previousMessage = mailbox.$messages[index];
if (nextMessage) {
if (nextMessage.isread && previousMessage && !previousMessage.isread) {
nextIndex = index;
nextMessage = previousMessage;
}
}
else if (previousMessage) {
nextIndex = index;
nextMessage = previousMessage;
}
try {
state.go('mail.account.mailbox', { mailboxId: encodeUriFilter(mailbox.path) });
if (nextMessage) {
state.go('mail.account.mailbox.message', { messageId: nextMessage.uid });
mailbox.$topIndex = nextIndex;
}
else {
state.go('mail.account.mailbox');
}
}
catch (error) {}
}