Monotone-Parent: 072d560619f22b78e92501eb17c779b5ce668cac
Monotone-Revision: c6bfd1926ff53d5a648a5ff92a03176498297cf8 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2007-12-06T17:29:32 Monotone-Branch: ca.inverse.sogomaint-2.0.2
parent
1054f243d4
commit
891687ace0
13
ChangeLog
13
ChangeLog
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue