feat(addressbook): Add global address book autocomplete on vlist

This commit is contained in:
smizrahi
2023-11-08 18:10:06 +01:00
parent d1634054d6
commit 0560efd1f6
6 changed files with 135 additions and 19 deletions
+62 -5
View File
@@ -42,6 +42,7 @@
#import <SoObjects/Contacts/SOGoContactGCSEntry.h>
#import <SoObjects/Contacts/SOGoContactGCSFolder.h>
#import <SoObjects/Contacts/SOGoContactSourceFolder.h>
#import "UIxContactsListActions.h"
@@ -140,17 +141,18 @@
{
id <SOGoContactFolder> 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 @@
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 @@
count = 0;
fields = [[contactInfos objectAtIndex: 0] allKeys];
[headers addObject: fields];
while (count < max)
{
[headers addObject: [[contactInfos objectAtIndex: count] objectsForKeys: fields
+16 -2
View File
@@ -200,12 +200,16 @@
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 @@
[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;
+19 -1
View File
@@ -26,6 +26,8 @@
#import <SOGo/NSArray+Utilities.h>
#import <SOGo/NSDictionary+Utilities.h>
#import <SoObjects/Contacts/SOGoContactSourceFolder.h>
#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 <SOGoContactFolder> 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];