From 3b65eaea0b177374abe7389a42935ccd08629910 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Tue, 2 Sep 2014 13:42:04 -0400 Subject: [PATCH] Tagging labels with 1 AJAX request --- UI/MailerUI/UIxMailFolderActions.m | 74 +++++++--------- UI/MailerUI/product.plist | 9 +- UI/WebServerResources/MailerUI.js | 132 +++++++++++++++++------------ 3 files changed, 110 insertions(+), 105 deletions(-) diff --git a/UI/MailerUI/UIxMailFolderActions.m b/UI/MailerUI/UIxMailFolderActions.m index 877a0ada0..15fe69459 100644 --- a/UI/MailerUI/UIxMailFolderActions.m +++ b/UI/MailerUI/UIxMailFolderActions.m @@ -618,7 +618,7 @@ return response; } -- (WOResponse *) addLabelAction +- (WOResponse *) addOrRemoveLabelAction { WOResponse *response; WORequest *request; @@ -626,14 +626,14 @@ NSException *error; NSArray *msgUIDs, *flags; NSString *operation; - NSDictionary *content; + NSDictionary *content, *result; BOOL addOrRemove; NGImap4Client *client; request = [context request]; content = [[request contentAsString] objectFromJSONString]; - flags = [content objectForKey:@"flags"]; - msgUIDs = [content objectForKey:@"msgUIDs"]; + flags = [NSArray arrayWithObject:[content objectForKey:@"flags"]]; + msgUIDs = [NSArray arrayWithArray:[content objectForKey:@"msgUIDs"]]; operation = [content objectForKey:@"operation"]; if ([operation isEqualToString:@"add"]) @@ -643,60 +643,46 @@ co = [self clientObject]; client = [[co imap4Connection] client]; - error = [client storeFlags:flags forUIDs:msgUIDs addOrRemove:addOrRemove]; - if (error) - response = (WOResponse *) error; - else + [[co imap4Connection] selectFolder: [co imap4URL]]; + result = [client storeFlags:flags forUIDs:msgUIDs addOrRemove:addOrRemove]; + if ([[[[result objectForKey:@"RawResponse"] objectForKey:@"ResponseResult"] objectForKey:@"description"] isEqualToString:@"Completed"]) response = [self responseWith204]; - - return response; -} - -- (WOResponse *) removeLabelAction -{ - WOResponse *response; - SOGoMailObject *co; - NSException *error; - NSArray *flags; - NSString *flag; - - flag = [[[self->context request] formValueForKey: @"flag"] fromCSSIdentifier]; - co = [self clientObject]; - flags = [NSArray arrayWithObject: flag]; - - error = [co removeFlags: flags]; - if (error) - response = (WOResponse *) error; else - response = [self responseWith204]; - + response = nil; + return response; } - (WOResponse *) removeAllLabelsAction { - NSMutableArray *flags; WOResponse *response; - SOGoMailObject *co; - NSException *error; - NSDictionary *v; - - - co = [self clientObject]; - - v = [[[context activeUser] userDefaults] mailLabelsColors]; - + WORequest *request; + SOGoMailFolder *co; + NGImap4Client *client; + NSArray *msgUIDs; + NSMutableArray *flags; + NSDictionary *v, *content, *result; + + request = [context request]; + content = [[request contentAsString] objectFromJSONString]; + msgUIDs = [NSArray arrayWithArray:[content objectForKey:@"msgUIDs"]]; + // We always unconditionally remove the Mozilla tags flags = [NSMutableArray arrayWithObjects: @"$Label1", @"$Label2", @"$Label3", @"$Label4", @"$Label5", nil]; - + + co = [self clientObject]; + v = [[[context activeUser] userDefaults] mailLabelsColors]; [flags addObjectsFromArray: [v allKeys]]; - error = [co removeFlags: flags]; - if (error) - response = (WOResponse *) error; - else + client = [[co imap4Connection] client]; + [[co imap4Connection] selectFolder: [co imap4URL]]; + result = [client storeFlags:flags forUIDs:msgUIDs addOrRemove:NO]; + + if ([[[[result objectForKey:@"RawResponse"] objectForKey:@"ResponseResult"] objectForKey:@"description"] isEqualToString:@"Completed"]) response = [self responseWith204]; + else + response = nil; return response; } diff --git a/UI/MailerUI/product.plist b/UI/MailerUI/product.plist index e0130ee8b..3abdd26bf 100644 --- a/UI/MailerUI/product.plist +++ b/UI/MailerUI/product.plist @@ -181,15 +181,10 @@ pageName = "UIxMailUserRightsEditor"; actionName = "saveUserRights"; }; - addLabel = { + addOrRemoveLabel = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; - actionName = "addLabel"; - }; - removeLabel = { - protectedBy = "View"; - actionClass = "UIxMailFolderActions"; - actionName = "removeLabel"; + actionName = "addOrRemoveLabel"; }; removeAllLabels = { protectedBy = "View"; diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index ac997e7ce..0a53b005d 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -879,14 +879,28 @@ function openMailbox(mailbox, reload) { * Called from SOGoDataTable.render() */ function messageListCallback(row, data, isNew) { - var currentMessage = Mailer.currentMessages[Mailer.currentMailbox]; + var currentMessages = []; + if (!Object.isArray(document.menuTarget)) { + // Menu called from one selection in message list view + currentMessages.push(Mailer.currentMessages[Mailer.currentMailbox]); + } + else { + // Menu called from multiple selection in messages list view + var rows = $(document.menuTarget); + for (var i = 0; i < rows.length; i++) { + var _row = $(rows[i]); + if (_row) { + currentMessages.push(rows[i].substr(4)); + } + } + } row.id = data['rowID']; row.writeAttribute('labels', (data['labels']?data['labels']:"")); row.className = data['rowClasses']; row.show(); // make sure the row is visible // Restore previous selection - if (data['uid'] == currentMessage) + if (currentMessages.indexOf(String(data['uid'])) != -1) row.addClassName('_selected'); if (data['Thread']) @@ -2444,40 +2458,47 @@ function onMenuToggleMessageRead(event) { } function onMenuLabelNone() { - var messages = []; + var msgUIDs = []; + var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox); - if (document.menuTarget.tagName == "DIV") - // Menu called from message content view - messages.push(Mailer.currentMessages[Mailer.currentMailbox]); - else if (Object.isArray(document.menuTarget)) + if (!Object.isArray(document.menuTarget)) { + if (document.menuTarget.tagName == "DIV") + // Menu called from message content view + msgUIDs.push(Mailer.currentMessages[Mailer.currentMailbox]); + + else + // Menu called from one selection in message list view + msgUIDs.push(document.menuTarget.getAttribute("id").substr(4)); + } + else { // Menu called from multiple selection in messages list view - $(document.menuTarget).collect(function(row) { - messages.push(row.substr(4)); - }); - else - // Menu called from one selection in messages list view - messages.push(document.menuTarget.getAttribute("id").substr(4)); + var rows = $(document.menuTarget); + for (var i = 0; i < rows.length; i++) { + var row = $(rows[i]); + if (row) { + msgUIDs.push(rows[i].substr(4)); + } + } + } - var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/"; - messages.each(function(id) { - triggerAjaxRequest(url + id + "/removeAllLabels", - messageFlagCallback, - { mailbox: Mailer.currentMailbox, msg: id, label: null } ); - }); + var callbackData = { mailbox: Mailer.currentMailbox, msgUIDs: msgUIDs }; + var content = { mailbox: Mailer.currentMailbox, msgUIDs: msgUIDs }; + content = Object.toJSON(content); + triggerAjaxRequest(url + "/removeAllLabels", messageFlagCallback, callbackData, content); } function onMenuLabelFlag() { var flag = this.readAttribute("data-name"); - var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/"; + var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox); var operation = "add"; - var msgUIDs; + var msgUIDs = []; var msgLabels; if (!Object.isArray(document.menuTarget)) { - msgUIDs = Mailer.currentMessages[Mailer.currentMailbox]; + msgUIDs.push(Mailer.currentMessages[Mailer.currentMailbox]); if (document.menuTarget.tagName == "DIV") // Menu called from message content view - msgLabels = $('row_' + msgLabels).getAttribute("labels"); + msgLabels = $('row_' + msgUIDs[0]).getAttribute("labels"); else // Menu called from one selection in messages list view msgLabels = document.menuTarget.getAttribute("labels"); @@ -2508,10 +2529,42 @@ function onMenuLabelFlag() { } } - var callbackData = { mailbox: Mailer.currentMailbox, operation: operation, flag: flag }; + var callbackData = { mailbox: Mailer.currentMailbox, operation: operation, flag: flag, msgUIDs: msgUIDs}; var content = {flags: flag.asCSSIdentifier(), msgUIDs: msgUIDs, operation: operation}; content = Object.toJSON(content); - triggerAjaxRequest(url + operation + "Label", messageFlagCallback, callbackData, content); + triggerAjaxRequest(url + "/addOrRemoveLabel", messageFlagCallback, callbackData, content); +} + +function messageFlagCallback(http) { + if (http.readyState == 4 + && isHttpStatus204(http.status)) { + var data = http.callbackData; + if (data["mailbox"] == Mailer.currentMailbox) { + var msgUIDs = data["msgUIDs"]; + for (var i = 0; i < msgUIDs.length; i++) { + Mailer.dataTable.invalidate(msgUIDs[i]); + var row = $("row_" + msgUIDs[i]); + var operation = data["operation"]; + if (operation) { + var labels = row.getAttribute("labels"); + var flags = []; + if (labels.length > 0) + flags = labels.split(" "); + if (operation == "add") + flags.push(data["flag"]); + else { + // Remove flag + var flag = data["flag"]; + var idx = flags.indexOf(flag); + flags.splice(idx, 1); + } + row.writeAttribute("labels", flags.join(" ")); + } + else + row.writeAttribute("labels", ""); + } + } + } } function onMenuToggleMessageFlag(event) { @@ -2566,35 +2619,6 @@ function folderRefreshCallback(http) { } } -function messageFlagCallback(http) { - if (http.readyState == 4 - && isHttpStatus204(http.status)) { - var data = http.callbackData; - if (data["mailbox"] == Mailer.currentMailbox) { - Mailer.dataTable.invalidate(data["msg"]); - var row = $("row_" + data["msg"]); - var operation = data["label"]; - if (operation) { - var labels = row.getAttribute("labels"); - var flags = []; - if (labels.length > 0) - flags = labels.split(" "); - if (operation.substr(0, 3) == "add") - flags.push(operation.substr(3)); - else { - // Remove flag - var flag = operation.substr(6); - var idx = flags.indexOf(flag); - flags.splice(idx, 1); - } - row.writeAttribute("labels", flags.join(" ")); - } - else - row.writeAttribute("labels", ""); - } - } -} - function onMessageListMenuPrepareVisibility() { /* This method attaches the right mailbox-menu to the generic message list menu. */