From eb1a16bc87f9649e8da907a0debf1b4da04a0f08 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Fri, 10 Nov 2006 22:59:39 +0000 Subject: [PATCH] Monotone-Parent: 53a9a0c604dc0d44347247cc86a74a8d746c3c4b Monotone-Revision: 69f4dab4873454f7a95f8824f9f72c5a71f8d3d7 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2006-11-10T22:59:39 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 4 + UI/WebServerResources/MailerUI.js | 147 ++++++++++++++++++++++++++---- 2 files changed, 133 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1567dc8a5..6cb5b0886 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2006-11-10 Wolfgang Sourdeau + * UI/WebServerResources/MailerUI.js: added code to handle the + possible drag and drop events to manager in the mail module. + Moving messages, opening parent folders, ... + * UI/WebServerResources/SOGoDragAndDrop.js: new file containing the drag and drop manager as well as the interface to HTMLElement to trigger drag and drop events. diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index 18881e8ba..7842d7373 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -313,17 +313,23 @@ function uixDeleteSelectedMessages(sender) { var url, http; /* send AJAX request (synchronously) */ - - url = (ApplicationBaseURL + currentMailbox + "/" - + rows[i].getAttribute("id").substr(4) - + "/trash?jsonly=1"); + + var messageId = currentMailbox + "/" + rowIds[i]; + url = ApplicationBaseURL + messageId + "/trash?jsonly=1"; http = createHTTPClient(); - http.open("POST", url, false /* not async */); + http.open("GET", url, false /* not async */); http.send(""); if (http.status != 200) { /* request failed */ failCount++; http = null; continue; + } else { + deleteCachedMessage(messageId); + if (currentMessages[currentMailbox] == rowIds[i]) { + var div = $('messageContent'); + div.innerHTML = ""; + currentMessages[currentMailbox] = null; + } } http = null; @@ -339,6 +345,43 @@ function uixDeleteSelectedMessages(sender) { return false; } +function moveMessages(rowIds, folder) { + var failCount = 0; + + for (var i = 0; i < rowIds.length; i++) { + var url, http; + + /* send AJAX request (synchronously) */ + + var messageId = currentMailbox + "/" + rowIds[i]; + url = ApplicationBaseURL + messageId + "/move?jsonly=1&tofolder=" + folder; + http = createHTTPClient(); + http.open("GET", url, false /* not async */); + http.send(""); + if (http.status == 200) { + var row = $("row_" + rowIds[i]); + row.parentNode.removeChild(row); + deleteCachedMessage(messageId); + if (currentMessages[currentMailbox] == rowIds[i]) { + var div = $('messageContent'); + div.innerHTML = ""; + currentMessages[currentMailbox] = null; + } + } + else /* request failed */ + failCount++; + + /* remove from page */ + + /* line-through would be nicer, but hiding is OK too */ + } + + if (failCount > 0) + alert("Could not move " + failCount + " messages!"); + + return failCount; +} + function onMenuDeleteMessage(event) { uixDeleteSelectedMessages(); event.preventDefault(); @@ -507,6 +550,21 @@ function onFolderMenuHide(event) selectNode(topNode.selectedEntry); } +function deleteCachedMessage(messageId) { + var done = false; + var counter = 0; + + while (counter < cachedMessages.length + && !done) + if (cachedMessages[counter] + && cachedMessages[counter]['idx'] == messageId) { + cachedMessages.splice(counter, 1); + done = true; + } + else + counter++; +} + function getCachedMessage(idx) { var message = null; @@ -787,6 +845,39 @@ var mailboxSpanExit = function() { this.removeClassName("_dragOver"); } +var mailboxSpanDrop = function(data) { + var success = false; + + if (data) { + var folder = this.parentNode.parentNode.getAttribute("dataname"); + if (folder != currentMailbox) + success = (moveMessages(data, folder) == 0); + } + else + success = false; + + return success; +} + +var plusSignEnter = function() { + var nodeNr = parseInt(this.id.substr(2)); + if (!d.aNodes[nodeNr]._io) + this.plusSignTimer = setTimeout("openPlusSign('" + nodeNr + "');", 1000); +} + +var plusSignExit = function() { + if (this.plusSignTimer) { + clearTimeout(this.plusSignTimer); + this.plusSignTimer = null; + } +} + +function openPlusSign(nodeNr) { + d.nodeStatus(1, nodeNr, d.aNodes[nodeNr]._ls); + d.aNodes[nodeNr]._io = 1; + this.plusSignTimer = null; +} + var messageListGhost = function () { var newDiv = document.createElement("div"); // newDiv.style.width = "25px;"; @@ -805,6 +896,15 @@ var messageListGhost = function () { return newDiv; } +var messageListData = function(type) { + var rows = this.getSelectedRowsId(); + var msgIds = new Array(); + for (var i = 0; i < rows.length; i++) + msgIds.push(rows[i].substr(4)); + + return msgIds; +} + function configureMessageListEvents() { var messageList = $("messageList"); if (messageList) { @@ -816,11 +916,11 @@ function configureMessageListEvents() { || rows[start].cells[0].hasClassName("tbtv_navcell")) start++; for (var i = start; i < rows.length; i++) { - rows[i].addEventListener("click", onRowClick, false); + rows[i].addEventListener("mousedown", onRowClick, false); rows[i].addEventListener("contextmenu", onMessageContextMenu, false); for (var j = 0; j < rows[i].cells.length; j++) { var cell = rows[i].cells[j]; - cell.addEventListener("mousedown", listRowMouseDownHandler, true); + cell.addEventListener("mousedown", listRowMouseDownHandler, false); if (j == 2 || j == 3 || j == 5) cell.addEventListener("dblclick", onMessageDoubleClick, false); else if (j == 4) { @@ -829,6 +929,11 @@ function configureMessageListEvents() { } } } + + messageList.dndTypes = function() { return new Array("mailRow"); }; + messageList.dndGhost = messageListGhost; + messageList.dndDataForType = messageListData; + document.DNDManager.registerSource(messageList); } } @@ -851,19 +956,25 @@ function configureDragHandles() { /* dnd */ function initDnd() { log ("MailerUI initDnd"); - var msgList = $("messageList"); - if (msgList) { - msgList.workAroundDragGesture(); - msgList.dndTypes = function() { return new Array("mailRow"); }; - msgList.dndGhost = messageListGhost; - document.DNDManager.registerSource(msgList); - var nodes = document.getElementsByClassName("leaf", $("d")); + var tree = $("d"); + if (tree) { + var images = tree.getElementsByTagName("img"); + for (var i = 0; i < images.length; i++) { + if (images[i].id[0] == 'j') { + images[i].dndAcceptType = mailboxSpanAcceptType; + images[i].dndEnter = plusSignEnter; + images[i].dndExit = plusSignExit; + document.DNDManager.registerDestination(images[i]); + } + } + var nodes = document.getElementsByClassName("leaf", tree); for (var i = 0; i < nodes.length; i++) { - nodes[i].dndAcceptType = this.mailboxSpanAcceptType; - nodes[i].dndEnter = this.mailboxSpanEnter; - nodes[i].dndExit = this.mailboxSpanExit; - document.DNDManager.registerDestination(nodes[i]); + nodes[i].dndAcceptType = mailboxSpanAcceptType; + nodes[i].dndEnter = mailboxSpanEnter; + nodes[i].dndExit = mailboxSpanExit; + nodes[i].dndDrop = mailboxSpanDrop; + document.DNDManager.registerDestination(nodes[i]); } } }