Improve deleting occurences of recurrent events

This commit is contained in:
Francis Lachapelle
2014-02-04 16:25:52 -05:00
parent 4e42d5d410
commit ef1be5dc5f
25 changed files with 173 additions and 91 deletions
+1 -1
View File
@@ -498,7 +498,7 @@ function onToolbarDeleteSelectedContactsConfirm(dialogId) {
for (var i = 0; i < rowIds.length; i++)
$(rowIds[i]).hide();
triggerAjaxRequest(urlstr, onContactDeleteEventCallback, rowIds,
('ids=' + rowIds.join("/")),
('ids=' + rowIds.join(",")),
{ "Content-type": "application/x-www-form-urlencoded" });
}
+85 -50
View File
@@ -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();
+17 -2
View File
@@ -290,6 +290,9 @@ UL.choiceMenu LI._chosen:hover
{ background-color: #9ABCD8;
color: #fff; }
.menu LI:hover span.muted
{ color: #fff !important; }
.menu LI.disabled:hover
{ background-color: inherit; }
@@ -659,9 +662,13 @@ DIV.dialog.none
opacity: 1;
margin: 100px auto; /* top margin could be dynamically set depending on window height */ }
DIV.dialog.none DIV
DIV.dialog.none > DIV
{ padding: 10px; }
DIV.dialog DIV.muted
{ font-size: smaller;
padding: 0; }
DIV.dialog HR
{ clear: both;
height: 0px;
@@ -680,10 +687,18 @@ DIV.dialog.none P
DIV.dialog P.prompt
{ text-align: right; }
DIV.dialog P.list
DIV.dialog P.list,
DIV.dialog UL
{ max-height: 200px;
overflow-y: auto; }
DIV.dialog UL
{ list-style-type: none;
padding-left: 20px; }
DIV.dialog UL LI
{ margin-bottom: 10px; }
DIV.dialog .button
{ font-family: Lucida Grande, Bitstream VeraSans, Tahoma, sans-serif;
font-size: 8pt;
+1 -3
View File
@@ -65,9 +65,7 @@ function clickEventWrapper(functionRef) {
}
function createElement(tagName, id, classes,
attributes, htmlAttributes,
parentNode) {
function createElement(tagName, id, classes, attributes, htmlAttributes, parentNode) {
var newElement = $(document.createElement(tagName));
if (id)
newElement.setAttribute("id", id);