(feat) can now copy mails
parent
06cb06fce6
commit
f449f0456b
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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];
|
||||
|
|
Loading…
Reference in New Issue