]> err.no Git - scalable-opengroupware.org/blobdiff - UI/Scheduler/UIxAppointmentEditor.m
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1196 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / UI / Scheduler / UIxAppointmentEditor.m
index 3f1fa9b0718ed522d7410808ea1b2d783f9dfb93..de4e0c4722bffef7142a4d26930e0627125ab332 100644 (file)
@@ -20,6 +20,8 @@
  * Boston, MA 02111-1307, USA.
  */
 
+#include <math.h>
+
 #import <NGObjWeb/SoObject.h>
 #import <NGObjWeb/WORequest.h>
 #import <NGObjWeb/NSException+HTTP.h>
@@ -27,8 +29,8 @@
 
 #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 *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