Monotone-Parent: 072d560619f22b78e92501eb17c779b5ce668cac

Monotone-Revision: c6bfd1926ff53d5a648a5ff92a03176498297cf8

Monotone-Author: flachapelle@inverse.ca
Monotone-Date: 2007-12-06T17:29:32
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Francis Lachapelle 2007-12-06 17:29:32 +00:00
parent 1054f243d4
commit 891687ace0
6 changed files with 126 additions and 21 deletions

View File

@ -1,3 +1,14 @@
2007-12-06 Francis Lachapelle <flachapelle@inverse.ca>
* 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 <wsourdeau@inverse.ca>
* UI/Scheduler/UIxTaskEditor.m ([UIxTaskEditor -newAction]):
@ -25,7 +36,7 @@
2007-12-05 Francis Lachapelle <flachapelle@inverse.ca>
* 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 <wsourdeau@inverse.ca>

View File

@ -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

View File

@ -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

View File

@ -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];
}

View File

@ -92,10 +92,10 @@
<table id="eventsList" cellspacing="0">
<thead>
<tr>
<td class="headerCell headerTitle sortableTableHeader"><var:string label:value="Title"/></td>
<td class="headerCell headerDateTime sortableTableHeader"><var:string label:value="Start"/></td>
<td class="headerCell headerDateTime sortableTableHeader"><var:string label:value="End"/></td>
<td class="headerCell headerLocation sortableTableHeader"><var:string label:value="Location"/></td>
<td id="titleHeader" class="headerCell headerTitle sortableTableHeader"><var:string label:value="Title"/></td>
<td id="startHeader" class="headerCell headerDateTime sortableTableHeader"><var:string label:value="Start"/></td>
<td id="endHeader" class="headerCell headerDateTime sortableTableHeader"><var:string label:value="End"/></td>
<td id="locationHeader" class="headerCell headerLocation sortableTableHeader"><var:string label:value="Location"/></td>
</tr>
</thead>
<tbody></tbody>

View File

@ -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();