merge of '30ec73924173f30cac8edaa24abb0d6e6dfdeac1'
and '3a0c58bfa60eceb8b04e37505a605d15b3d2b1af' Monotone-Parent: 30ec73924173f30cac8edaa24abb0d6e6dfdeac1 Monotone-Parent: 3a0c58bfa60eceb8b04e37505a605d15b3d2b1af Monotone-Revision: a9acd9019d1a4eac616803c0f5ee8fe8af50cf15 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2007-11-27T21:57:57 Monotone-Branch: ca.inverse.sogo
This commit is contained in:
commit
5447d83d4b
29
ChangeLog
29
ChangeLog
|
@ -1,3 +1,32 @@
|
|||
2007-11-27 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
|
||||
* SoObjects/SOGo/SOGoContentObject.m ([SOGoContentObject
|
||||
-aclsForUser:uid]): copy all the roles from the container. If the
|
||||
object is new, make sure the roles contain "ObjectEditor" if and
|
||||
only if "ObjectCreator" is present.
|
||||
|
||||
* SoObjects/SOGo/SOGoGCSFolder.m ([SOGoGCSFolder
|
||||
-aclsForUser:uid]): no longer take the "ObjectReader" role into
|
||||
account.
|
||||
|
||||
* UI/Common/UIxFolderActions.m ([UIxFolderActions
|
||||
-canAccessContentAction]): always return HTTP status 204. We want
|
||||
this because we are relying on the SOPE access control manager to
|
||||
grant access to this method. This requires a fine-tuned access
|
||||
control in SOGo itself...
|
||||
|
||||
* UI/Contacts/UIxContactsUserRightsEditor.m ([-userCanReadObjects])
|
||||
([-setUserCanReadObjects:userCanReadObjects]): removed methods.
|
||||
|
||||
* UI/MailerUI/UIxMailUserRightsEditor.m ([UIxMailUserRightsEditor
|
||||
-updateRights]): no longer take the "ObjectReader" role into account.
|
||||
([-userCanReadMails], [-setUserCanReadMails:userCanReadMails]):
|
||||
removed methods.
|
||||
|
||||
* SoObjects/Appointments/SOGoFreeBusyObject.m ([SOGoFreeBusyObject
|
||||
-fetchFreeBusyInfosFrom:_startDateto:_endDate]): specify context
|
||||
when looking up the Calendar folder.
|
||||
|
||||
2007-11-26 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
|
||||
* UI/Scheduler/UIxTaskEditor.m ([UIxTaskEditor -todo]): same as below.
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2007-11-27 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
|
||||
* GCSFolder.m ([GCSFolder -versionOfContentWithName:], [GCSFolder
|
||||
-fetchContentWithName:]): ignore records marked as deleted.
|
||||
([GCSFolder -deletionOfContentWithName:]): don't.
|
||||
|
||||
2007-11-04 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
|
||||
* GCSFolder.m ([GCSFolder -writeContent:toName:baseVersion:]): the
|
||||
|
|
|
@ -251,13 +251,16 @@ static GCSStringFormatter *stringFormatter = nil;
|
|||
recursive:YES];
|
||||
}
|
||||
|
||||
- (id)_fetchValueOfColumn:(NSString *)_col inContentWithName:(NSString *)_name{
|
||||
- (id) _fetchValueOfColumn: (NSString *)_col
|
||||
inContentWithName: (NSString *)_name
|
||||
ignoreDeleted: (BOOL) ignoreDeleted
|
||||
{
|
||||
EOAdaptorChannel *channel;
|
||||
NSException *error;
|
||||
NSDictionary *row;
|
||||
NSArray *attrs;
|
||||
NSString *result;
|
||||
NSString *sql;
|
||||
NSMutableString *sql;
|
||||
|
||||
if ((channel = [self acquireStoreChannel]) == nil) {
|
||||
[self errorWithFormat:@"could not open storage channel!"];
|
||||
|
@ -265,20 +268,18 @@ static GCSStringFormatter *stringFormatter = nil;
|
|||
}
|
||||
|
||||
/* generate SQL */
|
||||
|
||||
sql = @"SELECT ";
|
||||
sql = [sql stringByAppendingString:_col];
|
||||
sql = [sql stringByAppendingString:@" FROM "];
|
||||
sql = [sql stringByAppendingString:[self storeTableName]];
|
||||
sql = [sql stringByAppendingString:@" WHERE c_name = '"];
|
||||
sql = [sql stringByAppendingString:_name];
|
||||
sql = [sql stringByAppendingString:@"'"];
|
||||
|
||||
sql = [NSMutableString stringWithFormat: @"SELECT %@"
|
||||
@" FROM %@"
|
||||
@" WHERE c_name = '%@'",
|
||||
_col, [self storeTableName], _name];
|
||||
if (ignoreDeleted)
|
||||
[sql appendString: @" AND (c_deleted != 1 OR c_deleted IS NULL)"];
|
||||
|
||||
/* run SQL */
|
||||
|
||||
if ((error = [channel evaluateExpressionX:sql]) != nil) {
|
||||
[self errorWithFormat:@"%s: cannot execute SQL '%@': %@",
|
||||
__PRETTY_FUNCTION__, sql, error];
|
||||
__PRETTY_FUNCTION__, sql, error];
|
||||
[self releaseChannel:channel];
|
||||
return nil;
|
||||
}
|
||||
|
@ -300,15 +301,18 @@ static GCSStringFormatter *stringFormatter = nil;
|
|||
}
|
||||
|
||||
- (NSNumber *)versionOfContentWithName:(NSString *)_name {
|
||||
return [self _fetchValueOfColumn:@"c_version" inContentWithName:_name];
|
||||
return [self _fetchValueOfColumn:@"c_version" inContentWithName:_name
|
||||
ignoreDeleted: YES];
|
||||
}
|
||||
|
||||
- (NSNumber *)deletionOfContentWithName:(NSString *)_name {
|
||||
return [self _fetchValueOfColumn:@"c_deleted" inContentWithName:_name];
|
||||
return [self _fetchValueOfColumn:@"c_deleted" inContentWithName:_name
|
||||
ignoreDeleted: NO];
|
||||
}
|
||||
|
||||
- (NSString *)fetchContentWithName:(NSString *)_name {
|
||||
return [self _fetchValueOfColumn:@"c_content" inContentWithName:_name];
|
||||
return [self _fetchValueOfColumn:@"c_content" inContentWithName:_name
|
||||
ignoreDeleted: YES];
|
||||
}
|
||||
|
||||
- (NSDictionary *)fetchContentsOfAllFiles {
|
||||
|
|
|
@ -80,8 +80,8 @@
|
|||
// SoSecurityManager *sm;
|
||||
NSArray *infos;
|
||||
|
||||
calFolder = [[container lookupName: @"Calendar" inContext: nil acquire: NO]
|
||||
lookupName: @"personal" inContext: nil acquire: NO];
|
||||
calFolder = [[container lookupName: @"Calendar" inContext: context acquire: NO]
|
||||
lookupName: @"personal" inContext: context acquire: NO];
|
||||
// sm = [SoSecurityManager sharedSecurityManager];
|
||||
// if (![sm validatePermission: SOGoPerm_FreeBusyLookup
|
||||
// onObject: calFolder
|
||||
|
|
|
@ -454,10 +454,8 @@ static NSString *defaultUserID = @"anyone";
|
|||
switch ([imapAcls characterAtIndex: count])
|
||||
{
|
||||
case 'l':
|
||||
[SOGoAcls addObjectUniquely: SOGoRole_ObjectViewer];
|
||||
break;
|
||||
case 'r':
|
||||
[SOGoAcls addObjectUniquely: SOGoRole_ObjectReader];
|
||||
[SOGoAcls addObjectUniquely: SOGoRole_ObjectViewer];
|
||||
break;
|
||||
case 's':
|
||||
[SOGoAcls addObjectUniquely: SOGoMailRole_SeenKeeper];
|
||||
|
@ -505,9 +503,10 @@ static NSString *defaultUserID = @"anyone";
|
|||
while (currentAcl)
|
||||
{
|
||||
if ([currentAcl isEqualToString: SOGoRole_ObjectViewer])
|
||||
character = 'l';
|
||||
else if ([currentAcl isEqualToString: SOGoRole_ObjectReader])
|
||||
character = 'r';
|
||||
{
|
||||
[imapAcls appendFormat: @"lr"];
|
||||
character = 0;
|
||||
}
|
||||
else if ([currentAcl isEqualToString: SOGoMailRole_SeenKeeper])
|
||||
character = 's';
|
||||
else if ([currentAcl isEqualToString: SOGoMailRole_Writer])
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
superclass = "SOGoMailBaseObject";
|
||||
defaultRoles = {
|
||||
"View" = ( "Owner", "ObjectViewer" );
|
||||
"Access Contents Information" = ( "Owner", "ObjectReader" );
|
||||
"Access Contents Information" = ( "Owner", "ObjectViewer" );
|
||||
"Add Documents, Images, and Files" = ( "Owner", "ObjectCreator" );
|
||||
"Delete Objects" = ( "Owner", "ObjectEraser" );
|
||||
"WebDAV Access" = ( "Owner", "ObjectViewer" );
|
||||
|
|
|
@ -374,16 +374,14 @@
|
|||
containerAcls = [container aclsForUser: uid];
|
||||
if ([containerAcls count] > 0)
|
||||
{
|
||||
if ([containerAcls containsObject: SOGoRole_ObjectCreator])
|
||||
[acls addObjectsFromArray: containerAcls];
|
||||
if (isNew)
|
||||
{
|
||||
[acls addObject: SOGoRole_ObjectCreator];
|
||||
if (isNew)
|
||||
if ([containerAcls containsObject: SOGoRole_ObjectCreator])
|
||||
[acls addObject: SOGoRole_ObjectEditor];
|
||||
else
|
||||
[acls removeObject: SOGoRole_ObjectEditor];
|
||||
}
|
||||
if ([containerAcls containsObject: SOGoRole_ObjectReader])
|
||||
[acls addObject: SOGoRole_ObjectViewer];
|
||||
if ([containerAcls containsObject: SOGoRole_ObjectEditor])
|
||||
[acls addObject: SOGoRole_ObjectEditor];
|
||||
}
|
||||
|
||||
return acls;
|
||||
|
|
|
@ -596,8 +596,6 @@ static NSString *defaultUserID = @"<default>";
|
|||
containerAcls = [container aclsForUser: uid];
|
||||
if ([containerAcls count] > 0)
|
||||
{
|
||||
if ([containerAcls containsObject: SOGoRole_ObjectReader])
|
||||
[acls addObject: SOGoRole_ObjectViewer];
|
||||
#warning this should be checked
|
||||
if ([containerAcls containsObject: SOGoRole_ObjectEraser])
|
||||
[acls addObject: SOGoRole_ObjectEraser];
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
NSString *SOGoRole_ObjectCreator = @"ObjectCreator";
|
||||
NSString *SOGoRole_ObjectEraser = @"ObjectEraser";
|
||||
NSString *SOGoRole_ObjectViewer = @"ObjectViewer";
|
||||
NSString *SOGoRole_ObjectReader = @"ObjectReader";
|
||||
NSString *SOGoRole_ObjectEditor = @"ObjectEditor";
|
||||
|
||||
NSString *SOGoRole_FolderCreator = @"FolderCreator";
|
||||
|
|
|
@ -147,34 +147,39 @@
|
|||
|
||||
- (WOResponse *) canAccessContentAction
|
||||
{
|
||||
#warning IMPROVEMENTS REQUIRED!
|
||||
NSArray *acls;
|
||||
// NSEnumerator *userAcls;
|
||||
// NSString *currentAcl;
|
||||
/* We want this action to be authorized managed by the SOPE's internal acl
|
||||
handling. */
|
||||
return [self responseWith204];
|
||||
// #warning IMPROVEMENTS REQUIRED!
|
||||
// NSArray *acls;
|
||||
// // NSEnumerator *userAcls;
|
||||
// // NSString *currentAcl;
|
||||
|
||||
[self _setupContext];
|
||||
// [self _setupContext];
|
||||
|
||||
// NSLog(@"canAccessContentAction %@, owner %@", subscriptionPointer, owner);
|
||||
// // NSLog(@"canAccessContentAction %@, owner %@", subscriptionPointer, owner);
|
||||
|
||||
if ([login isEqualToString: owner] || [owner isEqualToString: @"nobody"]) {
|
||||
return [self responseWith204];
|
||||
}
|
||||
else {
|
||||
acls = [clientObject aclsForUser: login];
|
||||
// userAcls = [acls objectEnumerator];
|
||||
// currentAcl = [userAcls nextObject];
|
||||
// while (currentAcl) {
|
||||
// NSLog(@"ACL login %@, owner %@, folder %@: %@",
|
||||
// login, owner, baseFolder, currentAcl);
|
||||
// currentAcl = [userAcls nextObject];
|
||||
// }
|
||||
if (([[clientObject folderType] isEqualToString: @"Contact"] && [acls containsObject: SOGoRole_ObjectReader]) ||
|
||||
([[clientObject folderType] isEqualToString: @"Appointment"] && [acls containsObject: SOGoRole_AuthorizedSubscriber])) {
|
||||
return [self responseWith204];
|
||||
}
|
||||
}
|
||||
// if ([login isEqualToString: owner] || [owner isEqualToString: @"nobody"]) {
|
||||
// return [self responseWith204];
|
||||
// }
|
||||
// else {
|
||||
// acls = [clientObject aclsForUser: login];
|
||||
// // userAcls = [acls objectEnumerator];
|
||||
// // currentAcl = [userAcls nextObject];
|
||||
// // while (currentAcl) {
|
||||
// // NSLog(@"ACL login %@, owner %@, folder %@: %@",
|
||||
// // login, owner, baseFolder, currentAcl);
|
||||
// // currentAcl = [userAcls nextObject];
|
||||
// // }
|
||||
// if (([[clientObject folderType] isEqualToString: @"Contact"]
|
||||
// && [acls containsObject: SOGoRole_ObjectViewer]) ||
|
||||
// ([[clientObject folderType] isEqualToString: @"Appointment"]
|
||||
// && [acls containsObject: SOGoRole_AuthorizedSubscriber])) {
|
||||
// return [self responseWith204];
|
||||
// }
|
||||
// }
|
||||
|
||||
return [self responseWithStatus: 403];
|
||||
// return [self responseWithStatus: 403];
|
||||
}
|
||||
|
||||
- (WOResponse *) _realFolderActivation: (BOOL) makeActive
|
||||
|
|
|
@ -84,7 +84,7 @@
|
|||
actionName = "unsubscribe";
|
||||
};
|
||||
canAccessContent = {
|
||||
protectedBy = "<public>";
|
||||
protectedBy = "Access Object";
|
||||
actionClass = "UIxFolderActions";
|
||||
actionName = "canAccessContent";
|
||||
};
|
||||
|
|
|
@ -199,8 +199,7 @@
|
|||
[folders autorelease];
|
||||
|
||||
subfolders = [[parentFolder subFolders] objectEnumerator];
|
||||
currentFolder = [subfolders nextObject];
|
||||
while (currentFolder)
|
||||
while ((currentFolder = [subfolders nextObject]))
|
||||
{
|
||||
if (![securityManager validatePermission: SOGoPerm_AccessObject
|
||||
onObject: currentFolder inContext: context])
|
||||
|
@ -217,7 +216,6 @@
|
|||
forKey: @"type"];
|
||||
[folders addObject: currentDictionary];
|
||||
}
|
||||
currentFolder = [subfolders nextObject];
|
||||
}
|
||||
|
||||
return folders;
|
||||
|
|
|
@ -81,19 +81,6 @@
|
|||
return [userRights containsObject: SOGoRole_ObjectViewer];
|
||||
}
|
||||
|
||||
- (void) setUserCanReadObjects: (BOOL) userCanReadObjects
|
||||
{
|
||||
if (userCanReadObjects)
|
||||
[self appendRight: SOGoRole_ObjectReader];
|
||||
else
|
||||
[self removeRight: SOGoRole_ObjectReader];
|
||||
}
|
||||
|
||||
- (BOOL) userCanReadObjects
|
||||
{
|
||||
return [userRights containsObject: SOGoRole_ObjectReader];
|
||||
}
|
||||
|
||||
- (void) updateRights
|
||||
{
|
||||
WORequest *request;
|
||||
|
@ -115,11 +102,6 @@
|
|||
else
|
||||
[self removeRight: SOGoRole_ObjectViewer];
|
||||
|
||||
if ([[request formValueForKey: @"ObjectReader"] length] > 0)
|
||||
[self appendRight: SOGoRole_ObjectReader];
|
||||
else
|
||||
[self removeRight: SOGoRole_ObjectReader];
|
||||
|
||||
if ([[request formValueForKey: @"ObjectEraser"] length] > 0)
|
||||
[self appendRight: SOGoRole_ObjectEraser];
|
||||
else
|
||||
|
|
|
@ -42,19 +42,6 @@
|
|||
return [userRights containsObject: SOGoRole_ObjectViewer];
|
||||
}
|
||||
|
||||
- (void) setUserCanReadMails: (BOOL) userCanReadMails
|
||||
{
|
||||
if (userCanReadMails)
|
||||
[self appendRight: SOGoRole_ObjectReader];
|
||||
else
|
||||
[self removeRight: SOGoRole_ObjectReader];
|
||||
}
|
||||
|
||||
- (BOOL) userCanReadMails
|
||||
{
|
||||
return [userRights containsObject: SOGoRole_ObjectReader];
|
||||
}
|
||||
|
||||
- (void) setUserCanMarkMailsRead: (BOOL) userCanMarkMailsRead
|
||||
{
|
||||
if (userCanMarkMailsRead)
|
||||
|
@ -183,11 +170,6 @@
|
|||
else
|
||||
[self removeRight: SOGoRole_ObjectViewer];
|
||||
|
||||
if ([[request formValueForKey: SOGoRole_ObjectReader] length] > 0)
|
||||
[self appendRight: SOGoRole_ObjectReader];
|
||||
else
|
||||
[self removeRight: SOGoRole_ObjectReader];
|
||||
|
||||
if ([[request formValueForKey: SOGoMailRole_SeenKeeper] length] > 0)
|
||||
[self appendRight: SOGoMailRole_SeenKeeper];
|
||||
else
|
||||
|
|
|
@ -95,8 +95,7 @@ static NSString *defaultModule = nil;
|
|||
NSNumber *status;
|
||||
NSCalendarDate *currentDate;
|
||||
|
||||
record = [records nextObject];
|
||||
while (record)
|
||||
while ((record = [records nextObject]))
|
||||
{
|
||||
status = [record objectForKey: @"c_status"];
|
||||
|
||||
|
@ -117,8 +116,6 @@ static NSString *defaultModule = nil;
|
|||
|
||||
for (count = startInterval; count < endInterval; count++)
|
||||
[items replaceObjectAtIndex: count withObject: status];
|
||||
|
||||
record = [records nextObject];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -21,31 +21,44 @@
|
|||
defaultRoles = {
|
||||
"View" = ( "Owner", "ObjectViewer" );
|
||||
"Change Images And Files" = ( "Owner", "ObjectEditor" );
|
||||
"Access Contents Information" = ( "Owner", "ObjectReader" );
|
||||
"Access Object" = ( "Owner", "ObjectViewer", "ObjectEditor", "ObjectCreator", "ObjectEraser" );
|
||||
"Access Contents Information" = ( "Owner", "ObjectViewer" );
|
||||
"Add Documents, Images, and Files" = ( "Owner", "ObjectCreator" );
|
||||
"Add Folders" = ( "Owner", "FolderCreator" );
|
||||
"ReadAcls" = ( "Owner" );
|
||||
"SaveAcls" = ( "Owner" );
|
||||
"Delete Objects" = ( "Owner", "ObjectEraser" );
|
||||
"WebDAV Access" = ( "Owner", "ObjectViewer", "ObjectEditor", "ObjectCreator", "ObjectEraser" );
|
||||
};
|
||||
};
|
||||
SOGoContentObject = {
|
||||
superclass = "SOGoObject";
|
||||
defaultAccess = "Access Contents Information";
|
||||
protectedBy = "Access Object";
|
||||
defaultRoles = {
|
||||
"Access Object" = ( "Owner", "ObjectViewer" );
|
||||
"Access Contents Information" = ( "Owner", "ObjectViewer" );
|
||||
"Change Images And Files" = ( "Owner", "ObjectEditor" );
|
||||
"Access Contents Information" = ( "Owner", "ObjectViewer", "ObjectEditor" );
|
||||
"Change Images And Files" = ( "Owner", "ObjectEditor" );
|
||||
};
|
||||
methods = {
|
||||
DELETE = {
|
||||
protectedBy = "Delete Objects";
|
||||
};
|
||||
GET = {
|
||||
protectedBy = "Access Contents Information";
|
||||
};
|
||||
PUT = {
|
||||
protectedBy = "Change Images And Files";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
SOGoFolder = {
|
||||
superclass = "SOGoObject";
|
||||
protectedBy = "Access Object";
|
||||
defaultRoles = {
|
||||
"Change Images And Files" = ( "Owner", "ObjectEditor" );
|
||||
"WebDAV Access" = ( "Owner", "AuthorizedSubscriber" );
|
||||
"Access Object" = ( "Owner", "ObjectViewer" );
|
||||
"Access Contents Information" = ( "Owner", "ObjectViewer" );
|
||||
"View" = ( "Owner", "ObjectViewer", "ObjectEditor" );
|
||||
"Access Contents Information" = ( "Owner", "ObjectViewer", "ObjectEditor" );
|
||||
};
|
||||
};
|
||||
SOGoParentFolder = {
|
||||
|
|
|
@ -27,21 +27,16 @@
|
|||
var:checked="userCanCreateObjects"/><var:string
|
||||
label:value="This person can add cards to this addressbook."/></label>
|
||||
<br/>
|
||||
<label><input type="checkbox" class="checkBox"
|
||||
const:name="ObjectViewer"
|
||||
var:checked="userCanViewObjects"/><var:string
|
||||
label:value="This person can read the cards of this addressbook."/></label>
|
||||
<br/>
|
||||
<label><input type="checkbox" class="checkBox"
|
||||
const:name="ObjectEditor"
|
||||
var:checked="userCanEditObjects"/><var:string
|
||||
label:value="This person can edit the cards of this addressbook."/></label>
|
||||
<br/>
|
||||
<label><input type="checkbox" class="checkBox"
|
||||
const:name="ObjectViewer"
|
||||
var:checked="userCanViewObjects"/><var:string
|
||||
label:value="This person can list the content of this addressbook."/></label>
|
||||
<br/>
|
||||
<label><input type="checkbox" class="checkBox"
|
||||
const:name="ObjectReader"
|
||||
var:checked="userCanReadObjects"/><var:string
|
||||
label:value="This person can read the cards of this addressbook."/></label>
|
||||
<br/>
|
||||
<label><input type="checkbox" class="checkBox"
|
||||
const:name="ObjectEraser"
|
||||
var:checked="userCanEraseObjects"/><var:string
|
||||
|
|
|
@ -74,45 +74,45 @@ function openContactsFolderAtIndex(element) {
|
|||
}
|
||||
|
||||
function contactsListCallback(http) {
|
||||
if (http.readyState == 4
|
||||
&& http.status == 200) {
|
||||
document.contactsListAjaxRequest = null;
|
||||
if (http.readyState == 4) {
|
||||
if (http.status == 200) {
|
||||
document.contactsListAjaxRequest = null;
|
||||
|
||||
var table = $("contactsList");
|
||||
if (table) {
|
||||
// Update table
|
||||
var data = http.responseText;
|
||||
var html = data.replace(/^(.*\n)*.*(<table(.*\n)*)$/, "$2");
|
||||
var tbody = table.tBodies[0];
|
||||
var tmp = document.createElement('div');
|
||||
$(tmp).update(html);
|
||||
table.replaceChild(tmp.firstChild.tBodies[0], tbody);
|
||||
}
|
||||
else {
|
||||
// Add table (doesn't happen .. yet)
|
||||
var div = $("contactsListContent");
|
||||
div.update(http.responseText);
|
||||
table = $("contactsList");
|
||||
configureSortableTableHeaders(table);
|
||||
TableKit.Resizable.init(table, {'trueResize' : true, 'keepWidth' : true});
|
||||
}
|
||||
var table = $("contactsList");
|
||||
if (table) {
|
||||
// Update table
|
||||
var data = http.responseText;
|
||||
var html = data.replace(/^(.*\n)*.*(<table(.*\n)*)$/, "$2");
|
||||
var tbody = table.tBodies[0];
|
||||
var tmp = document.createElement('div');
|
||||
$(tmp).update(html);
|
||||
table.replaceChild(tmp.firstChild.tBodies[0], tbody);
|
||||
}
|
||||
else {
|
||||
// Add table (doesn't happen .. yet)
|
||||
var div = $("contactsListContent");
|
||||
div.update(http.responseText);
|
||||
table = $("contactsList");
|
||||
configureSortableTableHeaders(table);
|
||||
TableKit.Resizable.init(table, {'trueResize' : true, 'keepWidth' : true});
|
||||
}
|
||||
|
||||
if (sorting["attribute"] && sorting["attribute"].length > 0) {
|
||||
var sortHeader;
|
||||
if (sorting["attribute"] == "displayName")
|
||||
if (sorting["attribute"] && sorting["attribute"].length > 0) {
|
||||
var sortHeader;
|
||||
if (sorting["attribute"] == "displayName")
|
||||
sortHeader = $("nameHeader");
|
||||
else if (sorting["attribute"] == "mail")
|
||||
else if (sorting["attribute"] == "mail")
|
||||
sortHeader = $("mailHeader");
|
||||
else if (sorting["attribute"] == "screenName")
|
||||
else if (sorting["attribute"] == "screenName")
|
||||
sortHeader = $("screenNameHeader");
|
||||
else if (sorting["attribute"] == "org")
|
||||
else if (sorting["attribute"] == "org")
|
||||
sortHeader = $("orgHeader");
|
||||
else if (sorting["attribute"] == "phone")
|
||||
else if (sorting["attribute"] == "phone")
|
||||
sortHeader = $("phoneHeader");
|
||||
else
|
||||
else
|
||||
sortHeader = null;
|
||||
|
||||
if (sortHeader) {
|
||||
if (sortHeader) {
|
||||
var sortImages = $(table.tHead).getElementsByClassName("sortImage");
|
||||
$(sortImages).each(function(item) {
|
||||
item.remove();
|
||||
|
@ -121,19 +121,33 @@ function contactsListCallback(http) {
|
|||
var sortImage = createElement("img", "messageSortImage", "sortImage");
|
||||
sortHeader.insertBefore(sortImage, sortHeader.firstChild);
|
||||
if (sorting["ascending"])
|
||||
sortImage.src = ResourcesURL + "/title_sortdown_12x12.png";
|
||||
sortImage.src = ResourcesURL + "/title_sortdown_12x12.png";
|
||||
else
|
||||
sortImage.src = ResourcesURL + "/title_sortup_12x12.png";
|
||||
}
|
||||
}
|
||||
sortImage.src = ResourcesURL + "/title_sortup_12x12.png";
|
||||
}
|
||||
}
|
||||
|
||||
var selected = http.callbackData;
|
||||
if (selected) {
|
||||
for (var i = 0; i < selected.length; i++) {
|
||||
var selected = http.callbackData;
|
||||
if (selected) {
|
||||
for (var i = 0; i < selected.length; i++) {
|
||||
var row = $(selected[i]);
|
||||
if (row)
|
||||
row.select();
|
||||
}
|
||||
row.select();
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
var table = $("contactsList");
|
||||
if (table) {
|
||||
var sortImages = $(table.tHead).getElementsByClassName("sortImage");
|
||||
$(sortImages).each(function(item) {
|
||||
item.remove();
|
||||
});
|
||||
var tBody = $(table.tBodies[0]);
|
||||
var length = tBody.rows.length;
|
||||
for (var i = length - 1; i > -1; i--)
|
||||
tBody.removeChild(tBody.rows[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
@ -36,8 +36,8 @@ function addLineToTree(tree, parent, line) {
|
|||
icon += 'calendar-folder-16x16.png';
|
||||
var folderId = userInfos[0] + ":" + folderInfos[1];
|
||||
var name = folderInfos[0]; // name has the format "Folername (Firstname Lastname <email>)"
|
||||
var pos = name.indexOf(' (')
|
||||
if (pos !== -1)
|
||||
var pos = name.lastIndexOf(' (')
|
||||
if (pos != -1)
|
||||
name = name.substring(0, pos); // strip the part with fullname and email
|
||||
tree.add(parent + i, parent, name, 0, '#', folderId,
|
||||
folderInfos[2] + '-folder', '', '', icon, icon);
|
||||
|
|
Loading…
Reference in a new issue