merge of '077cf05982d8b328c0c4db80c174a594d7195243'

and '8415886962e2854ead2dc46850882c17f3ddbba8'

Monotone-Parent: 077cf05982d8b328c0c4db80c174a594d7195243
Monotone-Parent: 8415886962e2854ead2dc46850882c17f3ddbba8
Monotone-Revision: e862c091a9e60e7f16da927f0c0c174a7c80dd6f

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2009-03-24T16:34:20
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Wolfgang Sourdeau 2009-03-24 16:34:20 +00:00
commit 0475cc892a
7 changed files with 86 additions and 32 deletions

View File

@ -1,3 +1,25 @@
2009-03-24 Ludovic Marcotte <lmarcotte@inverse.ca>
* UI/MailerUI/UIxMailListView.m
([UIxMailListView messages)]:
Adjusted the sort so it's a little bit faster
and correctly work in case the server returns us
the FETCH response in an order different that what
we asked for.
2009-03-24 Francis Lachapelle <flachapelle@inverse.ca>
* SoObjects/Appointments/SOGoCalendarComponent.m
([SOGoCalendarComponent
-sendEMailUsingTemplateNamed:forObject:previousObject:toAttendees:]):
no longer send a deletion notification to an attendee who already
declined the meeting.
* UI/MailPartViewers/UIxMailPartICalActions.m
([UIxMailPartICalActions -_eventObjectWithUID:forUser:]): when
looking for an event for a specific user, we now search into all
the user's calendar folders.
2009-03-24 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* UI/Scheduler/UIxComponentEditor.m ([UIxComponentEditor
@ -119,8 +141,8 @@
* UI/MainUI/SOGoRootPage.m ([SOGoRootPage -version]): new method
that returns the application version.
* iCalDateTime.m ([iCalDateTime -dateTime]): when not defined, the
timezone is now guessed from the date of the current object.
* SOPE/NGCards/iCalDateTime.m ([iCalDateTime -dateTime]): when not
defined, the timezone is now guessed from the date of the current object.
2009-03-18 Ludovic Marcotte <lmarcotte@inverse.ca>

View File

@ -9,6 +9,11 @@
currentStartDate when instantiated from a copy of firDate, to
avoid a leak.
2009-03-18 Francis Lachapelle <flachapelle@inverse.ca>
* iCalDateTime.m ([iCalDateTime -dateTime]): when not defined, the
timezone is now guessed from the date of the current object.
2009-02-06 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* CardElement.m ([CardElement -setParent:aParent]): no longer

View File

@ -202,6 +202,7 @@
if (!object)
{
folder = [container lookupCalendarFolderForUID: uid];
object = [SOGoAppointmentObject objectWithName: nameInContainer
inContainer: folder];
[object setIsNew: YES];

View File

@ -570,7 +570,11 @@ _occurenceHasID (iCalRepeatableEntityObject *occurence, NSString *recID)
for (i = 0; i < count; i++)
{
attendee = [attendees objectAtIndex: i];
if (![[attendee uid] isEqualToString: owner])
// Don't send a notification to the event organizer nor a deletion
// notification to an attendee who already declined the invitation.
if (![[attendee uid] isEqualToString: owner] &&
!([[attendee partStat] compare: @"DECLINED"] == NSOrderedSame &&
[newPageName compare: @"Deletion"] == NSOrderedSame))
{
/* construct recipient */
recipient = [attendee mailAddress];

View File

@ -21,6 +21,7 @@
*/
#import <Foundation/NSCalendarDate.h>
#import <Foundation/NSEnumerator.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGObjWeb/WOResponse.h>
@ -41,6 +42,7 @@
#import <SoObjects/Appointments/SOGoAppointmentObject.h>
#import <SoObjects/Appointments/SOGoAppointmentFolder.h>
#import <SoObjects/Mailer/SOGoMailObject.h>
#import <SoObjects/SOGo/SOGoParentFolder.h>
#import <SoObjects/SOGo/SOGoUser.h>
#import <SoObjects/SOGo/iCalEntityObject+Utilities.h>
#import <SoObjects/Mailer/SOGoMailBodyPart.h>
@ -69,27 +71,33 @@
- (SOGoAppointmentObject *) _eventObjectWithUID: (NSString *) uid
forUser: (SOGoUser *) user
{
SOGoAppointmentFolder *personalFolder;
SOGoAppointmentFolder *folder;
SOGoAppointmentObject *eventObject;
NSArray *folders;
NSEnumerator *e;
NSString *cname;
eventObject = nil;
#warning Should call lookupCalendarFoldersForUIDs to search among all folders
personalFolder = [user personalCalendarFolderInContext: context];
cname = [personalFolder resourceNameForEventUID: uid];
if (cname)
folders = [[user calendarsFolderInContext: context] subFolders];
e = [folders objectEnumerator];
while ( eventObject == nil && (folder = [e nextObject]) )
{
eventObject = [personalFolder lookupName: cname
inContext: context acquire: NO];
if (![eventObject isKindOfClass: [SOGoAppointmentObject class]])
eventObject = nil;
cname = [folder resourceNameForEventUID: uid];
if (cname)
{
eventObject = [folder lookupName: cname
inContext: context acquire: NO];
if (![eventObject isKindOfClass: [SOGoAppointmentObject class]])
eventObject = nil;
}
}
if (!eventObject)
{
folder = [user personalCalendarFolderInContext: context];
eventObject = [SOGoAppointmentObject objectWithName: uid
inContainer: personalFolder];
inContainer: folder];
[eventObject setIsNew: YES];
}

View File

@ -1,14 +1,15 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
Copyright (C) 2006-2009 Inverse inc.
This file is part of OpenGroupware.org.
This file is part of SOGo
OGo is free software; you can redistribute it and/or modify it under
SOGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
SOGo is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
@ -459,21 +460,26 @@
- (NSArray *) messages
{
NSMutableArray *unsortedMsgs;
NSMutableDictionary *map;
NSDictionary *msgs;
NSArray *uids;
NSDictionary *msgs, *msg;
NSEnumerator *msgsList;
NSMutableArray *unsortedMsgs, *sortedMsgs;
unsigned len, i, count;
NSRange r;
unsigned len, index;
if (!messages)
{
r = [self fetchBlock];
r = [self fetchBlock];
uids = [self sortedUIDs];
len = [uids count];
// only need to restrict if we have a lot
if (len > r.length)
/* only need to restrict if we have a lot */
{
uids = [uids subarrayWithRange: r];
len = [uids count];
}
// Don't assume the IMAP server return the messages in the
// same order as the specified list of UIDs (specially true for
@ -481,17 +487,24 @@
msgs = (NSDictionary *) [[self clientObject] fetchUIDs: uids
parts: [self fetchKeys]];
unsortedMsgs = [msgs objectForKey: @"fetch"];
sortedMsgs = [NSMutableArray arrayWithCapacity: [unsortedMsgs count]];
msgsList = [unsortedMsgs objectEnumerator];
while ( (msg = [msgsList nextObject]) )
count = [unsortedMsgs count];
messages = [NSMutableArray arrayWithCapacity: count];
// We build our uid->message map from our FETCH response
map = [[NSMutableDictionary alloc] initWithCapacity: count];
for (i = 0; i < count; i++)
[map setObject: [unsortedMsgs objectAtIndex: i]
forKey: [[unsortedMsgs objectAtIndex: i] objectForKey: @"uid"]];
for (i = 0; i < len; i++)
{
index = [uids indexOfObject: [msg objectForKey: @"uid"]];
if (index < [sortedMsgs count])
[sortedMsgs insertObject: msg atIndex: index];
else
[sortedMsgs addObject: msg];
[(NSMutableArray *)messages addObject: [map objectForKey: [uids objectAtIndex: i]]];
}
messages = [[NSArray arrayWithArray: sortedMsgs] retain];
RELEASE(map);
RETAIN(messages);
}
return messages;

View File

@ -1461,6 +1461,7 @@ function configureSortableTableHeaders(table) {
var headers = $(table).getElementsByClassName("sortableTableHeader");
for (var i = 0; i < headers.length; i++) {
var header = $(headers[i]);
header.stopObserving("click", onHeaderClick);
header.observe("click", onHeaderClick);
}
}