From 030c456ced93c43bf394cff1e1cb89fca83890dd Mon Sep 17 00:00:00 2001 From: wolfgang Date: Sat, 15 Sep 2007 01:56:19 +0000 Subject: [PATCH] git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1174 d1b88da0-ebda-0310-925b-ed51d893ca5b --- ChangeLog | 20 +++ NEWS | 5 +- .../Appointments/SOGoAppointmentFolder.h | 2 - .../Appointments/SOGoAppointmentFolder.m | 20 --- .../Appointments/SOGoAppointmentFolders.h | 32 ++++ .../Appointments/SOGoAppointmentFolders.m | 46 ++++++ SoObjects/Appointments/SOGoFreeBusyObject.m | 11 +- SoObjects/Appointments/SOGoTaskObject.m | 121 +++++++------- SoObjects/SOGo/SOGoFolder.h | 2 + SoObjects/SOGo/SOGoFolder.m | 17 ++ UI/Common/English.lproj/Localizable.strings | 14 +- UI/Common/French.lproj/Localizable.strings | 2 + UI/Common/German.lproj/Localizable.strings | 2 + UI/Common/UIxFolderActions.m | 43 +++-- UI/Common/UIxParentFolderActions.h | 31 ++++ UI/Common/UIxParentFolderActions.m | 61 +++++++ UI/Common/UIxToolbar.m | 9 ++ UI/Common/product.plist | 5 + UI/Contacts/English.lproj/Localizable.strings | 11 ++ UI/Contacts/French.lproj/Localizable.strings | 11 ++ UI/Contacts/German.lproj/Localizable.strings | 3 + UI/MailerUI/English.lproj/Localizable.strings | 17 ++ UI/MailerUI/French.lproj/Localizable.strings | 17 ++ .../English.lproj/Localizable.strings | 14 ++ UI/Scheduler/French.lproj/Localizable.strings | 14 ++ UI/Scheduler/German.lproj/Localizable.strings | 3 + UI/Scheduler/UIxCalMainView.m | 15 -- UI/Scheduler/UIxCalendarSelector.m | 2 +- UI/Scheduler/product.plist | 23 +-- .../SchedulerUI/UIxComponentEditor.wox | 5 + UI/Templates/UIxPageFrame.wox | 1 + UI/Templates/UIxToolbar.wox | 8 +- UI/WebServerResources/ContactsUI.css | 18 ++- UI/WebServerResources/ContactsUI.js | 61 +++++-- UI/WebServerResources/HTMLTableElement.js | 23 +++ UI/WebServerResources/MailerUI.css | 30 ++-- UI/WebServerResources/MailerUI.js | 36 +++-- UI/WebServerResources/SchedulerUI.js | 151 ++++++++++-------- UI/WebServerResources/UIxComponentEditor.js | 4 +- UI/WebServerResources/generic.css | 33 ++-- UI/WebServerResources/generic.js | 32 ++-- 41 files changed, 698 insertions(+), 277 deletions(-) create mode 100644 SoObjects/Appointments/SOGoAppointmentFolders.h create mode 100644 SoObjects/Appointments/SOGoAppointmentFolders.m create mode 100644 UI/Common/UIxParentFolderActions.h create mode 100644 UI/Common/UIxParentFolderActions.m diff --git a/ChangeLog b/ChangeLog index 8ce905a8..a4c799c2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,25 @@ 2007-09-14 Wolfgang Sourdeau + * SoObjects/Appointments/SOGoAppointmentFolder.m + ([-deleteEntriesWithIds:ids]): moved method into SOGoFolder. + + * UI/Scheduler/UIxCalMainView.m ([-batchDeleteAction]): moved + method into UIxFolderActions. + + * SoObjects/Appointments/SOGoFreeBusyObject.m ([SOGoFreeBusyObject + -fetchFreeBusyInfosFrom:_startDateto:_endDate]): fetch the + freebusy info from the "personal" calendar. + + * UI/Common/UIxParentFolderActions.m ([UIxParentFolderActions + -createFolderAction]): new standardized method for requesting + folder creations among gcs-based modules. + + * UI/Common/UIxParentFolderActions.[hm]: new action class module. + + * SoObjects/Appointments/SOGoAppointmentFolders.m: new class + module, equivalent to the SOGoParentFolder's child + SOGoContactFolders, but for calendars. + * SoObjects/SOGo/SOGoObject.m ([SOGoObject -labelForKey:key]): new method that returns translated strings for controller bundles (same as what UIxComponent does for view bundles). diff --git a/NEWS b/NEWS index b5142639..e6fe36e0 100644 --- a/NEWS +++ b/NEWS @@ -5,8 +5,11 @@ given during an indirect bind; - deleting a message no longer expunges its parent folder; - implemented support for multiple calendars; -- it is not possible to rename folders; +- it is now possible to rename folders; - fixed search in message content; +- added tooltips for toolbar buttons (English and French); +- added checkmarks in live search options popup menus; +- initial support for resizable columns in tables; - countless bugfixes; 0.9.0-20070824 diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.h b/SoObjects/Appointments/SOGoAppointmentFolder.h index 06edea0e..5f5ee41d 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.h +++ b/SoObjects/Appointments/SOGoAppointmentFolder.h @@ -84,8 +84,6 @@ - (NSArray *) fetchFreeBusyInfosFrom: (NSCalendarDate *) _startDate to: (NSCalendarDate *) _endDate; -- (void) deleteEntriesWithIds: (NSArray *) ids; - /* URL generation */ - (NSString *) baseURLForAptWithUID: (NSString *) _uid diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.m b/SoObjects/Appointments/SOGoAppointmentFolder.m index 38c34a94..a517d18d 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.m +++ b/SoObjects/Appointments/SOGoAppointmentFolder.m @@ -933,26 +933,6 @@ static NSNumber *sharedYes = nil; component: _component]; } -- (void) deleteEntriesWithIds: (NSArray *) ids -{ - Class objectClass; - unsigned int count, max; - NSString *currentId; - id deleteObject; - - max = [ids count]; - for (count = 0; count < max; count++) - { - currentId = [ids objectAtIndex: count]; - objectClass - = [self objectClassForResourceNamed: currentId]; - deleteObject = [objectClass objectWithName: currentId - inContainer: self]; - [deleteObject delete]; - [deleteObject primaryDelete]; - } -} - /* URL generation */ - (NSString *) baseURLForAptWithUID: (NSString *)_uid diff --git a/SoObjects/Appointments/SOGoAppointmentFolders.h b/SoObjects/Appointments/SOGoAppointmentFolders.h new file mode 100644 index 00000000..287a0904 --- /dev/null +++ b/SoObjects/Appointments/SOGoAppointmentFolders.h @@ -0,0 +1,32 @@ +/* SOGoAppointmentFolders.h - this file is part of SOGo + * + * Copyright (C) 2007 Inverse groupe conseil + * + * Author: Wolfgang Sourdeau + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef SOGOAPPOINTMENTFOLDERS_H +#define SOGOAPPOINTMENTFOLDERS_H + +#import + +@interface SOGoAppointmentFolders : SOGoParentFolder + +@end + +#endif /* SOGOAPPOINTMENTFOLDERS_H */ diff --git a/SoObjects/Appointments/SOGoAppointmentFolders.m b/SoObjects/Appointments/SOGoAppointmentFolders.m new file mode 100644 index 00000000..151f66fc --- /dev/null +++ b/SoObjects/Appointments/SOGoAppointmentFolders.m @@ -0,0 +1,46 @@ +/* SOGoAppointmentFolders.m - this file is part of SOGo + * + * Copyright (C) 2007 Inverse groupe conseil + * + * Author: Wolfgang Sourdeau + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#import + +#import "SOGoAppointmentFolder.h" + +#import "SOGoAppointmentFolders.h" + +@implementation SOGoAppointmentFolders + ++ (NSString *) gcsFolderType +{ + return @"Appointment"; +} + ++ (Class) subFolderClass +{ + return [SOGoAppointmentFolder class]; +} + +- (NSString *) defaultFolderName +{ + return @"Personal calendar"; +} + +@end diff --git a/SoObjects/Appointments/SOGoFreeBusyObject.m b/SoObjects/Appointments/SOGoFreeBusyObject.m index bddee8ac..ef40274d 100644 --- a/SoObjects/Appointments/SOGoFreeBusyObject.m +++ b/SoObjects/Appointments/SOGoFreeBusyObject.m @@ -35,6 +35,8 @@ #import #import +#import "SOGoAppointmentFolder.h" + #import "SOGoFreeBusyObject.h" @interface SOGoFreeBusyObject (PrivateAPI) @@ -80,17 +82,18 @@ - (NSArray *) fetchFreeBusyInfosFrom: (NSCalendarDate *) _startDate to: (NSCalendarDate *) _endDate { - id calFolder; + SOGoAppointmentFolder *calFolder; // SoSecurityManager *sm; NSArray *infos; - calFolder = [container lookupName: @"Calendar" inContext: nil acquire: NO]; + calFolder = [[container lookupName: @"Calendar" inContext: nil acquire: NO] + lookupName: @"personal" inContext: nil acquire: NO]; // sm = [SoSecurityManager sharedSecurityManager]; // if (![sm validatePermission: SOGoPerm_FreeBusyLookup // onObject: calFolder // inContext: context]) - infos = [calFolder fetchFreeBusyInfosFrom: _startDate - to: _endDate]; + infos = [calFolder fetchFreeBusyInfosFrom: _startDate + to: _endDate]; // else // { // infos = [NSArray new]; diff --git a/SoObjects/Appointments/SOGoTaskObject.m b/SoObjects/Appointments/SOGoTaskObject.m index 2357ac8b..5c628fa6 100644 --- a/SoObjects/Appointments/SOGoTaskObject.m +++ b/SoObjects/Appointments/SOGoTaskObject.m @@ -160,38 +160,38 @@ static NSString *mailTemplateDefaultLanguage = nil; } return allErrors; } -- (NSException *)deleteInUIDs:(NSArray *)_uids { - NSEnumerator *e; - id folder; - NSException *allErrors = nil; +// - (NSException *)deleteInUIDs:(NSArray *)_uids { +// NSEnumerator *e; +// id folder; +// NSException *allErrors = nil; - e = [[container lookupCalendarFoldersForUIDs: _uids inContext: context] - objectEnumerator]; - while ((folder = [e nextObject])) { - NSException *error; - SOGoTaskObject *task; +// e = [[container lookupCalendarFoldersForUIDs: _uids inContext: context] +// objectEnumerator]; +// while ((folder = [e nextObject])) { +// NSException *error; +// SOGoTaskObject *task; - task = [folder lookupName: [self nameInContainer] - inContext: context - acquire: NO]; - if (![task isNotNull]) { - [self logWithFormat:@"Note: did not find '%@' in folder: %@", - [self nameInContainer], folder]; - continue; - } - if ([task isKindOfClass: [NSException class]]) { - [self logWithFormat:@"Exception: %@", [(NSException *) task reason]]; - continue; - } +// task = [folder lookupName: [self nameInContainer] +// inContext: context +// acquire: NO]; +// if (![task isNotNull]) { +// [self logWithFormat:@"Note: did not find '%@' in folder: %@", +// [self nameInContainer], folder]; +// continue; +// } +// if ([task isKindOfClass: [NSException class]]) { +// [self logWithFormat:@"Exception: %@", [(NSException *) task reason]]; +// continue; +// } - if ((error = [task primaryDelete]) != nil) { - [self logWithFormat:@"Note: failed to delete in folder: %@", folder]; - // TODO: make compound - allErrors = error; - } - } - return allErrors; -} +// if ((error = [task primaryDelete]) != nil) { +// [self logWithFormat:@"Note: failed to delete in folder: %@", folder]; +// // TODO: make compound +// allErrors = error; +// } +// } +// return allErrors; +// } /* "iCal multifolder saves" */ @@ -396,45 +396,48 @@ static NSString *mailTemplateDefaultLanguage = nil; - delete in removed folders - send iMIP mail for all folders not found */ - iCalToDo *task; - NSArray *removedUIDs; - NSMutableArray *attendees; +// iCalToDo *task; +// NSArray *removedUIDs; +// NSMutableArray *attendees; - /* load existing content */ + [self primaryDelete]; + + return nil; +// /* load existing content */ - task = (iCalToDo *) [self component: NO]; +// task = (iCalToDo *) [self component: NO]; - /* compare sequence if requested */ +// /* compare sequence if requested */ - if (_v != 0) { - // TODO - } +// if (_v != 0) { +// // TODO +// } - removedUIDs = [self attendeeUIDsFromTask:task]; +// removedUIDs = [self attendeeUIDsFromTask:task]; - if ([self sendEMailNotifications]) - { - /* send notification email to attendees excluding organizer */ - attendees = [NSMutableArray arrayWithArray:[task attendees]]; - [attendees removePerson:[task organizer]]; +// if ([self sendEMailNotifications]) +// { +// /* send notification email to attendees excluding organizer */ +// attendees = [NSMutableArray arrayWithArray:[task attendees]]; +// [attendees removePerson:[task organizer]]; - /* flag task as being cancelled */ - [(iCalCalendar *) [task parent] setMethod: @"cancel"]; - [task increaseSequence]; - - /* remove all attendees to signal complete removal */ - [task removeAllAttendees]; - - /* send notification email */ - [self sendEMailUsingTemplateNamed: @"Deletion" - forOldObject: nil - andNewObject: task - toAttendees: attendees]; - } +// /* flag task as being cancelled */ +// [(iCalCalendar *) [task parent] setMethod: @"cancel"]; +// [task increaseSequence]; + +// /* remove all attendees to signal complete removal */ +// [task removeAllAttendees]; + +// /* send notification email */ +// [self sendEMailUsingTemplateNamed: @"Deletion" +// forOldObject: nil +// andNewObject: task +// toAttendees: attendees]; +// } - /* perform */ +// /* perform */ - return [self deleteInUIDs:removedUIDs]; +// return [self deleteInUIDs:removedUIDs]; } - (NSException *)saveContentString:(NSString *)_iCalString { diff --git a/SoObjects/SOGo/SOGoFolder.h b/SoObjects/SOGo/SOGoFolder.h index ed57b805..ccca8e7d 100644 --- a/SoObjects/SOGo/SOGoFolder.h +++ b/SoObjects/SOGo/SOGoFolder.h @@ -66,6 +66,8 @@ /* lower level fetches */ - (BOOL) nameExistsInFolder: (NSString *) objectName; +- (void) deleteEntriesWithIds: (NSArray *) ids; + - (NSArray *) fetchContentObjectNames; - (NSDictionary *) fetchContentStringsAndNamesOfAllObjects; diff --git a/SoObjects/SOGo/SOGoFolder.m b/SoObjects/SOGo/SOGoFolder.m index a78d5074..e0845f82 100644 --- a/SoObjects/SOGo/SOGoFolder.m +++ b/SoObjects/SOGo/SOGoFolder.m @@ -45,6 +45,7 @@ #import "NSArray+Utilities.h" #import "NSString+Utilities.h" +#import "SOGoContentObject.h" #import "SOGoPermissions.h" #import "SOGoUser.h" @@ -338,6 +339,22 @@ static NSString *defaultUserID = @""; && [records count] > 0); } +- (void) deleteEntriesWithIds: (NSArray *) ids +{ + unsigned int count, max; + NSString *currentID; + SOGoContentObject *deleteObject; + + max = [ids count]; + for (count = 0; count < max; count++) + { + currentID = [ids objectAtIndex: count]; + deleteObject = [self lookupName: currentID + inContext: context acquire: NO]; + [deleteObject delete]; + } +} + - (NSDictionary *) fetchContentStringsAndNamesOfAllObjects { NSDictionary *files; diff --git a/UI/Common/English.lproj/Localizable.strings b/UI/Common/English.lproj/Localizable.strings index 9f20244c..f25d4d2f 100644 --- a/UI/Common/English.lproj/Localizable.strings +++ b/UI/Common/English.lproj/Localizable.strings @@ -28,8 +28,14 @@ "Sorry, the user rights can not be configured for that object." = "Sorry, the user rights can not be configured for that object."; /* generic.js */ -"Unable to subscribe to that folder!" = "Unable to subscribe to that folder!"; -"You cannot subscribe to a folder that you own!" = "You cannot subscribe to a folder that you own!"; -"Unable to unsubscribe from that folder!" = "Unable to unsubscribe from that folder!"; -"You cannot unsubscribe from a folder that you own!" = "You cannot unsubscribe from a folder that you own!"; +"Unable to subscribe to that folder!" + = "Unable to subscribe to that folder!"; +"You cannot subscribe to a folder that you own!" + = "You cannot subscribe to a folder that you own!"; +"Unable to unsubscribe from that folder!" + = "Unable to unsubscribe from that folder!"; +"You cannot unsubscribe from a folder that you own!" + = "You cannot unsubscribe from a folder that you own!"; "Unable to rename that folder!" = "Unable to rename that folder!"; +"You have already subscribed to that folder!" + = "You have already subscribed to that folder!"; diff --git a/UI/Common/French.lproj/Localizable.strings b/UI/Common/French.lproj/Localizable.strings index e77de6d7..839c0bb8 100644 --- a/UI/Common/French.lproj/Localizable.strings +++ b/UI/Common/French.lproj/Localizable.strings @@ -34,3 +34,5 @@ "Unable to unsubscribe from that folder!" = "Impossible de se désabonner de ce dossier."; "You cannot unsubscribe from a folder that you own!" = "Impossible de vous désabonner d'un dossier qui vous appartient."; "Unable to rename that folder!" = "Impossible de renommer ce dossier."; +"You have already subscribed to that folder!" + = "Vous êtes déja abonné à ce dossier."; diff --git a/UI/Common/German.lproj/Localizable.strings b/UI/Common/German.lproj/Localizable.strings index 9a0bb696..a7feaba3 100644 --- a/UI/Common/German.lproj/Localizable.strings +++ b/UI/Common/German.lproj/Localizable.strings @@ -36,3 +36,5 @@ "Unable to unsubscribe from that folder!" = "Unmöglich sich von diesem Ordner zu des-abonnieren."; "You cannot unsubscribe from a folder that you own!" = "Unmöglich sich von einem Ordner zu des-abonnieren, der Ihnen selbst gehört."; "Unable to rename that folder!" = "Unable to rename that folder!"; +"You have already subscribed to that folder!" + = "You have already subscribed to that folder!"; diff --git a/UI/Common/UIxFolderActions.m b/UI/Common/UIxFolderActions.m index e152ed33..943fbafe 100644 --- a/UI/Common/UIxFolderActions.m +++ b/UI/Common/UIxFolderActions.m @@ -49,7 +49,8 @@ - (void) _setupContext { - NSString *clientClass, *mailInvitationParam; + NSString *folder, *mailInvitationParam; + NSArray *realFolderPath; SOGoUser *activeUser; activeUser = [context activeUser]; @@ -57,13 +58,7 @@ clientObject = [self clientObject]; owner = [clientObject ownerInContext: nil]; - clientClass = NSStringFromClass([clientObject class]); - if ([clientClass isEqualToString: @"SOGoContactGCSFolder"]) - baseFolder = @"Contacts"; - else if ([clientClass isEqualToString: @"SOGoAppointmentFolder"]) - baseFolder = @"Calendar"; - else - baseFolder = nil; + baseFolder = [[clientObject container] nameInContainer]; um = [LDAPUserManager sharedUserManager]; ud = [activeUser userSettings]; @@ -75,9 +70,14 @@ } [ud setObject: moduleSettings forKey: baseFolder]; + realFolderPath = [[clientObject nameInContainer] + componentsSeparatedByString: @"_"]; + if ([realFolderPath count] > 1) + folder = [realFolderPath objectAtIndex: 1]; + else + folder = [realFolderPath objectAtIndex: 0]; subscriptionPointer = [NSString stringWithFormat: @"%@:%@/%@", - owner, baseFolder, - [clientObject nameInContainer]]; + owner, baseFolder, folder]; mailInvitationParam = [[context request] formValueForKey: @"mail-invitation"]; @@ -216,4 +216,27 @@ return response; } +- (id) batchDeleteAction +{ + WOResponse *response; + NSString *idsParam; + NSArray *ids; + + idsParam = [[context request] formValueForKey: @"ids"]; + ids = [idsParam componentsSeparatedByString: @"/"]; + if ([ids count]) + { + clientObject = [self clientObject]; + [clientObject deleteEntriesWithIds: ids]; + response = [self responseWith204]; + } + else + { + response = [self responseWithStatus: 500]; + [response appendContentString: @"At least 1 id required."]; + } + + return response; +} + @end diff --git a/UI/Common/UIxParentFolderActions.h b/UI/Common/UIxParentFolderActions.h new file mode 100644 index 00000000..c380f064 --- /dev/null +++ b/UI/Common/UIxParentFolderActions.h @@ -0,0 +1,31 @@ +/* UIxParentFolderActions.h - this file is part of SOGo + * + * Copyright (C) 2007 Inverse groupe conseil + * + * Author: Wolfgang Sourdeau + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef UIXPARENTFOLDERACTIONS_H +#define UIXPARENTFOLDERACTIONS_H + +#import + +@interface UIxParentFolderActions : WODirectAction +@end + +#endif /* UIXPARENTFOLDERACTIONS_H */ diff --git a/UI/Common/UIxParentFolderActions.m b/UI/Common/UIxParentFolderActions.m new file mode 100644 index 00000000..8f759936 --- /dev/null +++ b/UI/Common/UIxParentFolderActions.m @@ -0,0 +1,61 @@ +/* UIxParentFolderActions.m - this file is part of SOGo + * + * Copyright (C) 2007 Inverse groupe conseil + * + * Author: Wolfgang Sourdeau + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#import + +#import +#import +#import + +#import +#import + +#import "UIxParentFolderActions.h" + +@implementation UIxParentFolderActions + +- (id ) createFolderAction +{ + WOResponse *response; + NSString *name, *nameInContainer; + + name = [[context request] formValueForKey: @"name"]; + if ([name length] > 0) + { + response = (WOResponse *) [[self clientObject] newFolderWithName: name + nameInContainer: &nameInContainer]; + if (!response) + { + response = [self responseWithStatus: 201]; + [response setHeader: @"text/plain; charset=us-ascii" + forKey: @"content-type"]; + [response appendContentString: nameInContainer]; + } + } + else + response = [NSException exceptionWithHTTPStatus: 400 + reason: @"The name is missing"]; + + return response; +} + +@end diff --git a/UI/Common/UIxToolbar.m b/UI/Common/UIxToolbar.m index e7fd1009..1959aaac 100644 --- a/UI/Common/UIxToolbar.m +++ b/UI/Common/UIxToolbar.m @@ -214,6 +214,15 @@ return image; } +- (NSString *) buttonTooltip +{ + NSString *key; + + key = [[self buttonInfo] valueForKey: @"tooltip"]; + + return [self labelForKey: key]; +} + /* enable/disable buttons */ - (BOOL)isButtonEnabled { diff --git a/UI/Common/product.plist b/UI/Common/product.plist index 704880c1..b9b6d7e7 100644 --- a/UI/Common/product.plist +++ b/UI/Common/product.plist @@ -108,6 +108,11 @@ actionClass = "UIxFolderActions"; actionName = "renameFolder"; }; + batchDelete = { + protectedBy = "Delete Objects"; + actionClass = "UIxFolderActions"; + actionName = "batchDelete"; + }; }; }; }; diff --git a/UI/Contacts/English.lproj/Localizable.strings b/UI/Contacts/English.lproj/Localizable.strings index f7d9db02..08044be8 100644 --- a/UI/Contacts/English.lproj/Localizable.strings +++ b/UI/Contacts/English.lproj/Localizable.strings @@ -32,6 +32,14 @@ "invalidemailwarn" = "invalidemailwarn"; "new" = "new"; +/* Tooltips */ + +"Create a new address book card" = "Create a new address book card"; +"Create a new list" = "Create a new list"; +"Edit the selected card" = "Edit the selected card"; +"Send a mail message" = "Send a mail message"; +"Delete selected card or address book" = "Delete selected card or address book"; + "htmlMailFormat_UNKNOWN" = "Unknown"; "htmlMailFormat_FALSE" = "Plain Text"; "htmlMailFormat_TRUE" = "HTML"; @@ -117,3 +125,6 @@ = "This person can read the cards of this addressbook."; "This person can erase cards from this addressbook." = "This person can erase cards from this addressbook."; + +"The selected contact has no email address." += "The selected contact has no email address."; diff --git a/UI/Contacts/French.lproj/Localizable.strings b/UI/Contacts/French.lproj/Localizable.strings index 75749406..5bf20163 100644 --- a/UI/Contacts/French.lproj/Localizable.strings +++ b/UI/Contacts/French.lproj/Localizable.strings @@ -39,6 +39,14 @@ "invalidemailwarn" = "Champ de l'email invalide, continuer quand même ?"; "new" = "Nouveau"; +/* Tooltips */ + +"Create a new address book card" = "Créer une nouvelle fiche"; +"Create a new list" = "Créer une nouvelle liste de diffusion"; +"Edit the selected card" = "Modifier la fiche sélectionnée"; +"Send a mail message" = "Rédiger un courrier à la sélection"; +"Delete selected card or address book" = "Supprimer la fiche sélectionnée"; + "htmlMailFormat_UNKNOWN" = "Inconnu"; "htmlMailFormat_FALSE" = "Texte simple (sans HTML)"; "htmlMailFormat_TRUE" = "HTML"; @@ -131,3 +139,6 @@ "This person can erase cards from this addressbook." = "Cette personne peut effacer des fiches de ce carnet d'adresses."; +"The selected contact has no email address." += "Cette personne n'a pas d'adresse courriel."; + diff --git a/UI/Contacts/German.lproj/Localizable.strings b/UI/Contacts/German.lproj/Localizable.strings index 19bd4387..6d27d4e4 100644 --- a/UI/Contacts/German.lproj/Localizable.strings +++ b/UI/Contacts/German.lproj/Localizable.strings @@ -129,3 +129,6 @@ = "Diese Person kann Karten dieses Adressbuches anzeigen."; "This person can erase cards from this addressbook." = "Diese Person kann Karten aus diesem Adressbuch löschen"; + +"The selected contact has no email address." += "The selected contact has no email address."; diff --git a/UI/MailerUI/English.lproj/Localizable.strings b/UI/MailerUI/English.lproj/Localizable.strings index 9e18ecd3..b058b07a 100644 --- a/UI/MailerUI/English.lproj/Localizable.strings +++ b/UI/MailerUI/English.lproj/Localizable.strings @@ -19,6 +19,23 @@ "Attach" = "Attach"; "Save" = "Save"; +/* Tooltips */ + +"Send this message now" = "Send this message now"; +"Select a recipient from an Address Book" = "Select a recipient from an Address Book"; +"Include an attachment" = "Include an attachment"; +"Save this message" = "Save this message"; +"Get new messages" = "Get new messages"; +"Create a new message" = "Create a new message"; +"Go to address book" = "Go to address book"; +"Reply to the message" = "Reply to the message"; +"Reply to sender and all recipients" = "Reply to sender and all recipients"; +"Forward selected message" = "Forward selected message"; +"Delete selected message or folder" = "Delete selected message or folder"; +"Mark the selected messages as junk" = "Mark the selected messages as junk"; +"Print this message" = "Print this message"; +"Stop the current transfer" = "Stop the current transfer"; + /* Main Frame */ "Home" = "Home"; diff --git a/UI/MailerUI/French.lproj/Localizable.strings b/UI/MailerUI/French.lproj/Localizable.strings index 20f78222..cf34cac3 100644 --- a/UI/MailerUI/French.lproj/Localizable.strings +++ b/UI/MailerUI/French.lproj/Localizable.strings @@ -19,6 +19,23 @@ "Attach" = "Joindre"; "Save" = "Enregistrer"; +/* Tooltips */ + +"Send this message now" = "Envoyer le message maintenant"; +"Select a recipient from an Address Book" = "Sélectionner un destinataire du carnet d'adresses"; +"Include an attachment" = "Inclure une pièce jointe"; +"Save this message" = "Enregistrer ce message"; +"Get new messages" = "Relever les nouveaux messages"; +"Create a new message" = "Créer un nouveau message"; +"Go to address book" = "Ouvrir le carnet d'adresses"; +"Reply to the message" = "Répondre au message"; +"Reply to sender and all recipients" = "Répondre à l'expéditeur et à tous les destinataires"; +"Forward selected message" = "Transférer le message sélectionné"; +"Delete selected message or folder" = "Supprimer le message ou le dossier sélectionné"; +"Mark the selected messages as junk" = "Marquer les messages sélectionnés comme indésirables"; +"Print this message" = "Imprimer ce message"; +"Stop the current transfer" = "Arrêter le transfert courant"; + /* Main Frame */ "Home" = "Accueil"; diff --git a/UI/Scheduler/English.lproj/Localizable.strings b/UI/Scheduler/English.lproj/Localizable.strings index 5e7ee587..fde04128 100644 --- a/UI/Scheduler/English.lproj/Localizable.strings +++ b/UI/Scheduler/English.lproj/Localizable.strings @@ -1,5 +1,16 @@ /* this file is in UTF-8 format! */ +/* Tooltips */ + +"Create a new event" = "Create a new event"; +"Create a new task" = "Create a new task"; +"Edit this event or task" = "Edit this event or task"; +"Delete this event or task" = "Delete this event or task"; +"Go to today" = "Go to today"; +"Switch to day view" = "Switch to day view"; +"Switch to week view" = "Switch to week view"; +"Switch to month view" = "Switch to month view"; + /* Day */ "Sunday" = "Sunday"; @@ -368,6 +379,9 @@ validate_endbeforestart = "Enddate is before startdate!"; "eventDeleteConfirmation" = "Erasing this event will be permanent.\\nWould you like to continue?"; "taskDeleteConfirmation" = "Erasing this task will be permanent.\\nWould you like to continue?"; +"Are you sure you want to delete the selected calendar?" += "Are you sure you want to delete the selected calendar?"; + /* Legend */ "Required participant" = "Required participant"; "Optional participant" = "Optional participant"; diff --git a/UI/Scheduler/French.lproj/Localizable.strings b/UI/Scheduler/French.lproj/Localizable.strings index 1d8f083e..ce110725 100644 --- a/UI/Scheduler/French.lproj/Localizable.strings +++ b/UI/Scheduler/French.lproj/Localizable.strings @@ -1,5 +1,16 @@ /* this file is in UTF-8 format! */ +/* Tooltips */ + +"Create a new event" = "Créer un nouvel événement"; +"Create a new task" = "Créer une nouvelle tâche"; +"Edit this event or task" = "Modifier l'événement ou la tâche sélectionnée"; +"Delete this event or task" = "Supprimer l'événement ou la tâche sélectionnée"; +"Go to today" = "Aller à la journée d'aujourd'hui"; +"Switch to day view" = "Passer à la vue par jour"; +"Switch to week view" = "Passer à la vue par semaine"; +"Switch to month view" = "Passer à la vue par mois"; + /* Day */ "Sunday" = "Dimanche"; @@ -366,6 +377,9 @@ validate_endbeforestart = "La date de fin est avant la date de début !"; "eventDeleteConfirmation" = "L'effacement de cet événement sera permanent.\\nVoulez-vous continuer?"; "taskDeleteConfirmation" = "L'effacement de cette tâche sera permanent.\\nVoulez-vous continuer?"; +"Are you sure you want to delete the selected calendar?" += "Voulez-vous vraiment supprimer l'agenda sélectionné ?"; + /* Legend */ "Required participant" = "Participant obligatoire"; "Optional participant" = "Participant facultatif"; diff --git a/UI/Scheduler/German.lproj/Localizable.strings b/UI/Scheduler/German.lproj/Localizable.strings index b05adbc7..2093ad21 100644 --- a/UI/Scheduler/German.lproj/Localizable.strings +++ b/UI/Scheduler/German.lproj/Localizable.strings @@ -366,6 +366,9 @@ validate_endbeforestart = "Ihr Beginn ist nach dem Ende"; "eventDeleteConfirmation" = "L'effacement de cet événement sera permanent.\\nVoulez-vous continuer?"; "taskDeleteConfirmation" = "L'effacement de cette tâche sera permanent.\\nVoulez-vous continuer?"; +"Are you sure you want to delete the selected calendar?" += "Are you sure you want to delete the selected calendar?"; + /* Legend */ "Required participant" = "Participant obligatoire"; "Optional participant" = "Participant facultatif"; diff --git a/UI/Scheduler/UIxCalMainView.m b/UI/Scheduler/UIxCalMainView.m index ca3933a0..a7c0126f 100644 --- a/UI/Scheduler/UIxCalMainView.m +++ b/UI/Scheduler/UIxCalMainView.m @@ -109,19 +109,4 @@ static NSMutableArray *yearMenuItems = nil; return yearMenuItem; } -- (id) batchDeleteAction -{ - NSArray *ids; - SOGoAppointmentFolder *clientObject; - - ids = [[self queryParameterForKey: @"ids"] componentsSeparatedByString: @"/"]; - if (ids) - { - clientObject = [self clientObject]; - [clientObject deleteEntriesWithIds: ids]; - } - - return self; -} - @end diff --git a/UI/Scheduler/UIxCalendarSelector.m b/UI/Scheduler/UIxCalendarSelector.m index b411f6b4..e077176a 100644 --- a/UI/Scheduler/UIxCalendarSelector.m +++ b/UI/Scheduler/UIxCalendarSelector.m @@ -106,7 +106,7 @@ colorForNumber (unsigned int number) SOGoAppointmentFolder *folder; NSMutableDictionary *calendar; unsigned int count, max; - NSString *folderId, *folderName; + NSString *folderName; NSNumber *isActive; if (!calendars) diff --git a/UI/Scheduler/product.plist b/UI/Scheduler/product.plist index c5afd5cc..6ee2a5af 100644 --- a/UI/Scheduler/product.plist +++ b/UI/Scheduler/product.plist @@ -93,6 +93,10 @@ pageName = "UIxCalUserRightsEditor"; actionName = "saveUserRights"; }; + editAttendees = { + protectedBy = "View"; + pageName = "UIxAttendeesEditor"; + }; }; }; @@ -108,26 +112,11 @@ pageName = "UIxTaskEditor"; actionName = "new"; }; - batchDelete = { - protectedBy = "Delete Objects"; - pageName = "UIxCalMainView"; - actionName = "batchDelete"; - }; - show = { protectedBy = "View"; pageName = "UIxCalView"; actionName = "redirectForUIDs"; }; - batchDelete = { - protectedBy = "Delete Objects"; - pageName = "UIxCalMainView"; - actionName = "batchDelete"; - }; - editAttendees = { - protectedBy = "View"; - pageName = "UIxAttendeesEditor"; - }; userRights = { protectedBy = "ReadAcls"; pageName = "UIxCalUserRightsEditor"; @@ -179,10 +168,6 @@ pageName = "UIxAppointmentEditor"; actionName = "decline"; }; - editAttendees = { - protectedBy = "View"; - pageName = "UIxAttendeesEditor"; - }; }; }; diff --git a/UI/Templates/SchedulerUI/UIxComponentEditor.wox b/UI/Templates/SchedulerUI/UIxComponentEditor.wox index d9638d34..14e76351 100644 --- a/UI/Templates/SchedulerUI/UIxComponentEditor.wox +++ b/UI/Templates/SchedulerUI/UIxComponentEditor.wox @@ -14,6 +14,11 @@ + +