Fixed bug #1515 Task View is very basic.

- Added sortable fields on Title, Due date, Location, Category and
  Calendar.
- Added Priority column, also sortable.
- Separated the logic of Events and Tasks.
This commit is contained in:
Luc Charland
2012-10-01 16:20:10 -04:00
parent 4038229688
commit 034f2c8745
7 changed files with 277 additions and 80 deletions
+20
View File
@@ -48,6 +48,20 @@
#define eventErasableIndex 19
#define eventOwnerIsOrganizerIndex 20
// See [UIxCalListingActions initialize]
#define taskNameIndex 0
#define taskFolderIndex 1
#define taskCalendarNameIndex 2
#define taskStatusIndex 3
#define taskTitleIndex 4
#define taskEndDateIndex 5
#define taskClassificationIndex 6
#define taskLocationIndex 7
#define taskCategoryIndex 8
#define taskEditableIndex 9
#define taskErasableIndex 10
#define taskPriorityIndex 11
@interface NSArray (SOGoEventComparison)
- (NSComparisonResult) compareEventsStartDateAscending: (NSArray *) otherEvent;
@@ -56,6 +70,12 @@
- (NSComparisonResult) compareEventsLocationAscending: (NSArray *) otherEvent;
- (NSComparisonResult) compareEventsCalendarNameAscending: (NSArray *) otherEvent;
- (NSComparisonResult) compareTasksAscending: (NSArray *) otherTask;
- (NSComparisonResult) compareTasksPriorityAscending: (NSArray *) otherTask;
- (NSComparisonResult) compareTasksTitleAscending: (NSArray *) otherTask;
- (NSComparisonResult) compareTasksEndAscending: (NSArray *) otherTask;
- (NSComparisonResult) compareTasksLocationAscending: (NSArray *) otherTask;
- (NSComparisonResult) compareTasksCategoryAscending: (NSArray *) otherTask;
- (NSComparisonResult) compareTasksCalendarNameAscending: (NSArray *) otherTask;
- (NSArray *) reversedArray;
@end
+135 -26
View File
@@ -27,6 +27,7 @@
#import <Foundation/NSValue.h>
#import <NGExtensions/NGCalendarDateRange.h>
#import <NGExtensions/NSNull+misc.h>
#import "NSArray+Scheduler.h"
@@ -119,40 +120,148 @@
NSComparisonResult result;
unsigned int selfTime, otherTime;
result = [self _compareCompletionWithStatus1: [self objectAtIndex: 2]
andStatus2: [otherTask objectAtIndex: 2]];
result = [self _compareCompletionWithStatus1: [self objectAtIndex: taskCalendarNameIndex]
andStatus2: [otherTask objectAtIndex: taskCalendarNameIndex]];
if (result == NSOrderedSame)
{
// End date
selfTime = [[self objectAtIndex: taskEndDateIndex] intValue];
otherTime = [[otherTask objectAtIndex: taskEndDateIndex] intValue];
if (selfTime && !otherTime)
result = NSOrderedAscending;
else if (!selfTime && otherTime)
result = NSOrderedDescending;
else
{
// End date
selfTime = [[self objectAtIndex: 5] intValue];
otherTime = [[otherTask objectAtIndex: 5] intValue];
if (selfTime && !otherTime)
result = NSOrderedAscending;
else if (!selfTime && otherTime)
result = NSOrderedDescending;
if (selfTime > otherTime)
result = NSOrderedDescending;
else if (selfTime < otherTime)
result = NSOrderedAscending;
else
{
if (selfTime > otherTime)
result = NSOrderedDescending;
else if (selfTime < otherTime)
result = NSOrderedAscending;
else
{
// Calendar ID
result = [[self objectAtIndex: 1]
compare: [otherTask objectAtIndex: 1]];
if (result == NSOrderedSame)
// Task name
result = [[self objectAtIndex: 4]
compare: [otherTask objectAtIndex: 4]
options: NSCaseInsensitiveSearch];
}
}
{
// Calendar ID
result = [[self objectAtIndex: taskFolderIndex]
compare: [otherTask objectAtIndex: taskFolderIndex]];
if (result == NSOrderedSame)
// Task name
result = [[self objectAtIndex: taskTitleIndex]
compare: [otherTask objectAtIndex: taskTitleIndex]
options: NSCaseInsensitiveSearch];
}
}
}
return result;
}
- (NSComparisonResult) compareTasksPriorityAscending: (NSArray *) otherTask
{
NSComparisonResult result;
int selfPriority, otherPriority;
selfPriority = [[self objectAtIndex: taskPriorityIndex] intValue];
otherPriority = [[otherTask objectAtIndex: taskPriorityIndex] intValue];
if (selfPriority && !otherPriority)
result = NSOrderedAscending;
else if (!selfPriority && otherPriority)
result = NSOrderedDescending;
else
{
if (selfPriority > otherPriority)
result = NSOrderedDescending;
else if (selfPriority < otherPriority)
result = NSOrderedAscending;
else
result = NSOrderedSame;
}
return result;
}
- (NSComparisonResult) compareTasksTitleAscending: (NSArray *) otherTask
{
NSString *selfTitle, *otherTitle;
selfTitle = [self objectAtIndex: taskTitleIndex];
otherTitle = [otherTask objectAtIndex: taskTitleIndex];
return [selfTitle caseInsensitiveCompare: otherTitle];
}
- (NSComparisonResult) compareTasksEndAscending: (NSArray *) otherTask
{
NSComparisonResult result;
unsigned int selfTime, otherTime;
// End date
selfTime = [[self objectAtIndex: taskEndDateIndex] intValue];
otherTime = [[otherTask objectAtIndex: taskEndDateIndex] intValue];
if (selfTime && !otherTime)
result = NSOrderedAscending;
else if (!selfTime && otherTime)
result = NSOrderedDescending;
else
{
if (selfTime > otherTime)
result = NSOrderedDescending;
else if (selfTime < otherTime)
result = NSOrderedAscending;
else
{
// Calendar ID
result = [[self objectAtIndex: taskFolderIndex]
compare: [otherTask objectAtIndex: taskFolderIndex]];
if (result == NSOrderedSame)
// Task name
result = [[self objectAtIndex: taskTitleIndex]
compare: [otherTask objectAtIndex: taskTitleIndex]
options: NSCaseInsensitiveSearch];
}
}
return result;
}
- (NSComparisonResult) compareTasksLocationAscending: (NSArray *) otherTask
{
NSString *selfLocation, *otherLocation;
selfLocation = [self objectAtIndex: taskLocationIndex];
otherLocation = [otherTask objectAtIndex: taskLocationIndex];
return [selfLocation caseInsensitiveCompare: otherLocation];
}
- (NSComparisonResult) compareTasksCategoryAscending: (NSArray *) otherTask
{
NSString *selfCategory, *otherCategory;
NSComparisonResult result;
selfCategory = [self objectAtIndex: taskCategoryIndex];
otherCategory = [otherTask objectAtIndex: taskCategoryIndex];
if ([selfCategory isNotNull] && [otherCategory isNotNull])
result = [selfCategory caseInsensitiveCompare: otherCategory];
else if ([selfCategory isNotNull])
result = NSOrderedAscending;
else if ([otherCategory isNotNull])
result = NSOrderedDescending;
else
result = NSOrderedSame;
return result;
}
- (NSComparisonResult) compareTasksCalendarNameAscending: (NSArray *) otherTask
{
NSString *selfCalendarName, *otherCalendarName;
selfCalendarName = [self objectAtIndex: taskCalendarNameIndex];
otherCalendarName = [otherTask objectAtIndex: taskCalendarNameIndex];
return [selfCalendarName caseInsensitiveCompare: otherCalendarName];
}
- (NSArray *) reversedArray
{
return [[self reverseObjectEnumerator] allObjects];
+25 -5
View File
@@ -1047,14 +1047,16 @@ _computeBlocksPosition (NSArray *blocks)
- (WOResponse *) tasksListAction
{
NSMutableArray *filteredTasks, *filteredTask;
NSString *sort, *ascending;
NSString *statusFlag;
SOGoUserSettings *us;
NSEnumerator *tasks;
NSMutableArray *filteredTasks, *filteredTask;
BOOL showCompleted;
NSArray *task;
int statusCode;
unsigned int endDateStamp;
NSString *statusFlag;
BOOL showCompleted;
int statusCode;
filteredTasks = [NSMutableArray array];
@@ -1087,7 +1089,25 @@ _computeBlocksPosition (NSArray *blocks)
[filteredTasks addObject: filteredTask];
}
}
[filteredTasks sortUsingSelector: @selector (compareTasksAscending:)];
sort = [[context request] formValueForKey: @"sort"];
if ([sort isEqualToString: @"title"])
[filteredTasks sortUsingSelector: @selector (compareTasksTitleAscending:)];
else if ([sort isEqualToString: @"priority"])
[filteredTasks sortUsingSelector: @selector (compareTasksPriorityAscending:)];
else if ([sort isEqualToString: @"end"])
[filteredTasks sortUsingSelector: @selector (compareTasksEndAscending:)];
else if ([sort isEqualToString: @"location"])
[filteredTasks sortUsingSelector: @selector (compareTasksLocationAscending:)];
else if ([sort isEqualToString: @"category"])
[filteredTasks sortUsingSelector: @selector (compareTasksCategoryAscending:)];
else if ([sort isEqualToString: @"calendarname"])
[filteredTasks sortUsingSelector: @selector (compareTasksCalendarNameAscending:)];
else
[filteredTasks sortUsingSelector: @selector (compareTasksAscending:)];
ascending = [[context request] formValueForKey: @"asc"];
if (![ascending boolValue])
[filteredTasks reverseArray];
return [self _responseWithData: filteredTasks];
}