(js) Add batch operations in advanced search

pull/217/head
Francis Lachapelle 2016-07-04 17:34:13 -04:00
parent da0a099638
commit cccdeee707
2 changed files with 136 additions and 36 deletions

View File

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

View File

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