diff --git a/SoObjects/Contacts/SOGoContactGCSFolder.m b/SoObjects/Contacts/SOGoContactGCSFolder.m index 262b09d5c1..493924ab88 100644 --- a/SoObjects/Contacts/SOGoContactGCSFolder.m +++ b/SoObjects/Contacts/SOGoContactGCSFolder.m @@ -271,6 +271,9 @@ - (void) fixupContactRecord: (NSMutableDictionary *) contactRecord 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 be82394fbb..9d74edb903 100644 --- a/SoObjects/Contacts/SOGoContactSourceFolder.m +++ b/SoObjects/Contacts/SOGoContactSourceFolder.m @@ -242,6 +242,10 @@ - (NSDictionary *) _flattenedRecord: (NSDictionary *) oldRecord //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 c686077991..6bc794889b 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 @@ - (NSArray *) contactInfos { 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,65 @@ - (NSArray *) contactInfos 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]]) { + 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]; + } + } + } + + // Flatten email for global address book instead of array + if (globalAddressBookResults) { + for (i = 0 ; i < [globalAddressBookResults count] ; i++) { + tmpDict = [NSMutableDictionary dictionaryWithDictionary: [globalAddressBookResults objectAtIndex: i]]; + 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"]; + [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]]; + [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 +254,7 @@ - (NSArray *) contactInfos 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 618054f517..dd57360bcf 100644 --- a/UI/Contacts/UIxListEditor.m +++ b/UI/Contacts/UIxListEditor.m @@ -200,12 +200,16 @@ - (void) setReferences: (NSArray *) references count = [references count]; pool = [[NSAutoreleasePool alloc] init]; + 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 +226,18 @@ - (void) setReferences: (NSArray *) references [list addCardReference: cardReference]; } - else - { + else if ([currentReference objectForKey:@"sourceid"] && [[currentReference objectForKey:@"sourceid"] isEqualToString: @"public"]) { + // 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; diff --git a/UI/Contacts/UIxListView.m b/UI/Contacts/UIxListView.m index b3d47c6cdf..b181037d8d 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 @@ - (void) checkListReferences NGVCardReference *card, *cardCopy; int i, count; id test; + NSArray *folders; invalid = [NSMutableArray array]; @@ -46,7 +49,22 @@ - (void) checkListReferences 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 6bc125766e..0d0270a4c0 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}} +
+
+