diff --git a/ChangeLog b/ChangeLog index 3ce4db100..490036ce5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2009-10-21 Francis Lachapelle + + * UI/Scheduler/UIxCalListingActions.m + (-_loadScheduleLimitsForUsers:): we must not consider users not + part of the system (no uid). + + * UI/WebServerResources/UIxAttendeesEditor.js + (redisplayFreeBusyZone): removed logic around start/end + minutes. It was breaking the display of an event spanning multiple days. + 2009-10-20 Ludovic Marcotte * Added missing timezones diff --git a/UI/Scheduler/UIxCalListingActions.m b/UI/Scheduler/UIxCalListingActions.m index b07caaf07..64cbf70f3 100644 --- a/UI/Scheduler/UIxCalListingActions.m +++ b/UI/Scheduler/UIxCalListingActions.m @@ -63,11 +63,11 @@ static NSArray *tasksFields = nil; #define dayLength 86400 #define quarterLength 900 -#define intervalSeconds 900 -#define offsetHours 24 * 5 -#define offsetSeconds offsetHours * 60 * 60 -#define offsetBlocks offsetHours * 4 -#define maxBlocks offsetBlocks * 2 +#define intervalSeconds 900 // number of seconds in 15 minutes +#define offsetHours 24 * 5 // number of hours in invitation window +#define offsetSeconds offsetHours * 60 * 60 // number of seconds in invitation window +#define offsetBlocks offsetHours * 4 // number of 15-minute blocks in invitation window +#define maxBlocks offsetBlocks * 2 // maximum number of blocks to search for a free slot (10 days) @implementation UIxCalListingActions @@ -1048,9 +1048,9 @@ _computeBlocksPosition (NSArray *blocks) int itemCount = (offsetBlocks + maxBlocks) * 15 * 60; user = [SOGoUser userWithLogin: uid roles: nil]; - fbObject = [[user homeFolderInContext: context] - freeBusyObject: @"freebusy.ifb" - inContext: context]; + fbObject = [[user homeFolderInContext: context] + freeBusyObject: @"freebusy.ifb" + inContext: context]; end = [start addTimeInterval: itemCount]; @@ -1113,7 +1113,7 @@ _computeBlocksPosition (NSArray *blocks) if (type == 1) for (count = startInterval; count < endInterval; count++) - *(fb + count) = 1; + *(fb + count) = 1; } } @@ -1269,12 +1269,15 @@ _computeBlocksPosition (NSArray *blocks) { ud = [[SOGoUser userWithLogin: [users objectAtIndex: count] roles: nil] userDefaults]; - from = [NSCalendarDate dateWithString: [ud objectForKey: @"DayStartTime"] - calendarFormat: @"%H:%M"]; - to = [NSCalendarDate dateWithString: [ud objectForKey: @"DayEndTime"] - calendarFormat: @"%H:%M"]; - maxFrom = (NSCalendarDate *)[from laterDate: maxFrom]; - maxTo = (NSCalendarDate *)[to earlierDate: maxTo]; + if (ud) + { + from = [NSCalendarDate dateWithString: [ud objectForKey: @"DayStartTime"] + calendarFormat: @"%H:%M"]; + to = [NSCalendarDate dateWithString: [ud objectForKey: @"DayEndTime"] + calendarFormat: @"%H:%M"]; + maxFrom = (NSCalendarDate *)[from laterDate: maxFrom]; + maxTo = (NSCalendarDate *)[to earlierDate: maxTo]; + } } return [NSArray arrayWithObjects: maxFrom, maxTo, nil]; diff --git a/UI/WebServerResources/UIxAttendeesEditor.js b/UI/WebServerResources/UIxAttendeesEditor.js index ebb642540..36a897f0a 100644 --- a/UI/WebServerResources/UIxAttendeesEditor.js +++ b/UI/WebServerResources/UIxAttendeesEditor.js @@ -244,6 +244,7 @@ function redisplayFreeBusyZone() { var stMinute = parseInt($("startTime_time_minute").value) / 15; var etHour = parseInt($("endTime_time_hour").value); var etMinute = parseInt($("endTime_time_minute").value) / 15; + if (stHour < displayStartHour) { stHour = displayStartHour; stMinute = 0; @@ -260,20 +261,6 @@ function redisplayFreeBusyZone() { etHour = displayEndHour; etMinute = 0; } - if (stHour > etHour) { - var swap = etHour; - etHour = stHour; - stHour = swap; - swap = etMinute; - etMinute = stMinute; - stMinute = etMinute; - } else { - if (stMinute > etMinute) { - var swap = etMinute; - etMinute = stMinute; - stMinute = swap; - } - } var deltaCells = (etHour - stHour) + ((displayEndHour - displayStartHour + 1) * addDays); var deltaSpans = (deltaCells * 4 ) + (etMinute - stMinute); @@ -294,7 +281,7 @@ function redisplayFreeBusyZone() { } deltaSpans--; } - scrollToEvent (); + scrollToEvent(); } function newAttendee(event) { @@ -446,7 +433,7 @@ function resetAllFreeBusys() { var table = $("freeBusy"); var inputs = table.getElementsByTagName("input"); - for (var i = 0; i < inputs.length - 2; i++) { + for (var i = 0; i < inputs.length - 1; i++) { var currentInput = inputs[i]; currentInput.hasfreebusy = false; displayFreeBusyForNode(inputs[i]); @@ -475,10 +462,10 @@ function findSlot (direction) { var et = window.timeWidgets['end']['hour'].value + ":" + window.timeWidgets['end']['minute'].value; - for (var i = 0; i < inputs.length - 2; i++) - { + for (var i = 0; i < inputs.length - 1; i++) { + if (inputs[i].uid) userList += "," + inputs[i].uid; - } + } // Abort any pending request if (document.findSlotAjaxRequest) { @@ -486,12 +473,12 @@ function findSlot (direction) { document.findSlotAjaxRequest.abort(); } var urlstr = (ApplicationBaseURL - + "/findPossibleSlot?direction=" + direction - + "&uids=" + escape (userList) - + "&startDate=" + escape (sd) - + "&startTime=" + escape (st) - + "&endDate=" + escape (ed) - + "&endTime=" + escape (et) + + "findPossibleSlot?direction=" + direction + + "&uids=" + escape(userList) + + "&startDate=" + escape(sd) + + "&startTime=" + escape(st) + + "&endDate=" + escape(ed) + + "&endTime=" + escape(et) + "&isAllDay=" + isAllDay + "&onlyOfficeHours=" + ($("onlyOfficeHours").checked + 0)); document.findSlotAjaxRequest = triggerAjaxRequest(urlstr, @@ -514,7 +501,7 @@ function scrollToEvent () { var spans = $$('TR#currentEventPosition TH SPAN'); for (var i = 0; i < spans.length; i++) { scroll += spans[i].getWidth (spans[i]); - if (spans[i].hasClassName ("busy")) { + if (spans[i].hasClassName("busy")) { scroll -= 20 * spans[i].getWidth (spans[i]); break; } @@ -536,33 +523,32 @@ function toggleOfficeHours () { } function updateSlotDisplayCallback(http) { - var data = http.responseText.evalJSON (true); - var start = new Date (); - var end = new Date (); + var data = http.responseText.evalJSON(true); + var start = new Date(); + var end = new Date(); var cb = redisplayFreeBusyZone; - start.setFullYear (parseInt (data[0]['startDate'].substr (0, 4)), - parseInt (data[0]['startDate'].substr (4, 2)) - 1, - parseInt (data[0]['startDate'].substr (6, 2))); - end.setFullYear (parseInt (data[0]['endDate'].substr (0, 4)), - parseInt (data[0]['endDate'].substr (4, 2)) - 1, - parseInt (data[0]['endDate'].substr (6, 2))); - - window.timeWidgets['end']['date'].setValueAsDate (end); - window.timeWidgets['end']['hour'].value = cleanInt (data[0]['endHour']); - window.timeWidgets['end']['minute'].value = cleanInt (data[0]['endMinute']); + start.setFullYear(parseInt (data[0]['startDate'].substr(0, 4)), + parseInt (data[0]['startDate'].substr(4, 2)) - 1, + parseInt (data[0]['startDate'].substr(6, 2))); + end.setFullYear(parseInt (data[0]['endDate'].substr(0, 4)), + parseInt (data[0]['endDate'].substr(4, 2)) - 1, + parseInt (data[0]['endDate'].substr(6, 2))); + + window.timeWidgets['end']['date'].setValueAsDate(end); + window.timeWidgets['end']['hour'].value = cleanInt(data[0]['endHour']); + window.timeWidgets['end']['minute'].value = cleanInt(data[0]['endMinute']); - if (window.timeWidgets['start']['date'].valueAsShortDateString () != - data[0]['startDate']) - { - cb = onTimeDateWidgetChange; - } + if (window.timeWidgets['start']['date'].valueAsShortDateString() != + data[0]['startDate']) { + cb = onTimeDateWidgetChange; + } - window.timeWidgets['start']['date'].setValueAsDate (start); - window.timeWidgets['start']['hour'].value = cleanInt (data[0]['startHour']); - window.timeWidgets['start']['minute'].value = cleanInt (data[0]['startMinute']); - - cb (); + window.timeWidgets['start']['date'].setValueAsDate(start); + window.timeWidgets['start']['hour'].value = cleanInt(data[0]['startHour']); + window.timeWidgets['start']['minute'].value = cleanInt(data[0]['startMinute']); + + cb(); } function onPreviousSlotClick (event) {