Monotone-Parent: e8b3da9b104c4b14f0b2cd44a4efdac6944ee56f

Monotone-Revision: 611626379a1312fbf65d92dbd94e483f8b8e7c0f

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2008-07-29T16:35:49
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Wolfgang Sourdeau 2008-07-29 16:35:49 +00:00
parent aaeb05f547
commit 13f09cd2b6
3 changed files with 174 additions and 109 deletions

View File

@ -1,5 +1,11 @@
2008-07-29 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* UI/Scheduler/UIxCalListingActions.m ([UIxCalListingActions
-eventsBlocksAction]): return event blocks with the serial number
of the event they refer to in the events list (first array) rather
than their cname, so that specific occurences can be
differenciated.
* SoObjects/SOGo/SOGoUserFolder.m ([SOGoUserFolder
-davUserQuery:queryContext]): make searches only in user
repositories and not in addressbooks.

View File

@ -403,7 +403,7 @@ _feedBlockWithMonthBasedData(NSMutableDictionary *block, unsigned int start,
- (NSMutableDictionary *) _eventBlockWithStart: (unsigned int) start
end: (unsigned int) end
cname: (NSString *) cName
number: (NSNumber *) number
onDay: (unsigned int) dayStart
recurrenceTime: (unsigned int) recurrenceTime
userState: (iCalPersonPartStat) userState
@ -416,7 +416,7 @@ _feedBlockWithMonthBasedData(NSMutableDictionary *block, unsigned int start,
_feedBlockWithDayBasedData (block, start, end, dayStart);
else
_feedBlockWithMonthBasedData (block, start, userTimeZone, dateFormatter);
[block setObject: cName forKey: @"cname"];
[block setObject: number forKey: @"nbr"];
if (recurrenceTime)
[block setObject: [NSNumber numberWithInt: recurrenceTime]
forKey: @"recurrenceTime"];
@ -463,12 +463,12 @@ _userStateInEvent (NSArray *event)
- (void) _fillBlocks: (NSArray *) blocks
withEvent: (NSArray *) event
withNumber: (NSNumber *) number
{
unsigned int currentDayStart, startSecs, endsSecs, currentStart, eventStart,
eventEnd, offset, recurrenceTime;
NSMutableArray *currentDay;
NSMutableDictionary *eventBlock;
NSString *eventCName;
iCalPersonPartStat userState;
startSecs = (unsigned int) [startDate timeIntervalSince1970];
@ -496,13 +496,12 @@ _userStateInEvent (NSArray *event)
if (eventEnd > endsSecs)
eventEnd = endsSecs;
eventCName = [event objectAtIndex: 0];
userState = _userStateInEvent (event);
while (currentDayStart + dayLength < eventEnd)
{
eventBlock = [self _eventBlockWithStart: currentStart
end: currentDayStart + dayLength - 1
cname: eventCName
number: number
onDay: currentDayStart
recurrenceTime: recurrenceTime
userState: userState];
@ -514,7 +513,7 @@ _userStateInEvent (NSArray *event)
}
eventBlock = [self _eventBlockWithStart: currentStart
end: eventEnd
cname: eventCName
number: number
onDay: currentDayStart
recurrenceTime: recurrenceTime
userState: userState];
@ -736,6 +735,7 @@ _computeBlocksPosition (NSArray *blocks)
int count, max;
NSArray *events, *event, *eventsBlocks;
NSMutableArray *allDayBlocks, *blocks, *currentDay;
NSNumber *eventNbr;
[self _setupContext];
@ -748,10 +748,12 @@ _computeBlocksPosition (NSArray *blocks)
for (count = 0; count < max; count++)
{
event = [events objectAtIndex: count];
eventNbr = [NSNumber numberWithUnsignedInt: count];
if (dayBasedView && [[event objectAtIndex: 7] boolValue])
[self _fillBlocks: allDayBlocks withEvent: event];
[self _fillBlocks: allDayBlocks
withEvent: event withNumber: eventNbr];
else
[self _fillBlocks: blocks withEvent: event];
[self _fillBlocks: blocks withEvent: event withNumber: eventNbr];
}
max = [blocks count];

View File

@ -20,7 +20,6 @@ var calendarsOfEventsToDelete = [];
var usersRightsWindowHeight = 250;
var usersRightsWindowWidth = 502;
var eventsBlocks;
var calendarEvents = null;
var userStates = [ "needs-action", "accepted", "declined", "tentative" ];
@ -259,12 +258,27 @@ function deleteEventCallback(http) {
}
}
function getEventById(cname, owner) {
var event = null;
if (calendarEvents) {
if (!owner)
owner = UserLogin;
var userEvents = calendarEvents[owner];
if (userEvents)
event = userEvents[cname];
}
return event;
}
function deleteTasksFromViews(tasks) {
}
function deleteEventsFromViews(events) {
if (calendarEvents) {
for (var i = 0; i < events.length; i++) {
// FIXME cname + !calendar + siblings
var cname = events[i];
var event = calendarEvents[cname];
if (event) {
@ -309,52 +323,55 @@ function performEventEdition(folder, event, recurrence) {
function performEventDeletion(folder, event, recurrence) {
if (calendarEvents) {
var eventEntry = calendarEvents[event];
if (eventEntry) {
var urlstr = ApplicationBaseURL + folder + "/" + event;
var nodes;
if (recurrence) {
urlstr += "/" + recurrence;
var occurenceTime = recurrence.substring(9);
nodes = [];
for (var i = 0; i < eventEntry.siblings.length; i++) {
if (eventEntry.siblings[i].recurrenceTime
&& eventEntry.siblings[i].recurrenceTime == occurenceTime)
nodes.push(eventEntry.siblings[i]);
}
}
else
nodes = eventEntry.siblings;
urlstr += "/delete";
var urlstr = ApplicationBaseURL + folder + "/" + event;
var occurenceTime;
if (recurrence) {
urlstr += "/" + recurrence;
occurenceTime = recurrence.substring(9);
}
else
occurenceTime = null;
urlstr += "/delete";
var nodes = _eventBlocksMatching(folder, event, occurenceTime);
if (nodes)
document.deleteEventAjaxRequest = triggerAjaxRequest(urlstr,
performDeleteEventCallback,
{ nodes: nodes,
recurrence: recurrence });
}
occurence: occurenceTime });
}
}
function performDeleteEventCallback(http) {
if (http.readyState == 4) {
if (isHttpStatus204(http.status)) {
var occurenceTime = http.callbackData.occurence;
var nodes = http.callbackData.nodes;
var recurrenceTime = 0;
if (http.callbackData.recurrence)
recurrenceTime = http.callbackData.recurrence.substring(9);
var cName = nodes[0].cname;
var eventEntry = calendarEvents[cName];
var node = nodes.pop();
while (node) {
var cname = nodes[0].cname;
var calendar = nodes[0].calendar;
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
log("node: " + node);
node.parentNode.removeChild(node);
node = nodes.pop();
}
if (recurrenceTime) {
var row = $(cName + "-" + recurrenceTime);
var basename = calendar + "-" + cname;
if (occurenceTime) {
var row = $(basename + "-" + occurenceTime);
log("rowID: " + basename + "-" + occurenceTime);
if (row)
row.parentNode.removeChild(row);
var occurences = calendarEvents[calendar][cname];
var newOccurences = [];
for (var i = 0; i < occurences.length; i++) {
var occurence = occurences[i];
if (occurence[13] != recurrenceTime)
newOccurences.push(occurence);
}
calendarEvents[calendar][cname] = newOccurences;
}
else {
delete calendarEvents[cName];
log("basename: " + basename);
var tables = [ "eventsList", "tasksList" ];
for (var i = 0; i < 2; i++) {
var table = $(tables[i]);
@ -365,10 +382,11 @@ function performDeleteEventCallback(http) {
for (var j = rows.length; j > 0; j--) {
var row = $(rows[j - 1]);
var id = row.getAttribute("id");
if (id.indexOf(cName) == 0)
if (id.indexOf(basename) == 0)
row.parentNode.removeChild(row);
}
}
delete calendarEvents[calendar][cname];
}
}
}
@ -466,16 +484,16 @@ function eventsListCallback(http) {
if (http.responseText.length > 0) {
var data = http.responseText.evalJSON(true);
for (var i = 0; i < data.length; i++) {
var row = document.createElement("tr");
var row = $(document.createElement("tr"));
table.tBodies[0].appendChild(row);
$(row).addClassName("eventRow");
row.addClassName("eventRow");
var rTime = data[i][13];
var id = escape(data[i][0]);
var id = escape(data[i][1] + "-" + data[i][0]);
if (rTime)
id += "-" + escape(rTime);
row.setAttribute("id", id);
row.cname = escape(data[i][0]);
row.calendar = data[i][1];
row.calendar = escape(data[i][1]);
if (rTime)
row.recurrenceTime = escape(rTime);
var startDate = new Date();
@ -734,9 +752,11 @@ function scrollDayView(scrollEvent) {
var divs;
// Select event in calendar view
if (scrollEvent)
selectCalendarEvent(scrollEvent);
if (scrollEvent) {
var eventRow = $(scrollEvent);
selectCalendarEvent(eventRow.calendar, eventRow.cname, eventRow.recurrenceTime);
}
// Don't scroll if in month view
if (currentView == "monthview")
return;
@ -751,6 +771,7 @@ function scrollDayView(scrollEvent) {
if (scrollEvent && calendarEvents) {
var event = calendarEvents[scrollEvent];
if (event) {
// FIXME siblings
var classes = $w(event.siblings[0].className);
for (var i = 0; i < classes.length; i++)
if (classes[i].startsWith("starts")) {
@ -821,17 +842,42 @@ function refreshCalendarEvents(scrollEvent) {
"scrollEvent": scrollEvent});
}
function _parseEvents(list) {
var newCalendarEvents = {};
for (var i = 0; i < list.length; i++) {
var event = list[i];
var cname = event[0];
var calendar = event[1];
// log("parsed cname: " + cname + "; calendar: " + calendar);
var calendarDict = newCalendarEvents[calendar];
if (!calendarDict) {
calendarDict = {};
newCalendarEvents[calendar] = calendarDict;
}
var occurences = calendarDict[cname];
if (!occurences) {
occurences = [];
calendarDict[cname] = occurences;
}
event.blocks = [];
occurences.push(event);
}
return newCalendarEvents;
}
function refreshCalendarEventsCallback(http) {
if (http.readyState == 4
&& http.status == 200) {
if (http.responseText.length > 0) {
var eventsBlocks = http.responseText.evalJSON(true);
calendarEvents = _prepareCalendarEventsCache(eventsBlocks[0]);
calendarEvents = _parseEvents(eventsBlocks[0]);
if (currentView == "monthview")
_drawMonthCalendarEvents(eventsBlocks[2]);
_drawMonthCalendarEvents(eventsBlocks[2], eventsBlocks[0]);
else {
_drawCalendarAllDaysEvents(eventsBlocks[1]);
_drawCalendarEvents(eventsBlocks[2]);
_drawCalendarAllDayEvents(eventsBlocks[1], eventsBlocks[0]);
_drawCalendarEvents(eventsBlocks[2], eventsBlocks[0]);
}
}
scrollDayView(http.callbackData["scrollEvent"]);
@ -840,37 +886,10 @@ function refreshCalendarEventsCallback(http) {
log("AJAX error when refreshing calendar events");
}
function _prepareCalendarEventsCache(events) {
var cache = {};
for (var i = 0; i < events.length; i++) {
cache[events[i][0]] = events[i];
}
return cache;
}
function _drawCalendarAllDaysEvents(events) {
var daysView = $("calendarHeader");
var subdivs = daysView.childNodesWithTag("div");
var days = subdivs[1].childNodesWithTag("div");
for (var i = 0; i < events.length; i++) {
var parentDiv = days[i];
for (var j = 0; j < events[i].length; j++) {
var eventRep = events[i][j];
var eventDiv = newAllDayEventDIV(eventRep);
parentDiv.appendChild(eventDiv);
}
}
}
function newBaseEventDIV(eventRep, event, eventText) {
// cname, calendar, starts, lasts,
// startHour, endHour, title) {
var eventDiv = $(document.createElement("div"));
if (!event.siblings)
event.siblings = [];
eventDiv.event = event;
eventDiv.cname = event[0];
eventDiv.calendar = event[1];
if (eventRep.recurrenceTime)
@ -907,21 +926,35 @@ function newBaseEventDIV(eventRep, event, eventText) {
eventDiv.observe("click", onCalendarSelectEvent);
eventDiv.observe("dblclick", editDoubleClickedEvent);
event.siblings.push(eventDiv);
event.blocks.push(eventDiv);
return eventDiv;
}
function newAllDayEventDIV(eventRep) {
function _drawCalendarAllDayEvents(events, eventsData) {
var daysView = $("calendarHeader");
var subdivs = daysView.childNodesWithTag("div");
var days = subdivs[1].childNodesWithTag("div");
for (var i = 0; i < events.length; i++) {
var parentDiv = days[i];
for (var j = 0; j < events[i].length; j++) {
var eventRep = events[i][j];
var nbr = eventRep.nbr;
var eventDiv = newAllDayEventDIV(eventRep, eventsData[nbr]);
parentDiv.appendChild(eventDiv);
}
}
}
function newAllDayEventDIV(eventRep, event) {
// cname, calendar, starts, lasts,
// startHour, endHour, title) {
var event = calendarEvents[eventRep.cname];
var eventDiv = newBaseEventDIV(eventRep, event, event[3]);
return eventDiv;
}
function _drawCalendarEvents(events) {
function _drawCalendarEvents(events, eventsData) {
var daysView = $("daysView");
var subdivs = daysView.childNodesWithTag("div");
var days = subdivs[1].childNodesWithTag("div");
@ -929,14 +962,14 @@ function _drawCalendarEvents(events) {
var parentDiv = days[i].childNodesWithTag("div")[0];
for (var j = 0; j < events[i].length; j++) {
var eventRep = events[i][j];
var eventDiv = newEventDIV(eventRep);
var nbr = eventRep.nbr;
var eventDiv = newEventDIV(eventRep, eventsData[nbr]);
parentDiv.appendChild(eventDiv);
}
}
}
function newEventDIV(eventRep) {
var event = calendarEvents[eventRep.cname];
function newEventDIV(eventRep, event) {
var eventDiv = newBaseEventDIV(eventRep, event, event[3]);
var pc = 100 / eventRep.siblings;
@ -949,28 +982,29 @@ function newEventDIV(eventRep) {
return eventDiv;
}
function _drawMonthCalendarEvents(events) {
function _drawMonthCalendarEvents(events, eventsData) {
var daysView = $("monthDaysView");
var days = daysView.childNodesWithTag("div");
for (var i = 0; i < days.length; i++) {
var parentDiv = days[i];
for (var j = 0; j < events[i].length; j++) {
var eventRep = events[i][j];
var eventDiv = newMonthEventDIV(eventRep);
var nbr = eventRep.nbr;
var eventDiv = newMonthEventDIV(eventRep, eventsData[nbr]);
parentDiv.appendChild(eventDiv);
}
}
}
function newMonthEventDIV(eventRep) {
var event = calendarEvents[eventRep.cname];
function newMonthEventDIV(eventRep, event) {
var eventText;
if (event[7])
eventText = event[3];
else
eventText = eventRep.starthour + " - " + event[3];
var eventDiv = newBaseEventDIV(eventRep, event, eventText);
var eventDiv = newBaseEventDIV(eventRep, event,
eventText);
return eventDiv;
}
@ -1241,34 +1275,57 @@ function onYearMenuItemClick(event) {
changeDateSelectorDisplay(year + month + "01", true);
}
function selectCalendarEvent(cname) {
function _eventBlocksMatching(calendar, cname, recurrenceTime) {
var blocks = null;
var events = calendarEvents[calendar];
if (events) {
var occurences = events[cname];
if (occurences) {
if (recurrenceTime) {
for (var i = 0; i < occurences.length; i++) {
var occurence = occurences[i];
if (occurence[13] == recurrenceTime)
blocks = occurence.blocks;
}
}
else {
blocks = [];
for (var i = 0; i < occurences.length; i++) {
var occurence = occurences[i];
blocks = blocks.concat(occurence.blocks);
}
}
}
}
return blocks;
}
function selectCalendarEvent(calendar, cname, recurrenceTime) {
// Select event in calendar view
if (selectedCalendarCell)
for (var i = 0; i < selectedCalendarCell.length; i++)
selectedCalendarCell[i].deselect();
if (calendarEvents) {
var event = calendarEvents[cname];
// if (event) {
// if (event[12])
// log("recurrence; date=" + event[4]);
// }
if (event && event.siblings) {
for (var i = 0; i < event.siblings.length; i++)
event.siblings[i].selectElement();
selectedCalendarCell = event.siblings;
}
var selection = _eventBlocksMatching(calendar, cname, recurrenceTime);
if (selection) {
for (var i = 0; i < selection.length; i++)
selection[i].selectElement();
selectedCalendarCell = selection;
}
}
function onCalendarSelectEvent() {
var list = $("eventsList");
selectCalendarEvent(this.cname);
selectCalendarEvent(this.calendar, this.cname, this.recurrenceTime);
// Select event in events list
var list = $("eventsList");
$(list.tBodies[0]).deselectAll();
var row = $(this.cname);
var rowID = this.calendar + "-" + this.cname;
if (this.recurrenceTime)
rowID += "-" + this.recurrenceTime;
var row = $(rowID);
if (row) {
var div = row.parentNode.parentNode.parentNode;
div.scrollTop = row.offsetTop - (div.offsetHeight / 2);
@ -1580,9 +1637,9 @@ function initCalendarSelector() {
}
var links = $("calendarSelectorButtons").childNodesWithTag("a");
links[0].observe("click", onCalendarNew);
links[1].observe("click", onCalendarAdd);
links[2].observe("click", onCalendarRemove);
$(links[0]).observe("click", onCalendarNew);
$(links[1]).observe("click", onCalendarAdd);
$(links[2]).observe("click", onCalendarRemove);
}
function onCalendarModify(event) {