diff --git a/ChangeLog b/ChangeLog index 3b291afda..9e6dfd8a9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2008-07-29 Wolfgang Sourdeau + * 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. diff --git a/UI/Scheduler/UIxCalListingActions.m b/UI/Scheduler/UIxCalListingActions.m index 5102a459a..ef0792332 100644 --- a/UI/Scheduler/UIxCalListingActions.m +++ b/UI/Scheduler/UIxCalListingActions.m @@ -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]; diff --git a/UI/WebServerResources/SchedulerUI.js b/UI/WebServerResources/SchedulerUI.js index 9351032a4..e4660be8c 100644 --- a/UI/WebServerResources/SchedulerUI.js +++ b/UI/WebServerResources/SchedulerUI.js @@ -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) {