(js) Add batch operations in advanced search
parent
da0a099638
commit
cccdeee707
|
@ -780,35 +780,53 @@
|
|||
NSDictionary *content, *result;
|
||||
BOOL addOrRemove;
|
||||
NGImap4Client *client;
|
||||
id flag;
|
||||
id o, flag;
|
||||
|
||||
int i;
|
||||
|
||||
request = [context request];
|
||||
content = [[request contentAsString] objectFromJSONString];
|
||||
flags = [NSMutableArray arrayWithObject:[content objectForKey:@"flags"]];
|
||||
msgUIDs = [NSArray arrayWithArray:[content objectForKey:@"msgUIDs"]];
|
||||
flags = nil;
|
||||
msgUIDs = nil;
|
||||
|
||||
// Validate parameters
|
||||
o = [content objectForKey:@"flags"];
|
||||
if ([o isKindOfClass: [NSString class]])
|
||||
flags = [NSMutableArray arrayWithObject: o];
|
||||
o = [content objectForKey:@"msgUIDs"];
|
||||
if ([o isKindOfClass: [NSArray class]])
|
||||
msgUIDs = [NSArray arrayWithArray: o];
|
||||
operation = [content objectForKey:@"operation"];
|
||||
addOrRemove = ([operation isEqualToString:@"add"]? YES: NO);
|
||||
|
||||
// We unescape our flags
|
||||
for (i = [flags count]-1; i >= 0; i--)
|
||||
if (!flags || !msgUIDs)
|
||||
{
|
||||
flag = [flags objectAtIndex: i];
|
||||
if ([flag isKindOfClass: [NSString class]])
|
||||
[flags replaceObjectAtIndex: i withObject: [flag fromCSSIdentifier]];
|
||||
else
|
||||
[flags removeObjectAtIndex: i];
|
||||
result = [NSDictionary dictionaryWithObject: [self labelForKey: @"Missing 'flags' and 'msgUIDs' parameters."
|
||||
inContext: context]
|
||||
forKey: @"error"];
|
||||
response = [self responseWithStatus: 500 andJSONRepresentation: result];
|
||||
}
|
||||
|
||||
co = [self clientObject];
|
||||
client = [[co imap4Connection] client];
|
||||
[[co imap4Connection] selectFolder: [co imap4URL]];
|
||||
result = [client storeFlags:flags forUIDs:msgUIDs addOrRemove:addOrRemove];
|
||||
if ([[result valueForKey: @"result"] boolValue])
|
||||
response = [self responseWith204];
|
||||
else
|
||||
response = [self responseWithStatus: 500 andJSONRepresentation: result];
|
||||
{
|
||||
// We unescape our flags
|
||||
for (i = [flags count]-1; i >= 0; i--)
|
||||
{
|
||||
flag = [flags objectAtIndex: i];
|
||||
if ([flag isKindOfClass: [NSString class]])
|
||||
[flags replaceObjectAtIndex: i withObject: [flag fromCSSIdentifier]];
|
||||
else
|
||||
[flags removeObjectAtIndex: i];
|
||||
}
|
||||
|
||||
co = [self clientObject];
|
||||
client = [[co imap4Connection] client];
|
||||
[[co imap4Connection] selectFolder: [co imap4URL]];
|
||||
result = [client storeFlags:flags forUIDs:msgUIDs addOrRemove:addOrRemove];
|
||||
if ([[result valueForKey: @"result"] boolValue])
|
||||
response = [self responseWith204];
|
||||
else
|
||||
response = [self responseWithStatus: 500 andJSONRepresentation: result];
|
||||
}
|
||||
|
||||
return response;
|
||||
}
|
||||
|
|
|
@ -17,11 +17,12 @@
|
|||
* @desc The factory we'll use to register with Angular
|
||||
* @returns the VirtualMailbox constructor
|
||||
*/
|
||||
VirtualMailbox.$factory = ['$q', '$timeout', '$log', 'sgSettings', 'Message', 'Mailbox', 'sgMailbox_PRELOAD', function($q, $timeout, $log, Settings, Mailbox, Message, PRELOAD) {
|
||||
VirtualMailbox.$factory = ['$q', '$timeout', '$log', 'sgSettings', 'Resource', 'Message', 'Mailbox', 'sgMailbox_PRELOAD', function($q, $timeout, $log, Settings, Resource, Mailbox, Message, PRELOAD) {
|
||||
angular.extend(VirtualMailbox, {
|
||||
$q: $q,
|
||||
$timeout: $timeout,
|
||||
$log: $log,
|
||||
$$resource: new Resource(Settings.activeUser('folderURL') + 'Mail', Settings.activeUser()),
|
||||
$Message: Message,
|
||||
selectedFolder: null,
|
||||
PRELOAD: PRELOAD
|
||||
|
@ -206,6 +207,19 @@
|
|||
return VirtualMailbox.$absolutePath(this.$account.id);
|
||||
};
|
||||
|
||||
/**
|
||||
* @function $selectedMessages
|
||||
* @memberof VirtualMailbox.prototype
|
||||
* @desc Return an associative array of the selected messages for each mailbox. Keys are the mailboxes ids.
|
||||
* @returns an associative array
|
||||
*/
|
||||
VirtualMailbox.prototype.$selectedMessages = function() {
|
||||
var messagesMap = {};
|
||||
return _.transform(this.$mailboxes, function(messagesMap, mailbox) {
|
||||
messagesMap[mailbox.id] = mailbox.$selectedMessages();
|
||||
}, {});
|
||||
};
|
||||
|
||||
/**
|
||||
* @function $selectedCount
|
||||
* @memberof VirtualMailbox.prototype
|
||||
|
@ -213,56 +227,124 @@
|
|||
* @returns the number of selected messages
|
||||
*/
|
||||
VirtualMailbox.prototype.$selectedCount = function() {
|
||||
// TODO
|
||||
return 0;
|
||||
return _.sum(_.invokeMap(this.$mailboxes, '$selectedCount'));
|
||||
};
|
||||
|
||||
/**
|
||||
* @function $flagMessages
|
||||
* @memberof VirtualMailbox.prototype
|
||||
* @desc Add or remove a flag on a message set
|
||||
* @param {object} messagesMap
|
||||
* @param {array} flags
|
||||
* @param {string} operation
|
||||
* @returns a promise of the HTTP operation
|
||||
*/
|
||||
VirtualMailbox.prototype.$flagMessages = function(uids, flags, operation) {
|
||||
// TODO
|
||||
// var data = {msgUIDs: uids,
|
||||
// flags: flags,
|
||||
// operation: operation};
|
||||
VirtualMailbox.prototype.$flagMessages = function(messagesMap, flags, operation) {
|
||||
var data = {
|
||||
flags: flags,
|
||||
operation: operation
|
||||
};
|
||||
var allMessages = [];
|
||||
var promises = [];
|
||||
|
||||
// return VirtualMailbox.$$resource.post(this.id, 'addOrRemoveLabel', data);
|
||||
_.forEach(messagesMap, function(messages, id) {
|
||||
if (messages.length > 0) {
|
||||
var uids = _.map(messages, 'uid');
|
||||
allMessages.push(messages);
|
||||
var promise = VirtualMailbox.$$resource.post(id, 'addOrRemoveLabel', _.assign(data, {msgUIDs: uids}));
|
||||
promises.push(promise);
|
||||
}
|
||||
});
|
||||
|
||||
return VirtualMailbox.$q.all(promises).then(function() {
|
||||
return _.flatten(allMessages);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @function $deleteMessages
|
||||
* @memberof VirtualMailbox.prototype
|
||||
* @desc Delete multiple messages from mailbox.
|
||||
* @param {object} messagesMap
|
||||
* @return a promise of the HTTP operation
|
||||
*/
|
||||
VirtualMailbox.prototype.$deleteMessages = function(uids) {
|
||||
// TODO
|
||||
//return VirtualMailbox.$$resource.post(this.id, 'batchDelete', {uids: uids});
|
||||
VirtualMailbox.prototype.$deleteMessages = function(messagesMap) {
|
||||
var promises = [];
|
||||
|
||||
_.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);
|
||||
};
|
||||
|
||||
/**
|
||||
* @function $markOrUnMarkMessagesAsJunk
|
||||
* @memberof VirtualMailbox.prototype
|
||||
* @desc Mark messages as junk/not junk
|
||||
* @param {object} messagesMap
|
||||
* @return a promise of the HTTP operation
|
||||
*/
|
||||
VirtualMailbox.prototype.$markOrUnMarkMessagesAsJunk = function(messagesMap) {
|
||||
var promises = [];
|
||||
|
||||
_.forEach(messagesMap, function(messages, id) {
|
||||
if (messages.length > 0) {
|
||||
var mailbox = messages[0].$mailbox;
|
||||
var promise = mailbox.$markOrUnMarkMessagesAsJunk(messages);
|
||||
promises.push(promise);
|
||||
}
|
||||
});
|
||||
|
||||
return VirtualMailbox.$q.all(promises);
|
||||
};
|
||||
|
||||
/**
|
||||
* @function $copyMessages
|
||||
* @memberof VirtualMailbox.prototype
|
||||
* @desc Copy multiple messages from the current mailbox to a target one
|
||||
* @param {object} messagesMap
|
||||
* @param {string} folder
|
||||
* @return a promise of the HTTP operation
|
||||
*/
|
||||
VirtualMailbox.prototype.$copyMessages = function(uids, folder) {
|
||||
// TODO
|
||||
//return VirtualMailbox.$$resource.post(this.id, 'copyMessages', {uids: uids, folder: folder});
|
||||
VirtualMailbox.prototype.$copyMessages = function(messagesMap, folder) {
|
||||
var promises = [];
|
||||
|
||||
_.forEach(messagesMap, function(messages, id) {
|
||||
if (messages.length > 0) {
|
||||
var mailbox = messages[0].$mailbox;
|
||||
var promise = mailbox.$copyMessages(messages, folder);
|
||||
promises.push(promise);
|
||||
}
|
||||
});
|
||||
|
||||
return VirtualMailbox.$q.all(promises);
|
||||
};
|
||||
|
||||
/**
|
||||
* @function $moveMessages
|
||||
* @memberof VirtualMailbox.prototype
|
||||
* @desc Move multiple messages from the current mailbox to a target one
|
||||
* @param {object} messagesMap
|
||||
* @param {string} folder
|
||||
* @return a promise of the HTTP operation
|
||||
*/
|
||||
VirtualMailbox.prototype.$moveMessages = function(uids, folder) {
|
||||
// TODO
|
||||
//return VirtualMailbox.$$resource.post(this.id, 'moveMessages', {uids: uids, folder: folder});
|
||||
VirtualMailbox.prototype.$moveMessages = function(messagesMap, folder) {
|
||||
var promises = [];
|
||||
|
||||
_.forEach(messagesMap, function(messages, id) {
|
||||
if (messages.length > 0) {
|
||||
var mailbox = messages[0].$mailbox;
|
||||
var promise = mailbox.$moveMessages(messages, folder);
|
||||
promises.push(promise);
|
||||
}
|
||||
});
|
||||
|
||||
return VirtualMailbox.$q.all(promises);
|
||||
};
|
||||
|
||||
})();
|
||||
|
|
Loading…
Reference in New Issue