From 40cc7a378510673b15f6bd407a961ac35c64f53a Mon Sep 17 00:00:00 2001 From: C Robert Date: Fri, 5 Jun 2009 16:55:26 +0000 Subject: [PATCH] Monotone-Parent: 4de8470166df292fcd9ceff9ebe9f6837f051a3e Monotone-Revision: b0e1ac9e028f296dd60f8db6aff67c520b3f1fea Monotone-Author: crobert@inverse.ca Monotone-Date: 2009-06-05T16:55:26 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 9 ++ UI/Scheduler/Dutch.lproj/Localizable.strings | 1 + .../English.lproj/Localizable.strings | 1 + UI/Scheduler/French.lproj/Localizable.strings | 1 + UI/Scheduler/German.lproj/Localizable.strings | 1 + .../Italian.lproj/Localizable.strings | 1 + .../Russian.lproj/Localizable.strings | 1 + .../Spanish.lproj/Localizable.strings | 1 + UI/Scheduler/UIxCalListingActions.m | 10 ++- UI/Scheduler/Welsh.lproj/Localizable.strings | 1 + .../SchedulerUI/UIxAttendeesEditor.wox | 20 +---- UI/WebServerResources/UIxAttendeesEditor.css | 4 + UI/WebServerResources/UIxAttendeesEditor.js | 89 +++++++++++-------- 13 files changed, 82 insertions(+), 58 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8ddc007cd..1e441fed9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2009-06-05 Cyril Robert + + * UI/Scheduler/UIxCalListingActions.m: Added support to ignore + office hours. + * UI/Templates/SchedulerUI/UIxAttendeesEditor.wox: Removed old commented-out + buttons, added text as a proper string. + * UI/WebServerResources/UIxAttendeesEditor.js: Fixed scrolling issues, + added support for "onlyOfficeHours" checkbox + 2009-06-04 Wolfgang Sourdeau * SoObjects/Mailer/SOGoMailObject+Draft.m: add a default diff --git a/UI/Scheduler/Dutch.lproj/Localizable.strings b/UI/Scheduler/Dutch.lproj/Localizable.strings index a35002ba6..306c41ac8 100644 --- a/UI/Scheduler/Dutch.lproj/Localizable.strings +++ b/UI/Scheduler/Dutch.lproj/Localizable.strings @@ -458,6 +458,7 @@ validate_endbeforestart = "Het begin vindt plaats vóór het einde."; "Next slot" = "Volgende"; "Previous hour" = "Vorig uur"; "Next hour" = "Volgend uur"; +"Only office hours" = "Only office hours"; /* apt list */ "Title" = "Titel"; diff --git a/UI/Scheduler/English.lproj/Localizable.strings b/UI/Scheduler/English.lproj/Localizable.strings index 6e53fca83..600e7b7b5 100644 --- a/UI/Scheduler/English.lproj/Localizable.strings +++ b/UI/Scheduler/English.lproj/Localizable.strings @@ -476,6 +476,7 @@ validate_endbeforestart = "The end date that you entered occurs before the st "Next slot" = "Next slot"; "Previous hour" = "Previous hour"; "Next hour" = "Next hour"; +"Only office hours" = "Only office hours"; /* apt list */ "Title" = "Title"; diff --git a/UI/Scheduler/French.lproj/Localizable.strings b/UI/Scheduler/French.lproj/Localizable.strings index 6c802c6c8..48c6ab45c 100644 --- a/UI/Scheduler/French.lproj/Localizable.strings +++ b/UI/Scheduler/French.lproj/Localizable.strings @@ -473,6 +473,7 @@ validate_endbeforestart = "La date de fin est avant la date de début."; "Next slot" = "Prochain"; "Previous hour" = "Heure précédente"; "Next hour" = "Prochaine heure"; +"Only office hours" = "Heures de bureau seulement"; /* apt list */ "Title" = "Titre"; diff --git a/UI/Scheduler/German.lproj/Localizable.strings b/UI/Scheduler/German.lproj/Localizable.strings index bb80cceb5..beb4ccd33 100644 --- a/UI/Scheduler/German.lproj/Localizable.strings +++ b/UI/Scheduler/German.lproj/Localizable.strings @@ -473,6 +473,7 @@ validate_endbeforestart = "Ihr Beginn ist nach dem Ende"; "Next slot" = "Nächster"; "Previous hour" = "Vorherige Stunde"; "Next hour" = "Nächste Stunde"; +"Only office hours" = "Only office hours"; /* apt list */ "Title" = "Titel"; diff --git a/UI/Scheduler/Italian.lproj/Localizable.strings b/UI/Scheduler/Italian.lproj/Localizable.strings index af6c8aa5a..e36869fe9 100644 --- a/UI/Scheduler/Italian.lproj/Localizable.strings +++ b/UI/Scheduler/Italian.lproj/Localizable.strings @@ -474,6 +474,7 @@ validate_endbeforestart = "La data finale specificata è precedente alla data "Next slot" = "Successivo"; "Previous hour" = "Ora precedente"; "Next hour" = "Ora successiva"; +"Only office hours" = "Only office hours"; /* apt list */ "Title" = "Titolo"; diff --git a/UI/Scheduler/Russian.lproj/Localizable.strings b/UI/Scheduler/Russian.lproj/Localizable.strings index 36c3c3dbb..4704c4067 100644 --- a/UI/Scheduler/Russian.lproj/Localizable.strings +++ b/UI/Scheduler/Russian.lproj/Localizable.strings @@ -475,6 +475,7 @@ validate_endbeforestart = "The end date that you entered occurs before the st "Next slot" = "Next slot"; "Previous hour" = "Previous hour"; "Next hour" = "Next hour"; +"Only office hours" = "Only office hours"; /* apt list */ "Title" = "Title"; diff --git a/UI/Scheduler/Spanish.lproj/Localizable.strings b/UI/Scheduler/Spanish.lproj/Localizable.strings index 887f46682..7b35ede83 100644 --- a/UI/Scheduler/Spanish.lproj/Localizable.strings +++ b/UI/Scheduler/Spanish.lproj/Localizable.strings @@ -480,6 +480,7 @@ validate_endbeforestart = "Su fecha/hora de comienzo es posterio a la de fina "Next slot" = "Siguiente ranura"; "Previous hour" = "Hora anterior"; "Next hour" = "Hora siguiente"; +"Only office hours" = "Only office hours"; /* apt list */ "Title" = "Título"; diff --git a/UI/Scheduler/UIxCalListingActions.m b/UI/Scheduler/UIxCalListingActions.m index 9614247a0..e01d094fe 100644 --- a/UI/Scheduler/UIxCalListingActions.m +++ b/UI/Scheduler/UIxCalListingActions.m @@ -1218,7 +1218,7 @@ _computeBlocksPosition (NSArray *blocks) NSMutableDictionary *rc; int direction, count, blockDuration, step; unsigned int **fbData; - BOOL isAllDay = NO; + BOOL isAllDay = NO, onlyOfficeHours = YES; r = [context request]; rc = nil; @@ -1227,6 +1227,7 @@ _computeBlocksPosition (NSArray *blocks) if ([uids count] > 0) { isAllDay = [[r formValueForKey: @"isAllDay"] boolValue]; + onlyOfficeHours = [[r formValueForKey: @"onlyOfficeHours"] boolValue]; direction = [[r formValueForKey: @"direction"] intValue]; limits = [self _loadScheduleLimitsForUsers: uids]; @@ -1251,9 +1252,10 @@ _computeBlocksPosition (NSArray *blocks) count += step) { //NSLog (@"Trying %@ -> %@", nStart, nEnd); - if ([self _validateStart: nStart - andEnd: nEnd - against: limits]) + if ((onlyOfficeHours && [self _validateStart: nStart + andEnd: nEnd + against: limits]) + || !onlyOfficeHours) { //NSLog (@"valid"); if ([self _possibleBlock: count diff --git a/UI/Scheduler/Welsh.lproj/Localizable.strings b/UI/Scheduler/Welsh.lproj/Localizable.strings index 5bd1fcbbf..60e92a9de 100644 --- a/UI/Scheduler/Welsh.lproj/Localizable.strings +++ b/UI/Scheduler/Welsh.lproj/Localizable.strings @@ -465,6 +465,7 @@ validate_endbeforestart = "Mae'r dyddiad gorffen sydd wedi'i roi yn digwydd c "Next slot" = "Slot nesaf"; "Previous hour" = "Awr flaenorol"; "Next hour" = "Awr nesaf"; +"Only office hours" = "Only office hours"; /* apt list */ "Title" = "Teitl"; diff --git a/UI/Templates/SchedulerUI/UIxAttendeesEditor.wox b/UI/Templates/SchedulerUI/UIxAttendeesEditor.wox index a3f2facea..633fd8b09 100644 --- a/UI/Templates/SchedulerUI/UIxAttendeesEditor.wox +++ b/UI/Templates/SchedulerUI/UIxAttendeesEditor.wox @@ -24,17 +24,11 @@ + > -
-
dayEndHour + 1) { - stHour = dayEndHour + 1; + if (stHour > displayEndHour + 1) { + stHour = displayEndHour + 1; stMinute = 0; } - if (etHour < dayStartHour) { - etHour = dayStartHour; + if (etHour < displayStartHour) { + etHour = displayStartHour; etMinute = 0; } - if (etHour > dayEndHour + 1) { - etHour = dayEndHour; + if (etHour > displayEndHour + 1) { + etHour = displayEndHour; etMinute = 0; } if (stHour > etHour) { @@ -280,9 +281,9 @@ function redisplayFreeBusyZone() { } } - var deltaCells = (etHour - stHour) + ((dayEndHour - dayStartHour + 1) * addDays); + var deltaCells = (etHour - stHour) + ((displayEndHour - displayStartHour + 1) * addDays); var deltaSpans = (deltaCells * 4 ) + (etMinute - stMinute); - var currentCellNbr = stHour - dayStartHour; + var currentCellNbr = stHour - displayStartHour; var currentCell = row.cells[currentCellNbr]; var currentSpanNbr = stMinute; var spans = $(currentCell).childNodesWithTag("span"); @@ -418,8 +419,8 @@ function setSlot(tds, nbr, status) { days = Math.floor(tdnbr / 24); tdnbr -= (days * 24); } - if (tdnbr > (dayStartHour - 1) && tdnbr < (dayEndHour + 1)) { - var i = (days * (dayEndHour - dayStartHour + 1) + tdnbr - (dayStartHour - 1)); + if (tdnbr > (displayStartHour - 1) && tdnbr < (displayEndHour + 1)) { + var i = (days * (displayEndHour - displayStartHour + 1) + tdnbr - (displayStartHour - 1)); var td = tds[i - 1]; var spans = $(td).childNodesWithTag("span"); if (status == '2') @@ -467,14 +468,6 @@ function initializeWindowButtons() { $("previousSlot").observe ("click", onPreviousSlotClick, false); $("nextSlot").observe ("click", onNextSlotClick, false); - -/* buttons = $("freeBusyZoomButtons").childNodesWithTag("a"); - for (var i = 0; i < buttons.length; i++) - buttons[i].observe("click", listRowMouseDownHandler, false); - buttons = $("freeBusyButtons").childNodesWithTag("a"); - for (var i = 0; i < buttons.length; i++) - buttons[i].observe("click", listRowMouseDownHandler, false); -*/ } function findSlot (direction) { @@ -505,7 +498,8 @@ function findSlot (direction) { + "&startTime=" + escape (st) + "&endDate=" + escape (ed) + "&endTime=" + escape (et) - + "&isAllDay=" + isAllDay); + + "&isAllDay=" + isAllDay + + "&onlyOfficeHours=" + ($("onlyOfficeHours").checked + 0)); document.findSlotAjaxRequest = triggerAjaxRequest(urlstr, updateSlotDisplayCallback, userList); @@ -519,20 +513,35 @@ function cleanInt (data) { } function scrollToEvent () { - var ths = $("currentEventPosition").childNodesWithTag ("th"); - for (var i = 0; i < ths.length; i++) { - var spans = ths[i].childNodesWithTag ("span"); - for (var j = 0; j < spans.length; j++) { - if (spans[j].hasClassName ("busy")) { - spans[j].scrollIntoView (); - var headerDiv = $$('TABLE#freeBusy TD.freeBusyHeader DIV').first(); - var dataDiv = $$('TABLE#freeBusy TD.freeBusyData DIV').first(); - dataDiv.scrollLeft = headerDiv.scrollLeft; - } + var headerDiv = $$('TABLE#freeBusy TD.freeBusyHeader DIV').first(); + var dataDiv = $$('TABLE#freeBusy TD.freeBusyData DIV').first(); + + var scroll = 0; + 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")) { + scroll -= 20 * spans[i].getWidth (spans[i]); + break; } } + + headerDiv.scrollLeft = scroll; + dataDiv.scrollLeft = headerDiv.scrollLeft; } +function toggleOfficeHours () { + var endDate = window.getEndDate(); + var startDate = window.getStartDate(); + + if (startDate.getHours () < dayStartHour + || startDate.getHours () > dayEndHour + || endDate.getHours () > dayEndHour + || endDate.getHours () < dayStartHour) + $("onlyOfficeHours").checked = false; +} + + function updateSlotDisplayCallback (http) { var data = http.responseText.evalJSON (true); var start = new Date (); @@ -693,18 +702,20 @@ function prepareTableHeaders() { var days = startDate.daysUpTo(endDate); for (var i = 0; i < days.length; i++) { var header1 = document.createElement("th"); - header1.colSpan = ((dayEndHour - dayStartHour) + 1)/2; + header1.colSpan = ((displayEndHour - displayStartHour) + 1)/2; header1.appendChild(document.createTextNode(days[i].toLocaleDateString())); rows[0].appendChild(header1); var header1b = document.createElement("th"); - header1b.colSpan = ((dayEndHour - dayStartHour) + 1)/2; + header1b.colSpan = ((displayEndHour - displayStartHour) + 1)/2; header1b.appendChild(document.createTextNode(days[i].toLocaleDateString())); rows[0].appendChild(header1b); - for (var hour = dayStartHour; hour < (dayEndHour + 1); hour++) { + for (var hour = displayStartHour; hour < (displayEndHour + 1); hour++) { var header2 = document.createElement("th"); var text = hour + ":00"; if (hour < 10) text = "0" + text; + if (hour >= dayStartHour && hour <= dayEndHour) + $(header2).addClassName ("officeHour"); header2.appendChild(document.createTextNode(text)); rows[1].appendChild(header2); @@ -733,7 +744,7 @@ function prepareTableRows() { $("freeBusyData").setStyle({ width: width + 'px' }); for (var i = 0; i < days.length; i++) for (var rowNbr = 0; rowNbr < rows.length; rowNbr++) - for (var hour = dayStartHour; hour < (dayEndHour + 1); hour++) + for (var hour = displayStartHour; hour < (displayEndHour + 1); hour++) rows[rowNbr].appendChild(document.createElement("td")); } @@ -838,6 +849,7 @@ function onFreeBusyLoadHandler() { Event.observe(window, "resize", onWindowResize); $$('TABLE#freeBusy TD.freeBusyData DIV').first().observe("scroll", onScroll); scrollToEvent (); + toggleOfficeHours (); } document.observe("dom:loaded", onFreeBusyLoadHandler); @@ -912,6 +924,7 @@ function onAdjustTime(event) { // Specific function for the attendees editor onTimeDateWidgetChange(); + toggleOfficeHours (); } function _getDate(which) {