Monotone-Parent: 01c5e5314c26ef13463ba2e2dec3d854ef793f1d
Monotone-Revision: eea6de6db85c76d95dc3f6d1ca4e05b3fa7fc455 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2010-03-10T21:53:26 Monotone-Branch: ca.inverse.sogomaint-2.0.2
parent
3b056b3226
commit
251a538c12
26
ChangeLog
26
ChangeLog
|
@ -1,3 +1,29 @@
|
|||
2010-03-10 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
|
||||
* 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 <wsourdeau@inverse.ca>
|
||||
|
||||
* UI/Common/WODirectAction+SOGo.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 = @"";
|
||||
|
||||
|
@ -412,72 +355,47 @@ static NSNumber *sharedYes = nil;
|
|||
}
|
||||
|
||||
- (void) setSyncTag: (NSString *) newSyncTag
|
||||
{
|
||||
if ([newSyncTag length])
|
||||
{
|
||||
// Check for duplicated tags
|
||||
SOGoUserSettings *settings;
|
||||
NSMutableDictionary *calendarSettings;
|
||||
NSMutableDictionary *syncTags;
|
||||
NSEnumerator *keysList;
|
||||
NSString *key;
|
||||
BOOL hasDuplicate;
|
||||
NSDictionary *syncTags;
|
||||
NSArray *values;
|
||||
|
||||
hasDuplicate = NO;
|
||||
if ([newSyncTag length])
|
||||
{
|
||||
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 */
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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,12 +403,7 @@ 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])
|
||||
{
|
||||
[self renameTo: newName];
|
||||
|
@ -349,10 +412,6 @@ static NSArray *childRecordFields = nil;
|
|||
else
|
||||
error = [NSException exceptionWithHTTPStatus: 400
|
||||
reason: @"Empty string"];
|
||||
}
|
||||
else
|
||||
error = [NSException exceptionWithHTTPStatus: 403
|
||||
reason: @"Modification denied."];
|
||||
|
||||
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;
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
|
||||
- (NSString *) calendarName;
|
||||
- (void) setCalendarName: (NSString *) newName;
|
||||
- (NSString *) calendarNameIsDisabled;
|
||||
|
||||
- (NSString *) calendarColor;
|
||||
- (void) setCalendarColor: (NSString *) newColor;
|
||||
|
|
|
@ -56,24 +56,9 @@
|
|||
|
||||
- (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");
|
||||
}
|
||||
|
||||
- (NSString *) calendarColor
|
||||
{
|
||||
return [calendar calendarColor];
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
<div><span class="label"><var:string label:value="Name:"/></span
|
||||
><span class="content"><input type="text"
|
||||
name="calendarName" id="calendarName"
|
||||
var:disabled="calendarNameIsDisabled"
|
||||
class="textField"
|
||||
var:value="calendarName"
|
||||
/></span></div>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
appendStyleElement(nodeID, calendarColor);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue