diff --git a/SoObjects/Contacts/SOGoContactGCSFolder.m b/SoObjects/Contacts/SOGoContactGCSFolder.m index 262b09d5c..493924ab8 100644 --- a/SoObjects/Contacts/SOGoContactGCSFolder.m +++ b/SoObjects/Contacts/SOGoContactGCSFolder.m @@ -271,6 +271,9 @@ static NSArray *folderListingFields = nil; if ([data length]) [contactRecord setObject: data forKey: @"id"]; + // Container name + [contactRecord setObject: [self displayName] forKey: @"containerName"]; + // c_cn data = [contactRecord objectForKey: @"c_cn"]; if (![data length]) diff --git a/SoObjects/Contacts/SOGoContactSourceFolder.m b/SoObjects/Contacts/SOGoContactSourceFolder.m index be82394fb..9d74edb90 100644 --- a/SoObjects/Contacts/SOGoContactSourceFolder.m +++ b/SoObjects/Contacts/SOGoContactSourceFolder.m @@ -242,6 +242,10 @@ //source id [newRecord setObject: [source sourceID] forKey: @"sourceID"]; + //source display name + [newRecord setObject: [self displayName] + forKey: @"containerName"]; + // c_name => id [newRecord setObject: [oldRecord objectForKey: @"c_name"] forKey: @"c_name"]; diff --git a/UI/Contacts/UIxContactsListActions.m b/UI/Contacts/UIxContactsListActions.m index c68607799..bfe463a23 100644 --- a/UI/Contacts/UIxContactsListActions.m +++ b/UI/Contacts/UIxContactsListActions.m @@ -42,6 +42,7 @@ #import #import +#import #import "UIxContactsListActions.h" @@ -140,17 +141,18 @@ { id folder; NSString *ascending, *valueText; - NSArray *results, *searchFields, *fields; - NSMutableArray *filteredContacts, *headers; + NSArray *searchFields, *fields, *folders, *tmpGlobalAddressBookResults; + NSMutableArray *filteredContacts, *headers, *results, *globalAddressBookResults; NSDictionary *data, *contact; BOOL excludeLists; NSComparisonResult ordering; NSUInteger max, count; unsigned int i; + NSSortDescriptor *descriptor; + NSMutableDictionary *tmpDict; if (!contactInfos) { - folder = [self clientObject]; data = [self requestData]; ascending = [data objectForKey: @"asc"]; @@ -167,11 +169,78 @@ excludeLists = [[data objectForKey: @"excludeLists"] boolValue]; [contactInfos release]; - results = [folder lookupContactsWithFilter: valueText - onCriteria: searchFields + + folders = [[[self clientObject] container] subFolders]; + + globalAddressBookResults = nil; + for (folder in folders) { + // Global AB + if ([folder isKindOfClass: [SOGoContactSourceFolder class]] && (![folder isEqual: [self clientObject]])) { + tmpGlobalAddressBookResults = [folder lookupContactsWithFilter: valueText + onCriteria: nil sortBy: [self sortKey] ordering: ordering inDomain: [[context activeUser] domain]]; + if (globalAddressBookResults) { + globalAddressBookResults = [globalAddressBookResults arrayByAddingObjectsFromArray: tmpGlobalAddressBookResults]; + } else { + globalAddressBookResults = [NSMutableArray arrayWithArray: tmpGlobalAddressBookResults]; + } + } + } + + // Process for global address book instead of array + if (globalAddressBookResults) { + for (i = 0 ; i < [globalAddressBookResults count] ; i++) { + tmpDict = [NSMutableDictionary dictionaryWithDictionary: [globalAddressBookResults objectAtIndex: i]]; + // Flatten emails + if ([tmpDict objectForKey: @"c_mail"] && [[tmpDict objectForKey: @"c_mail"] isKindOfClass:[NSArray class]] && [[tmpDict objectForKey: @"c_mail"] count] > 0) { + [tmpDict setObject:[[tmpDict objectForKey: @"c_mail"] componentsJoinedByString: @","] forKey:@"c_mail"]; + } + + if ((![tmpDict objectForKey:@"c_cn"] || [tmpDict objectForKey:@"c_cn"] == [NSNull null]) && [tmpDict objectForKey:@"c_name"]) { + // Replace c_cn if not filled + [tmpDict setObject:[tmpDict objectForKey:@"c_name"] forKey:@"c_cn"]; + } + + if ((![tmpDict objectForKey:@"c_uid"] || [tmpDict objectForKey:@"c_uid"] == [NSNull null]) && [tmpDict objectForKey:@"c_id"]) { + // Replace c_uid if not filled + [tmpDict setObject:[tmpDict objectForKey:@"c_uid"] forKey:@"c_id"]; + } + + [globalAddressBookResults replaceObjectAtIndex:i withObject: tmpDict]; + } + } + + // Current AB + folder = [self clientObject]; + results = [NSMutableArray arrayWithArray: [folder lookupContactsWithFilter: valueText + onCriteria: searchFields + sortBy: [self sortKey] + ordering: ordering + inDomain: [[context activeUser] domain]]]; + + // Add sourceid for current AB + for (i = 0 ; i < [results count] ; i++) { + tmpDict = [NSMutableDictionary dictionaryWithDictionary: [results objectAtIndex: i]]; + // Add sourceid + [tmpDict setObject:[folder nameInContainer] forKey:@"sourceid"]; + [results replaceObjectAtIndex:i withObject: tmpDict]; + } + + if (globalAddressBookResults && results) { // Both results, merge arrays + // Results in personal folder will appear first + results = [results arrayByAddingObjectsFromArray: globalAddressBookResults]; + } else if (globalAddressBookResults) { // No results in personal AB + results = globalAddressBookResults; + } + + // Sort the results + descriptor = [[NSSortDescriptor alloc] initWithKey: [self sortKey] + ascending: ordering]; + results = [results sortedArrayUsingDescriptors: [NSArray arrayWithObjects: descriptor, nil]]; + [descriptor release]; + if (excludeLists) { filteredContacts = [NSMutableArray array]; @@ -198,6 +267,7 @@ count = 0; fields = [[contactInfos objectAtIndex: 0] allKeys]; [headers addObject: fields]; + while (count < max) { [headers addObject: [[contactInfos objectAtIndex: count] objectsForKeys: fields diff --git a/UI/Contacts/UIxListEditor.m b/UI/Contacts/UIxListEditor.m index 618054f51..9e9c67309 100644 --- a/UI/Contacts/UIxListEditor.m +++ b/UI/Contacts/UIxListEditor.m @@ -35,6 +35,8 @@ #import #import +#import + #import #import @@ -173,12 +175,14 @@ { NSAutoreleasePool *pool; NSDictionary *values; - NSArray *initialReferences, *refs, *emails; + NSArray *initialReferences, *refs, *emails, *folders; NSDictionary *currentReference; NSString *uid, *workMail, *fn, *newUID; int i, count; NGVCardReference *cardReference; SOGoContactGCSFolder *folder; + NSMutableArray *publicSourceIDs; + id f; folder = [co container]; @@ -200,12 +204,25 @@ count = [references count]; pool = [[NSAutoreleasePool alloc] init]; + // List container name of global AB + folders = [[[co lookupUserFolder] privateContacts: @"Contacts" inContext: nil] subFolders]; + publicSourceIDs = [[NSMutableArray alloc] init]; + for (f in folders) { + if ([f isKindOfClass:[SOGoContactSourceFolder class]]) { + [publicSourceIDs addObject: [f nameInContainer]]; + } + } + + for (i = 0; i < count; i++) { if ([[references objectAtIndex: i] isKindOfClass: [NSDictionary class]]) { currentReference = [references objectAtIndex: i]; + uid = [currentReference objectForKey: @"id"]; + + if (![self cardReferences: [list cardReferences] contain: uid]) { @@ -222,8 +239,18 @@ [list addCardReference: cardReference]; } - else - { + else if ([currentReference objectForKey:@"sourceid"] && [publicSourceIDs containsObject:[currentReference objectForKey:@"sourceid"]]) { + // Create reference for shared AB (public) + uid = [currentReference objectForKey: @"id"]; + emails = [[currentReference objectForKey: @"c_mail"] componentsSeparatedByString: @","]; + cardReference = [NGVCardReference elementWithTag: @"card"]; + [cardReference setFn: [currentReference objectForKey: @"c_cn"]]; + if ([emails count]) + [cardReference setEmail: [emails objectAtIndex: 0]]; + [cardReference setReference: uid]; + + [list addCardReference: cardReference]; + } else { // Invalid UID or no UID NGVCard *newCard; CardElement *newWorkMail; @@ -264,6 +291,8 @@ pool = [[NSAutoreleasePool alloc] init]; } } + + [publicSourceIDs release]; } - (BOOL) cardReferences: (NSArray *) references diff --git a/UI/Contacts/UIxListView.m b/UI/Contacts/UIxListView.m index b3d47c6cd..b181037d8 100644 --- a/UI/Contacts/UIxListView.m +++ b/UI/Contacts/UIxListView.m @@ -26,6 +26,8 @@ #import #import +#import + #import "UIxListView.h" @implementation UIxListView @@ -36,6 +38,7 @@ NGVCardReference *card, *cardCopy; int i, count; id test; + NSArray *folders; invalid = [NSMutableArray array]; @@ -46,7 +49,22 @@ test = [[co container] lookupName: [card reference] inContext: context acquire: NO]; - if ([test isKindOfClass: [NSException class]]) + if ([test isKindOfClass: [NSException class]]) { + folders = [[[co lookupUserFolder] privateContacts: @"Contacts" inContext: nil] subFolders]; + id folder; + for (folder in folders) { + // Global AB + if ([folder isKindOfClass: [SOGoContactSourceFolder class]]) { + test = [folder lookupName: [card reference] + inContext: context + acquire: NO]; + if (test && ![test isKindOfClass: [NSException class]]) break; + } + } + } + + + if (test && [test isKindOfClass: [NSException class]]) { //NSLog (@"%@ not found", [card reference]); cardCopy = [card copy]; diff --git a/UI/Templates/ContactsUI/UIxContactEditorTemplate.wox b/UI/Templates/ContactsUI/UIxContactEditorTemplate.wox index 6bc125766..0d0270a4c 100644 --- a/UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +++ b/UI/Templates/ContactsUI/UIxContactEditorTemplate.wox @@ -468,17 +468,37 @@ - + + + +
+
+
{{ card.$shortFormat(editor.searchText) }}
+
{{ card.containername }}
+
+
+
+
+ +
+ {{$chip.c_cn}} +
+
+