merge of '968d106fbab318497571d45998864ccefcc20480'

and 'f633654a120834c13835a3ef41a1418e31efffe3'

Monotone-Parent: 968d106fbab318497571d45998864ccefcc20480
Monotone-Parent: f633654a120834c13835a3ef41a1418e31efffe3
Monotone-Revision: 8491f20b4bac3508e0839201c1e6756c5df21835

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2008-07-16T21:49:36
Monotone-Branch: ca.inverse.sogo
This commit is contained in:
Wolfgang Sourdeau 2008-07-16 21:49:36 +00:00
commit 4a9c837741
13 changed files with 284 additions and 201 deletions

View file

@ -1,3 +1,14 @@
2008-07-16 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* UI/Scheduler/UIxCalListingActions.m ([UIxCalListingActions
-eventsBlocksAction]): take user participation status into account
again.
* SoObjects/Appointments/iCalEntityObject+SOGo.m
([iCalEntityObject
-quickRecordDateAsNumber:_datewithOffset:offsetforAllDay:allDay]):
enhanced method to do the special computations for all day events.
2008-07-16 Francis Lachapelle <flachapelle@inverse.ca> 2008-07-16 Francis Lachapelle <flachapelle@inverse.ca>
* UI/Contacts/UIxContactEditor.m ([BOOL isNew]) * UI/Contacts/UIxContactEditor.m ([BOOL isNew])

View file

@ -1,3 +1,8 @@
2008-07-16 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* iCalDateTime.m ([iCalDateTime -setDate:dateTime]): don't set
date in utc.
2008-07-14 Wolfgang Sourdeau <wsourdeau@inverse.ca> 2008-07-14 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* ICalDateHolder.m: removed class module. * ICalDateHolder.m: removed class module.

View file

@ -48,8 +48,7 @@ static NSString *commaSeparator = nil;
unsigned int length; unsigned int length;
NSRange subStringRange; NSRange subStringRange;
foldedString = [NSMutableString new]; foldedString = [NSMutableString string];
[foldedString autorelease];
length = [self length]; length = [self length];
if (length < 76) if (length < 76)
@ -80,8 +79,7 @@ static NSString *commaSeparator = nil;
NSEnumerator *rawValues; NSEnumerator *rawValues;
NSString *tmpString, *rawValue, *newString; NSString *tmpString, *rawValue, *newString;
values = [NSMutableArray new]; values = [NSMutableArray array];
[values autorelease];
if (!commaSeparator) if (!commaSeparator)
[self _initCommaSeparator]; [self _initCommaSeparator];
@ -90,13 +88,11 @@ static NSString *commaSeparator = nil;
withString: commaSeparator]; withString: commaSeparator];
rawValues = [[tmpString componentsSeparatedByString: @","] rawValues = [[tmpString componentsSeparatedByString: @","]
objectEnumerator]; objectEnumerator];
rawValue = [rawValues nextObject]; while ((rawValue = [rawValues nextObject]))
while (rawValue)
{ {
newString = [rawValue stringByReplacingString: commaSeparator newString = [rawValue stringByReplacingString: commaSeparator
withString: @","]; withString: @","];
[values addObject: [newString stringByTrimmingSpaces]]; [values addObject: [newString stringByTrimmingSpaces]];
rawValue = [rawValues nextObject];
} }
return values; return values;

View file

@ -118,15 +118,16 @@
} }
else else
{ {
utcTZ = [NSTimeZone timeZoneWithName: @"GMT"];
tmpTime = [dateTime copy]; tmpTime = [dateTime copy];
[tmpTime setTimeZone: utcTZ];
if (forAllDayEntity) if (forAllDayEntity)
timeString = [tmpTime iCalFormattedDateString]; timeString = [tmpTime iCalFormattedDateString];
else else
timeString = [NSString stringWithFormat: @"%@Z", {
[tmpTime iCalFormattedDateTimeString]]; utcTZ = [NSTimeZone timeZoneWithName: @"GMT"];
[tmpTime setTimeZone: utcTZ];
timeString = [NSString stringWithFormat: @"%@Z",
[tmpTime iCalFormattedDateTimeString]];
}
[tmpTime release]; [tmpTime release];
} }
} }

View file

@ -56,6 +56,7 @@
[(iCalDateTime *) [self uniqueChildWithTag: @"dtstart"] [(iCalDateTime *) [self uniqueChildWithTag: @"dtstart"]
setDate: newStartDate]; setDate: newStartDate];
endDate = [newStartDate dateByAddingYears: 0 months: 0 days: days]; endDate = [newStartDate dateByAddingYears: 0 months: 0 days: days];
[endDate setTimeZone: [newStartDate timeZone]];
[(iCalDateTime *) [self uniqueChildWithTag: @"dtend"] [(iCalDateTime *) [self uniqueChildWithTag: @"dtend"]
setDate: endDate]; setDate: endDate];
} }

View file

@ -64,7 +64,6 @@
#import <SOGo/SOGoUser.h> #import <SOGo/SOGoUser.h>
#import <SOGo/SOGoUserFolder.h> #import <SOGo/SOGoUserFolder.h>
#import <SOGo/SOGoWebDAVAclManager.h> #import <SOGo/SOGoWebDAVAclManager.h>
#import <SOGo/iCalEntityObject+Utilities.h>
#import "iCalEntityObject+SOGo.h" #import "iCalEntityObject+SOGo.h"
#import "SOGoAppointmentObject.h" #import "SOGoAppointmentObject.h"
@ -566,6 +565,9 @@ static Class sogoAppointmentFolderKlass = Nil;
unsigned int count; unsigned int count;
NSCalendarDate *date; NSCalendarDate *date;
NSNumber *dateValue; NSNumber *dateValue;
BOOL isAllDay;
isAllDay = [[_record objectForKey: @"c_isallday"] boolValue];
md = [[_record mutableCopy] autorelease]; md = [[_record mutableCopy] autorelease];
for (count = 0; count < 2; count++) for (count = 0; count < 2; count++)
@ -573,8 +575,7 @@ static Class sogoAppointmentFolderKlass = Nil;
dateValue = [_record objectForKey: fields[count * 2]]; dateValue = [_record objectForKey: fields[count * 2]];
if (dateValue) if (dateValue)
{ {
date = [NSCalendarDate dateWithTimeIntervalSince1970: date = [NSCalendarDate dateWithTimeIntervalSince1970: (NSTimeInterval) [dateValue unsignedIntValue]];
(NSTimeInterval) [dateValue unsignedIntValue]];
if (date) if (date)
{ {
[date setTimeZone: timeZone]; [date setTimeZone: timeZone];
@ -582,7 +583,7 @@ static Class sogoAppointmentFolderKlass = Nil;
} }
} }
else else
[self logWithFormat:@"missing '%@' in record?", fields[count * 2]]; [self logWithFormat: @"missing '%@' in record?", fields[count * 2]];
} }
return md; return md;
@ -926,9 +927,11 @@ static Class sogoAppointmentFolderKlass = Nil;
/* prepare mandatory fields */ /* prepare mandatory fields */
fields = [NSMutableArray arrayWithArray: _fields]; fields = [NSMutableArray arrayWithArray: _fields];
[fields addObject: @"c_uid"]; [fields addObjectUniquely: @"c_name"];
[fields addObject: @"c_startdate"]; [fields addObjectUniquely: @"c_uid"];
[fields addObject: @"c_enddate"]; [fields addObjectUniquely: @"c_startdate"];
[fields addObjectUniquely: @"c_enddate"];
[fields addObjectUniquely: @"c_isallday"];
if (logger) if (logger)
[self debugWithFormat:@"should fetch (%@=>%@) ...", _startDate, _endDate]; [self debugWithFormat:@"should fetch (%@=>%@) ...", _startDate, _endDate];

View file

@ -46,7 +46,9 @@ NSNumber *iCalDistantFutureNumber;
- (NSMutableDictionary *) quickRecord; - (NSMutableDictionary *) quickRecord;
- (int) priorityNumber; - (int) priorityNumber;
- (NSNumber *) quickRecordDateAsNumber: (NSCalendarDate *) _date; - (NSNumber *) quickRecordDateAsNumber: (NSCalendarDate *) _date
withOffset: (int) offset
forAllDay: (BOOL) allDay;
@end @end

View file

@ -24,10 +24,14 @@
#import <Foundation/NSEnumerator.h> #import <Foundation/NSEnumerator.h>
#import <Foundation/NSString.h> #import <Foundation/NSString.h>
#import <Foundation/NSValue.h> #import <Foundation/NSValue.h>
#import <Foundation/NSTimeZone.h>
#import <NGCards/iCalCalendar.h> #import <NGCards/iCalCalendar.h>
#import <NGCards/iCalPerson.h> #import <NGCards/iCalPerson.h>
#import <NGObjWeb/WOApplication.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <SoObjects/SOGo/NSArray+Utilities.h> #import <SoObjects/SOGo/NSArray+Utilities.h>
#import <SoObjects/SOGo/SOGoUser.h> #import <SoObjects/SOGo/SOGoUser.h>
@ -35,8 +39,31 @@
#import "iCalEntityObject+SOGo.h" #import "iCalEntityObject+SOGo.h"
static int utcOffset = -1;
@implementation iCalEntityObject (SOGoExtensions) @implementation iCalEntityObject (SOGoExtensions)
static inline int
_computeAllDayOffset()
{
NSTimeZone *tz;
SOGoUser *user;
WOApplication *application;
int offset;
if (utcOffset == -1)
{
tz = [[NSCalendarDate date] timeZone];
utcOffset = [tz secondsFromGMT];
}
application = [WOApplication application];
user = [[application context] activeUser];
offset = utcOffset - [[user timeZone] secondsFromGMT];
return offset;
}
+ (void) initializeSOGoExtensions; + (void) initializeSOGoExtensions;
{ {
if (!iCalDistantFuture) if (!iCalDistantFuture)
@ -140,10 +167,24 @@
} }
- (NSNumber *) quickRecordDateAsNumber: (NSCalendarDate *) _date - (NSNumber *) quickRecordDateAsNumber: (NSCalendarDate *) _date
withOffset: (int) offset
forAllDay: (BOOL) allDay
{ {
return ((_date == iCalDistantFuture) unsigned int seconds;
? iCalDistantFutureNumber NSNumber *dateNumber;
: [NSNumber numberWithUnsignedInt: [_date timeIntervalSince1970]]);
if (_date == iCalDistantFuture)
dateNumber = iCalDistantFutureNumber;
else
{
seconds = [_date timeIntervalSince1970] + offset;
if (allDay)
seconds += _computeAllDayOffset ();
dateNumber = [NSNumber numberWithUnsignedInt: seconds];
}
return dateNumber;
} }
- (NSMutableDictionary *) quickRecord - (NSMutableDictionary *) quickRecord

View file

@ -52,7 +52,7 @@
NSCalendarDate *startDate, *endDate; NSCalendarDate *startDate, *endDate;
NSArray *attendees; NSArray *attendees;
NSString *uid, *title, *location, *status; NSString *uid, *title, *location, *status;
NSNumber *sequence, *dateNumber; NSNumber *sequence;
id organizer; id organizer;
id participants, partmails; id participants, partmails;
NSMutableString *partstates; NSMutableString *partstates;
@ -61,7 +61,7 @@
iCalAccessClass accessClass; iCalAccessClass accessClass;
/* extract values */ /* extract values */
startDate = [self startDate]; startDate = [self startDate];
endDate = [self endDate]; endDate = [self endDate];
uid = [self uid]; uid = [self uid];
@ -108,56 +108,56 @@
if ([sequence isNotNull]) [row setObject: sequence forKey: @"c_sequence"]; if ([sequence isNotNull]) [row setObject: sequence forKey: @"c_sequence"];
if ([startDate isNotNull]) if ([startDate isNotNull])
[row setObject: [self quickRecordDateAsNumber: startDate]
forKey: @"c_startdate"];
if ([endDate isNotNull])
{ {
if (endDate == iCalDistantFuture) if (isAllDay)
dateNumber = iCalDistantFutureNumber; NSLog (@"start date...");
else [row setObject: [self quickRecordDateAsNumber: startDate
{ withOffset: 0 forAllDay: isAllDay]
if (isAllDay) forKey: @"c_startdate"];
i = 1;
else
i = 0;
dateNumber
= [NSNumber numberWithUnsignedInt:
[endDate timeIntervalSince1970] - i];
}
[row setObject: dateNumber forKey: @"c_enddate"];
} }
if ([endDate isNotNull])
[row setObject: [self quickRecordDateAsNumber: endDate
withOffset: ((isAllDay) ? -1 : 0)
forAllDay: isAllDay]
forKey: @"c_enddate"];
if ([self isRecurrent]) { if ([self isRecurrent])
NSCalendarDate *date; {
NSCalendarDate *date;
date = [self lastPossibleRecurrenceStartDate];
if (!date) { date = [self lastPossibleRecurrenceStartDate];
/* this could also be *nil*, but in the end it makes the fetchspecs if (!date)
more complex - thus we set it to a "reasonable" distant future */ {
date = iCalDistantFuture; /* this could also be *nil*, but in the end it makes the fetchspecs
more complex - thus we set it to a "reasonable" distant future */
date = iCalDistantFuture;
}
[row setObject: [self quickRecordDateAsNumber: date
withOffset: 0 forAllDay: NO]
forKey: @"c_cycleenddate"];
[row setObject: [self cycleInfo] forKey: @"c_cycleinfo"];
} }
[row setObject:[self quickRecordDateAsNumber:date] forKey: @"c_cycleenddate"];
[row setObject:[self cycleInfo] forKey: @"c_cycleinfo"];
}
if ([participants length] > 0) if ([participants length] > 0)
[row setObject: participants forKey: @"c_participants"]; [row setObject: participants forKey: @"c_participants"];
if ([partmails length] > 0) if ([partmails length] > 0)
[row setObject: partmails forKey: @"c_partmails"]; [row setObject: partmails forKey: @"c_partmails"];
if ([status isNotNull]) { if ([status isNotNull])
int code = 1; {
int code = 1;
if ([status isEqualToString: @"TENTATIVE"]) if ([status isEqualToString: @"TENTATIVE"])
code = 2; code = 2;
else if ([status isEqualToString: @"CANCELLED"]) else if ([status isEqualToString: @"CANCELLED"])
code = 0; code = 0;
[row setObject:[NSNumber numberWithInt:code] forKey: @"c_status"]; [row setObject:[NSNumber numberWithInt:code] forKey: @"c_status"];
} }
else { else
/* confirmed by default */ {
[row setObject: [NSNumber numberWithInt:1] forKey: @"c_status"]; /* confirmed by default */
} [row setObject: [NSNumber numberWithInt:1] forKey: @"c_status"];
}
[row setObject: [NSNumber numberWithUnsignedInt: accessClass] [row setObject: [NSNumber numberWithUnsignedInt: accessClass]
forKey: @"c_classification"]; forKey: @"c_classification"];

View file

@ -95,23 +95,23 @@
if ([sequence isNotNull]) [row setObject: sequence forKey: @"c_sequence"]; if ([sequence isNotNull]) [row setObject: sequence forKey: @"c_sequence"];
if ([startDate isNotNull]) if ([startDate isNotNull])
date = [self quickRecordDateAsNumber: startDate]; date = [self quickRecordDateAsNumber: startDate
withOffset: 0 forAllDay: NO];
else else
date = [NSNull null]; date = [NSNull null];
[row setObject: date forKey: @"c_startdate"]; [row setObject: date forKey: @"c_startdate"];
if ([dueDate isNotNull]) if ([dueDate isNotNull])
date = [self quickRecordDateAsNumber: dueDate]; date = [self quickRecordDateAsNumber: dueDate
withOffset: 0 forAllDay: NO];
else else
date = [NSNull null]; date = [NSNull null];
[row setObject: date forKey: @"c_enddate"]; [row setObject: date forKey: @"c_enddate"];
if ([self isRecurrent]) if ([self isRecurrent])
{ {
[row setObject: [self quickRecordDateAsNumber: iCalDistantFuture] [row setObject: iCalDistantFutureNumber forKey: @"c_cycleenddate"];
forKey: @"c_cycleenddate"]; [row setObject: [self cycleInfo] forKey: @"c_cycleinfo"];
[row setObject: [self cycleInfo]
forKey: @"c_cycleinfo"];
} }
if ([participants length] > 0) if ([participants length] > 0)
@ -119,46 +119,50 @@
if ([partmails length] > 0) if ([partmails length] > 0)
[row setObject:partmails forKey: @"c_partmails"]; [row setObject:partmails forKey: @"c_partmails"];
if ([status isNotNull]) { if ([status isNotNull])
code = 0; /* NEEDS-ACTION */ {
if ([status isEqualToString: @"COMPLETED"]) code = 0; /* NEEDS-ACTION */
code = 1; if ([status isEqualToString: @"COMPLETED"])
else if ([status isEqualToString: @"IN-PROCESS"]) code = 1;
code = 2; else if ([status isEqualToString: @"IN-PROCESS"])
else if ([status isEqualToString: @"CANCELLED"]) code = 2;
code = 3; else if ([status isEqualToString: @"CANCELLED"])
[row setObject: [NSNumber numberWithInt: code] forKey: @"c_status"]; code = 3;
} [row setObject: [NSNumber numberWithInt: code] forKey: @"c_status"];
else { }
/* confirmed by default */ else
[row setObject:[NSNumber numberWithInt:1] forKey: @"c_status"]; {
} /* confirmed by default */
[row setObject:[NSNumber numberWithInt:1] forKey: @"c_status"];
}
[row setObject: [NSNumber numberWithUnsignedInt: accessClass] [row setObject: [NSNumber numberWithUnsignedInt: accessClass]
forKey: @"c_classification"]; forKey: @"c_classification"];
organizer = [self organizer]; organizer = [self organizer];
if (organizer) { if (organizer)
NSString *email; {
NSString *email;
email = [organizer valueForKey: @"rfc822Email"]; email = [organizer valueForKey: @"rfc822Email"];
if (email) if (email)
[row setObject:email forKey: @"c_orgmail"]; [row setObject:email forKey: @"c_orgmail"];
} }
/* construct partstates */ /* construct partstates */
count = [attendees count]; count = [attendees count];
partstates = [[NSMutableString alloc] initWithCapacity:count * 2]; partstates = [[NSMutableString alloc] initWithCapacity:count * 2];
for ( i = 0; i < count; i++) { for (i = 0; i < count; i++)
iCalPerson *p; {
iCalPersonPartStat stat; iCalPerson *p;
iCalPersonPartStat stat;
p = [attendees objectAtIndex:i]; p = [attendees objectAtIndex:i];
stat = [p participationStatus]; stat = [p participationStatus];
if(i != 0) if(i != 0)
[partstates appendString: @"\n"]; [partstates appendString: @"\n"];
[partstates appendFormat: @"%d", stat]; [partstates appendFormat: @"%d", stat];
} }
[row setObject:partstates forKey: @"c_partstates"]; [row setObject:partstates forKey: @"c_partstates"];
[partstates release]; [partstates release];

View file

@ -323,13 +323,12 @@ static NSArray *tasksFields = nil;
- (WOResponse *) eventsListAction - (WOResponse *) eventsListAction
{ {
NSArray *oldEvent, *participants, *states; NSArray *oldEvent;
NSEnumerator *events; NSEnumerator *events;
NSMutableArray *newEvents, *newEvent; NSMutableArray *newEvents, *newEvent;
unsigned int interval, i; unsigned int interval;
BOOL isAllDay; BOOL isAllDay;
NSString *sort, *ascending, *participant, *state; NSString *sort, *ascending;
SOGoUser *user;
[self _setupContext]; [self _setupContext];
@ -346,40 +345,6 @@ static NSArray *tasksFields = nil;
interval = [[oldEvent objectAtIndex: 5] intValue]; interval = [[oldEvent objectAtIndex: 5] intValue];
[newEvent addObject: [self _formattedDateForSeconds: interval [newEvent addObject: [self _formattedDateForSeconds: interval
forAllDay: isAllDay]]; forAllDay: isAllDay]];
participants = nil;
state = nil;
if ([[oldEvent objectAtIndex: 9] length] > 0 &&
[[oldEvent objectAtIndex: 10] length] > 0)
{
participants = [[oldEvent objectAtIndex: 9] componentsSeparatedByString: @"\n"];
states = [[oldEvent objectAtIndex: 10] componentsSeparatedByString: @"\n"];
for (i = 0; i < [participants count]; i++)
{
user = [SOGoUser userWithLogin: [oldEvent objectAtIndex: 11] roles: nil];
participant = [participants objectAtIndex: i];
if ([user hasEmail: participant]) {
switch ([[states objectAtIndex: i] intValue]) {
case iCalPersonPartStatNeedsAction:
state = @"needs-action";
break;
case iCalPersonPartStatAccepted:
state = @"accepted";
break;
case iCalPersonPartStatDeclined:
state = @"declined";
break;
}
[newEvent replaceObjectAtIndex: 9 withObject: state];
break;
}
}
}
if (participants == nil || i == [participants count])
[newEvent replaceObjectAtIndex: 9 withObject: @""];
[newEvent removeObjectAtIndex: 11];
[newEvent removeObjectAtIndex: 10];
[newEvents addObject: newEvent]; [newEvents addObject: newEvent];
} }
@ -440,6 +405,7 @@ _feedBlockWithMonthBasedData(NSMutableDictionary *block, unsigned int start,
cname: (NSString *) cName cname: (NSString *) cName
onDay: (unsigned int) dayStart onDay: (unsigned int) dayStart
recurrence: (BOOL) recurrence recurrence: (BOOL) recurrence
userState: (iCalPersonPartStat) userState
{ {
NSMutableDictionary *block; NSMutableDictionary *block;
@ -452,10 +418,47 @@ _feedBlockWithMonthBasedData(NSMutableDictionary *block, unsigned int start,
[block setObject: cName forKey: @"cname"]; [block setObject: cName forKey: @"cname"];
if (recurrence) if (recurrence)
[block setObject: @"1" forKey: @"recurrence"]; [block setObject: @"1" forKey: @"recurrence"];
if (userState != iCalPersonPartStatOther)
[block setObject: [NSNumber numberWithInt: userState]
forKey: @"userState"];
return block; return block;
} }
static inline iCalPersonPartStat
_userStateInEvent (NSArray *event)
{
unsigned int count, max;
iCalPersonPartStat state;
NSString *partList, *stateList;
NSArray *participants, *states;
SOGoUser *user;
participants = nil;
state = iCalPersonPartStatOther;
partList = [event objectAtIndex: 9];
stateList = [event objectAtIndex: 10];
if ([partList length] && [stateList length])
{
participants = [partList componentsSeparatedByString: @"\n"];
states = [stateList componentsSeparatedByString: @"\n"];
count = 0;
max = [participants count];
while (state == iCalPersonPartStatOther && count < max)
{
user = [SOGoUser userWithLogin: [event objectAtIndex: 11]
roles: nil];
if ([user hasEmail: [participants objectAtIndex: count]])
state = [[states objectAtIndex: count] intValue];
else
count++;
}
}
return state;
}
- (void) _fillBlocks: (NSArray *) blocks - (void) _fillBlocks: (NSArray *) blocks
withEvent: (NSArray *) event withEvent: (NSArray *) event
{ {
@ -465,6 +468,7 @@ _feedBlockWithMonthBasedData(NSMutableDictionary *block, unsigned int start,
NSMutableDictionary *eventBlock; NSMutableDictionary *eventBlock;
NSString *eventCName; NSString *eventCName;
BOOL recurrence; BOOL recurrence;
iCalPersonPartStat userState;
startSecs = (unsigned int) [startDate timeIntervalSince1970]; startSecs = (unsigned int) [startDate timeIntervalSince1970];
endsSecs = (unsigned int) [endDate timeIntervalSince1970]; endsSecs = (unsigned int) [endDate timeIntervalSince1970];
@ -489,13 +493,15 @@ _feedBlockWithMonthBasedData(NSMutableDictionary *block, unsigned int start,
eventEnd = endsSecs; eventEnd = endsSecs;
eventCName = [event objectAtIndex: 0]; eventCName = [event objectAtIndex: 0];
while (currentStart + dayLength < eventEnd) userState = _userStateInEvent (event);
while (currentDayStart + dayLength < eventEnd)
{ {
eventBlock = [self _eventBlockWithStart: currentStart eventBlock = [self _eventBlockWithStart: currentStart
end: currentDayStart + 86399 end: currentDayStart + dayLength - 1
cname: eventCName cname: eventCName
onDay: currentDayStart onDay: currentDayStart
recurrence: recurrence]; recurrence: recurrence
userState: userState];
[currentDay addObject: eventBlock]; [currentDay addObject: eventBlock];
currentDayStart += dayLength; currentDayStart += dayLength;
currentStart = currentDayStart; currentStart = currentDayStart;
@ -506,7 +512,8 @@ _feedBlockWithMonthBasedData(NSMutableDictionary *block, unsigned int start,
end: eventEnd end: eventEnd
cname: eventCName cname: eventCName
onDay: currentDayStart onDay: currentDayStart
recurrence: recurrence]; recurrence: recurrence
userState: userState];
[currentDay addObject: eventBlock]; [currentDay addObject: eventBlock];
} }

View file

@ -906,22 +906,22 @@ DIV.event DIV.text
DIV.event.needs-action DIV.text DIV.event.needs-action DIV.text
{ background-image: url("needs-action.png"); { background-image: url("needs-action.png");
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 98% 95%; } background-position: top right; }
DIV.event.accepted DIV.text DIV.event.accepted DIV.text
{ background-image: url("accepted.png"); { background-image: url("accepted.png");
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 98% 95%; } background-position: top right; }
DIV.event.declined DIV.text DIV.event.declined DIV.text
{ background-image: url("declined.png"); { background-image: url("declined.png");
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 98% 95%; } background-position: top right; }
DIV.event.tentative DIV.text DIV.event.tentative DIV.text
{ background-image: url("tentative.png"); { background-image: url("tentative.png");
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 98% 95%; } background-position: top right; }
DIV#daysView DIV[class~="event"].starts0 DIV#daysView DIV[class~="event"].starts0
{ top: 0.000000%; } { top: 0.000000%; }

View file

@ -23,6 +23,8 @@ var usersRightsWindowWidth = 502;
var eventsBlocks; var eventsBlocks;
var calendarEvents = null; var calendarEvents = null;
var userStates = [ "needs-action", "accepted", "declined", "tentative" ];
function newEvent(sender, type) { function newEvent(sender, type) {
var day = $(sender).readAttribute("day"); var day = $(sender).readAttribute("day");
if (!day) if (!day)
@ -389,12 +391,12 @@ function eventsListCallback(http) {
td = $(document.createElement("td")); td = $(document.createElement("td"));
row.appendChild(td); row.appendChild(td);
td.observe("mousedown", listRowMouseDownHandler, true); td.observe("mousedown", listRowMouseDownHandler, true);
td.appendChild(document.createTextNode(data[i][11])); td.appendChild(document.createTextNode(data[i][13]));
td = $(document.createElement("td")); td = $(document.createElement("td"));
row.appendChild(td); row.appendChild(td);
td.observe("mousedown", listRowMouseDownHandler, true); td.observe("mousedown", listRowMouseDownHandler, true);
td.appendChild(document.createTextNode(data[i][12])); td.appendChild(document.createTextNode(data[i][14]));
td = $(document.createElement("td")); td = $(document.createElement("td"));
row.appendChild(td); row.appendChild(td);
@ -762,7 +764,7 @@ function _drawCalendarAllDaysEvents(events) {
function newAllDayEventDIV(eventRep) { function newAllDayEventDIV(eventRep) {
// cname, calendar, starts, lasts, // cname, calendar, starts, lasts,
// startHour, endHour, title) { // startHour, endHour, title) {
var eventDiv = document.createElement("div"); var eventDiv = $(document.createElement("div"));
var event = calendarEvents[eventRep.cname]; var event = calendarEvents[eventRep.cname];
if (!event.siblings) if (!event.siblings)
event.siblings = []; event.siblings = [];
@ -770,28 +772,31 @@ function newAllDayEventDIV(eventRep) {
eventDiv.cname = event[0]; eventDiv.cname = event[0];
eventDiv.calendar = event[1]; eventDiv.calendar = event[1];
$(eventDiv).addClassName("event"); eventDiv.addClassName("event");
for (var i = 1; i < 5; i++) { if (eventRep.userState && userStates[eventRep.userState])
var shadowDiv = document.createElement("div"); eventDiv.addClassName(userStates[eventRep.userState]);
eventDiv.appendChild(shadowDiv);
$(shadowDiv).addClassName("shadow");
$(shadowDiv).addClassName("shadow" + i);
}
var innerDiv = document.createElement("div");
eventDiv.appendChild(innerDiv);
$(innerDiv).addClassName("eventInside");
$(innerDiv).addClassName("calendarFolder" + event[1]);
var gradientDiv = document.createElement("div"); for (var i = 1; i < 5; i++) {
var shadowDiv = $(document.createElement("div"));
eventDiv.appendChild(shadowDiv);
shadowDiv.addClassName("shadow");
shadowDiv.addClassName("shadow" + i);
}
var innerDiv = $(document.createElement("div"));
eventDiv.appendChild(innerDiv);
innerDiv.addClassName("eventInside");
innerDiv.addClassName("calendarFolder" + event[1]);
var gradientDiv = $(document.createElement("div"));
innerDiv.appendChild(gradientDiv); innerDiv.appendChild(gradientDiv);
$(gradientDiv).addClassName("gradient"); gradientDiv.addClassName("gradient");
var gradientImg = document.createElement("img"); var gradientImg = document.createElement("img");
gradientDiv.appendChild(gradientImg); gradientDiv.appendChild(gradientImg);
gradientImg.src = ResourcesURL + "/event-gradient.png"; gradientImg.src = ResourcesURL + "/event-gradient.png";
var textDiv = document.createElement("div"); var textDiv = $(document.createElement("div"));
innerDiv.appendChild(textDiv); innerDiv.appendChild(textDiv);
$(textDiv).addClassName("text"); textDiv.addClassName("text");
textDiv.appendChild(document.createTextNode(event[3])); textDiv.appendChild(document.createTextNode(event[3]));
eventDiv.observe("mousedown", listRowMouseDownHandler); eventDiv.observe("mousedown", listRowMouseDownHandler);
@ -820,7 +825,7 @@ function _drawCalendarEvents(events) {
function newEventDIV(eventRep) { function newEventDIV(eventRep) {
// cname, calendar, starts, lasts, // cname, calendar, starts, lasts,
// startHour, endHour, title) { // startHour, endHour, title) {
var eventDiv = document.createElement("div"); var eventDiv = $(document.createElement("div"));
var event = calendarEvents[eventRep.cname]; var event = calendarEvents[eventRep.cname];
if (!event.siblings) if (!event.siblings)
event.siblings = []; event.siblings = [];
@ -828,31 +833,33 @@ function newEventDIV(eventRep) {
eventDiv.cname = event[0]; eventDiv.cname = event[0];
eventDiv.calendar = event[1]; eventDiv.calendar = event[1];
$(eventDiv).addClassName("event"); eventDiv.addClassName("event");
// $(eventDiv).addClassName(eventClass(cname)); if (eventRep.userState && userStates[eventRep.userState])
$(eventDiv).addClassName("starts" + eventRep.start); eventDiv.addClassName(userStates[eventRep.userState]);
$(eventDiv).addClassName("lasts" + eventRep.length);
for (var i = 1; i < 5; i++) {
var shadowDiv = document.createElement("div");
eventDiv.appendChild(shadowDiv);
$(shadowDiv).addClassName("shadow");
$(shadowDiv).addClassName("shadow" + i);
}
var innerDiv = document.createElement("div");
eventDiv.appendChild(innerDiv);
$(innerDiv).addClassName("eventInside");
$(innerDiv).addClassName("calendarFolder" + event[1]);
var gradientDiv = document.createElement("div"); eventDiv.addClassName("starts" + eventRep.start);
eventDiv.addClassName("lasts" + eventRep.length);
for (var i = 1; i < 5; i++) {
var shadowDiv = $(document.createElement("div"));
eventDiv.appendChild(shadowDiv);
shadowDiv.addClassName("shadow");
shadowDiv.addClassName("shadow" + i);
}
var innerDiv = $(document.createElement("div"));
eventDiv.appendChild(innerDiv);
innerDiv.addClassName("eventInside");
innerDiv.addClassName("calendarFolder" + event[1]);
var gradientDiv = $(document.createElement("div"));
innerDiv.appendChild(gradientDiv); innerDiv.appendChild(gradientDiv);
$(gradientDiv).addClassName("gradient"); gradientDiv.addClassName("gradient");
var gradientImg = document.createElement("img"); var gradientImg = $(document.createElement("img"));
gradientDiv.appendChild(gradientImg); gradientDiv.appendChild(gradientImg);
gradientImg.src = ResourcesURL + "/event-gradient.png"; gradientImg.src = ResourcesURL + "/event-gradient.png";
var textDiv = document.createElement("div"); var textDiv = $(document.createElement("div"));
innerDiv.appendChild(textDiv); innerDiv.appendChild(textDiv);
$(textDiv).addClassName("text"); textDiv.addClassName("text");
// if (startHour) { // if (startHour) {
// var headerSpan = document.createElement("span"); // var headerSpan = document.createElement("span");
// textDiv.appendChild(headerSpan); // textDiv.appendChild(headerSpan);
@ -893,7 +900,7 @@ function _drawMonthCalendarEvents(events) {
function newMonthEventDIV(eventRep) { function newMonthEventDIV(eventRep) {
// cname, calendar, starts, lasts, // cname, calendar, starts, lasts,
// startHour, endHour, title) { // startHour, endHour, title) {
var eventDiv = document.createElement("div"); var eventDiv = $(document.createElement("div"));
var event = calendarEvents[eventRep.cname]; var event = calendarEvents[eventRep.cname];
if (!event.siblings) if (!event.siblings)
event.siblings = []; event.siblings = [];
@ -901,28 +908,33 @@ function newMonthEventDIV(eventRep) {
eventDiv.cname = event[0]; eventDiv.cname = event[0];
eventDiv.calendar = event[1]; eventDiv.calendar = event[1];
$(eventDiv).addClassName("event"); eventDiv.addClassName("event");
for (var i = 1; i < 5; i++) { if (eventRep.userState && userStates[eventRep.userState]) {
var shadowDiv = document.createElement("div"); eventDiv.addClassName(userStates[eventRep.userState]);
eventDiv.appendChild(shadowDiv); log (eventDiv.getAttribute("class"));
$(shadowDiv).addClassName("shadow");
$(shadowDiv).addClassName("shadow" + i);
} }
var innerDiv = document.createElement("div");
eventDiv.appendChild(innerDiv);
$(innerDiv).addClassName("eventInside");
$(innerDiv).addClassName("calendarFolder" + event[1]);
var gradientDiv = document.createElement("div"); for (var i = 1; i < 5; i++) {
var shadowDiv = $(document.createElement("div"));
eventDiv.appendChild(shadowDiv);
shadowDiv.addClassName("shadow");
shadowDiv.addClassName("shadow" + i);
}
var innerDiv = $(document.createElement("div"));
eventDiv.appendChild(innerDiv);
innerDiv.addClassName("eventInside");
innerDiv.addClassName("calendarFolder" + event[1]);
var gradientDiv = $(document.createElement("div"));
innerDiv.appendChild(gradientDiv); innerDiv.appendChild(gradientDiv);
$(gradientDiv).addClassName("gradient"); gradientDiv.addClassName("gradient");
var gradientImg = document.createElement("img"); var gradientImg = document.createElement("img");
gradientDiv.appendChild(gradientImg); gradientDiv.appendChild(gradientImg);
gradientImg.src = ResourcesURL + "/event-gradient.png"; gradientImg.src = ResourcesURL + "/event-gradient.png";
var textDiv = document.createElement("div"); var textDiv = $(document.createElement("div"));
innerDiv.appendChild(textDiv); innerDiv.appendChild(textDiv);
$(textDiv).addClassName("textw"); textDiv.addClassName("textw");
var eventText; var eventText;
if (event[7]) if (event[7])
@ -1265,8 +1277,8 @@ function changeWeekCalendarDisplayOfSelectedDay(node) {
var daysView = $("daysView"); var daysView = $("daysView");
var daysDiv = daysView.childNodesWithTag("div"); var daysDiv = daysView.childNodesWithTag("div");
var days = daysDiv[1].childNodesWithTag("div"); var days = daysDiv[1].childNodesWithTag("div");
var headerDiv = $("calendarHeader").childNodesWithTag("div")[1]; var headerDiv = $($("calendarHeader").childNodesWithTag("div")[1]);
var headerDays = $(headerDiv).childNodesWithTag("div"); var headerDays = headerDiv.childNodesWithTag("div");
for (var i = 0; i < days.length; i++) { for (var i = 0; i < days.length; i++) {
if (days[i] == node if (days[i] == node