See ChangeLog
Monotone-Parent: ebd8557fae4ef7c0656a9eae753c68207fc9c60b Monotone-Revision: a57ac11c710e04e59d47cf12be270492f600a306 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2009-06-29T19:08:29 Monotone-Branch: ca.inverse.sogomaint-2.0.2
parent
a667155d0f
commit
109ca5a129
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
|||
2009-06-29 Francis Lachapelle <flachapelle@inverse.ca>
|
||||
|
||||
* SoObjects/SOGo/SOGoParentFolder.m ([SOGoParentFolder
|
||||
-initSubFolders]): system folders (LDAP sources) are now loaded
|
||||
unconditionally.
|
||||
([SOGoFolderParent -initSubscribedSubFolders]): new method to load
|
||||
only subscribed folders.
|
||||
([SOGoParent -lookupName:inContext:acquire:]): we now properly
|
||||
lookup in subscribed folders.
|
||||
([SOGoParentFolder -subFolders]): since the subscribed folders are
|
||||
now stored in its own dictionary, we must return keys from both
|
||||
dictionaries.
|
||||
|
||||
2009-06-26 Francis Lachapelle <flachapelle@inverse.ca>
|
||||
|
||||
* UI/Contacts/UIxContactsListViewContainer.[hm]: this class was
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
|
||||
@interface SOGoParentFolder : SOGoFolder
|
||||
{
|
||||
NSMutableDictionary *subFolders;
|
||||
NSMutableDictionary *subFolders, *subscribedSubFolders;
|
||||
NSString *OCSPath;
|
||||
Class subFolderClass;
|
||||
BOOL hasSubscribedSources;
|
||||
|
|
|
@ -243,11 +243,6 @@ static SoSecurityManager *sm = nil;
|
|||
return nil;
|
||||
}
|
||||
|
||||
- (void) _removeSubscribedSource: (NSString *) key
|
||||
{
|
||||
#warning TO BE IMPLEMENTED SOON FIXME
|
||||
}
|
||||
|
||||
- (void) _appendSubscribedSource: (NSString *) sourceKey
|
||||
{
|
||||
SOGoGCSFolder *subscribedFolder;
|
||||
|
@ -257,12 +252,10 @@ static SoSecurityManager *sm = nil;
|
|||
inContainer: self];
|
||||
if (subscribedFolder
|
||||
&& ![sm validatePermission: SOGoPerm_AccessObject
|
||||
onObject: subscribedFolder
|
||||
inContext: context])
|
||||
[subFolders setObject: subscribedFolder
|
||||
forKey: [subscribedFolder nameInContainer]];
|
||||
else
|
||||
[self _removeSubscribedSource: sourceKey];
|
||||
onObject: subscribedFolder
|
||||
inContext: context])
|
||||
[subscribedSubFolders setObject: subscribedFolder
|
||||
forKey: [subscribedFolder nameInContainer]];
|
||||
}
|
||||
|
||||
- (NSException *) appendSubscribedSources
|
||||
|
@ -336,27 +329,16 @@ static SoSecurityManager *sm = nil;
|
|||
return error;
|
||||
}
|
||||
|
||||
- (NSException *) initSubFoldersMatching: (NSString *) folderName
|
||||
- (NSException *) initSubFolders;
|
||||
{
|
||||
NSString *login;
|
||||
NSException *error;
|
||||
|
||||
if (!subFolders)
|
||||
{
|
||||
subFolders = [NSMutableDictionary new];
|
||||
error = [self appendPersonalSources];
|
||||
if (!error
|
||||
&& !(folderName && [subFolders objectForKey: folderName]))
|
||||
{
|
||||
error = [self appendSystemSources];
|
||||
if (!error
|
||||
&& !(folderName && [subFolders objectForKey: folderName]))
|
||||
{
|
||||
login = [[context activeUser] login];
|
||||
if ([login isEqualToString: owner])
|
||||
error = [self appendSubscribedSources];
|
||||
}
|
||||
}
|
||||
if (!error)
|
||||
error = [self appendSystemSources];
|
||||
if (error)
|
||||
{
|
||||
[subFolders release];
|
||||
|
@ -369,15 +351,33 @@ static SoSecurityManager *sm = nil;
|
|||
return error;
|
||||
}
|
||||
|
||||
// - (void) _appendSubscribedSourcesIfNeeded
|
||||
// {
|
||||
// NSString *login;
|
||||
- (NSException *) initSubscribedSubFolders
|
||||
{
|
||||
NSArray *subscribedReferences;
|
||||
NSUserDefaults *settings;
|
||||
NSEnumerator *allKeys;
|
||||
NSString *currentKey, *login;
|
||||
NSException *error;
|
||||
|
||||
// login = [[context activeUser] login];
|
||||
// if ([login isEqualToString: owner])
|
||||
// [self appendSubscribedSources];
|
||||
// hasSubscribedSources = YES;
|
||||
// }
|
||||
error = nil; /* we ignore non-DB errors at this time... */
|
||||
login = [[context activeUser] login];
|
||||
|
||||
if (!subscribedSubFolders && [login isEqualToString: owner])
|
||||
{
|
||||
subscribedSubFolders = [NSMutableDictionary new];
|
||||
settings = [[context activeUser] userSettings];
|
||||
subscribedReferences = [[settings objectForKey: nameInContainer]
|
||||
objectForKey: @"SubscribedFolders"];
|
||||
if ([subscribedReferences isKindOfClass: [NSArray class]])
|
||||
{
|
||||
allKeys = [subscribedReferences objectEnumerator];
|
||||
while ((currentKey = [allKeys nextObject]))
|
||||
[self _appendSubscribedSource: currentKey];
|
||||
}
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
- (NSArray *) fetchContentObjectNames
|
||||
{
|
||||
|
@ -395,11 +395,8 @@ static SoSecurityManager *sm = nil;
|
|||
obj = [super lookupName: name inContext: lookupContext acquire: NO];
|
||||
if (!obj)
|
||||
{
|
||||
if (!subFolders)
|
||||
error = [self initSubFoldersMatching: name];
|
||||
else
|
||||
error = nil;
|
||||
|
||||
// Lookup in personal folders
|
||||
error = [self initSubFolders];
|
||||
if (error)
|
||||
{
|
||||
[self errorWithFormat: @"a database error occured: %@", [error reason]];
|
||||
|
@ -407,37 +404,48 @@ static SoSecurityManager *sm = nil;
|
|||
}
|
||||
else
|
||||
obj = [subFolders objectForKey: name];
|
||||
// if (!obj && !hasSubscribedSources)
|
||||
// {
|
||||
// [self _appendSubscribedSourcesIfNeeded];
|
||||
// obj = [subFolders objectForKey: name];
|
||||
// }
|
||||
|
||||
if (!obj)
|
||||
{
|
||||
// Lookup in subscribed folders
|
||||
error = [self initSubscribedSubFolders];
|
||||
if (error)
|
||||
{
|
||||
[self errorWithFormat: @"a database error occured: %@", [error reason]];
|
||||
obj = [NSException exceptionWithHTTPStatus: 503];
|
||||
}
|
||||
else
|
||||
obj = [subscribedSubFolders objectForKey: name];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
- (NSArray *) subFolders
|
||||
{
|
||||
NSMutableArray *ma;
|
||||
NSException *error;
|
||||
|
||||
if (!subFolders)
|
||||
error = [self initSubFolders];
|
||||
if (error)
|
||||
{
|
||||
error = [self initSubFoldersMatching: nil];
|
||||
if (error)
|
||||
{
|
||||
/* We exceptionnally raise the exception here because doPROPFIND:
|
||||
will not care for errors in its response from
|
||||
toManyRelationShipKeys, which may in turn trigger the
|
||||
disappearance of user folders in the SOGo extensions. */
|
||||
[error raise];
|
||||
}
|
||||
/* We exceptionnally raise the exception here because doPROPFIND:
|
||||
will not care for errors in its response from
|
||||
toManyRelationShipKeys, which may in turn trigger the
|
||||
disappearance of user folders in the SOGo extensions. */
|
||||
[error raise];
|
||||
}
|
||||
// if (!!hasSubscribedSources)
|
||||
// [self _appendSubscribedSourcesIfNeeded];
|
||||
|
||||
error = [self initSubscribedSubFolders];
|
||||
if (error)
|
||||
[error raise];
|
||||
|
||||
return [[subFolders allValues]
|
||||
sortedArrayUsingSelector: @selector (compare:)];
|
||||
ma = [NSMutableArray arrayWithArray: [subFolders allValues]];
|
||||
if ([subscribedSubFolders count])
|
||||
[ma addObjectsFromArray: [subscribedSubFolders allValues]];
|
||||
|
||||
return [ma sortedArrayUsingSelector: @selector (compare:)];
|
||||
}
|
||||
|
||||
- (NSArray *) toManyRelationshipKeys
|
||||
|
|
|
@ -251,7 +251,7 @@ function actionContactCallback(http) {
|
|||
var error = html.select("p").first().firstChild.nodeValue.trim();
|
||||
log("actionContactCallback failed: error " + http.status + " (" + error + ")");
|
||||
if (parseInt(http.status) == 403)
|
||||
window.alert(labels["You don't have the required privileges to perform the operation."]);
|
||||
window.alert(clabels["You don't have the required privileges to perform the operation."]);
|
||||
else if (error)
|
||||
window.alert(labels[error]);
|
||||
refreshCurrentFolder();
|
||||
|
@ -775,6 +775,8 @@ function onAddressBookMenuPrepareVisibility() {
|
|||
menuEntry.removeClassName("disabled");
|
||||
});
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function updateAddressBooksMenus() {
|
||||
|
@ -897,8 +899,7 @@ function onAddressBooksMenuPrepareVisibility() {
|
|||
sharingOption.addClassName("disabled");
|
||||
}
|
||||
|
||||
// disable the "remove" option when address book is public, otherwise
|
||||
// enable it
|
||||
// Disable the "remove" option when address book is public
|
||||
if (folderOwner == "nobody")
|
||||
removeOption.addClassName("disabled");
|
||||
else
|
||||
|
@ -912,7 +913,7 @@ function onAddressBooksMenuPrepareVisibility() {
|
|||
|
||||
function onContactMenuPrepareVisibility() {
|
||||
var contactRows = document.menuTarget;
|
||||
var selectedFolder = $("contactFolders").getSelectedNodes()[0];
|
||||
var selectedFolder = $("contactFolders").getSelectedNodes().first();
|
||||
var options = { write: false,
|
||||
aim: false };
|
||||
|
||||
|
@ -923,9 +924,10 @@ function onContactMenuPrepareVisibility() {
|
|||
var moveOption = elements[7];
|
||||
|
||||
$A(contactRows).each(function(contactRow) {
|
||||
var emailCell = contactRow.down('td', 1);
|
||||
var cells = contactRow.getElementsByTagName('td');
|
||||
var emailCell = cells[1];
|
||||
options.write |= (emailCell.firstChild != null);
|
||||
var aimCell = contactRow.down('td', 2);
|
||||
var aimCell = cells[2];
|
||||
options.aim |= (aimCell.firstChild != null);
|
||||
});
|
||||
|
||||
|
|
Loading…
Reference in New Issue