(feat) can now copy mails

pull/91/head
Ludovic Marcotte 2015-06-30 17:13:55 -04:00
parent 06cb06fce6
commit f449f0456b
4 changed files with 123 additions and 55 deletions

View File

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

View File

@ -347,7 +347,6 @@
<md-option value="to_or_cc"><var:string label:value="To or Cc"/></md-option>
<md-option value="body"><var:string label:value="Entire Message"/></md-option>
</md-select>
</div>
</div>
</div>
@ -362,6 +361,27 @@
<md-button>
<i class="md-icon-star"><!-- flag mails --></i>
</md-button>
<md-menu>
<md-button aria-label="Copy messages" ng-click="$mdOpenMenu()">
<i class="md-icon-content-copy"><!-- copy mails --></i>
</md-button>
<md-menu-content width="4">
<div ng-repeat="account in accounts track by account.id">
<md-menu-item>
<md-button class="md-primary" ng-disabled="true">{{account.name}}</md-button>
</md-menu-item>
<md-menu-divider><!-- divider --></md-menu-divider>
<md-menu-item ng-repeat="folder in
account.$flattenMailboxes()
track by folder.path"
ng-hide="mailbox.id == folder.id">
<md-button ng-click="copySelectedMessages(folder.id)">
<span ng-class="'sg-child-level-' + folder.level">{{folder.name}}</span>
</md-button>
</md-menu-item>
</div>
</md-menu-content>
</md-menu>
</div>
</md-toolbar>
<div layout="row" ui-view="mailbox"><!-- messages list --></div>

View File

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

View File

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