mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-04-23 22:09:29 +00:00
Improve deleting occurences of recurrent events
This commit is contained in:
@@ -208,22 +208,22 @@ function editEvent() {
|
||||
}
|
||||
|
||||
function _batchDeleteEvents() {
|
||||
// Delete the next event from the batch
|
||||
var events = eventsToDelete.shift();
|
||||
// Delete the events of the next calendar
|
||||
var calendar = calendarsOfEventsToDelete.shift();
|
||||
var events = eventsToDelete.shift();
|
||||
var urlstr = (ApplicationBaseURL + calendar
|
||||
+ "/batchDelete?ids=" + events.join('/'));
|
||||
+ "/batchDelete?ids=" + events.join(','));
|
||||
document.deleteEventAjaxRequest = triggerAjaxRequest(urlstr,
|
||||
deleteEventCallback,
|
||||
{ calendar: calendar,
|
||||
events: events });
|
||||
{ calendar: calendar, events: events });
|
||||
}
|
||||
|
||||
function deleteEvent() {
|
||||
var label = "";
|
||||
var events = [];
|
||||
if (listOfSelection) {
|
||||
var nodes = listOfSelection.getSelectedRows();
|
||||
if (nodes.length > 0) {
|
||||
var label = "";
|
||||
if (listOfSelection.parentNode == $("tasksList"))
|
||||
label = _("taskDeleteConfirmation");
|
||||
else
|
||||
@@ -240,41 +240,54 @@ function deleteEvent() {
|
||||
var canDelete;
|
||||
var sortedNodes = [];
|
||||
var calendars = [];
|
||||
var events = [];
|
||||
for (var i = 0; i < nodes.length; i++) {
|
||||
canDelete = nodes[i].erasable;
|
||||
if (canDelete) {
|
||||
var calendar = nodes[i].calendar;
|
||||
var cname = nodes[i].cname;
|
||||
if (nodes[i].recurrenceTime) {
|
||||
cname += '/occurence' + nodes[i].recurrenceTime;
|
||||
}
|
||||
if (!sortedNodes[calendar]) {
|
||||
sortedNodes[calendar] = [];
|
||||
calendars.push(calendar);
|
||||
}
|
||||
if (sortedNodes[calendar].indexOf(nodes[i].cname) < 0) {
|
||||
sortedNodes[calendar].push(nodes[i].cname);
|
||||
if (sortedNodes[calendar].indexOf(cname) < 0) {
|
||||
// Build list item element for confirmation dialog
|
||||
var itemElement = new Element('li');
|
||||
var colorBox = new Element('div', {'class': 'colorBox calendarFolder' + nodes[i].calendar});
|
||||
var content = '';
|
||||
if (nodes[i].tagName == 'TR') {
|
||||
var cell = nodes[i].down('td span');
|
||||
var title = cell.allTextContent();
|
||||
events.push(title); // extract the first column only
|
||||
content = cell.allTextContent(); // extract the first column only
|
||||
}
|
||||
else
|
||||
events.push(nodes[i].allTextContent());
|
||||
else {
|
||||
content = nodes[i].allTextContent();
|
||||
}
|
||||
itemElement.appendChild(colorBox);
|
||||
itemElement.appendChild(new Element('span').update(content));
|
||||
if (nodes[i].startDate) {
|
||||
var startDate = new Date(nodes[i].startDate*1000);
|
||||
var dateElement = new Element('div', {'class': 'muted'});
|
||||
var date;
|
||||
if (typeof nodes[i].hour == 'undefined')
|
||||
date = startDate.toLocaleDateString(localeCode);
|
||||
else
|
||||
date = startDate.toLocaleString(localeCode);
|
||||
dateElement.update(date);
|
||||
itemElement.appendChild(dateElement);
|
||||
}
|
||||
events.push(itemElement);
|
||||
sortedNodes[calendar].push(cname);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Update global arrays
|
||||
for (i = 0; i < calendars.length; i++) {
|
||||
calendarsOfEventsToDelete.push(calendars[i]);
|
||||
eventsToDelete.push(sortedNodes[calendars[i]]);
|
||||
}
|
||||
if (i > 0) {
|
||||
var p = createElement("p", null, ["list"]);
|
||||
if (Prototype.Browser.IE)
|
||||
label = label.formatted('<br><br> - <b>' + events.join('</b><br> - <b>') + '</b><br><br>');
|
||||
else
|
||||
label = label.formatted('<ul><li>' + events.join('<li>') + '</ul>');
|
||||
p.innerHTML = label;
|
||||
showConfirmDialog(_("Warning"), p, deleteEventFromListConfirm, deleteEventCancel);
|
||||
}
|
||||
else
|
||||
if (i == 0)
|
||||
showAlertDialog(_("You don't have the required privileges to perform the operation."));
|
||||
}
|
||||
}
|
||||
@@ -293,18 +306,24 @@ function deleteEvent() {
|
||||
var canDelete;
|
||||
var sortedNodes = [];
|
||||
var calendars = [];
|
||||
var events = [];
|
||||
var cname;
|
||||
for (var i = 0; i < selectedCalendarCell.length; i++) {
|
||||
canDelete = selectedCalendarCell[i].erasable;
|
||||
if (canDelete) {
|
||||
var calendar = selectedCalendarCell[i].calendar;
|
||||
var cname = selectedCalendarCell[i].cname;
|
||||
if (selectedCalendarCell[i].recurrenceTime) {
|
||||
cname += '/occurence' + selectedCalendarCell[i].recurrenceTime;
|
||||
}
|
||||
if (!sortedNodes[calendar]) {
|
||||
sortedNodes[calendar] = [];
|
||||
calendars.push(calendar);
|
||||
}
|
||||
if (sortedNodes[calendar].indexOf(selectedCalendarCell[i].cname) < 0) {
|
||||
// Extract event name for confirmation dialog
|
||||
var content = "";
|
||||
if (sortedNodes[calendar].indexOf(cname) < 0) {
|
||||
// Build list item element for confirmation dialog
|
||||
var itemElement = new Element('li');
|
||||
var colorBox = new Element('div', {'class': 'colorBox calendarFolder' + selectedCalendarCell[i].calendar});
|
||||
var content = '';
|
||||
var event = $(selectedCalendarCell[i]).down("DIV.text");
|
||||
for (var j = 0; j < event.childNodes.length; j++) {
|
||||
var node = event.childNodes[j];
|
||||
@@ -312,33 +331,49 @@ function deleteEvent() {
|
||||
content += node.nodeValue;
|
||||
}
|
||||
}
|
||||
events.push(content);
|
||||
sortedNodes[calendar].push(selectedCalendarCell[i].cname);
|
||||
itemElement.appendChild(colorBox);
|
||||
itemElement.appendChild(new Element('span').update(content));
|
||||
if (selectedCalendarCell[i].startDate) {
|
||||
var startDate = new Date(selectedCalendarCell[i].startDate*1000);
|
||||
var dateElement = new Element('div', {'class': 'muted'});
|
||||
var date;
|
||||
if (selectedCalendarCell[i].readAttribute('hour') == 'allday')
|
||||
date = startDate.toLocaleDateString(localeCode);
|
||||
else
|
||||
date = startDate.toLocaleString(localeCode);
|
||||
dateElement.update(date);
|
||||
itemElement.appendChild(dateElement);
|
||||
}
|
||||
events.push(itemElement);
|
||||
sortedNodes[calendar].push(cname);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Update global arrays
|
||||
for (i = 0; i < calendars.length; i++) {
|
||||
calendarsOfEventsToDelete.push(calendars[i]);
|
||||
eventsToDelete.push(sortedNodes[calendars[i]]);
|
||||
}
|
||||
if (i > 0) {
|
||||
var p = createElement("p", null, ["list"]);
|
||||
var label = _("eventDeleteConfirmation");
|
||||
if (Prototype.Browser.IE)
|
||||
label = label.formatted('<br><br> - <b>' + events.join('</b><br> - <b>') + '</b><br><br>');
|
||||
else
|
||||
label = label.formatted('<ul><li>' + events.join('<li>') + '</ul>');
|
||||
p.innerHTML = label;
|
||||
showConfirmDialog(_("Warning"), p, deleteEventFromListConfirm, deleteEventCancel);
|
||||
}
|
||||
else
|
||||
if (i == 0)
|
||||
showAlertDialog(_("You don't have the required privileges to perform the operation."));
|
||||
}
|
||||
}
|
||||
else
|
||||
showAlertDialog(_("Please select an event or a task."));
|
||||
|
||||
if (events.length > 0) {
|
||||
// Show confirmation dialog
|
||||
var p = new Element('p');
|
||||
p.appendChild(document.createTextNode(label));
|
||||
var list = new Element('ul');
|
||||
for (i = 0; i < events.length; i++) {
|
||||
list.appendChild(events[i]);
|
||||
}
|
||||
p.appendChild(list);
|
||||
p.appendChild(document.createTextNode(_("Would you like to continue?")));
|
||||
showConfirmDialog(_("Warning"), p, deleteEventFromListConfirm, deleteEventCancel);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -638,12 +673,11 @@ function deleteEventCallback(http) {
|
||||
var calendar = http.callbackData.calendar;
|
||||
var events = http.callbackData.events;
|
||||
for (var i = 0; i < events.length; i++) {
|
||||
var cname = events[i];
|
||||
_deleteCalendarEventBlocks(calendar, cname);
|
||||
_deleteEventFromTables(calendar, cname);
|
||||
_deleteCalendarEventCache(calendar, cname);
|
||||
var cname = /(.+)\/occurence([0-9]+)/.exec(events[i]) || [null, events[i]];
|
||||
_deleteCalendarEventBlocks(calendar, cname[1], cname[2]);
|
||||
_deleteEventFromTables(calendar, cname[1], cname[2]);
|
||||
_deleteCalendarEventCache(calendar, cname[1], cname[2]);
|
||||
}
|
||||
|
||||
if (eventsToDelete.length)
|
||||
_batchDeleteEvents();
|
||||
else
|
||||
@@ -957,8 +991,8 @@ function eventsListCallback(http) {
|
||||
row.isException = data[i][17];
|
||||
row.editable = data[i][18] || IsSuperUser;
|
||||
row.erasable = data[i][19] || IsSuperUser;
|
||||
var startDate = new Date();
|
||||
startDate.setTime(data[i][5] * 1000);
|
||||
row.startDate = data[i][5];
|
||||
var startDate = new Date(data[i][5]*1000);
|
||||
row.day = startDate.getDayString();
|
||||
if (!data[i][8])
|
||||
row.hour = startDate.getHourString(); // event is not all day
|
||||
@@ -1710,8 +1744,9 @@ function newBaseEventDIV(eventRep, event, eventText) {
|
||||
eventCell.calendar = event[1];
|
||||
var startDate = new Date(event[5]*1000);
|
||||
if (startDate) {
|
||||
eventCell.startDate = event[5];
|
||||
eventCell.writeAttribute('day', startDate.getDayString());
|
||||
eventCell.writeAttribute('hour', startDate.getHourString());
|
||||
eventCell.writeAttribute('hour', event[8]? 'allday' : startDate.getHourString());
|
||||
}
|
||||
// if (event[8] == 1)
|
||||
// eventCell.addClassName("private");
|
||||
@@ -3352,7 +3387,7 @@ function onDocumentKeydown(event) {
|
||||
keyCode = "V".charCodeAt(0);
|
||||
}
|
||||
if (keyCode == Event.KEY_DELETE
|
||||
|| (keyCode == Event.KEY_BACKSPACE && isMac())) {
|
||||
|| (keyCode == Event.KEY_BACKSPACE)) {
|
||||
$("eventDialog").hide();
|
||||
deleteEvent();
|
||||
event.stop();
|
||||
|
||||
Reference in New Issue
Block a user