diff --git a/UI/MailerUI/UIxMailActions.m b/UI/MailerUI/UIxMailActions.m index b21cd160f..71bb05f8f 100644 --- a/UI/MailerUI/UIxMailActions.m +++ b/UI/MailerUI/UIxMailActions.m @@ -203,74 +203,4 @@ return response; } -- (WOResponse *) addLabelAction -{ - 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 addFlags: flags]; - if (error) - response = (WOResponse *) error; - else - 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]; - - return response; -} - -- (WOResponse *) removeAllLabelsAction -{ - NSMutableArray *flags; - WOResponse *response; - SOGoMailObject *co; - NSException *error; - NSDictionary *v; - - - co = [self clientObject]; - - v = [[[context activeUser] userDefaults] mailLabelsColors]; - - // We always unconditionally remove the Mozilla tags - flags = [NSMutableArray arrayWithObjects: @"$Label1", @"$Label2", @"$Label3", - @"$Label4", @"$Label5", nil]; - - [flags addObjectsFromArray: [v allKeys]]; - - error = [co removeFlags: flags]; - if (error) - response = (WOResponse *) error; - else - response = [self responseWith204]; - - return response; -} - @end diff --git a/UI/MailerUI/UIxMailFolderActions.m b/UI/MailerUI/UIxMailFolderActions.m index 0e1ca9123..877a0ada0 100644 --- a/UI/MailerUI/UIxMailFolderActions.m +++ b/UI/MailerUI/UIxMailFolderActions.m @@ -618,4 +618,88 @@ return response; } +- (WOResponse *) addLabelAction +{ + WOResponse *response; + WORequest *request; + SOGoMailFolder *co; + NSException *error; + NSArray *msgUIDs, *flags; + NSString *operation; + NSDictionary *content; + BOOL addOrRemove; + NGImap4Client *client; + + request = [context request]; + content = [[request contentAsString] objectFromJSONString]; + flags = [content objectForKey:@"flags"]; + msgUIDs = [content objectForKey:@"msgUIDs"]; + operation = [content objectForKey:@"operation"]; + + if ([operation isEqualToString:@"add"]) + addOrRemove = YES; + else + addOrRemove = NO; + + co = [self clientObject]; + client = [[co imap4Connection] client]; + error = [client storeFlags:flags forUIDs:msgUIDs addOrRemove:addOrRemove]; + if (error) + response = (WOResponse *) error; + else + 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]; + + return response; +} + +- (WOResponse *) removeAllLabelsAction +{ + NSMutableArray *flags; + WOResponse *response; + SOGoMailObject *co; + NSException *error; + NSDictionary *v; + + + co = [self clientObject]; + + v = [[[context activeUser] userDefaults] mailLabelsColors]; + + // We always unconditionally remove the Mozilla tags + flags = [NSMutableArray arrayWithObjects: @"$Label1", @"$Label2", @"$Label3", + @"$Label4", @"$Label5", nil]; + + [flags addObjectsFromArray: [v allKeys]]; + + error = [co removeFlags: flags]; + if (error) + response = (WOResponse *) error; + else + response = [self responseWith204]; + + return response; +} + + @end diff --git a/UI/MailerUI/product.plist b/UI/MailerUI/product.plist index 8b9ed30cb..e0130ee8b 100644 --- a/UI/MailerUI/product.plist +++ b/UI/MailerUI/product.plist @@ -181,6 +181,21 @@ pageName = "UIxMailUserRightsEditor"; actionName = "saveUserRights"; }; + addLabel = { + protectedBy = "View"; + actionClass = "UIxMailFolderActions"; + actionName = "addLabel"; + }; + removeLabel = { + protectedBy = "View"; + actionClass = "UIxMailFolderActions"; + actionName = "removeLabel"; + }; + removeAllLabels = { + protectedBy = "View"; + actionClass = "UIxMailFolderActions"; + actionName = "removeAllLabels"; + }; }; }; @@ -272,21 +287,6 @@ actionClass = "UIxMailActions"; actionName = "markMessageRead"; }; - addLabel = { - protectedBy = "View"; - actionClass = "UIxMailActions"; - actionName = "addLabel"; - }; - removeLabel = { - protectedBy = "View"; - actionClass = "UIxMailActions"; - actionName = "removeLabel"; - }; - removeAllLabels = { - protectedBy = "View"; - actionClass = "UIxMailActions"; - actionName = "removeAllLabels"; - }; }; }; diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index f9fa6973e..ac997e7ce 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -31,7 +31,7 @@ var pageContent = $("pageContent"); var deleteMessageRequestCount = 0; -var messageCheckTimer; +var refreshViewCheckTimer; /* We need to override this method since it is adapted to GCS-based folder references, which we do not use here */ @@ -1955,7 +1955,7 @@ function initMailer(event) { configureMessageListEvents(); initMailboxTree(); - initMessageCheckTimer(); + initRefreshViewCheckTimer(); Event.observe(document, "keydown", onDocumentKeydown); @@ -1975,23 +1975,27 @@ function initMailer(event) { Event.observe(window, "resize", onWindowResize); } -function initMessageCheckTimer() { - var messageCheck = UserDefaults["SOGoMailMessageCheck"]; - if (messageCheck && messageCheck != "manually") { +function initRefreshViewCheckTimer() { + // TEMPORARY : to be erase + var refreshViewCheck = UserDefaults["SOGoMailMessageCheck"]; + if (refreshViewCheck == null) + refreshViewCheck = UserDefaults["SOGoRefreshViewCheck"]; + + if (refreshViewCheck && refreshViewCheck != "manually") { var interval; - if (messageCheck == "once_per_hour") + if (refreshViewCheck == "once_per_hour") interval = 3600; - else if (messageCheck == "every_minute") + else if (refreshViewCheck == "every_minute") interval = 60; else { - interval = parseInt(messageCheck.substr(6)) * 60; + interval = parseInt(refreshViewCheck.substr(6)) * 60; } - messageCheckTimer = window.setInterval(onMessageCheckCallback, - interval * 1000); + refreshViewCheckTimer = window.setInterval(onRefreshViewCheckCallback, + interval * 1000); } } -function onMessageCheckCallback(event) { +function onRefreshViewCheckCallback(event) { refreshMailbox(); } @@ -2447,8 +2451,8 @@ function onMenuLabelNone() { messages.push(Mailer.currentMessages[Mailer.currentMailbox]); else if (Object.isArray(document.menuTarget)) // Menu called from multiple selection in messages list view - $(document.menuTarget).collect(function(rowID) { - messages.push(rowID.substr(4)); + $(document.menuTarget).collect(function(row) { + messages.push(row.substr(4)); }); else // Menu called from one selection in messages list view @@ -2463,40 +2467,51 @@ function onMenuLabelNone() { } function onMenuLabelFlag() { - var messages = new Hash(); - var flag = this.readAttribute("data-name"); - - if (document.menuTarget.tagName == "DIV") - // Menu called from message content view - messages.set(Mailer.currentMessages[Mailer.currentMailbox], - $('row_' + Mailer.currentMessages[Mailer.currentMailbox]).getAttribute("labels")); - else if (Object.isArray(document.menuTarget)) - // Menu called from multiple selection in messages list view - $(document.menuTarget).collect(function(rowID) { - var row = $(rowID); - if (row) - messages.set(rowID.substr(4), - row.getAttribute("labels")); - }); - else - // Menu called from one selection in messages list view - messages.set(document.menuTarget.getAttribute("id").substr(4), - document.menuTarget.getAttribute("labels")); - var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/"; - messages.keys().each(function(id) { - var flags = messages.get(id).split(" "); - var operation = "add"; + var operation = "add"; + var msgUIDs; + var msgLabels; + if (!Object.isArray(document.menuTarget)) { + msgUIDs = Mailer.currentMessages[Mailer.currentMailbox]; + if (document.menuTarget.tagName == "DIV") + // Menu called from message content view + msgLabels = $('row_' + msgLabels).getAttribute("labels"); + else + // Menu called from one selection in messages list view + msgLabels = document.menuTarget.getAttribute("labels"); + + var flags = msgLabels.split(" "); if (flags.indexOf(flag) > -1) operation = "remove"; + } + else { + // Menu called from multiple selection in messages list view + var rows = $(document.menuTarget); + var blockedOperation = false; + for (var i = 0; i < rows.length; i++) { + var row = $(rows[i]); + if (row) { + msgUIDs.push(rows[i].substr(4)); + msgLabels = row.getAttribute("labels"); + + var flags = msgLabels.split(" "); + if (flags.indexOf(flag) > -1 && !blockedOperation) { + operation = "remove"; + } + else { + blockedOperation = true; + operation = "add"; + } + } + } + } - triggerAjaxRequest(url + id + "/" + operation + "Label?flag=" + flag.asCSSIdentifier(), - messageFlagCallback, - { mailbox: Mailer.currentMailbox, msg: id, - label: operation + flag } ); - }); + var callbackData = { mailbox: Mailer.currentMailbox, operation: operation, flag: flag }; + var content = {flags: flag.asCSSIdentifier(), msgUIDs: msgUIDs, operation: operation}; + content = Object.toJSON(content); + triggerAjaxRequest(url + operation + "Label", messageFlagCallback, callbackData, content); } function onMenuToggleMessageFlag(event) {