diff --git a/UI/MailerUI/UIxMailFolderActions.m b/UI/MailerUI/UIxMailFolderActions.m index 052d21140..c324a18ca 100644 --- a/UI/MailerUI/UIxMailFolderActions.m +++ b/UI/MailerUI/UIxMailFolderActions.m @@ -410,86 +410,92 @@ - (WOResponse *) copyMessagesAction { - SOGoMailFolder *co; + NSString *value, *destinationFolder; SOGoMailAccount *account; WOResponse *response; - NSArray *uids; - NSString *value, *destinationFolder; + SOGoMailFolder *co; NSDictionary *data; + NSArray *uids; co = [self clientObject]; - value = [[context request] formValueForKey: @"uid"]; - destinationFolder = [[context request] formValueForKey: @"folder"]; + data = [[[context request] contentAsString] objectFromJSONString]; + uids = [data objectForKey: @"uids"]; + destinationFolder = [data objectForKey: @"folder"]; response = nil; - if ([value length] > 0) - { - uids = [value componentsSeparatedByString: @","]; - response = [co copyUIDs: uids toFolder: destinationFolder inContext: context]; - if (!response) - { - // We return the inbox quota - account = [co mailAccountFolder]; - data = [NSDictionary dictionaryWithObjectsAndKeys: [account getInboxQuota], @"quotas", nil]; - response = [self responseWithStatus: 200 - andString: [data jsonRepresentation]]; - } - } + if ([uids count] > 0) + { + response = [co copyUIDs: uids toFolder: destinationFolder inContext: context]; + if (!response) + { + // We return the inbox quota + account = [co mailAccountFolder]; + data = [NSDictionary dictionaryWithObjectsAndKeys: [account getInboxQuota], @"quotas", nil]; + response = [self responseWithStatus: 200 + andString: [data jsonRepresentation]]; + } + } else - { - response = [self responseWithStatus: 500]; - [response appendContentString: @"Missing 'uid' parameter."]; - } + { + data = [NSDictionary dictionaryWithObject: @"Error copying messages." forKey: @"error"]; + response = [self responseWithStatus: 500 + andString: [data jsonRepresentation]]; + } return response; } - (WOResponse *) moveMessagesAction { - SOGoMailFolder *co; + NSString *currentMailbox, *currentAccount, *keyForMsgUIDs; + NSMutableDictionary *moduleSettings, *threadsCollapsed; + NSMutableArray *mailboxThreadsCollapsed; + NSString *value, *destinationFolder; SOGoUserSettings *us; WOResponse *response; + NSDictionary *data; + SOGoMailFolder *co; NSArray *uids; - NSString *value, *destinationFolder; - NSMutableDictionary *moduleSettings, *threadsCollapsed; - NSString *currentMailbox, *currentAccount, *keyForMsgUIDs; - NSMutableArray *mailboxThreadsCollapsed; + int i; co = [self clientObject]; - value = [[context request] formValueForKey: @"uid"]; - destinationFolder = [[context request] formValueForKey: @"folder"]; + data = [[[context request] contentAsString] objectFromJSONString]; + uids = [data objectForKey: @"uids"]; + destinationFolder = [data objectForKey: @"folder"]; response = nil; - if ([value length] > 0) - { - uids = [value componentsSeparatedByString: @","]; - response = [co moveUIDs: uids toFolder: destinationFolder inContext: context]; - if (!response) - // Verify if the message beeing delete is saved as the root of a collapsed thread - us = [[context activeUser] userSettings]; - moduleSettings = [us objectForKey: @"Mail"]; - threadsCollapsed = [moduleSettings objectForKey:@"threadsCollapsed"]; - currentMailbox = [co nameInContainer]; - currentAccount = [[co container] nameInContainer]; - keyForMsgUIDs = [NSString stringWithFormat:@"/%@/%@", currentAccount, currentMailbox]; - - if (threadsCollapsed) + if ([uids count] > 0) + { + response = [co moveUIDs: uids toFolder: destinationFolder inContext: context]; + if (!response) { - if ((mailboxThreadsCollapsed = [threadsCollapsed objectForKey:keyForMsgUIDs])) + // Verify if the message beeing delete is saved as the root of a collapsed thread + us = [[context activeUser] userSettings]; + moduleSettings = [us objectForKey: @"Mail"]; + threadsCollapsed = [moduleSettings objectForKey: @"threadsCollapsed"]; + currentMailbox = [co nameInContainer]; + currentAccount = [[co container] nameInContainer]; + keyForMsgUIDs = [NSString stringWithFormat:@"/%@/%@", currentAccount, currentMailbox]; + + if (threadsCollapsed) { - for (i = 0; i < [uids count]; i++) - [mailboxThreadsCollapsed removeObject:[uids objectAtIndex:i]]; - [us synchronize]; + if ((mailboxThreadsCollapsed = [threadsCollapsed objectForKey: keyForMsgUIDs])) + { + for (i = 0; i < [uids count]; i++) + [mailboxThreadsCollapsed removeObject:[uids objectAtIndex:i]]; + [us synchronize]; + } } + response = [self responseWith204]; } - response = [self responseWith204]; - } + } else - { - response = [self responseWithStatus: 500]; - [response appendContentString: @"Missing 'uid' parameter."]; - } + { + data = [NSDictionary dictionaryWithObject: @"Error moving messages." forKey: @"error"]; + response = [self responseWithStatus: 500 + andString: [data jsonRepresentation]]; + } return response; } diff --git a/UI/Templates/MailerUI/UIxMailMainFrame.wox b/UI/Templates/MailerUI/UIxMailMainFrame.wox index bd0fc9228..4477c21a4 100644 --- a/UI/Templates/MailerUI/UIxMailMainFrame.wox +++ b/UI/Templates/MailerUI/UIxMailMainFrame.wox @@ -347,7 +347,6 @@ - @@ -362,6 +361,27 @@ + + + + + +
+ + {{account.name}} + + + + + {{folder.name}} + + +
+
+
diff --git a/UI/WebServerResources/js/Mailer/Mailbox.service.js b/UI/WebServerResources/js/Mailer/Mailbox.service.js index a51b3f681..5ec3fd45c 100644 --- a/UI/WebServerResources/js/Mailer/Mailbox.service.js +++ b/UI/WebServerResources/js/Mailer/Mailbox.service.js @@ -132,7 +132,7 @@ path.splice(0, 0, accountId); // insert account ID - return path.join('/'); + return '/' + path.join('/'); }; /** @@ -370,6 +370,28 @@ return Mailbox.$$resource.post(this.id, 'batchDelete', {uids: uids}); }; + /** + * @function $copyMessages + * @memberof Mailbox.prototype + * @desc Copy multiple messages from the current mailbox to a target one + * @return a promise of the HTTP operation + */ + Mailbox.prototype.$copyMessages = function(uids, folder) { + var _this = this; + return Mailbox.$$resource.post(this.id, 'copyMessages', {uids: uids, folder: folder}); + }; + + /** + * @function $moveMessages + * @memberof Mailbox.prototype + * @desc Move multiple messages from the current mailbox to a target one + * @return a promise of the HTTP operation + */ + Mailbox.prototype.$moveMessages = function(uids, folder) { + var _this = this; + return Mailbox.$$resource.post(this.id, 'moveMessages', {uids: uids, folder: folder}); + }; + /** * @function $reset * @memberof Mailbox.prototype diff --git a/UI/WebServerResources/js/Mailer/MailboxesController.js b/UI/WebServerResources/js/Mailer/MailboxesController.js index 897e15c01..c945d39fd 100644 --- a/UI/WebServerResources/js/Mailer/MailboxesController.js +++ b/UI/WebServerResources/js/Mailer/MailboxesController.js @@ -176,6 +176,26 @@ // Delete failed }); }; + + $scope.copySelectedMessages = function(folder) { + var selectedMessages = _.filter($rootScope.mailbox.$messages, function(message) { return message.selected }); + var selectedUIDs = _.pluck(selectedMessages, 'uid'); + $rootScope.mailbox.$copyMessages(selectedUIDs, folder).then(function() { + // TODO: refresh target mailbox? + }, function(error) { + Dialog.alert(l('Error'), error.error); + }); + }; + + // $scope.moveSelectedMessages = function(folder) { + // var selectedMessages = _.filter($rootScope.mailbox.$messages, function(message) { return message.selected }); + // var selectedUIDs = _.pluck(selectedMessages, 'uid'); + // $rootScope.mailbox.$moveMessages(selectedUIDs, folder).then(function() { + // // TODO: refresh target mailbox? + // $rootScope.mailbox.$messages = _.difference($rootScope.mailbox.$messages, selectedMessages); + // }); + // }; + if ($state.current.name == 'mail' && $scope.accounts.length > 0 && $scope.accounts[0].$mailboxes.length > 0) { // Redirect to first mailbox of first account if no mailbox is selected var account = $scope.accounts[0];