Improve event attendees editor

- Avoid repetitive AJAX queries;
- Improve handling of daylight changes.
pull/75/merge
Francis Lachapelle 2015-03-23 16:28:32 -04:00
parent cc3652b59b
commit 26d876e67a
2 changed files with 40 additions and 31 deletions

View File

@ -218,7 +218,7 @@ Date.prototype.stringWithSeparator = function(separator) {
Date.prototype.addDays = function(nbrDays) {
var milliSeconds = this.getTime();
milliSeconds += 86400000 * nbrDays;
milliSeconds += 86400000 * Math.round(nbrDays);
this.setTime(milliSeconds);
};

View File

@ -896,9 +896,8 @@ _freeBusyCacheEntry.prototype = {
if (this.entries.length > offset) {
var adjustedEd = ed.beginOfDay();
var nbrDays = adjustedSd.deltaDays(adjustedEd) + 1;
var nbrQu = nbrDays * 96;
var offsetEnd = offset + nbrQu;
if (this.entries.length >= offsetEnd) {
var offsetEnd = offset + (nbrDays * 96);
if (Math.round(this.entries.length/96) >= nbrDays) {
entries = this.entries.slice(offset, offsetEnd);
}
}
@ -912,16 +911,19 @@ _freeBusyCacheEntry.prototype = {
var adjustedSd = sd.beginOfDay();
var adjustedEd = ed.beginOfDay();
var nbrDays = adjustedSd.deltaDays(adjustedEd) + 1;
var start = adjustedSd.clone();
start.addDays(-7);
var end = adjustedEd.clone();
end.addDays(7);
if (this.startDate) {
fetchDates = [];
if (adjustedSd.getTime() < this.startDate.getTime()) {
// Period extends to before current start
var start = adjustedSd.clone();
start.addDays(-7);
var end = this.startDate.beginOfDay();
end.addDays(-1);
if (end.getTime() >= this.startDate.getTime()) {
end = this.startDate.beginOfDay();
end.addDays(-1);
}
fetchDates.push({ start: start, end: end });
}
@ -930,19 +932,18 @@ _freeBusyCacheEntry.prototype = {
nextDate.addDays(currentNbrDays);
if (adjustedEd.getTime() >= nextDate.getTime()) {
// Period extends to after current end
var end = adjustedEd.clone();
end.addDays(7);
fetchDates.push({ start: nextDate, end: end });
if (start.getTime() <= nextDate.getTime()) {
start = nextDate.beginOfDay();
start.addDays(1);
}
fetchDates.push({ start: start, end: end });
}
}
else {
// Initial range
var start = adjustedSd.clone();
start.addDays(-7);
var end = adjustedEd.clone();
end.addDays(7);
fetchDates = [ { start: start, end: end } ];
}
return fetchDates;
},
@ -960,7 +961,7 @@ _freeBusyCacheEntry.prototype = {
}
else {
days = this.startDate.deltaDays(start);
if (this.entries.length == (days * 96)) {
if (Math.round(this.entries.length/96) == days) {
// New period is just after previous period
this.entries = this.entries.concat(entries);
merged = true;
@ -1204,7 +1205,7 @@ function drawFbData(input, slots) {
else {
log("inconsistency between freebusy results and"
+ " the number of cells");
log(" expecting: " + tds.length + " received: " + slots.length);
log(" expecting: " + (tds.length * 4) + " received: " + slots.length);
}
}
@ -1685,10 +1686,10 @@ function initTimeWidgets(widgets) {
function onAdjustTime(event) {
var endDate = window.getEndDate();
var startDate = window.getStartDate();
var delta = 0;
if (this.id.startsWith("start")) {
// Start date was changed
var delta = window.getShadowStartDate().valueOf() -
startDate.valueOf();
delta = window.getShadowStartDate().valueOf() - startDate.valueOf();
var newEndDate = new Date(endDate.valueOf() - delta);
window.setEndDate(newEndDate);
window.timeWidgets['end']['date'].updateShadowValue();
@ -1698,20 +1699,27 @@ function onAdjustTime(event) {
}
else {
// End date was changed
var delta = endDate.valueOf() - startDate.valueOf();
if (delta < 0) {
showAlertDialog(labels.validate_endbeforestart);
var oldEndDate = window.getShadowEndDate();
window.setEndDate(oldEndDate);
window.timeWidgets['end']['date'].updateShadowValue();
window.timeWidgets['end']['time'].updateShadowValue();
window.timeWidgets['end']['time'].onChange(); // method from SOGoTimePicker
delta = window.getShadowEndDate().valueOf() - endDate.valueOf();
if (delta != 0) {
var startEndDelta = endDate.valueOf() - startDate.valueOf();
if (startEndDelta < 0) {
showAlertDialog(labels.validate_endbeforestart);
var oldEndDate = window.getShadowEndDate();
window.setEndDate(oldEndDate);
window.timeWidgets['end']['date'].updateShadowValue();
window.timeWidgets['end']['time'].updateShadowValue();
window.timeWidgets['end']['time'].onChange(); // method from SOGoTimePicker
}
else {
window.timeWidgets['end']['date'].updateShadowValue();
window.timeWidgets['end']['time'].updateShadowValue();
}
}
}
// Specific function for the attendees editor
onTimeDateWidgetChange();
if ($("freeBusyHeader").getElementsByTagName("th").length == 0 || delta != 0)
// Update freebusy data
onTimeDateWidgetChange();
}
function _getDate(which) {
@ -1750,6 +1758,7 @@ function getShadowEndDate() {
function _setDate(which, newDate) {
window.timeWidgets[which]['date'].setInputAsDate(newDate);
jQuery(window.timeWidgets[which]['date']).closest('.date').datepicker('update');
if (!isAllDay) {
window.timeWidgets[which]['time'].value = newDate.getDisplayHoursString();
if (window.timeWidgets[which]['time'].onChange) window.timeWidgets[which]['time'].onChange(); // method from SOGoTimePicker