* Boston, MA 02111-1307, USA.
*/
+#include <math.h>
+
#import <NGObjWeb/SoObject.h>
#import <NGObjWeb/WORequest.h>
#import <NGObjWeb/NSException+HTTP.h>
#import <NGCards/iCalEvent.h>
#import <NGCards/iCalPerson.h>
+#import <NGCards/iCalRecurrenceRule.h>
-#import <SoObjects/SOGo/AgenorUserManager.h>
#import <SoObjects/SOGo/SOGoUser.h>
#import <SoObjects/SOGo/SOGoContentObject.h>
#import <SoObjects/Appointments/SOGoAppointmentFolder.h>
aptEndDate = nil;
item = nil;
event = nil;
+ repeat = nil;
+ isAllDay = NO;
}
return self;
}
+- (void) dealloc
+{
+ [item release];
+ [repeat release];
+ [aptStartDate release];
+ [aptEndDate release];
+ [super dealloc];
+}
+
/* template values */
- (iCalEvent *) event
{
[[self clientObject] baseURL]];
}
-- (NSString *) _toolbarForCalObject
-{
- SOGoUser *currentUser;
- SOGoAppointmentObject *clientObject;
- NSString *filename, *email;
- iCalPerson *person;
- iCalPersonPartStat participationStatus;
-
- clientObject = [self clientObject];
- currentUser = [[self context] activeUser];
- email = [currentUser email];
- if ([clientObject isOrganizer: email
- orOwner: [currentUser login]])
- filename = @"SOGoAppointmentObject.toolbar";
- else
- {
- if ([clientObject isParticipant: email])
- {
- person = [[clientObject component: NO] findParticipantWithEmail: email];
- participationStatus = [person participationStatus];
- if (participationStatus == iCalPersonPartStatAccepted)
- filename = @"SOGoAppointmentObjectDecline.toolbar";
- else if (participationStatus == iCalPersonPartStatDeclined)
- filename = @"SOGoAppointmentObjectAccept.toolbar";
- else
- filename = @"SOGoAppointmentObjectAcceptOrDecline.toolbar";
- }
- else
- filename = @"SOGoComponentClose.toolbar";
- }
-
- return filename;
-}
-
-- (NSString *) toolbar
-{
- return ([self _toolbarForCalObject]);
-}
-
/* icalendar values */
- (BOOL) isAllDay
{
- return NO;
+ NSString *hm;
+
+ hm = [self queryParameterForKey: @"hm"];
+
+ return (isAllDay
+ || (hm && [hm isEqualToString: @"allday"]));
}
- (void) setIsAllDay: (BOOL) newIsAllDay
{
+ isAllDay = newIsAllDay;
}
- (void) setAptStartDate: (NSCalendarDate *) newAptStartDate
- (void) setItem: (NSString *) newItem
{
- item = newItem;
+ ASSIGN (item, newItem);
}
- (NSString *) item
// return reminder;
// }
+- (NSString *) reminder
+{
+ return @"";
+}
+
+- (void) setReminder: (NSString *) newReminder
+{
+}
+
- (NSString *) itemReminderText
{
NSString *text;
- (NSString *) repeat
{
- return @"";
+ return repeat;
}
- (void) setRepeat: (NSString *) newRepeat
{
-}
-
-- (NSString *) reminder
-{
- return @"";
-}
-
-- (void) setReminder: (NSString *) newReminder
-{
+ ASSIGN (repeat, newRepeat);
}
/* actions */
- (NSCalendarDate *) newStartDate
{
NSCalendarDate *newStartDate, *now;
+ NSTimeZone *timeZone;
int hour;
newStartDate = [self selectedDate];
if ([[self queryParameterForKey: @"hm"] length] == 0)
{
now = [NSCalendarDate calendarDate];
- [now setTimeZone: [[self clientObject] userTimeZone]];
+ timeZone = [[context activeUser] timeZone];
+ [now setTimeZone: timeZone];
if ([now isDateOnSameDay: newStartDate])
{
hour = [now hourOfDay];
NSCalendarDate *startDate, *endDate;
NSString *duration;
unsigned int minutes;
+ iCalRecurrenceRule *rule;
event = (iCalEvent *) [[self clientObject] component: NO];
if (event)
{
startDate = [event startDate];
- endDate = [event endDate];
+ isAllDay = [event isAllDay];
+ if (isAllDay)
+ endDate = [[event endDate] dateByAddingYears: 0 months: 0 days: -1];
+ else
+ endDate = [event endDate];
}
else
{
ASSIGN (aptStartDate, startDate);
ASSIGN (aptEndDate, endDate);
- /* here comes the code for initializing repeat, reminder and isAllDay... */
+ // We initialize our repeat ivars
+ if ([event hasRecurrenceRules])
+ {
+ repeat = @"CUSTOM";
+
+ rule = [[event recurrenceRules] lastObject];
+
+ if ([rule frequency] == iCalRecurrenceFrequenceWeekly)
+ {
+ if ([rule repeatInterval] == 1)
+ repeat = @"WEEKLY";
+ else if ([rule repeatInterval] == 2)
+ repeat = @"BI-WEEKLY";
+ }
+ else if ([rule frequency] == iCalRecurrenceFrequenceDaily)
+ {
+ if ([rule byDayMask] == (iCalWeekDayMonday
+ | iCalWeekDayTuesday
+ | iCalWeekDayWednesday
+ | iCalWeekDayThursday
+ | iCalWeekDayFriday))
+ repeat = @"EVERY WEEKDAY";
+ else if (![rule byDayMask])
+ repeat = @"DAILY";
+ }
+ else if ([rule frequency] == iCalRecurrenceFrequenceMonthly
+ && [rule repeatInterval] == 1)
+ repeat = @"MONTHLY";
+ else if ([rule frequency] == iCalRecurrenceFrequenceYearly
+ && [rule repeatInterval] == 1)
+ repeat = @"YEARLY";
+ }
+ else
+ DESTROY(repeat);
return self;
}
{
NSString *objectId, *method, *uri;
id <WOActionResults> result;
- Class clientKlazz;
+ SOGoAppointmentFolder *co;
- clientKlazz = [[self clientObject] class];
- objectId = [clientKlazz globallyUniqueObjectId];
+ co = [self clientObject];
+ objectId = [co globallyUniqueObjectId];
if ([objectId length] > 0)
{
- method = [NSString stringWithFormat:@"%@/Calendar/%@/editAsAppointment",
- [self userFolderPath], objectId];
+ method = [NSString stringWithFormat:@"%@/%@/editAsAppointment",
+ [co soURL], objectId];
uri = [self completeHrefForMethod: method];
result = [self redirectToLocation: uri];
}
NSString *iCalString;
clientObject = [self clientObject];
+ NSLog(@"saveAction, clientObject = %@", clientObject);
+
iCalString = [[clientObject calendar: NO] versitString];
+
+ NSLog(@"saveAction, iCalString = %@", iCalString);
[clientObject saveContentString: iCalString];
- return [self jsCloseWithRefreshMethod: @"refreshAppointmentsAndDisplay()"];
+ return [self jsCloseWithRefreshMethod: @"refreshEventsAndDisplay()"];
}
- (BOOL) shouldTakeValuesFromRequest: (WORequest *) request
inContext: (WOContext*) context
{
+ NSString *actionName;
+
+ actionName = [[request requestHandlerPath] lastPathComponent];
+
return ([[self clientObject] isKindOfClass: [SOGoAppointmentObject class]]
- && [[request method] isEqualToString: @"POST"]);
+ && [actionName hasPrefix: @"save"]);
}
- (void) takeValuesFromRequest: (WORequest *) _rq
inContext: (WOContext *) _ctx
{
SOGoAppointmentObject *clientObject;
+ int nbrDays;
+ iCalRecurrenceRule *rule;
clientObject = [self clientObject];
event = (iCalEvent *) [clientObject component: YES];
[super takeValuesFromRequest: _rq inContext: _ctx];
- [event setStartDate: aptStartDate];
- [event setEndDate: aptEndDate];
+ if (isAllDay)
+ {
+ nbrDays = ((float) abs ([aptEndDate timeIntervalSinceDate: aptStartDate])
+ / 86400) + 1;
+ [event setAllDayWithStartDate: aptStartDate
+ duration: nbrDays];
+ }
+ else
+ {
+ [event setStartDate: aptStartDate];
+ [event setEndDate: aptEndDate];
+ }
if ([clientObject isNew])
[event setTransparency: @"OPAQUE"];
+
+ // We remove any repeat rules
+ if (!repeat && [event hasRecurrenceRules])
+ [event removeAllRecurrenceRules];
+ else if (!([repeat caseInsensitiveCompare: @"-"] == NSOrderedSame
+ || [repeat caseInsensitiveCompare: @"CUSTOM"] == NSOrderedSame))
+ {
+ rule = [iCalRecurrenceRule new];
+
+ [rule setInterval: @"1"];
+ if ([repeat caseInsensitiveCompare: @"BI-WEEKLY"] == NSOrderedSame)
+ {
+ [rule setFrequency: iCalRecurrenceFrequenceWeekly];
+ [rule setInterval: @"2"];
+ }
+ else if ([repeat caseInsensitiveCompare: @"EVERY WEEKDAY"] == NSOrderedSame)
+ {
+ [rule setByDayMask: (iCalWeekDayMonday
+ |iCalWeekDayTuesday
+ |iCalWeekDayWednesday
+ |iCalWeekDayThursday
+ |iCalWeekDayFriday)];
+ [rule setFrequency: iCalRecurrenceFrequenceDaily];
+ }
+ else
+ [rule setFrequency:
+ (iCalRecurrenceFrequency) [rule valueForFrequency: repeat]];
+ [event setRecurrenceRules: [NSArray arrayWithObject: rule]];
+ [rule release];
+ }
}
// TODO: add tentatively
-- (id) acceptOrDeclineAction: (BOOL) _accept
+- (id) acceptOrDeclineAction: (BOOL) accept
{
- [[self clientObject] changeParticipationStatus:
- _accept ? @"ACCEPTED" : @"DECLINED"
- inContext: [self context]];
+ [[self clientObject] changeParticipationStatus: (accept
+ ? @"ACCEPTED"
+ : @"DECLINED")];
return self;
}
- (id) acceptAction
{
- return [self acceptOrDeclineAction:YES];
+ return [self acceptOrDeclineAction: YES];
}
- (id) declineAction
{
- return [self acceptOrDeclineAction:NO];
+ return [self acceptOrDeclineAction: NO];
}
@end