(js) Fix some operations in advanced mail search

Fixes #4478
pull/229/merge
Francis Lachapelle 2018-06-14 22:20:24 -04:00
parent 70d0408230
commit a69a5b77be
6 changed files with 104 additions and 29 deletions

View File

@ -7,7 +7,7 @@
<!-- in virtual mailbox mode -->
<md-toolbar class="md-whiteframe-z1 md-hue-3"
ng-hide="!mailbox.service.$virtualPath || mailbox.mode.multiple">
ng-hide="mailbox.service.$virtualPath === false || mailbox.mode.multiple">
<div class="md-toolbar-tools"
layout="row" layout-align="start start">
<div class="pseudo-input-container pseudo-input-container--compact md-flex sg-no-wrap">
@ -15,7 +15,7 @@
<var:string label:value="Search messages in"/>
</label>
<md-select class="pseudo-input-field" ng-model="mailbox.service.$virtualPath">
<md-option ng-value="">
<md-option ng-value="''">
<span ng-bind="app.accounts[0].name"><!-- main account name --></span>
</md-option>
<md-option ng-repeat="folder in
@ -67,7 +67,7 @@
</md-toolbar>
<!-- single-selection toolbars -->
<md-toolbar class="md-accent md-hue-1"
ng-hide="mailbox.service.$virtualPath || mailbox.mode.multiple">
ng-hide="mailbox.service.$virtualPath !== false || mailbox.mode.multiple">
<!-- sort mode (default) -->
<div class="md-toolbar-tools" ng-hide="mailbox.mode.search">
<md-button class="sg-icon-button" label:aria-label="Search"

View File

@ -69,6 +69,13 @@
<var:string label:value="New Folder..."/>
</md-button>
</md-menu-item>
<md-menu-item ng-show="::account.id == 0">
<md-button
label:aria-label="Search"
ng-click="app.showAdvancedSearch()">
<var:string label:value="Search"/>
</md-button>
</md-menu-item>
</md-menu-content>
</md-menu>
</md-list-item>
@ -116,13 +123,13 @@
<script type="text/ng-template" id="UIxMailFolderTemplate">
<md-toolbar layout="row" layout-align="space-between center" class="toolbar-main"
ng-hide="mailbox.service.$virtualPath">
ng-hide="mailbox.service.$virtualPath !== false">
<var:component className="UIxTopnavToolbar"/>
</md-toolbar>
<!-- Advanced search toolbar -->
<md-toolbar layout="column" class="md-tall toolbar-main md-hue-3"
ng-show="mailbox.service.$virtualPath">
ng-show="mailbox.service.$virtualPath !== false">
<div class="md-toolbar-tools">
<div layout="column" class="md-flex">
<div class="pseudo-input-container--compact">

View File

@ -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;

View File

@ -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'))

View File

@ -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)

View File

@ -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;
};
})();