diff --git a/ChangeLog b/ChangeLog index d272b7364..6d57dfc86 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,29 @@ +2010-03-10 Wolfgang Sourdeau + + * UI/WebServerResources/SchedulerUI.js (updateCalendarProperties): + the displayname can now also be set by subscribers, in their own + environment. + + * UI/Scheduler/UIxCalendarProperties.m (-setCalendarName:): this + action is now unconditional. + (-calendarNameIsDisabled): removed obsolete accessor. + + * SoObjects/SOGo/SOGoGCSFolder.m + (-setFolderPropertyValue:inCategory:): new setter for properties + pertaining to the ACTIVE user (who may or may not be the owner). + (-folderPropertyValueInCategory:): getter corollary to the new + method above. + (-_fetchDisplayNameFromSubscriber): new method for getting the + display name of the folder for the active user. + (renameTo:): split the method in an instance for the owner and + another one for subscribers. Respectively: _ownerRenameTo: and + _subscriberRenameTo:. The latter invoke the new methods above. + + * SoObjects/Appointments/SOGoAppointmentFolder.m + (_setCalendarProperty:forKey:): replaced method with a new + and more generic accessor from SOGoGCSFolder + "setFolderPropertyValue:inCategory:". + 2010-03-09 Wolfgang Sourdeau * UI/Common/WODirectAction+SOGo.m diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.m b/SoObjects/Appointments/SOGoAppointmentFolder.m index 2c0eb25b5..07137cf17 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.m +++ b/SoObjects/Appointments/SOGoAppointmentFolder.m @@ -278,53 +278,11 @@ static NSNumber *sharedYes = nil; return objectClass; } -- (void) _setCalendarProperty: (id) theValue - forKey: (NSString *) theKey -{ - SOGoUserSettings *settings; - NSMutableDictionary *calendarSettings, *values; - - settings = [[context activeUser] userSettings]; - calendarSettings = [settings objectForKey: @"Calendar"]; - if (!calendarSettings) - { - calendarSettings = [NSMutableDictionary dictionary]; - [settings setObject: calendarSettings - forKey: @"Calendar"]; - } - values = [calendarSettings objectForKey: theKey]; - if (theValue) - { - if (!values) - { - // Create the property dictionary - values = [NSMutableDictionary dictionary]; - [calendarSettings setObject: values forKey: theKey]; - } - [values setObject: theValue forKey: [self folderReference]]; - } - else if (values) - { - // Remove the property for the calendar - [values removeObjectForKey: [self folderReference]]; - if ([values count] == 0) - // Also remove the property dictionary when empty - [calendarSettings removeObjectForKey: theKey]; - } - - [settings synchronize]; -} - - (NSString *) calendarColor { - SOGoUserSettings *settings; - NSDictionary *colors; NSString *color; - settings = [[context activeUser] userSettings]; - colors = [[settings objectForKey: @"Calendar"] - objectForKey: @"FolderColors"]; - color = [colors objectForKey: [self folderReference]]; + color = [self folderPropertyValueInCategory: @"FolderColors"]; if (!color) color = defaultColor; @@ -333,78 +291,63 @@ static NSNumber *sharedYes = nil; - (void) setCalendarColor: (NSString *) newColor { - if ([newColor length]) - [self _setCalendarProperty: newColor - forKey: @"FolderColors"]; - else - [self _setCalendarProperty: nil - forKey: @"FolderColors"]; + if (![newColor length]) + newColor = nil; + + [self setFolderPropertyValue: newColor + inCategory: @"FolderColors"]; } - (BOOL) showCalendarAlarms { - SOGoUserSettings *settings; - NSDictionary *values; - id test; - BOOL show = YES; + NSNumber *showAlarms; - settings = [[context activeUser] userSettings]; - values = [[settings objectForKey: @"Calendar"] - objectForKey: @"FolderShowAlarms"]; - test = [values objectForKey: [self folderReference]]; - if (test) - show = [test boolValue]; + showAlarms = [self folderPropertyValueInCategory: @"FolderShowAlarms"]; - return show; + return (showAlarms ? [showAlarms boolValue] : YES); } - (void) setShowCalendarAlarms: (BOOL) new { + NSNumber *showAlarms; + if (new) - [self _setCalendarProperty: nil - forKey: @"FolderShowAlarms"]; + showAlarms = nil; else - [self _setCalendarProperty: [NSNumber numberWithBool: new] - forKey: @"FolderShowAlarms"]; + showAlarms = [NSNumber numberWithBool: NO]; + + [self setFolderPropertyValue: showAlarms + inCategory: @"FolderShowAlarms"]; } - (BOOL) showCalendarTasks { - SOGoUserSettings *settings; - NSDictionary *values; - id test; - BOOL show = YES; + NSNumber *showTasks; - settings = [[context activeUser] userSettings]; - values = [[settings objectForKey: @"Calendar"] - objectForKey: @"FolderShowTasks"]; - test = [values objectForKey: [self folderReference]]; - if (test) - show = [test boolValue]; + showTasks = [self folderPropertyValueInCategory: @"FolderShowTasks"]; - return show; + return (showTasks ? [showTasks boolValue] : YES); } - (void) setShowCalendarTasks: (BOOL) new { + NSNumber *showTasks; + + /* the default value is "YES", so we keep only those with a value of "NO"... */ if (new) - [self _setCalendarProperty: nil - forKey: @"FolderShowTasks"]; + showTasks = nil; else - [self _setCalendarProperty: [NSNumber numberWithBool: new] - forKey: @"FolderShowTasks"]; + showTasks = [NSNumber numberWithBool: NO]; + + [self setFolderPropertyValue: showTasks + inCategory: @"FolderShowTasks"]; } - (NSString *) syncTag { - SOGoUserSettings *settings; - NSDictionary *syncTags; NSString *syncTag; - settings = [[context activeUser] userSettings]; - syncTags = [[settings objectForKey: @"Calendar"] - objectForKey: @"FolderSyncTags"]; - syncTag = [syncTags objectForKey: [self folderReference]]; + syncTag = [self folderPropertyValueInCategory: @"FolderSyncTags"]; if (!syncTag) syncTag = @""; @@ -413,71 +356,46 @@ static NSNumber *sharedYes = nil; - (void) setSyncTag: (NSString *) newSyncTag { + // Check for duplicated tags + SOGoUserSettings *settings; + NSDictionary *syncTags; + NSArray *values; + if ([newSyncTag length]) { - // Check for duplicated tags - SOGoUserSettings *settings; - NSMutableDictionary *calendarSettings; - NSMutableDictionary *syncTags; - NSEnumerator *keysList; - NSString *key; - BOOL hasDuplicate; - - hasDuplicate = NO; settings = [[context activeUser] userSettings]; - calendarSettings = [settings objectForKey: @"Calendar"]; - if (calendarSettings) - { - syncTags = [calendarSettings objectForKey: @"FolderSyncTags"]; - if (syncTags) - { - keysList = [syncTags keyEnumerator]; - while ((key = (NSString*)[keysList nextObject])) { - if (![key isEqualToString: [self folderReference]] - && [(NSString*)[syncTags objectForKey: key] isEqualToString: newSyncTag]) - { - hasDuplicate = YES; - break; - } - } - } - } - if (!hasDuplicate) - [self _setCalendarProperty: newSyncTag - forKey: @"FolderSyncTags"]; + syncTags = [[settings objectForKey: @"Calendar"] + objectForKey: @"FolderSyncTags"]; + values = [syncTags allValues]; + if (![values containsObject: newSyncTag]) + [self setFolderPropertyValue: newSyncTag + inCategory: @"FolderSyncTags"]; } else - { - [self _setCalendarProperty: nil - forKey: @"FolderSyncTags"]; - } + [self setFolderPropertyValue: nil + inCategory: @"FolderSyncTags"]; } - (BOOL) synchronizeCalendar { - SOGoUserSettings *settings; - NSDictionary *values; - id test; - BOOL synchronize = NO; + NSNumber *synchronize; - settings = [[context activeUser] userSettings]; - values = [[settings objectForKey: @"Calendar"] - objectForKey: @"FolderSynchronize"]; - test = [values objectForKey: [self folderReference]]; - if (test) - synchronize = [test boolValue]; + synchronize = [self folderPropertyValueInCategory: @"FolderSynchronize"]; - return synchronize; + return [synchronize boolValue]; } - (void) setSynchronizeCalendar: (BOOL) new { + NSNumber *synchronize; + if (new) - [self _setCalendarProperty: [NSNumber numberWithBool: new] - forKey: @"FolderSynchronize"]; + synchronize = [NSNumber numberWithBool: YES]; else - [self _setCalendarProperty: nil - forKey: @"FolderSynchronize"]; + synchronize = nil; + + [self setFolderPropertyValue: synchronize + inCategory: @"FolderSynchronize"]; } /* selection */ diff --git a/SoObjects/SOGo/SOGoGCSFolder.h b/SoObjects/SOGo/SOGoGCSFolder.h index b4fbe8abb..059a4bf99 100644 --- a/SoObjects/SOGo/SOGoGCSFolder.h +++ b/SoObjects/SOGo/SOGoGCSFolder.h @@ -69,6 +69,10 @@ - (NSString *) folderReference; - (NSArray *) pathArrayToFolder; +- (void) setFolderPropertyValue: (id) theValue + inCategory: (NSString *) theKey; +- (id) folderPropertyValueInCategory: (NSString *) theKey; + /* lower level fetches */ - (BOOL) nameExistsInFolder: (NSString *) objectName; diff --git a/SoObjects/SOGo/SOGoGCSFolder.m b/SoObjects/SOGo/SOGoGCSFolder.m index bcb9efc3b..5e7fd70bd 100644 --- a/SoObjects/SOGo/SOGoGCSFolder.m +++ b/SoObjects/SOGo/SOGoGCSFolder.m @@ -209,9 +209,61 @@ static NSArray *childRecordFields = nil; /* accessors */ +- (void) setFolderPropertyValue: (id) theValue + inCategory: (NSString *) theKey +{ + SOGoUserSettings *settings; + NSMutableDictionary *folderSettings, *values; + NSString *module; + + settings = [[context activeUser] userSettings]; + module = [container nameInContainer]; + folderSettings = [settings objectForKey: module]; + if (!folderSettings) + { + folderSettings = [NSMutableDictionary dictionary]; + [settings setObject: folderSettings forKey: module]; + } + values = [folderSettings objectForKey: theKey]; + if (theValue) + { + if (!values) + { + // Create the property dictionary + values = [NSMutableDictionary dictionary]; + [folderSettings setObject: values forKey: theKey]; + } + [values setObject: theValue forKey: [self folderReference]]; + } + else if (values) + { + // Remove the property for the folder + [values removeObjectForKey: [self folderReference]]; + if ([values count] == 0) + // Also remove the property dictionary when empty + [folderSettings removeObjectForKey: theKey]; + } + + [settings synchronize]; +} + +- (id) folderPropertyValueInCategory: (NSString *) theKey +{ + SOGoUserSettings *settings; + NSDictionary *folderSettings; + id value; + + settings = [[context activeUser] userSettings]; + folderSettings = [settings objectForKey: [container nameInContainer]]; + value = [[folderSettings objectForKey: theKey] + objectForKey: [self folderReference]]; + + return value; +} + - (void) _setDisplayNameFromRow: (NSDictionary *) row { - NSString *currentLogin, *ownerLogin, *primaryDN; + NSString *primaryDN; NSDictionary *ownerIdentity; primaryDN = [row objectForKey: @"c_foldername"]; @@ -223,11 +275,9 @@ static NSArray *childRecordFields = nil; else [displayName appendString: primaryDN]; - currentLogin = [[context activeUser] login]; - ownerLogin = [self ownerInContext: context]; - if (![currentLogin isEqualToString: ownerLogin]) + if (!activeUserIsOwner) { - ownerIdentity = [[SOGoUser userWithLogin: ownerLogin roles: nil] + ownerIdentity = [[SOGoUser userWithLogin: owner] primaryIdentity]; [displayName appendString: [ownerIdentity keysWithFormat: @@ -236,7 +286,10 @@ static NSArray *childRecordFields = nil; } } -- (void) _fetchDisplayName +/* This method fetches the display name defined by the owner, but is also the + fallback when a subscriber has not redefined the display name yet in his + environment. */ +- (void) _fetchDisplayNameFromOwner { GCSChannelManager *cm; EOAdaptorChannel *fc; @@ -265,10 +318,25 @@ static NSArray *childRecordFields = nil; } } +- (void) _fetchDisplayNameFromSubscriber +{ + displayName = [self folderPropertyValueInCategory: @"FolderDisplayNames"]; + [displayName retain]; +} + - (NSString *) displayName { if (!displayName) - [self _fetchDisplayName]; + { + if (activeUserIsOwner) + [self _fetchDisplayNameFromOwner]; + else + { + [self _fetchDisplayNameFromSubscriber]; + if (!displayName) + [self _fetchDisplayNameFromOwner]; + } + } return displayName; } @@ -335,24 +403,15 @@ static NSArray *childRecordFields = nil; - (NSException *) setDavDisplayName: (NSString *) newName { NSException *error; - NSArray *currentRoles; - currentRoles = [[context activeUser] rolesForObject: self - inContext: context]; - if ([currentRoles containsObject: SoRole_Owner]) + if ([newName length]) { - if ([newName length]) - { - [self renameTo: newName]; - error = nil; - } - else - error = [NSException exceptionWithHTTPStatus: 400 - reason: @"Empty string"]; + [self renameTo: newName]; + error = nil; } else - error = [NSException exceptionWithHTTPStatus: 403 - reason: @"Modification denied."]; + error = [NSException exceptionWithHTTPStatus: 400 + reason: @"Empty string"]; return error; } @@ -437,23 +496,20 @@ static NSArray *childRecordFields = nil; return error; } -- (void) renameTo: (NSString *) newName +- (void) _ownerRenameTo: (NSString *) newName { GCSChannelManager *cm; EOAdaptorChannel *fc; NSURL *folderLocation; NSString *sql; -#warning SOGoFolder should have the corresponding method - [displayName release]; - displayName = nil; - cm = [GCSChannelManager defaultChannelManager]; folderLocation = [[GCSFolderManager defaultFolderManager] folderInfoLocation]; fc = [cm acquireOpenChannelForURL: folderLocation]; if (fc) { +#warning GDLContentStore should provide methods for renaming folders sql = [NSString stringWithFormat: (@"UPDATE %@ SET c_foldername = '%@'" @" WHERE c_path = '%@'"), @@ -467,6 +523,25 @@ static NSArray *childRecordFields = nil; } } +- (void) _subscriberRenameTo: (NSString *) newName +{ + if ([newName length]) + [self setFolderPropertyValue: newName + inCategory: @"FolderDisplayNames"]; +} + +- (void) renameTo: (NSString *) newName +{ +#warning SOGoFolder should have the corresponding method + [displayName release]; + displayName = nil; + + if (activeUserIsOwner) + [self _ownerRenameTo: newName]; + else + [self _subscriberRenameTo: newName]; +} + - (NSArray *) fetchContentObjectNames { NSArray *records, *names; diff --git a/UI/Scheduler/UIxCalendarProperties.h b/UI/Scheduler/UIxCalendarProperties.h index 0cc80609a..bb5483e46 100644 --- a/UI/Scheduler/UIxCalendarProperties.h +++ b/UI/Scheduler/UIxCalendarProperties.h @@ -34,7 +34,6 @@ - (NSString *) calendarName; - (void) setCalendarName: (NSString *) newName; -- (NSString *) calendarNameIsDisabled; - (NSString *) calendarColor; - (void) setCalendarColor: (NSString *) newColor; diff --git a/UI/Scheduler/UIxCalendarProperties.m b/UI/Scheduler/UIxCalendarProperties.m index 841faf414..4ffe752ff 100644 --- a/UI/Scheduler/UIxCalendarProperties.m +++ b/UI/Scheduler/UIxCalendarProperties.m @@ -56,22 +56,7 @@ - (void) setCalendarName: (NSString *) newName { - NSString *login; - - login = [[context activeUser] login]; - - if ([login isEqualToString: [calendar ownerInContext: context]]) - [calendar renameTo: newName]; -} - -- (NSString *) calendarNameIsDisabled -{ - NSString *login; - - login = [[context activeUser] login]; - - return ([login isEqualToString: [calendar ownerInContext: context]] - ? @"false" : @"true"); + [calendar renameTo: newName]; } - (NSString *) calendarColor diff --git a/UI/Templates/SchedulerUI/UIxCalendarProperties.wox b/UI/Templates/SchedulerUI/UIxCalendarProperties.wox index 0e31355f3..87a33a2c9 100644 --- a/UI/Templates/SchedulerUI/UIxCalendarProperties.wox +++ b/UI/Templates/SchedulerUI/UIxCalendarProperties.wox @@ -19,7 +19,6 @@
diff --git a/UI/WebServerResources/SchedulerUI.js b/UI/WebServerResources/SchedulerUI.js index 2a9dfbaef..45c19410e 100644 --- a/UI/WebServerResources/SchedulerUI.js +++ b/UI/WebServerResources/SchedulerUI.js @@ -2154,13 +2154,12 @@ function updateCalendarProperties(calendarID, calendarName, calendarColor) { if (idParts[0] != UserLogin) nodeID = "/" + idParts[0].asCSSIdentifier() + "_" + folderName; - else { + else nodeID = "/" + folderName; // log("nodeID: " + nodeID); - var calendarNode = $(nodeID); - var childNodes = calendarNode.childNodes; - childNodes[childNodes.length-1].nodeValue = calendarName; - } + var calendarNode = $(nodeID); + var childNodes = calendarNode.childNodes; + childNodes[childNodes.length-1].nodeValue = calendarName; appendStyleElement(nodeID, calendarColor); }