From 52cdb71d1f2b3696f7cc395163d35a73d526c5c9 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Wed, 30 Nov 2016 12:13:48 -0500 Subject: [PATCH] Add sort by start date for the tasks list Fixes #3840 --- NEWS | 1 + UI/Scheduler/NSArray+Scheduler.h | 34 ++++++++++--------- UI/Scheduler/NSArray+Scheduler.m | 36 ++++++++++++++++++++- UI/Scheduler/UIxCalListingActions.m | 7 ++-- UI/Templates/SchedulerUI/UIxCalMainView.wox | 2 +- 5 files changed, 59 insertions(+), 21 deletions(-) diff --git a/NEWS b/NEWS index d63c2411e..0c560ea72 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ Enhancements - [core] added handling of BYSETPOS for BYDAY in recurrence rules + - [web] added sort by start date for tasks (#3840) Bug fixes - [web] fixed JavaScript exception when SOGo is launched from an external link (#3900) diff --git a/UI/Scheduler/NSArray+Scheduler.h b/UI/Scheduler/NSArray+Scheduler.h index 10048f0ef..cf1b83e8e 100644 --- a/UI/Scheduler/NSArray+Scheduler.h +++ b/UI/Scheduler/NSArray+Scheduler.h @@ -54,21 +54,22 @@ #define taskCalendarNameIndex 2 #define taskStatusIndex 3 #define taskTitleIndex 4 -#define taskEndDateIndex 5 -#define taskClassificationIndex 6 -#define taskLocationIndex 7 -#define taskCategoryIndex 8 -#define taskViewableIndex 9 -#define taskEditableIndex 10 -#define taskErasableIndex 11 -#define taskPriorityIndex 12 -#define taskOwnerIndex 13 -#define taskIsCycleIndex 14 -#define taskNextAlarmIndex 15 -#define taskRecurrenceIdIndex 16 -#define taskIsExceptionIndex 17 -#define taskDescriptionIndex 18 -#define taskStatusFlagIndex 19 +#define taskStartDateIndex 5 +#define taskEndDateIndex 6 +#define taskClassificationIndex 7 +#define taskLocationIndex 8 +#define taskCategoryIndex 9 +#define taskViewableIndex 10 +#define taskEditableIndex 11 +#define taskErasableIndex 12 +#define taskPriorityIndex 13 +#define taskOwnerIndex 14 +#define taskIsCycleIndex 15 +#define taskNextAlarmIndex 16 +#define taskRecurrenceIdIndex 17 +#define taskIsExceptionIndex 18 +#define taskDescriptionIndex 19 +#define taskStatusFlagIndex 20 @interface NSArray (SOGoEventComparison) @@ -80,7 +81,8 @@ - (NSComparisonResult) compareTasksAscending: (NSArray *) otherTask; - (NSComparisonResult) compareTasksPriorityAscending: (NSArray *) otherTask; - (NSComparisonResult) compareTasksTitleAscending: (NSArray *) otherTask; -- (NSComparisonResult) compareTasksEndAscending: (NSArray *) otherTask; +- (NSComparisonResult) compareTasksStartDateAscending: (NSArray *) otherTask; +- (NSComparisonResult) compareTasksEndDateAscending: (NSArray *) otherTask; - (NSComparisonResult) compareTasksLocationAscending: (NSArray *) otherTask; - (NSComparisonResult) compareTasksCategoryAscending: (NSArray *) otherTask; - (NSComparisonResult) compareTasksCalendarNameAscending: (NSArray *) otherTask; diff --git a/UI/Scheduler/NSArray+Scheduler.m b/UI/Scheduler/NSArray+Scheduler.m index f4fc06017..0309e0226 100644 --- a/UI/Scheduler/NSArray+Scheduler.m +++ b/UI/Scheduler/NSArray+Scheduler.m @@ -182,7 +182,41 @@ return [selfTitle caseInsensitiveCompare: otherTitle]; } -- (NSComparisonResult) compareTasksEndAscending: (NSArray *) otherTask +- (NSComparisonResult) compareTasksStartDateAscending: (NSArray *) otherTask +{ + NSComparisonResult result; + unsigned int selfTime, otherTime; + + // Start date + selfTime = [[self objectAtIndex: taskStartDateIndex] intValue]; + otherTime = [[otherTask objectAtIndex: taskStartDateIndex] 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) compareTasksEndDateAscending: (NSArray *) otherTask { NSComparisonResult result; unsigned int selfTime, otherTime; diff --git a/UI/Scheduler/UIxCalListingActions.m b/UI/Scheduler/UIxCalListingActions.m index 2cbe8dbed..5c17f22a0 100644 --- a/UI/Scheduler/UIxCalListingActions.m +++ b/UI/Scheduler/UIxCalListingActions.m @@ -90,7 +90,7 @@ static NSArray *tasksFields = nil; { tasksFields = [NSArray arrayWithObjects: @"c_name", @"c_folder", @"calendarName", - @"c_status", @"c_title", @"c_enddate", + @"c_status", @"c_title", @"c_startdate", @"c_enddate", @"c_classification", @"c_location", @"c_category", @"viewable", @"editable", @"erasable", @"c_priority", @"c_owner", @@ -1595,7 +1595,6 @@ _computeBlocksPosition (NSArray *blocks) forAllDay: NO]]; else [filteredTask addObject: [NSNull null]]; - if (([tasksView isEqualToString:@"view_today"] || [tasksView isEqualToString:@"view_next7"] || [tasksView isEqualToString:@"view_next14"] || @@ -1621,8 +1620,10 @@ _computeBlocksPosition (NSArray *blocks) [filteredTasks sortUsingSelector: @selector (compareTasksTitleAscending:)]; else if ([sort isEqualToString: @"priority"]) [filteredTasks sortUsingSelector: @selector (compareTasksPriorityAscending:)]; + else if ([sort isEqualToString: @"start"]) + [filteredTasks sortUsingSelector: @selector (compareTasksStartDateAscending:)]; else if ([sort isEqualToString: @"end"]) - [filteredTasks sortUsingSelector: @selector (compareTasksEndAscending:)]; + [filteredTasks sortUsingSelector: @selector (compareTasksEndDateAscending:)]; else if ([sort isEqualToString: @"location"]) [filteredTasks sortUsingSelector: @selector (compareTasksLocationAscending:)]; else if ([sort isEqualToString: @"category"]) diff --git a/UI/Templates/SchedulerUI/UIxCalMainView.wox b/UI/Templates/SchedulerUI/UIxCalMainView.wox index 140e7cec2..673ab9f15 100644 --- a/UI/Templates/SchedulerUI/UIxCalMainView.wox +++ b/UI/Templates/SchedulerUI/UIxCalMainView.wox @@ -466,7 +466,7 @@ - +