From 891687ace094d24b0c968abcaa86c735df191517 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Thu, 6 Dec 2007 17:29:32 +0000 Subject: [PATCH] Monotone-Parent: 072d560619f22b78e92501eb17c779b5ce668cac Monotone-Revision: c6bfd1926ff53d5a648a5ff92a03176498297cf8 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2007-12-06T17:29:32 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 13 ++++- UI/Scheduler/NSArray+Scheduler.h | 6 ++- UI/Scheduler/NSArray+Scheduler.m | 44 +++++++++++++++- UI/Scheduler/UIxCalListingActions.m | 18 ++++++- UI/Templates/SchedulerUI/UIxCalMainView.wox | 8 +-- UI/WebServerResources/SchedulerUI.js | 58 ++++++++++++++++----- 6 files changed, 126 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index af43fe950..4a695cab0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2007-12-06 Francis Lachapelle + + * UI/Scheduler/NSArray+Scheduler.m ([NSArray -compareEventsTitleAscending:otherEvent]) + ([NSArray -compareEventsLocationAscending:otherEvent]) + ([NSArray -compareEventsEndDateAscending:otherEvent]) + ([NSArray -reversedArray]): new methods that sort an array of + events depending of various parameters. + + * UI/Scheduler/UIxCalListingActions.m ([UIxCalListingActions + -eventsListAction]): added support for sorting events. + 2007-12-05 Wolfgang Sourdeau * UI/Scheduler/UIxTaskEditor.m ([UIxTaskEditor -newAction]): @@ -25,7 +36,7 @@ 2007-12-05 Francis Lachapelle - * SoObjects/Mailer/SOGoDraftObject.m: The condition for replyToAll + * SoObjects/Mailer/SOGoDraftObject.m: the condition for replyToAll has to be done later to avoid duplicated to and cc addresses. 2007-12-04 Wolfgang Sourdeau diff --git a/UI/Scheduler/NSArray+Scheduler.h b/UI/Scheduler/NSArray+Scheduler.h index ac8e8b987..b9da8dc3f 100644 --- a/UI/Scheduler/NSArray+Scheduler.h +++ b/UI/Scheduler/NSArray+Scheduler.h @@ -27,8 +27,12 @@ @interface NSArray (SOGoEventComparison) -- (NSComparisonResult) compareEventsAscending: (NSArray *) otherEvent; +- (NSComparisonResult) compareEventsStartDateAscending: (NSArray *) otherEvent; +- (NSComparisonResult) compareEventsEndDateAscending: (NSArray *) otherEvent; +- (NSComparisonResult) compareEventsTitleAscending: (NSArray *) otherEvent; +- (NSComparisonResult) compareEventsLocationAscending: (NSArray *) otherEvent; - (NSComparisonResult) compareTasksAscending: (NSArray *) otherTask; +- (NSArray *) reversedArray; @end diff --git a/UI/Scheduler/NSArray+Scheduler.m b/UI/Scheduler/NSArray+Scheduler.m index 6425f6c53..eaf7f0d44 100644 --- a/UI/Scheduler/NSArray+Scheduler.m +++ b/UI/Scheduler/NSArray+Scheduler.m @@ -47,7 +47,7 @@ return result; } -- (NSComparisonResult) compareEventsAscending: (NSArray *) otherEvent +- (NSComparisonResult) compareEventsStartDateAscending: (NSArray *) otherEvent { NSComparisonResult result; unsigned int selfTime, otherTime; @@ -64,6 +64,43 @@ return result; } +- (NSComparisonResult) compareEventsEndDateAscending: (NSArray *) otherEvent +{ + NSComparisonResult result; + unsigned int selfTime, otherTime; + + selfTime = [[self objectAtIndex: 5] intValue]; + otherTime = [[otherEvent objectAtIndex: 5] intValue]; + if (selfTime > otherTime) + result = NSOrderedDescending; + else if (selfTime < otherTime) + result = NSOrderedAscending; + else + result = NSOrderedSame; + + return result; +} + +- (NSComparisonResult) compareEventsTitleAscending: (NSArray *) otherEvent +{ + NSString *selfTitle, *otherTitle; + + selfTitle = [self objectAtIndex: 3]; + otherTitle = [otherEvent objectAtIndex: 3]; + + return [selfTitle caseInsensitiveCompare: otherTitle]; +} + +- (NSComparisonResult) compareEventsLocationAscending: (NSArray *) otherEvent +{ + NSString *selfTitle, *otherTitle; + + selfTitle = [self objectAtIndex: 6]; + otherTitle = [otherEvent objectAtIndex: 6]; + + return [selfTitle caseInsensitiveCompare: otherTitle]; +} + - (NSComparisonResult) compareTasksAscending: (NSArray *) otherTask { NSComparisonResult result; @@ -96,4 +133,9 @@ return result; } +- (NSArray *) reversedArray +{ + return [[self reverseObjectEnumerator] allObjects]; +} + @end diff --git a/UI/Scheduler/UIxCalListingActions.m b/UI/Scheduler/UIxCalListingActions.m index f5a25d5a9..5e8905a35 100644 --- a/UI/Scheduler/UIxCalListingActions.m +++ b/UI/Scheduler/UIxCalListingActions.m @@ -313,6 +313,7 @@ NSMutableArray *newEvents, *newEvent; unsigned int interval; BOOL isAllDay; + NSString *sort, *ascending; [self _setupContext]; @@ -340,10 +341,23 @@ [newEvent addObject: [self _formattedDateForSeconds: interval forAllDay: isAllDay]]; [newEvents addObject: newEvent]; - + oldEvent = [events nextObject]; } - [newEvents sortUsingSelector: @selector (compareEventsAscending:)]; + + sort = [[context request] formValueForKey: @"sort"]; + if ([sort isEqualToString: @"title"]) + [newEvents sortUsingSelector: @selector (compareEventsTitleAscending:)]; + else if ([sort isEqualToString: @"end"]) + [newEvents sortUsingSelector: @selector (compareEventsEndDateAscending:)]; + else if ([sort isEqualToString: @"location"]) + [newEvents sortUsingSelector: @selector (compareEventsLocationAscending:)]; + else + [newEvents sortUsingSelector: @selector (compareEventsStartDateAscending:)]; + + ascending = [[context request] formValueForKey: @"asc"]; + if (![ascending boolValue]) + newEvents = [newEvents reversedArray]; return [self _responseWithData: newEvents]; } diff --git a/UI/Templates/SchedulerUI/UIxCalMainView.wox b/UI/Templates/SchedulerUI/UIxCalMainView.wox index 0431db72f..54fac20cb 100644 --- a/UI/Templates/SchedulerUI/UIxCalMainView.wox +++ b/UI/Templates/SchedulerUI/UIxCalMainView.wox @@ -92,10 +92,10 @@ - - - - + + + + diff --git a/UI/WebServerResources/SchedulerUI.js b/UI/WebServerResources/SchedulerUI.js index e4ebdd0d1..230132804 100644 --- a/UI/WebServerResources/SchedulerUI.js +++ b/UI/WebServerResources/SchedulerUI.js @@ -1,7 +1,5 @@ /* JavaScript for SOGoCalendar */ -var sortOrder = ''; -var sortKey = ''; var listFilter = 'view_today'; var listOfSelection = null; @@ -328,9 +326,6 @@ function eventsListCallback(http) { document.eventsListAjaxRequest = null; var table = $("eventsList"); - var params = parseQueryParameters(http.callbackData); - sortKey = params["sort"]; - sortOrder = params["desc"]; lastClickedRow = -1; // from generic.js if (http.responseText.length > 0) { @@ -374,6 +369,24 @@ function eventsListCallback(http) { Event.observe(td, "mousedown", listRowMouseDownHandler, true); td.appendChild(document.createTextNode(data[i][6])); } + + if (sorting["attribute"] && sorting["attribute"].length > 0) { + var sortHeader = $(sorting["attribute"] + "Header"); + + if (sortHeader) { + var sortImages = $(table.tHead).getElementsByClassName("sortImage"); + $(sortImages).each(function(item) { + item.remove(); + }); + + var sortImage = createElement("img", "messageSortImage", "sortImage"); + sortHeader.insertBefore(sortImage, sortHeader.firstChild); + if (sorting["ascending"]) + sortImage.src = ResourcesURL + "/title_sortdown_12x12.png"; + else + sortImage.src = ResourcesURL + "/title_sortup_12x12.png"; + } + } } } else @@ -995,10 +1008,28 @@ function _loadTasksHref(href) { } function onHeaderClick(event) { - //log("onHeaderClick: " + this.link); - //_loadEventHref(this.link); + var headerId = this.getAttribute("id"); + var newSortAttribute; + if (headerId == "titleHeader") + newSortAttribute = "title"; + else if (headerId == "startHeader") + newSortAttribute = "start"; + else if (headerId == "endHeader") + newSortAttribute = "end"; + else if (headerId == "locationHeader") + newSortAttribute = "location"; + else + newSortAttribute = "start"; + + if (sorting["attribute"] == newSortAttribute) + sorting["ascending"] = !sorting["ascending"]; + else { + sorting["attribute"] = newSortAttribute; + sorting["ascending"] = true; + } + refreshEvents(); - preventDefault(event); + Event.stop(event); } function refreshCurrentFolder() { @@ -1012,9 +1043,9 @@ function refreshEvents() { titleSearch = "&search=" + value; else titleSearch = ""; - - return _loadEventHref("eventslist?desc=" + sortOrder - + "&sort=" + sortKey + + return _loadEventHref("eventslist?asc=" + sorting["ascending"] + + "&sort=" + sorting["attribute"] + "&day=" + currentDay + titleSearch + "&filterpopup=" + listFilter); @@ -1699,7 +1730,7 @@ function configureLists() { list = $("eventsList"); list.multiselect = true; - //configureSortableTableHeaders(list); + configureSortableTableHeaders(list); TableKit.Resizable.init(list, {'trueResize' : true, 'keepWidth' : true}); Event.observe(list, "mousedown", onEventsSelectionChange.bindAsEventListener(list)); @@ -1722,6 +1753,9 @@ function initDateSelectorEvents() { } function initCalendars() { + sorting["attribute"] = "start"; + sorting["ascending"] = true; + if (!document.body.hasClassName("popup")) { initDateSelectorEvents(); initCalendarSelector();