2015-05-06 04:06:13 +02:00
|
|
|
/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
|
|
|
|
(function() {
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ngInject
|
|
|
|
*/
|
2017-09-20 22:50:41 +02:00
|
|
|
MailboxController.$inject = ['$window', '$scope', '$timeout', '$q', '$state', '$mdDialog', '$mdToast', 'stateAccounts', 'stateAccount', 'stateMailbox', 'sgHotkeys', 'encodeUriFilter', 'sgSettings', 'sgFocus', 'Dialog', 'Preferences', 'Account', 'Mailbox'];
|
|
|
|
function MailboxController($window, $scope, $timeout, $q, $state, $mdDialog, $mdToast, stateAccounts, stateAccount, stateMailbox, sgHotkeys, encodeUriFilter, sgSettings, focus, Dialog, Preferences, Account, Mailbox) {
|
2017-01-07 00:26:12 +01:00
|
|
|
var vm = this,
|
2016-09-23 23:17:25 +02:00
|
|
|
defaultWindowTitle = angular.element($window.document).find('title').attr('sg-default') || "SOGo",
|
2018-05-07 22:43:16 +02:00
|
|
|
hotkeys = [],
|
|
|
|
sortLabels;
|
|
|
|
|
|
|
|
sortLabels = {
|
|
|
|
subject: 'Subject',
|
|
|
|
from: 'From',
|
|
|
|
date: 'Date',
|
|
|
|
size: 'Size',
|
|
|
|
arrival: 'Order Received'
|
|
|
|
};
|
2015-07-13 21:22:58 +02:00
|
|
|
|
2017-05-18 21:31:38 +02:00
|
|
|
this.$onInit = function() {
|
|
|
|
// Expose controller for eventual popup windows
|
|
|
|
$window.$mailboxController = vm;
|
|
|
|
|
|
|
|
this.service = Mailbox;
|
|
|
|
this.accounts = stateAccounts;
|
|
|
|
this.account = stateAccount;
|
|
|
|
this.selectedFolder = stateMailbox;
|
|
|
|
this.messageDialog = null; // also access from Message controller
|
|
|
|
this.mode = { search: false, multiple: 0 };
|
|
|
|
|
|
|
|
_registerHotkeys(hotkeys);
|
|
|
|
|
|
|
|
// Expunge mailbox when leaving the Mail module
|
|
|
|
angular.element($window).on('beforeunload', _compactBeforeUnload);
|
|
|
|
$scope.$on('$destroy', function() {
|
|
|
|
angular.element($window).off('beforeunload', _compactBeforeUnload);
|
|
|
|
// Deregister hotkeys
|
|
|
|
_.forEach(hotkeys, function(key) {
|
|
|
|
sgHotkeys.deregisterHotkey(key);
|
|
|
|
});
|
2016-09-23 23:17:25 +02:00
|
|
|
});
|
2016-07-27 17:56:28 +02:00
|
|
|
|
2017-05-18 21:31:38 +02:00
|
|
|
// Update window's title with unseen messages count of selected mailbox
|
|
|
|
$scope.$watch(function() { return vm.selectedFolder.unseenCount; }, function(unseenCount) {
|
2018-09-24 17:28:52 +02:00
|
|
|
var title = '';
|
2017-05-18 21:31:38 +02:00
|
|
|
if (unseenCount)
|
|
|
|
title += '(' + unseenCount + ') ';
|
|
|
|
title += vm.selectedFolder.$displayName;
|
2018-09-24 17:28:52 +02:00
|
|
|
title += ' | ' + defaultWindowTitle;
|
2017-05-18 21:31:38 +02:00
|
|
|
$window.document.title = title;
|
|
|
|
});
|
|
|
|
};
|
2016-09-12 22:11:35 +02:00
|
|
|
|
2016-09-23 23:17:25 +02:00
|
|
|
|
|
|
|
function _registerHotkeys(keys) {
|
|
|
|
keys.push(sgHotkeys.createHotkey({
|
2016-09-27 21:19:24 +02:00
|
|
|
key: l('hotkey_search'),
|
|
|
|
description: l('Search'),
|
2017-05-18 21:31:38 +02:00
|
|
|
callback: vm.searchMode
|
2016-09-27 21:19:24 +02:00
|
|
|
}));
|
|
|
|
keys.push(sgHotkeys.createHotkey({
|
|
|
|
key: l('hotkey_compose'),
|
|
|
|
description: l('Write a new message'),
|
2017-01-07 00:26:12 +01:00
|
|
|
callback: function($event) {
|
|
|
|
if (vm.messageDialog === null)
|
2017-05-18 21:31:38 +02:00
|
|
|
vm.newMessage($event);
|
2017-01-07 00:26:12 +01:00
|
|
|
}
|
2016-09-23 23:17:25 +02:00
|
|
|
}));
|
2016-10-17 21:10:40 +02:00
|
|
|
keys.push(sgHotkeys.createHotkey({
|
|
|
|
key: l('hotkey_junk'),
|
|
|
|
description: l('Mark the selected messages as junk'),
|
2017-05-18 21:31:38 +02:00
|
|
|
callback: vm.markOrUnMarkMessagesAsJunk
|
2016-10-17 21:10:40 +02:00
|
|
|
}));
|
2016-09-23 23:17:25 +02:00
|
|
|
keys.push(sgHotkeys.createHotkey({
|
|
|
|
key: 'space',
|
2016-09-27 21:19:24 +02:00
|
|
|
description: l('Toggle item'),
|
2017-05-18 21:31:38 +02:00
|
|
|
callback: vm.toggleMessageSelection
|
2016-09-23 23:17:25 +02:00
|
|
|
}));
|
2016-11-10 16:34:31 +01:00
|
|
|
keys.push(sgHotkeys.createHotkey({
|
|
|
|
key: 'shift+space',
|
|
|
|
description: l('Toggle range of items'),
|
2017-05-18 21:31:38 +02:00
|
|
|
callback: vm.toggleMessageSelection
|
2016-11-10 16:34:31 +01:00
|
|
|
}));
|
2016-09-23 23:17:25 +02:00
|
|
|
keys.push(sgHotkeys.createHotkey({
|
|
|
|
key: 'up',
|
2016-09-27 21:19:24 +02:00
|
|
|
description: l('View next item'),
|
2016-09-23 23:17:25 +02:00
|
|
|
callback: _nextMessage,
|
|
|
|
preventInClass: ['sg-mail-part']
|
|
|
|
}));
|
|
|
|
keys.push(sgHotkeys.createHotkey({
|
|
|
|
key: 'down',
|
2016-09-27 21:19:24 +02:00
|
|
|
description: l('View previous item'),
|
2016-09-23 23:17:25 +02:00
|
|
|
callback: _previousMessage,
|
|
|
|
preventInClass: ['sg-mail-part']
|
|
|
|
}));
|
|
|
|
keys.push(sgHotkeys.createHotkey({
|
|
|
|
key: 'shift+up',
|
2016-09-27 21:19:24 +02:00
|
|
|
description: l('Add next item to selection'),
|
2016-09-23 23:17:25 +02:00
|
|
|
callback: _addNextMessageToSelection,
|
|
|
|
preventInClass: ['sg-mail-part']
|
|
|
|
}));
|
|
|
|
keys.push(sgHotkeys.createHotkey({
|
|
|
|
key: 'shift+down',
|
2016-09-27 21:19:24 +02:00
|
|
|
description: l('Add previous item to selection'),
|
2016-09-23 23:17:25 +02:00
|
|
|
callback: _addPreviousMessageToSelection,
|
|
|
|
preventInClass: ['sg-mail-part']
|
|
|
|
}));
|
2017-06-14 19:37:13 +02:00
|
|
|
_.forEach(['backspace', 'delete'], function(hotkey) {
|
|
|
|
keys.push(sgHotkeys.createHotkey({
|
|
|
|
key: hotkey,
|
|
|
|
description: l('Delete selected message or folder'),
|
|
|
|
callback: vm.confirmDeleteSelectedMessages
|
|
|
|
}));
|
|
|
|
});
|
2016-09-23 23:17:25 +02:00
|
|
|
|
|
|
|
// Register the hotkeys
|
2016-09-27 21:19:24 +02:00
|
|
|
_.forEach(keys, function(key) {
|
2016-09-23 23:17:25 +02:00
|
|
|
sgHotkeys.registerHotkey(key);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-07-27 17:56:28 +02:00
|
|
|
function _compactBeforeUnload(event) {
|
2020-06-16 18:57:17 +02:00
|
|
|
if (Mailbox.$virtualMode)
|
|
|
|
return true;
|
2016-07-27 17:56:28 +02:00
|
|
|
return vm.selectedFolder.$compact();
|
|
|
|
}
|
|
|
|
|
2017-09-05 16:16:36 +02:00
|
|
|
this.centerIsClose = function(navController_centerIsClose) {
|
|
|
|
// Allow the messages list to be hidden only if a message is selected
|
|
|
|
return this.selectedFolder.hasSelectedMessage() && !!navController_centerIsClose;
|
|
|
|
};
|
|
|
|
|
2017-05-18 21:31:38 +02:00
|
|
|
this.sort = function(field) {
|
2018-05-07 22:43:16 +02:00
|
|
|
if (field) {
|
|
|
|
vm.selectedFolder.$filter({ sort: field });
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return sortLabels[vm.service.$query.sort];
|
|
|
|
}
|
2017-05-18 21:31:38 +02:00
|
|
|
};
|
2016-06-23 22:03:14 +02:00
|
|
|
|
2017-05-18 21:31:38 +02:00
|
|
|
this.sortedBy = function(field) {
|
2016-06-23 22:03:14 +02:00
|
|
|
return Mailbox.$query.sort == field;
|
2017-05-18 21:31:38 +02:00
|
|
|
};
|
2016-06-23 22:03:14 +02:00
|
|
|
|
2018-05-07 22:43:16 +02:00
|
|
|
this.ascending = function() {
|
|
|
|
return Mailbox.$query.asc;
|
|
|
|
};
|
|
|
|
|
2020-07-29 22:31:19 +02:00
|
|
|
this.refresh = function () {
|
|
|
|
Preferences.pollInbox();
|
|
|
|
this.selectedFolder.$filter();
|
|
|
|
};
|
|
|
|
|
2018-07-11 20:00:54 +02:00
|
|
|
this.searchMode = function($event) {
|
2016-06-23 22:03:14 +02:00
|
|
|
vm.mode.search = true;
|
|
|
|
focus('search');
|
2018-07-11 20:00:54 +02:00
|
|
|
if ($event)
|
|
|
|
$event.preventDefault();
|
2017-05-18 21:31:38 +02:00
|
|
|
};
|
2016-06-23 22:03:14 +02:00
|
|
|
|
2017-05-18 21:31:38 +02:00
|
|
|
this.cancelSearch = function() {
|
2016-06-23 22:03:14 +02:00
|
|
|
vm.mode.search = false;
|
|
|
|
vm.selectedFolder.$filter().then(function() {
|
|
|
|
if (vm.selectedFolder.selectedMessage) {
|
|
|
|
$timeout(function() {
|
|
|
|
vm.selectedFolder.$topIndex = vm.selectedFolder.uidsMap[vm.selectedFolder.selectedMessage];
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
2017-05-18 21:31:38 +02:00
|
|
|
};
|
2016-06-23 22:03:14 +02:00
|
|
|
|
2017-09-20 22:50:41 +02:00
|
|
|
this.composeWindowEnabled = function() {
|
|
|
|
return Preferences.defaults.SOGoMailComposeWindowEnabled;
|
|
|
|
};
|
|
|
|
|
2017-05-18 21:31:38 +02:00
|
|
|
this.newMessage = function($event, inPopup) {
|
2018-08-17 22:31:50 +02:00
|
|
|
var message, onCompleteDeferred = $q.defer();
|
2016-06-23 22:03:14 +02:00
|
|
|
|
2017-01-07 00:26:12 +01:00
|
|
|
if (vm.messageDialog === null) {
|
2017-09-20 22:50:41 +02:00
|
|
|
if (inPopup || Preferences.defaults.SOGoMailComposeWindow == 'popup')
|
2017-01-19 18:23:55 +01:00
|
|
|
_newMessageInPopup();
|
|
|
|
else {
|
|
|
|
message = vm.account.$newMessage();
|
|
|
|
vm.messageDialog = $mdDialog
|
|
|
|
.show({
|
|
|
|
parent: angular.element(document.body),
|
|
|
|
targetEvent: $event,
|
|
|
|
clickOutsideToClose: false,
|
|
|
|
escapeToClose: false,
|
|
|
|
templateUrl: 'UIxMailEditor',
|
|
|
|
controller: 'MessageEditorController',
|
|
|
|
controllerAs: 'editor',
|
2018-08-17 22:31:50 +02:00
|
|
|
onComplete: function (scope, element) {
|
|
|
|
return onCompleteDeferred.resolve(element);
|
|
|
|
},
|
2017-01-19 18:23:55 +01:00
|
|
|
locals: {
|
2018-09-12 22:21:00 +02:00
|
|
|
stateParent: $scope,
|
2017-01-19 18:23:55 +01:00
|
|
|
stateAccount: vm.account,
|
2018-08-17 22:31:50 +02:00
|
|
|
stateMessage: message,
|
|
|
|
onCompletePromise: function () {
|
|
|
|
return onCompleteDeferred.promise;
|
|
|
|
}
|
2017-01-19 18:23:55 +01:00
|
|
|
}
|
|
|
|
})
|
2018-02-05 21:48:09 +01:00
|
|
|
.catch(_.noop) // Cancel
|
2017-01-19 18:23:55 +01:00
|
|
|
.finally(function() {
|
|
|
|
vm.messageDialog = null;
|
|
|
|
});
|
|
|
|
}
|
2016-06-23 22:03:14 +02:00
|
|
|
}
|
2017-05-18 21:31:38 +02:00
|
|
|
};
|
2015-07-15 19:44:17 +02:00
|
|
|
|
2017-01-19 18:23:55 +01:00
|
|
|
function _newMessageInPopup() {
|
|
|
|
var url = [sgSettings.baseURL(),
|
|
|
|
'UIxMailPopupView#!/Mail',
|
|
|
|
vm.account.id,
|
|
|
|
// The double-encoding is necessary
|
|
|
|
encodeUriFilter(encodeUriFilter(vm.selectedFolder.path)),
|
|
|
|
'new']
|
|
|
|
.join('/'),
|
|
|
|
wId = vm.selectedFolder.$id() + '/' + Math.random(0, 1000);
|
|
|
|
$window.open(url, wId,
|
|
|
|
["width=680",
|
|
|
|
"height=520",
|
|
|
|
"resizable=1",
|
|
|
|
"scrollbars=1",
|
|
|
|
"toolbar=0",
|
|
|
|
"location=0",
|
|
|
|
"directories=0",
|
|
|
|
"status=0",
|
|
|
|
"menubar=0",
|
|
|
|
"copyhistory=0"]
|
|
|
|
.join(','));
|
|
|
|
}
|
|
|
|
|
2016-09-23 23:17:25 +02:00
|
|
|
/**
|
|
|
|
* User has pressed up arrow key
|
|
|
|
*/
|
|
|
|
function _nextMessage($event) {
|
|
|
|
var index = vm.selectedFolder.$selectedMessageIndex();
|
|
|
|
|
2016-10-03 17:27:57 +02:00
|
|
|
if (angular.isDefined(index)) {
|
2016-09-23 23:17:25 +02:00
|
|
|
index--;
|
2016-10-03 17:27:57 +02:00
|
|
|
if (vm.selectedFolder.$topIndex > 0)
|
|
|
|
vm.selectedFolder.$topIndex--;
|
|
|
|
}
|
|
|
|
else {
|
2016-09-23 23:17:25 +02:00
|
|
|
// No message is selected, show oldest message
|
|
|
|
index = vm.selectedFolder.getLength() - 1;
|
2016-10-03 17:27:57 +02:00
|
|
|
vm.selectedFolder.$topIndex = vm.selectedFolder.getLength();
|
|
|
|
}
|
2016-09-23 23:17:25 +02:00
|
|
|
|
|
|
|
if (index > -1)
|
2018-06-15 04:20:24 +02:00
|
|
|
vm.selectMessage(vm.selectedFolder.getItemAtIndex(index));
|
2016-09-23 23:17:25 +02:00
|
|
|
|
|
|
|
$event.preventDefault();
|
|
|
|
|
|
|
|
return index;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* User has pressed the down arrow key
|
|
|
|
*/
|
|
|
|
function _previousMessage($event) {
|
|
|
|
var index = vm.selectedFolder.$selectedMessageIndex();
|
|
|
|
|
2016-10-03 17:27:57 +02:00
|
|
|
if (angular.isDefined(index)) {
|
2016-09-23 23:17:25 +02:00
|
|
|
index++;
|
2016-10-03 17:27:57 +02:00
|
|
|
if (vm.selectedFolder.$topIndex < vm.selectedFolder.getLength())
|
|
|
|
vm.selectedFolder.$topIndex++;
|
|
|
|
}
|
2016-09-23 23:17:25 +02:00
|
|
|
else
|
|
|
|
// No message is selected, show newest
|
|
|
|
index = 0;
|
|
|
|
|
|
|
|
if (index < vm.selectedFolder.getLength())
|
2018-06-15 04:20:24 +02:00
|
|
|
vm.selectMessage(vm.selectedFolder.getItemAtIndex(index));
|
2016-09-23 23:17:25 +02:00
|
|
|
else
|
|
|
|
index = -1;
|
|
|
|
|
|
|
|
$event.preventDefault();
|
|
|
|
|
|
|
|
return index;
|
|
|
|
}
|
|
|
|
|
|
|
|
function _addNextMessageToSelection($event) {
|
|
|
|
var index;
|
|
|
|
|
|
|
|
if (vm.selectedFolder.hasSelectedMessage()) {
|
|
|
|
index = _nextMessage($event);
|
|
|
|
if (index >= 0)
|
2017-05-18 21:31:38 +02:00
|
|
|
vm.toggleMessageSelection($event, vm.selectedFolder.$messages[index]);
|
2016-09-23 23:17:25 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function _addPreviousMessageToSelection($event) {
|
|
|
|
var index;
|
|
|
|
|
|
|
|
if (vm.selectedFolder.hasSelectedMessage()) {
|
|
|
|
index = _previousMessage($event);
|
|
|
|
if (index >= 0)
|
2017-05-18 21:31:38 +02:00
|
|
|
vm.toggleMessageSelection($event, vm.selectedFolder.$messages[index]);
|
2016-09-23 23:17:25 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-18 21:31:38 +02:00
|
|
|
this.selectMessage = function(message) {
|
2015-09-10 22:38:30 +02:00
|
|
|
if (Mailbox.$virtualMode)
|
2016-06-23 22:03:14 +02:00
|
|
|
$state.go('mail.account.virtualMailbox.message', {mailboxId: encodeUriFilter(message.$mailbox.path), messageId: message.uid});
|
2015-09-10 22:38:30 +02:00
|
|
|
else
|
2016-03-03 21:03:42 +01:00
|
|
|
$state.go('mail.account.mailbox.message', {messageId: message.uid});
|
2017-05-18 21:31:38 +02:00
|
|
|
};
|
2015-07-13 21:22:58 +02:00
|
|
|
|
2017-05-18 21:31:38 +02:00
|
|
|
this.toggleMessageSelection = function($event, message) {
|
2016-11-10 16:34:31 +01:00
|
|
|
var folder = vm.selectedFolder,
|
|
|
|
selectedIndex, nextSelectedIndex, i;
|
|
|
|
|
|
|
|
if (!message)
|
|
|
|
message = folder.$selectedMessage();
|
2017-05-18 21:31:38 +02:00
|
|
|
if (!message)
|
|
|
|
return true;
|
2015-09-09 21:18:00 +02:00
|
|
|
message.selected = !message.selected;
|
2016-03-08 19:20:34 +01:00
|
|
|
vm.mode.multiple += message.selected? 1 : -1;
|
2016-11-10 16:34:31 +01:00
|
|
|
|
|
|
|
// Select closest range of messages when shift key is pressed
|
|
|
|
if ($event.shiftKey && folder.$selectedCount() > 1) {
|
|
|
|
selectedIndex = folder.uidsMap[message.uid];
|
|
|
|
// Search for next selected message above
|
|
|
|
nextSelectedIndex = selectedIndex - 2;
|
|
|
|
while (nextSelectedIndex >= 0 &&
|
|
|
|
!folder.$messages[nextSelectedIndex].selected)
|
|
|
|
nextSelectedIndex--;
|
|
|
|
if (nextSelectedIndex < 0) {
|
|
|
|
// Search for next selected message bellow
|
|
|
|
nextSelectedIndex = selectedIndex + 2;
|
|
|
|
while (nextSelectedIndex < folder.getLength() &&
|
|
|
|
!folder.$messages[nextSelectedIndex].selected)
|
|
|
|
nextSelectedIndex++;
|
|
|
|
}
|
|
|
|
if (nextSelectedIndex >= 0 && nextSelectedIndex < folder.getLength()) {
|
|
|
|
for (i = Math.min(selectedIndex, nextSelectedIndex);
|
|
|
|
i <= Math.max(selectedIndex, nextSelectedIndex);
|
|
|
|
i++)
|
|
|
|
folder.$messages[i].selected = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-09-09 21:18:00 +02:00
|
|
|
$event.preventDefault();
|
|
|
|
$event.stopPropagation();
|
2017-05-18 21:31:38 +02:00
|
|
|
};
|
2015-09-09 21:18:00 +02:00
|
|
|
|
2016-06-23 22:03:14 +02:00
|
|
|
/**
|
|
|
|
* Batch operations
|
|
|
|
*/
|
2015-07-13 21:22:58 +02:00
|
|
|
|
2016-06-23 22:03:14 +02:00
|
|
|
function _currentMailboxes() {
|
|
|
|
if (Mailbox.$virtualMode)
|
|
|
|
return vm.selectedFolder.$mailboxes;
|
|
|
|
else
|
|
|
|
return [vm.selectedFolder];
|
2016-02-08 21:36:01 +01:00
|
|
|
}
|
|
|
|
|
2016-11-01 15:35:00 +01:00
|
|
|
// Unselect current message and cleverly load the next message.
|
|
|
|
// This function must not be called in virtual mode.
|
2016-06-23 22:03:14 +02:00
|
|
|
function _unselectMessage(message, index) {
|
2016-02-03 22:48:04 +01:00
|
|
|
var nextMessage, previousMessage, nextIndex = index;
|
2016-03-08 19:20:34 +01:00
|
|
|
vm.mode.multiple = vm.selectedFolder.$selectedCount();
|
2016-02-03 22:48:04 +01:00
|
|
|
if (message) {
|
2016-06-23 22:03:14 +02:00
|
|
|
// Select either the next or previous message
|
|
|
|
if (index > 0) {
|
|
|
|
nextIndex -= 1;
|
|
|
|
nextMessage = vm.selectedFolder.$messages[nextIndex];
|
2016-02-03 22:48:04 +01:00
|
|
|
}
|
2016-06-23 22:03:14 +02:00
|
|
|
if (index < vm.selectedFolder.$messages.length)
|
|
|
|
previousMessage = vm.selectedFolder.$messages[index];
|
|
|
|
if (nextMessage) {
|
|
|
|
if (nextMessage.isread && previousMessage && !previousMessage.isread) {
|
2016-02-03 22:48:04 +01:00
|
|
|
nextIndex = index;
|
|
|
|
nextMessage = previousMessage;
|
|
|
|
}
|
2016-06-23 22:03:14 +02:00
|
|
|
}
|
|
|
|
else if (previousMessage) {
|
|
|
|
nextIndex = index;
|
|
|
|
nextMessage = previousMessage;
|
|
|
|
}
|
|
|
|
if (nextMessage) {
|
|
|
|
vm.selectedFolder.$topIndex = nextIndex;
|
|
|
|
$state.go('mail.account.mailbox.message', { messageId: nextMessage.uid });
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$state.go('mail.account.mailbox');
|
2016-02-03 22:48:04 +01:00
|
|
|
}
|
|
|
|
}
|
2016-06-23 22:03:14 +02:00
|
|
|
else {
|
|
|
|
$timeout(function() {
|
|
|
|
console.warn('go to mailbox');
|
|
|
|
$state.go('mail.account.mailbox');
|
|
|
|
});
|
|
|
|
}
|
2016-02-03 22:48:04 +01:00
|
|
|
}
|
|
|
|
|
2017-05-18 21:31:38 +02:00
|
|
|
this.confirmDeleteSelectedMessages = function($event) {
|
2016-09-23 23:17:25 +02:00
|
|
|
var selectedMessages = vm.selectedFolder.$selectedMessages();
|
|
|
|
|
2017-01-07 00:26:12 +01:00
|
|
|
if (vm.messageDialog === null && _.size(selectedMessages) > 0)
|
|
|
|
vm.messageDialog = Dialog.confirm(l('Confirmation'),
|
2020-06-16 18:57:17 +02:00
|
|
|
l('Are you sure you want to delete the selected messages?'),
|
|
|
|
{ ok: l('Delete') })
|
2016-06-23 22:03:14 +02:00
|
|
|
.then(function() {
|
|
|
|
var deleteSelectedMessage = vm.selectedFolder.hasSelectedMessage();
|
2016-09-23 23:17:25 +02:00
|
|
|
vm.selectedFolder.$deleteMessages(selectedMessages).then(function(index) {
|
|
|
|
if (Mailbox.$virtualMode) {
|
|
|
|
// When performing an advanced search, we refresh the view if the selected message
|
|
|
|
// was deleted, but only once all promises have completed.
|
|
|
|
if (deleteSelectedMessage)
|
|
|
|
$state.go('mail.account.virtualMailbox');
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// In normal mode, we immediately unselect the selected message.
|
|
|
|
_unselectMessage(deleteSelectedMessage, index);
|
|
|
|
}
|
2016-11-01 15:35:00 +01:00
|
|
|
}, function(response) {
|
2017-01-07 00:26:12 +01:00
|
|
|
vm.messageDialog = Dialog.confirm(l('Warning'),
|
2016-11-01 15:35:00 +01:00
|
|
|
l('The messages could not be moved to the trash folder. Would you like to delete them immediately?'),
|
|
|
|
{ ok: l('Delete') })
|
|
|
|
.then(function() {
|
2020-06-16 18:57:17 +02:00
|
|
|
vm.selectedFolder.$deleteMessages(selectedMessages, { withoutTrash: true })
|
|
|
|
.then(function(index) {
|
|
|
|
if (Mailbox.$virtualMode) {
|
|
|
|
// When performing an advanced search, we refresh the view if the selected message
|
|
|
|
// was deleted, but only once all promises have completed.
|
|
|
|
if (deleteSelectedMessage)
|
|
|
|
$state.go('mail.account.virtualMailbox');
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// In normal mode, we immediately unselect the selected message.
|
|
|
|
_unselectMessage(deleteSelectedMessage, index);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.finally(function() {
|
|
|
|
vm.messageDialog = null;
|
|
|
|
});
|
2016-11-01 15:35:00 +01:00
|
|
|
});
|
2016-09-23 23:17:25 +02:00
|
|
|
});
|
2016-09-27 21:19:24 +02:00
|
|
|
})
|
|
|
|
.finally(function() {
|
2017-01-07 00:26:12 +01:00
|
|
|
vm.messageDialog = null;
|
2016-06-23 22:03:14 +02:00
|
|
|
});
|
2016-09-23 23:17:25 +02:00
|
|
|
|
|
|
|
$event.preventDefault();
|
2017-05-18 21:31:38 +02:00
|
|
|
};
|
2015-05-09 20:37:40 +02:00
|
|
|
|
2017-05-18 21:31:38 +02:00
|
|
|
this.markOrUnMarkMessagesAsJunk = function() {
|
2016-06-23 22:03:14 +02:00
|
|
|
var moveSelectedMessage = vm.selectedFolder.hasSelectedMessage();
|
|
|
|
var selectedMessages = vm.selectedFolder.$selectedMessages();
|
2016-10-17 21:10:40 +02:00
|
|
|
if (_.size(selectedMessages) === 0 && moveSelectedMessage)
|
|
|
|
selectedMessages = [vm.selectedFolder.$selectedMessage()];
|
2016-06-23 22:03:14 +02:00
|
|
|
if (_.size(selectedMessages) > 0)
|
|
|
|
vm.selectedFolder.$markOrUnMarkMessagesAsJunk(selectedMessages).then(function() {
|
|
|
|
var dstFolder = '/' + vm.account.id + '/folderINBOX';
|
|
|
|
if (vm.selectedFolder.type != 'junk') {
|
|
|
|
dstFolder = '/' + vm.account.$getMailboxByType('junk').id;
|
|
|
|
}
|
|
|
|
vm.selectedFolder.$moveMessages(selectedMessages, dstFolder).then(function(index) {
|
|
|
|
if (Mailbox.$virtualMode) {
|
|
|
|
// When performing an advanced search, we refresh the view if the selected message
|
|
|
|
// was deleted, but only once all promises have completed.
|
|
|
|
if (moveSelectedMessage)
|
|
|
|
$state.go('mail.account.virtualMailbox');
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// In normal mode, we immediately unselect the selected message.
|
|
|
|
_unselectMessage(moveSelectedMessage, index);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
2017-05-18 21:31:38 +02:00
|
|
|
};
|
2015-07-20 22:44:26 +02:00
|
|
|
|
2017-05-18 21:31:38 +02:00
|
|
|
this.copySelectedMessages = function(dstFolder) {
|
2016-06-23 22:03:14 +02:00
|
|
|
var selectedMessages = vm.selectedFolder.$selectedMessages();
|
|
|
|
if (_.size(selectedMessages) > 0)
|
2016-07-15 20:37:56 +02:00
|
|
|
vm.selectedFolder.$copyMessages(selectedMessages, '/' + dstFolder).then(function() {
|
|
|
|
$mdToast.show(
|
|
|
|
$mdToast.simple()
|
2020-08-04 22:12:52 +02:00
|
|
|
.textContent(l('%{0} message(s) copied', vm.selectedFolder.$selectedCount()))
|
2016-07-15 20:37:56 +02:00
|
|
|
.position('top right')
|
|
|
|
.hideDelay(2000));
|
|
|
|
});
|
2017-05-18 21:31:38 +02:00
|
|
|
};
|
2015-07-23 16:54:46 +02:00
|
|
|
|
2017-05-18 21:31:38 +02:00
|
|
|
this.moveSelectedMessages = function(dstFolder) {
|
2016-06-23 22:03:14 +02:00
|
|
|
var moveSelectedMessage = vm.selectedFolder.hasSelectedMessage();
|
|
|
|
var selectedMessages = vm.selectedFolder.$selectedMessages();
|
2016-07-15 20:37:56 +02:00
|
|
|
var count = vm.selectedFolder.$selectedCount();
|
2016-06-23 22:03:14 +02:00
|
|
|
if (_.size(selectedMessages) > 0)
|
|
|
|
vm.selectedFolder.$moveMessages(selectedMessages, '/' + dstFolder).then(function(index) {
|
2016-07-15 20:37:56 +02:00
|
|
|
$mdToast.show(
|
|
|
|
$mdToast.simple()
|
2020-08-04 22:12:52 +02:00
|
|
|
.textContent(l('%{0} message(s) moved', count))
|
2016-07-15 20:37:56 +02:00
|
|
|
.position('top right')
|
|
|
|
.hideDelay(2000));
|
2016-06-23 22:03:14 +02:00
|
|
|
if (Mailbox.$virtualMode) {
|
|
|
|
// When performing an advanced search, we refresh the view if the selected message
|
|
|
|
// was moved, but only once all promises have completed.
|
|
|
|
if (moveSelectedMessage)
|
|
|
|
$state.go('mail.account.virtualMailbox');
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// In normal mode, we immediately unselect the selected message.
|
|
|
|
_unselectMessage(moveSelectedMessage, index);
|
|
|
|
}
|
2015-08-10 19:10:45 +02:00
|
|
|
});
|
2017-05-18 21:31:38 +02:00
|
|
|
};
|
2015-08-10 19:10:45 +02:00
|
|
|
|
2017-05-18 21:31:38 +02:00
|
|
|
this.selectAll = function() {
|
2016-06-23 22:03:14 +02:00
|
|
|
var count = 0;
|
|
|
|
_.forEach(_currentMailboxes(), function(folder) {
|
|
|
|
var i = 0, length = folder.$messages.length;
|
|
|
|
for (; i < length; i++)
|
|
|
|
folder.$messages[i].selected = true;
|
|
|
|
count += length;
|
2015-08-10 19:10:45 +02:00
|
|
|
});
|
2016-06-23 22:03:14 +02:00
|
|
|
vm.mode.multiple = count;
|
2017-05-18 21:31:38 +02:00
|
|
|
};
|
2015-08-10 19:10:45 +02:00
|
|
|
|
2017-05-18 21:31:38 +02:00
|
|
|
this.unselectMessages = function() {
|
2016-06-23 22:03:14 +02:00
|
|
|
_.forEach(_currentMailboxes(), function(folder) {
|
|
|
|
_.forEach(folder.$messages, function(message) {
|
|
|
|
message.selected = false;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
vm.mode.multiple = 0;
|
2017-05-18 21:31:38 +02:00
|
|
|
};
|
2015-07-20 22:44:26 +02:00
|
|
|
|
2017-05-18 21:31:38 +02:00
|
|
|
this.markSelectedMessagesAsFlagged = function() {
|
2016-06-23 22:03:14 +02:00
|
|
|
var selectedMessages = vm.selectedFolder.$selectedMessages();
|
|
|
|
if (_.size(selectedMessages) > 0)
|
|
|
|
vm.selectedFolder.$flagMessages(selectedMessages, '\\Flagged', 'add').then(function(messages) {
|
|
|
|
_.forEach(messages, function(message) {
|
|
|
|
message.isflagged = true;
|
2016-01-18 20:33:31 +01:00
|
|
|
});
|
2016-06-23 22:03:14 +02:00
|
|
|
});
|
2017-05-18 21:31:38 +02:00
|
|
|
};
|
2015-07-30 19:06:28 +02:00
|
|
|
|
2017-05-18 21:31:38 +02:00
|
|
|
this.markSelectedMessagesAsUnread = function() {
|
2016-06-23 22:03:14 +02:00
|
|
|
var selectedMessages = vm.selectedFolder.$selectedMessages();
|
2016-11-07 18:14:00 +01:00
|
|
|
if (_.size(selectedMessages) > 0) {
|
2016-06-23 22:03:14 +02:00
|
|
|
vm.selectedFolder.$flagMessages(selectedMessages, 'seen', 'remove').then(function(messages) {
|
|
|
|
_.forEach(messages, function(message) {
|
2016-11-07 18:14:00 +01:00
|
|
|
if (message.isread)
|
|
|
|
message.$mailbox.unseenCount++;
|
2016-06-23 22:03:14 +02:00
|
|
|
message.isread = false;
|
2015-08-27 03:22:39 +02:00
|
|
|
});
|
2016-06-23 22:03:14 +02:00
|
|
|
});
|
2016-11-07 18:14:00 +01:00
|
|
|
}
|
2017-05-18 21:31:38 +02:00
|
|
|
};
|
2016-11-07 18:14:00 +01:00
|
|
|
|
2017-05-18 21:31:38 +02:00
|
|
|
this.markSelectedMessagesAsRead = function() {
|
2016-11-07 18:14:00 +01:00
|
|
|
var selectedMessages = vm.selectedFolder.$selectedMessages();
|
|
|
|
if (_.size(selectedMessages) > 0) {
|
|
|
|
vm.selectedFolder.$flagMessages(selectedMessages, 'seen', 'add').then(function(messages) {
|
|
|
|
_.forEach(messages, function(message) {
|
|
|
|
if (!message.isread)
|
|
|
|
message.$mailbox.unseenCount--;
|
|
|
|
message.isread = true;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
2017-05-18 21:31:38 +02:00
|
|
|
};
|
2016-06-23 22:03:14 +02:00
|
|
|
|
2015-05-06 04:06:13 +02:00
|
|
|
}
|
|
|
|
|
2016-01-08 22:31:06 +01:00
|
|
|
angular
|
2017-05-18 21:31:38 +02:00
|
|
|
.module('SOGo.MailerUI')
|
|
|
|
.controller('MailboxController', MailboxController);
|
2016-01-08 22:31:06 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @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;
|
|
|
|
}
|
|
|
|
|
2015-05-06 04:06:13 +02:00
|
|
|
angular
|
2017-05-18 21:31:38 +02:00
|
|
|
.module('material.components.virtualRepeat')
|
|
|
|
.decorator('mdVirtualRepeatContainerDirective', mdVirtualRepeatContainerDirectiveDecorator);
|
|
|
|
|
2015-05-06 04:06:13 +02:00
|
|
|
})();
|
|
|
|
|