Fix support for recurrent tasks

This commit is contained in:
Francis Lachapelle
2016-10-21 17:30:47 -04:00
parent 827e9cfca6
commit ef84985025
5 changed files with 67 additions and 33 deletions
+6
View File
@@ -1,3 +1,9 @@
2.3.18 (2016-11-DD)
-------------------
Bug fixes
- [web] fixed support for recurrent tasks
2.3.17 (2016-10-20)
-------------------
+30 -12
View File
@@ -869,16 +869,22 @@ static Class iCalEventK = nil;
}
[record setObject: dateSecs forKey: @"c_recurrence_id"];
date = [theCycle endDate];
if (theEventTimeZone)
date = [record valueForKey: @"c_enddate"];
if ([date isNotNull])
{
secondsOffsetFromGMT = (int) [[theEventTimeZone periodForDate: date] secondsOffsetFromGMT];
date = [date dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: -secondsOffsetFromGMT];
date = [theCycle endDate];
if (theEventTimeZone)
{
secondsOffsetFromGMT = (int) [[theEventTimeZone periodForDate: date] secondsOffsetFromGMT];
date = [date dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: -secondsOffsetFromGMT];
}
[date setTimeZone: timeZone];
[record setObject: date forKey: @"endDate"];
dateSecs = [NSNumber numberWithInt: [date timeIntervalSince1970]];
[record setObject: dateSecs forKey: @"c_enddate"];
}
[date setTimeZone: timeZone];
[record setObject: date forKey: @"endDate"];
dateSecs = [NSNumber numberWithInt: [date timeIntervalSince1970]];
[record setObject: dateSecs forKey: @"c_enddate"];
else
[record removeObjectForKey: @"endDate"];
return record;
}
@@ -980,7 +986,7 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir
toArray: (NSMutableArray *) ma
{
NGCalendarDateRange *recurrenceIdRange;
NSCalendarDate *recurrenceId;
NSCalendarDate *recurrenceId, *masterEndDate, *endDate;
NSMutableDictionary *newRecord;
NGCalendarDateRange *newRecordRange;
NSComparisonResult compare;
@@ -1010,8 +1016,20 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir
[recurrenceId setTimeZone: tz];
}
master = [[[component parent] events] objectAtIndex: 0];
delta = [[master endDate] timeIntervalSinceDate: [master startDate]];
if ([component isKindOfClass: [iCalEvent class]])
{
master = [[[component parent] events] objectAtIndex: 0];
masterEndDate = [master endDate];
endDate = [component endDate];
}
else
{
master = [[[component parent] todos] objectAtIndex: 0];
masterEndDate = [master due];
endDate = [component due];
}
delta = [masterEndDate timeIntervalSinceDate: [master startDate]];
recurrenceIdRange = [NGCalendarDateRange calendarDateRangeWithStartDate: recurrenceId
endDate: [recurrenceId dateByAddingYears:0 months:0 days:0 hours:0 minutes:0 seconds: delta]];
if ([dateRange doesIntersectWithDateRange: recurrenceIdRange])
@@ -1022,7 +1040,7 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir
if (recordIndex > -1)
{
if ([dateRange containsDate: [component startDate]] ||
[dateRange containsDate: [component endDate]])
[dateRange containsDate: endDate])
{
// We must pass nil to :container here in order to avoid re-entrancy issues.
newRecord = [self _fixupRecord: [component quickRecordFromContent: nil container: nil]];
+13 -10
View File
@@ -93,20 +93,23 @@
newOccurence = (iCalToDo *) [super newOccurenceWithID: theRecurrenceID];
date = [newOccurence recurrenceId];
[newOccurence setStartDate: date];
master = [self component: NO secure: NO];
firstDate = [master startDate];
interval = [[master due]
timeIntervalSinceDate: (NSDate *)firstDate];
if ([master due])
{
firstDate = [master startDate];
interval = [[master due]
timeIntervalSinceDate: (NSDate *)firstDate];
[newOccurence setStartDate: date];
[newOccurence setDue: [date addYear: 0
month: 0
day: 0
hour: 0
minute: 0
second: interval]];
[newOccurence setDue: [date addYear: 0
month: 0
day: 0
hour: 0
minute: 0
second: interval]];
}
return newOccurence;
}
+5
View File
@@ -61,6 +61,11 @@
#define taskEditableIndex 9
#define taskErasableIndex 10
#define taskPriorityIndex 11
#define taskOwnerIndex 12
#define taskRecurrenceIdIndex 13
#define taskIsExceptionIndex 14
#define taskDescriptionIndex 15
#define taskStatusFlagIndex 16
@interface NSArray (SOGoEventComparison)
+13 -11
View File
@@ -99,7 +99,8 @@ static NSArray *tasksFields = nil;
@"c_status", @"c_title", @"c_enddate",
@"c_classification", @"c_location", @"c_category",
@"editable", @"erasable",
@"c_priority", @"c_owner", @"c_recurrence_id", @"isException", @"c_description", nil];
@"c_priority", @"c_owner",
@"c_recurrence_id", @"isException", @"c_description", nil];
[tasksFields retain];
}
}
@@ -313,7 +314,7 @@ static NSArray *tasksFields = nil;
NSMutableDictionary *newInfo;
NSMutableArray *infos, *newInfoForComponent, *quickInfos, *allInfos, *quickInfosName;
NSNull *marker;
NSString *owner, *role, *calendarName, *filters, *iCalString;
NSString *owner, *role, *calendarName, *iCalString;
NSRange match;
iCalCalendar *calendar;
iCalEntityObject *master;
@@ -1072,7 +1073,6 @@ _computeBlocksPosition (NSArray *blocks)
NSString *fUID;
NSNumber *isActive;
unsigned int count, foldersCount;
int max=0, i;
co = [self clientObject];
folders = [co subFolders];
@@ -1218,14 +1218,12 @@ _computeBlocksPosition (NSArray *blocks)
BOOL showCompleted;
int statusCode;
int startSecs;
int endsSecs;
filteredTasks = [NSMutableArray array];
[self _setupContext];
startSecs = (unsigned int) [startDate timeIntervalSince1970];
endsSecs = (unsigned int) [endDate timeIntervalSince1970];
tasksView = [request formValueForKey: @"filterpopup"];
#warning see TODO in SchedulerUI.js about "setud"
@@ -1242,11 +1240,11 @@ _computeBlocksPosition (NSArray *blocks)
while ((task = [tasks nextObject]))
{
statusCode = [[task objectAtIndex: 3] intValue];
statusCode = [[task objectAtIndex: taskStatusIndex] intValue];
if (statusCode != 1 || showCompleted)
{
filteredTask = [NSMutableArray arrayWithArray: task];
endDateStamp = [[task objectAtIndex: 5] intValue];
endDateStamp = [[task objectAtIndex: taskEndDateIndex] intValue];
statusFlag = [self _getStatusClassForStatusCode: statusCode
andEndDateStamp: endDateStamp];
[filteredTask addObject: statusFlag];
@@ -1258,15 +1256,19 @@ _computeBlocksPosition (NSArray *blocks)
[tasksView isEqualToString:@"view_next7"] ||
[tasksView isEqualToString:@"view_next14"] ||
[tasksView isEqualToString:@"view_next31"] ||
[tasksView isEqualToString:@"view_thismonth"]) && ((endDateStamp <= endsSecs) && (endDateStamp >= startSecs)))
[tasksView isEqualToString:@"view_thismonth"]) &&
(endDateStamp == 0 || endDateStamp >= startSecs))
[filteredTasks addObject: filteredTask];
else if ([tasksView isEqualToString:@"view_all"])
[filteredTasks addObject: filteredTask];
else if (([tasksView isEqualToString:@"view_overdue"]) && ([[filteredTask objectAtIndex:15] isEqualToString:@"overdue"]))
else if (([tasksView isEqualToString:@"view_overdue"]) &&
([[filteredTask objectAtIndex:taskStatusFlagIndex] isEqualToString:@"overdue"]))
[filteredTasks addObject: filteredTask];
else if ([tasksView isEqualToString:@"view_incomplete"] && (![[filteredTask objectAtIndex:15] isEqualToString:@"completed"]))
else if ([tasksView isEqualToString:@"view_incomplete"] &&
(![[filteredTask objectAtIndex:taskStatusFlagIndex] isEqualToString:@"completed"]))
[filteredTasks addObject: filteredTask];
else if ([tasksView isEqualToString:@"view_not_started"] && ([[[filteredTask objectAtIndex:3] stringValue] isEqualToString:@"0"]))
else if ([tasksView isEqualToString:@"view_not_started"] &&
([[[filteredTask objectAtIndex:taskStatusIndex] stringValue] isEqualToString:@"0"]))
[filteredTasks addObject: filteredTask];
}
}