mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-07-15 05:14:53 +00:00
feat(addressbook): Add global address book autocomplete on vlist
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user