From 545e6693faae365f1982e36bdc169bac68ca4e9f Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Mon, 19 Apr 2010 16:35:35 +0000 Subject: [PATCH] Monotone-Parent: 75ec663b4b26859e635b90a350146642970dc3c2 Monotone-Revision: a5a4c03e7f73726c0698328f9ab3e90d3a4a2432 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2010-04-19T16:35:35 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 12 ++++++ .../Localizable.strings | 1 + UI/Contacts/Czech.lproj/Localizable.strings | 1 + UI/Contacts/Dutch.lproj/Localizable.strings | 1 + UI/Contacts/English.lproj/Localizable.strings | 1 + UI/Contacts/French.lproj/Localizable.strings | 1 + UI/Contacts/German.lproj/Localizable.strings | 1 + .../Hungarian.lproj/Localizable.strings | 1 + UI/Contacts/Italian.lproj/Localizable.strings | 1 + UI/Contacts/Russian.lproj/Localizable.strings | 1 + UI/Contacts/Spanish.lproj/Localizable.strings | 1 + UI/Contacts/Swedish.lproj/Localizable.strings | 1 + UI/Contacts/UIxContactFolderActions.m | 39 ++++++++++--------- UI/Contacts/Welsh.lproj/Localizable.strings | 1 + UI/Contacts/product.plist | 5 +++ .../ContactsUI/UIxContactFoldersView.wox | 4 +- UI/WebServerResources/ContactsUI.js | 30 ++++++++++---- 17 files changed, 75 insertions(+), 27 deletions(-) diff --git a/ChangeLog b/ChangeLog index 082b71673..e0cc277c0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,17 @@ 2010-04-19 Wolfgang Sourdeau + * UI/Contacts/UIxContactFolderActions.m (-exportAction): improved + method by providing the encoded filename of the address book + following rfc2047. Make the "uids" parameter optional: when + omitted, the address book is exported completely. + + * UI/WebServerResources/ContactsUI.js (getMenus): added entry for + exporting the address books, slightly reorganized the entries. + (onAddressBooksMenuPrepareVisibility): grey out the "export" entry + for LDAP address books. + (onAddressBookExport): new callback for exporting addressbooks + from the contextual menu. + * UI/WebServerResources/generic.js (URLForFolderID): avoid double slashes in the URL returned for personal folders. diff --git a/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings b/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings index b21d0ffe5..ab0cb83c3 100644 --- a/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings @@ -179,6 +179,7 @@ "Add" = "Add"; "Lists can't be moved or copied." = "Lists can't be moved or copied."; "Export" = "Export"; +"Export Address Book..." = "Export Address Book..."; "Import Cards" = "Import Cards"; "Select a vCard or LDIF file." = "Select a vCard or LDIF file."; "Upload" = "Upload"; diff --git a/UI/Contacts/Czech.lproj/Localizable.strings b/UI/Contacts/Czech.lproj/Localizable.strings index ed461a42a..2a6e4d474 100644 --- a/UI/Contacts/Czech.lproj/Localizable.strings +++ b/UI/Contacts/Czech.lproj/Localizable.strings @@ -179,6 +179,7 @@ "Add" = "Přidat"; "Lists can't be moved or copied." = "Skupinu nelze přesunout nebo kopírovat."; "Export" = "Exportovat"; +"Export Address Book..." = "Export Address Book..."; "Import Cards" = "Importovat kontakty"; "Select a vCard or LDIF file." = "Zvolte LDIF nebo vCard soubor."; "Upload" = "Upload"; diff --git a/UI/Contacts/Dutch.lproj/Localizable.strings b/UI/Contacts/Dutch.lproj/Localizable.strings index e45cb8011..3cad750d0 100644 --- a/UI/Contacts/Dutch.lproj/Localizable.strings +++ b/UI/Contacts/Dutch.lproj/Localizable.strings @@ -179,6 +179,7 @@ "Add" = "Add"; "Lists can't be moved or copied." = "Lists can't be moved or copied."; "Export" = "Export"; +"Export Address Book..." = "Export Address Book..."; "Import Cards" = "Import Cards"; "Select a vCard or LDIF file." = "Select LDIF or vCard file."; "Upload" = "Upload"; diff --git a/UI/Contacts/English.lproj/Localizable.strings b/UI/Contacts/English.lproj/Localizable.strings index dacba8862..7854571b1 100644 --- a/UI/Contacts/English.lproj/Localizable.strings +++ b/UI/Contacts/English.lproj/Localizable.strings @@ -179,6 +179,7 @@ "Add" = "Add"; "Lists can't be moved or copied." = "Lists can't be moved or copied."; "Export" = "Export"; +"Export Address Book..." = "Export Address Book..."; "Import Cards" = "Import Cards"; "Select a vCard or LDIF file." = "Select a vCard or LDIF file."; "Upload" = "Upload"; diff --git a/UI/Contacts/French.lproj/Localizable.strings b/UI/Contacts/French.lproj/Localizable.strings index 8e7f5ff37..d54b26a73 100644 --- a/UI/Contacts/French.lproj/Localizable.strings +++ b/UI/Contacts/French.lproj/Localizable.strings @@ -179,6 +179,7 @@ "Add" = "Ajouter"; "Lists can't be moved or copied." = "Les listes ne peuvent pas être déplacées ou copiées."; "Export" = "Exporter"; +"Export Address Book..." = "Exporter le carnet d'adresses..."; "Import Cards" = "Importer des contacts"; "Select a vCard or LDIF file." = "Sélectionner un fichier. LDIF ou vCard."; "Upload" = "Ajouter"; diff --git a/UI/Contacts/German.lproj/Localizable.strings b/UI/Contacts/German.lproj/Localizable.strings index b51e855b6..4b1e83f57 100644 --- a/UI/Contacts/German.lproj/Localizable.strings +++ b/UI/Contacts/German.lproj/Localizable.strings @@ -179,6 +179,7 @@ "Add" = "Add"; "Lists can't be moved or copied." = "Lists can't be moved or copied."; "Export" = "Export"; +"Export Address Book..." = "Export Address Book..."; "Import Cards" = "Import Cards"; "Select a vCard or LDIF file." = "Select a vCard or LDIF file."; "Upload" = "Upload"; diff --git a/UI/Contacts/Hungarian.lproj/Localizable.strings b/UI/Contacts/Hungarian.lproj/Localizable.strings index 4a658e0fc..5c0d1e72f 100644 --- a/UI/Contacts/Hungarian.lproj/Localizable.strings +++ b/UI/Contacts/Hungarian.lproj/Localizable.strings @@ -179,6 +179,7 @@ "Add" = "Add"; "Lists can't be moved or copied." = "Lists can't be moved or copied."; "Export" = "Export"; +"Export Address Book..." = "Export Address Book..."; "Import Cards" = "Import Cards"; "Select a vCard or LDIF file." = "Select LDIF or vCard file."; "Upload" = "Upload"; diff --git a/UI/Contacts/Italian.lproj/Localizable.strings b/UI/Contacts/Italian.lproj/Localizable.strings index 979ffa92b..74f336f51 100644 --- a/UI/Contacts/Italian.lproj/Localizable.strings +++ b/UI/Contacts/Italian.lproj/Localizable.strings @@ -179,6 +179,7 @@ "Add" = "Add"; "Lists can't be moved or copied." = "Lists can't be moved or copied."; "Export" = "Export"; +"Export Address Book..." = "Export Address Book..."; "Import Cards" = "Import Cards"; "Select a vCard or LDIF file." = "Select a vCard or LDIF file."; "Upload" = "Upload"; diff --git a/UI/Contacts/Russian.lproj/Localizable.strings b/UI/Contacts/Russian.lproj/Localizable.strings index 06f2778d3..861aeb81c 100644 --- a/UI/Contacts/Russian.lproj/Localizable.strings +++ b/UI/Contacts/Russian.lproj/Localizable.strings @@ -165,6 +165,7 @@ "Lists can't be moved or copied." = "Lists can't be moved or copied."; "Export" = "Export"; +"Export Address Book..." = "Export Address Book..."; "Import Cards" = "Import Cards"; "Select a vCard or LDIF file." = "Select a vCard or LDIF file."; "Upload" = "Upload"; diff --git a/UI/Contacts/Spanish.lproj/Localizable.strings b/UI/Contacts/Spanish.lproj/Localizable.strings index 656ad5a38..76d33cac1 100644 --- a/UI/Contacts/Spanish.lproj/Localizable.strings +++ b/UI/Contacts/Spanish.lproj/Localizable.strings @@ -179,6 +179,7 @@ "Add" = "Add"; "Lists can't be moved or copied." = "Lists can't be moved or copied."; "Export" = "Export"; +"Export Address Book..." = "Export Address Book..."; "Import Cards" = "Import Cards"; "Select a vCard or LDIF file." = "Select a vCard or LDIF file."; "Upload" = "Upload"; diff --git a/UI/Contacts/Swedish.lproj/Localizable.strings b/UI/Contacts/Swedish.lproj/Localizable.strings index 123a98281..a8ebac646 100644 --- a/UI/Contacts/Swedish.lproj/Localizable.strings +++ b/UI/Contacts/Swedish.lproj/Localizable.strings @@ -179,6 +179,7 @@ "Add" = "Lägg till"; "Lists can't be moved or copied." = "Utskickslistor kan inte flyttas eller kopieras."; "Export" = "Exportera"; +"Export Address Book..." = "Export Address Book..."; "Import Cards" = "Importera adresskort"; "Select a vCard or LDIF file." = "Välj ett vCard eller LDIF fil."; "Upload" = "Ladda upp"; diff --git a/UI/Contacts/UIxContactFolderActions.m b/UI/Contacts/UIxContactFolderActions.m index ff6b1876e..e5f4e746d 100644 --- a/UI/Contacts/UIxContactFolderActions.m +++ b/UI/Contacts/UIxContactFolderActions.m @@ -56,39 +56,40 @@ WOResponse *response; NSArray *contactsId; NSEnumerator *uids; - NSString *uid, *filename; + NSString *uid, *filename, *disposition; id currentChild; SOGoContactGCSFolder *sourceFolder; NSMutableString *content; content = [NSMutableString string]; request = [context request]; + sourceFolder = [self clientObject]; contactsId = [request formValuesForKey: @"uid"]; - if (contactsId) + if (!contactsId) + contactsId = [sourceFolder toOneRelationshipKeys]; + + uids = [contactsId objectEnumerator]; + while ((uid = [uids nextObject])) { - sourceFolder = [self clientObject]; - uids = [contactsId objectEnumerator]; - while ((uid = [uids nextObject])) - { - currentChild = [sourceFolder lookupName: uid - inContext: [self context] - acquire: NO]; - if ([currentChild respondsToSelector: @selector (vCard)]) - [content appendFormat: [[currentChild vCard] ldifString]]; - else if ([currentChild respondsToSelector: @selector (vList)]) - [content appendFormat: [[currentChild vList] ldifString]]; - } + currentChild = [sourceFolder lookupName: uid + inContext: [self context] + acquire: NO]; + if ([currentChild respondsToSelector: @selector (vCard)]) + [content appendFormat: [[currentChild vCard] ldifString]]; + else if ([currentChild respondsToSelector: @selector (vList)]) + [content appendFormat: [[currentChild vList] ldifString]]; } - filename = [NSString stringWithFormat: @"attachment;filename=\"%@.ldif\"", - [sourceFolder displayName]]; response = [context response]; [response setHeader: @"application/octet-stream; charset=utf-8" forKey: @"content-type"]; - [response setHeader: filename - forKey: @"Content-Disposition"]; + filename = [NSString stringWithFormat: @"%@.ldif", + [sourceFolder displayName]]; + disposition = [NSString stringWithFormat: @"attachment; filename=\"%@\"", + [filename asQPSubjectString: @"utf-8"]]; + [response setHeader: disposition forKey: @"Content-Disposition"]; [response setContent: [content dataUsingEncoding: NSUTF8StringEncoding]]; - + return response; } diff --git a/UI/Contacts/Welsh.lproj/Localizable.strings b/UI/Contacts/Welsh.lproj/Localizable.strings index 810e1fafd..dd9b8720c 100644 --- a/UI/Contacts/Welsh.lproj/Localizable.strings +++ b/UI/Contacts/Welsh.lproj/Localizable.strings @@ -164,6 +164,7 @@ "Lists can't be moved or copied." = "Lists can't be moved or copied."; "Export" = "Export"; +"Export Address Book..." = "Export Address Book..."; "Import Cards" = "Import Cards"; "Select a vCard or LDIF file." = "Select a vCard or LDIF file."; "Upload" = "Upload"; diff --git a/UI/Contacts/product.plist b/UI/Contacts/product.plist index a0c6a512d..c6a05e72c 100644 --- a/UI/Contacts/product.plist +++ b/UI/Contacts/product.plist @@ -103,6 +103,11 @@ actionClass = "UIxContactFolderActions"; actionName = "export"; }; + exportFolder = { + protectedBy = "View"; + actionClass = "UIxContactFolderActions"; + actionName = "export"; + }; import = { protectedBy = "View"; actionClass = "UIxContactFolderActions"; diff --git a/UI/Templates/ContactsUI/UIxContactFoldersView.wox b/UI/Templates/ContactsUI/UIxContactFoldersView.wox index 74eee38e7..318d811cd 100644 --- a/UI/Templates/ContactsUI/UIxContactFoldersView.wox +++ b/UI/Templates/ContactsUI/UIxContactFoldersView.wox @@ -60,9 +60,11 @@
  • -
  • +
  • +
  • +
  • diff --git a/UI/WebServerResources/ContactsUI.js b/UI/WebServerResources/ContactsUI.js index db719bde1..243b1309b 100644 --- a/UI/WebServerResources/ContactsUI.js +++ b/UI/WebServerResources/ContactsUI.js @@ -689,6 +689,15 @@ function onFolderUnsubscribeCB(folderId) { onFolderSelectionChange(); } +function onAddressBookExport(event) { + var node = $("contactFolders").getSelectedNodes().first(); + var folderID = node.getAttribute("id"); + var url = URLForFolderID(folderID) + "/exportFolder"; + window.location.href = url; + + event.stop(); +} + function onAddressBookImport(event) { var node = $("contactFolders").getSelectedNodes().first(); var folderId = node.getAttribute("id"); @@ -1000,9 +1009,10 @@ function onAddressBooksMenuPrepareVisibility() { var menu = $("contactFoldersMenu").down("ul");; var listElements = menu.childNodesWithTag("li"); - var modifyOption = $(listElements[0]); - var removeOption = $(listElements[5]); - var sharingOption = $(listElements[listElements.length - 1]); + var modifyOption = listElements[0]; + var removeOption = listElements[5]; + var exportOption = listElements[7]; + var sharingOption = listElements[listElements.length - 1]; // Disable the "Sharing" and "Modify" options when address book // is not owned by user @@ -1015,11 +1025,16 @@ function onAddressBooksMenuPrepareVisibility() { sharingOption.addClassName("disabled"); } - // Disable the "remove" option when address book is public - if (folderOwner == "nobody") + /* Disable the "remove" and "export ab" options when address book is + public */ + if (folderOwner == "nobody") { + exportOption.addClassName("disabled"); removeOption.addClassName("disabled"); - else + } + else { + exportOption.removeClassName("disabled"); removeOption.removeClassName("disabled"); + } return true; } @@ -1072,8 +1087,9 @@ function onContactMenuPrepareVisibility() { function getMenus() { var menus = {}; menus["contactFoldersMenu"] = new Array(onAddressBookModify, "-", newContact, - newList, "-", onAddressBookImport, + newList, "-", onAddressBookRemove, "-", + onAddressBookExport, onAddressBookImport, "-", onMenuSharing); menus["contactMenu"] = new Array(onMenuEditContact, "-", onMenuWriteToContact, onMenuAIMContact,