From 95c83d64e70e9c888b023d74d2cf42448659d9ea Mon Sep 17 00:00:00 2001 From: C Robert Date: Fri, 3 Oct 2008 19:01:29 +0000 Subject: [PATCH] See ChangeLog Monotone-Parent: 043af14fd2ae984a7c53179d03394ad062129d22 Monotone-Revision: 32554661a85cc9243d30ced4dbf571eab59b4ea3 Monotone-Author: crobert@inverse.ca Monotone-Date: 2008-10-03T19:01:29 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 17 ++++++ SoObjects/Mailer/SOGoMailFolder.m | 49 +++++++++++++++ UI/MailerUI/UIxMailActions.m | 40 ------------- UI/MailerUI/UIxMailFolderActions.m | 56 ++++++++++++++++++ UI/MailerUI/product.plist | 20 +++---- UI/WebServerResources/MailerUI.js | 95 +++++++++++++++++++----------- UI/WebServerResources/generic.css | 2 +- 7 files changed, 193 insertions(+), 86 deletions(-) diff --git a/ChangeLog b/ChangeLog index c82dd5abb..6a3b06321 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2008-10-03 Cyril Robert + * SoObjects/Mailer/SOGoMailFolder.m + Added copyUIDs and moveUIDs + + * UI/MailerUI/UIxMailActions.m + Removed copyAction and moveAction + + * UI/MailerUI/UIxMailFolderActions.m + Added copyMessagesAction and moveMessagesAction + + * UI/WebServerResources/MailerUI.js + Removed _onMailboxMenuAction + Modified onMailboxMenuCopy and onMailboxMenuMove + + Copying/Moving messages is now done with one POST. + Fixed bug #1893 + 2008-10-02 Cyril Robert * SoObjects/Mailer/SOGoMailFolder.m diff --git a/SoObjects/Mailer/SOGoMailFolder.m b/SoObjects/Mailer/SOGoMailFolder.m index f3908615c..1bca568d7 100644 --- a/SoObjects/Mailer/SOGoMailFolder.m +++ b/SoObjects/Mailer/SOGoMailFolder.m @@ -397,6 +397,55 @@ static NSString *spoolFolder = nil; return response; } +- (WOResponse *) copyUIDs: (NSArray *) uids + toFolder: (NSString *) destinationFolder + inContext: (id) localContext +{ + NSEnumerator *folders; + NSString *currentFolderName; + NSMutableString *imapDestinationFolder; + NGImap4Client *client; + id result; + + imapDestinationFolder = [NSMutableString string]; + folders = [[destinationFolder componentsSeparatedByString: @"/"] objectEnumerator]; + currentFolderName = [folders nextObject]; + while (currentFolderName) + { + if ([currentFolderName hasPrefix: @"folder"]) + { + [imapDestinationFolder appendString: @"/"]; + [imapDestinationFolder appendString: [currentFolderName substringFromIndex: 6]]; + } + currentFolderName = [folders nextObject]; + } + + client = [[self imap4Connection] client]; + [imap4 selectFolder: [self imap4URL]]; + + result = [client copyUids: uids toFolder: imapDestinationFolder]; + + if ([[result valueForKey: @"result"] boolValue]) + result = nil; + else + result = [NSException exceptionWithHTTPStatus: 500 reason: @"Couldn't copy UIDs."]; + + return result; +} + +- (WOResponse *) moveUIDs: (NSArray *) uids + toFolder: (NSString *) destinationFolder + inContext: (id) localContext +{ + id result; + result = [self copyUIDs: uids toFolder: destinationFolder inContext: localContext]; + + if ( ![result isNotNull] ) + result = [self deleteUIDs: uids inContext: localContext]; + + return result; +} + - (NSArray *) fetchUIDsMatchingQualifier: (id) _q sortOrdering: (id) _so { diff --git a/UI/MailerUI/UIxMailActions.m b/UI/MailerUI/UIxMailActions.m index 7657e125d..e38483a7e 100644 --- a/UI/MailerUI/UIxMailActions.m +++ b/UI/MailerUI/UIxMailActions.m @@ -89,46 +89,6 @@ return [self redirectToLocation: newLocation]; } -- (id) moveAction -{ - NSString *destinationFolder; - id response; - - destinationFolder = [[context request] formValueForKey: @"folder"]; - if ([destinationFolder length] > 0) - { - response = [[self clientObject] moveToFolderNamed: destinationFolder - inContext: context]; - if (!response) - response = [self responseWith204]; - } - else - response = [NSException exceptionWithHTTPStatus: 500 /* Server Error */ - reason: @"No destination folder given"]; - - return response; -} - -- (id) copyAction -{ - NSString *destinationFolder; - id response; - - destinationFolder = [[context request] formValueForKey: @"folder"]; - if ([destinationFolder length] > 0) - { - response = [[self clientObject] copyToFolderNamed: destinationFolder - inContext: context]; - if (!response) - response = [self responseWith204]; - } - else - response = [NSException exceptionWithHTTPStatus: 500 /* Server Error */ - reason: @"No destination folder given"]; - - return response; -} - /* active message */ - (id) markMessageUnreadAction diff --git a/UI/MailerUI/UIxMailFolderActions.m b/UI/MailerUI/UIxMailFolderActions.m index c7237b0d5..d1e757d7b 100644 --- a/UI/MailerUI/UIxMailFolderActions.m +++ b/UI/MailerUI/UIxMailFolderActions.m @@ -236,6 +236,62 @@ return response; } +- (WOResponse *) copyMessagesAction +{ + SOGoMailFolder *co; + WOResponse *response; + NSArray *uids; + NSString *value, *destinationFolder; + + co = [self clientObject]; + value = [[context request] formValueForKey: @"uid"]; + destinationFolder = [[context request] formValueForKey: @"folder"]; + response = nil; + + if ([value length] > 0) + { + uids = [value componentsSeparatedByString: @","]; + response = [co copyUIDs: uids toFolder: destinationFolder inContext: context]; + if (!response) + response = [self responseWith204]; + } + else + { + response = [self responseWithStatus: 500]; + [response appendContentString: @"Missing 'uid' parameter."]; + } + + return response; +} + +- (WOResponse *) moveMessagesAction +{ + SOGoMailFolder *co; + WOResponse *response; + NSArray *uids; + NSString *value, *destinationFolder; + + co = [self clientObject]; + value = [[context request] formValueForKey: @"uid"]; + destinationFolder = [[context request] formValueForKey: @"folder"]; + response = nil; + + if ([value length] > 0) + { + uids = [value componentsSeparatedByString: @","]; + response = [co moveUIDs: uids toFolder: destinationFolder inContext: context]; + if (!response) + response = [self responseWith204]; + } + else + { + response = [self responseWithStatus: 500]; + [response appendContentString: @"Missing 'uid' parameter."]; + } + + return response; +} + - (WOResponse *) _setFolderPurpose: (NSString *) purpose { SOGoMailFolder *co; diff --git a/UI/MailerUI/product.plist b/UI/MailerUI/product.plist index f759eea14..6dae0b952 100644 --- a/UI/MailerUI/product.plist +++ b/UI/MailerUI/product.plist @@ -146,6 +146,16 @@ actionClass = "UIxMailFolderActions"; actionName = "saveMessages"; }; + copyMessages = { + protectedBy = "View"; + actionClass = "UIxMailFolderActions"; + actionName = "copyMessages"; + }; + moveMessages = { + protectedBy = "View"; + actionClass = "UIxMailFolderActions"; + actionName = "moveMessages"; + }; setAsDraftsFolder = { protectedBy = "View"; actionClass = "UIxMailFolderActions"; @@ -211,16 +221,6 @@ protectedBy = "View"; pageName = "UIxMailPopupView"; }; - move = { - protectedBy = "View"; - actionClass = "UIxMailActions"; - actionName = "move"; - }; - copy = { - protectedBy = "View"; - actionClass = "UIxMailActions"; - actionName = "copy"; - }; junk = { protectedBy = "View"; actionClass = "UIxMailActions"; diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index 8ac2dcef7..3e3adfc5d 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -422,45 +422,49 @@ function onMailboxTreeItemClick(event) { Event.stop(event); } -function _onMailboxMenuAction(menuEntry, error, actionName) { - var targetMailbox = menuEntry.mailbox.fullName(); - var messages = new Array(); - - if (targetMailbox == Mailer.currentMailbox) - window.alert(labels[error]); - else { - if (document.menuTarget.tagName == "DIV") - // Menu called from message content view - messages.push(Mailer.currentMessages[Mailer.currentMailbox]); - else if (Object.isArray(document.menuTarget)) - // Menu called from multiple selection in messages list view - messages = $(document.menuTarget).collect(function(row) { - return row.getAttribute("id").substr(4); - }); - else - // Menu called from one selection in messages list view - messages.push(document.menuTarget.getAttribute("id").substr(4)); - - var url_prefix = URLForFolderID(Mailer.currentMailbox) + "/"; - messages.each(function(msgid, i) { - var url = url_prefix + msgid + "/" + actionName - + "?folder=" + encodeURIComponent(targetMailbox); - triggerAjaxRequest(url, folderRefreshCallback, - ((i == messages.size() - 1)?Mailer.currentMailbox:"")); - }); - } -} - function onMailboxMenuMove(event) { - _onMailboxMenuAction(this, - "Moving a message into its own folder is impossible!", - "move"); + var targetMailbox = this.mailbox.fullName(); + var messageList = $("messageList").down("TBODY"); + var rows = messageList.getSelectedNodes(); + var uids = new Array(); // message IDs + var paths = new Array(); // row IDs + + for (var i = 0; i < rows.length; i++) { + var uid = rows[i].readAttribute("id").substr(4); + var path = Mailer.currentMailbox + "/" + uid; + rows[i].hide(); + uids.push(uid); + paths.push(path); + } + var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/moveMessages"; + var parameters = "uid=" + uids.join(",") + "&folder=" + targetMailbox; + var data = { "id": uids, "mailbox": Mailer.currentMailbox, "path": paths, "folder": targetMailbox }; + triggerAjaxRequest(url, folderRefreshCallback, data, parameters, + { "Content-type": "application/x-www-form-urlencoded" }); + + return false; } function onMailboxMenuCopy(event) { - _onMailboxMenuAction(this, - "Copying a message into its own folder is impossible!", - "copy"); + var targetMailbox = this.mailbox.fullName(); + var messageList = $("messageList").down("TBODY"); + var rows = messageList.getSelectedNodes(); + var uids = new Array(); // message IDs + var paths = new Array(); // row IDs + + for (var i = 0; i < rows.length; i++) { + var uid = rows[i].readAttribute("id").substr(4); + var path = Mailer.currentMailbox + "/" + uid; + uids.push(uid); + paths.push(path); + } + var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/copyMessages"; + var parameters = "uid=" + uids.join(",") + "&folder=" + targetMailbox; + var data = { "id": uids, "mailbox": Mailer.currentMailbox, "path": paths, "folder": targetMailbox }; + triggerAjaxRequest(url, folderRefreshCallback, data, parameters, + { "Content-type": "application/x-www-form-urlencoded" }); + + return false; } function refreshMailbox() { @@ -1491,9 +1495,23 @@ function generateMenuForMailbox(mailbox, prefix, callback) { previousMenuDIV.parentNode.removeChild(previousMenuDIV); menuDIV.setAttribute("id", menuID); var menu = document.createElement("ul"); + menu.style.cssFloat="left"; + menu.style.styleFloat="left"; menuDIV.appendChild(menu); pageContent.appendChild(menuDIV); + var windowHeight = 0; + if ( typeof(window.innerHeight) != "undefined" && window.innerHeight != 0 ) { + windowHeight = window.innerHeight; + } + else { + windowHeight = document.body.clientHeight; + } + var offset = 70; + if ( navigator.appVersion.indexOf("Safari") >= 0 ) { + offset = 140; + } + var callbacks = new Array(); if (mailbox.type != "account") { var newNode = document.createElement("li"); @@ -1507,6 +1525,12 @@ function generateMenuForMailbox(mailbox, prefix, callback) { var submenuCount = 0; for (var i = 0; i < mailbox.children.length; i++) { + if ( menu.offsetHeight > windowHeight-offset ) { + menu = document.createElement("ul"); + menu.style.cssFloat="left"; + menu.style.styleFloat="left"; + menuDIV.appendChild(menu); + } var child = mailbox.children[i]; var newNode = mailboxMenuNode(child.type, child.name); menu.appendChild(newNode); @@ -1521,6 +1545,7 @@ function generateMenuForMailbox(mailbox, prefix, callback) { callbacks.push(callback); } } + initMenu(menuDIV, callbacks); return menuDIV.getAttribute("id"); diff --git a/UI/WebServerResources/generic.css b/UI/WebServerResources/generic.css index 2d162514c..c5972e26a 100644 --- a/UI/WebServerResources/generic.css +++ b/UI/WebServerResources/generic.css @@ -327,7 +327,7 @@ SPAN.toolbarButton:active border-top: 1px solid #fff; border-left: 1px solid #fff; border-right: 1px solid #9e9a92; - border-bottom: 1px solid #9e9a92; } + /*border-bottom: 1px solid #9e9a92;*/ } .menu LI, .popupMenu LI