diff --git a/extensions/webmail/imaputils.py b/extensions/webmail/imaputils.py
index dd6ba51c0..282e3c652 100644
--- a/extensions/webmail/imaputils.py
+++ b/extensions/webmail/imaputils.py
@@ -67,7 +67,7 @@ class IMAPconnector(object):
:param name: the command's name
:return: the command's result
"""
- if name in ['FETCH', 'SORT', 'STORE']:
+ if name in ['FETCH', 'SORT', 'STORE', 'COPY']:
try:
typ, data = self.m.uid(name, *args)
except imaplib.IMAP4.error, e:
@@ -292,11 +292,13 @@ class IMAPconnector(object):
def msg_answered(self, folder, imapid):
self._add_flag(folder, imapid, r'(\Answered)')
- def move(self, msgset, oldfolder, newfolder):
- self.m.select(self._encodefolder(oldfolder))
- status, data = self.m.copy(msgset, self._encodefolder(newfolder))
- if status == 'OK':
- self.m.store(msgset, "+FLAGS", r'(\Deleted)')
+ def move(self, msgset, oldmailbox, newmailbox):
+ """Move messages between mailboxes
+
+ """
+ self.select_mailbox(oldmailbox, False)
+ self._cmd("COPY", msgset, newmailbox.encode("imap4-utf-7"))
+ self._cmd("STORE", msgset, "+FLAGS", r'(\Deleted)')
def push_mail(self, folder, msg):
now = imaplib.Time2Internaldate(time.time())
diff --git a/extensions/webmail/static/js/webmail.js b/extensions/webmail/static/js/webmail.js
index 80e100e22..f882fc796 100644
--- a/extensions/webmail/static/js/webmail.js
+++ b/extensions/webmail/static/js/webmail.js
@@ -147,6 +147,7 @@ var Webmail = new Class({
link.addEvent("click", this.listmailbox_loader.bind(this));
img.addEvent("click", this.toggle_folder_buttons.bind(this));
}
+ this.init_draggables();
this.toggle_mbox_state(parent.getFirst("div"), ul);
},
@@ -272,11 +273,29 @@ var Webmail = new Class({
init_sortable_columns();
update_sortable_column();
- this.dragobjs = new Array();
+ this.init_draggables();
+
+ $$("tbody>tr").addEvent("dblclick", viewmail);
+ },
+
+ /*
+ * Drag & Drop feature
+ */
+ init_draggables: function(pattern) {
+ if (this.dragobjs == undefined) {
+ this.dragobjs = new Array();
+ } else {
+ this.dragobjs.each(function(item) {
+ item.detach();
+ delete(item);
+ });
+ this.dragobjs = new Array();
+ }
+
$$("td[class*=draggable]").each(function(item) {
var pid = item.getParent().get("id");
- this.dragobjs[pid] = new Drag.Move(item, {
+ this.dragobjs[pid] = item.makeDraggable({
droppables: ".droppable"
}).addEvents({
beforeStart: this.bstart_dragging.bind(this),
@@ -287,13 +306,8 @@ var Webmail = new Class({
cancel: this.cancel_dragging.bind(this)
});
}.bind(this));
-
- $$("tbody>tr").addEvent("dblclick", viewmail);
},
- /*
- * Drag & Drop feature
- */
/*
* 'before start' event callback
@@ -574,12 +588,13 @@ var Webmail = new Class({
profile: "gray",
spinner: true
});
+ params["json"] = "1";
new Request.JSON({
url : url,
onSuccess : function(response) {
if (response.status == "ok") {
if (!$defined(response.next)) {
- current_anchor.get_callback("folder")(response);
+ current_anchor.get_callback("listmailbox")(response);
}
infobox.info(gettext("Done"));
if ($defined(response.next)) {
diff --git a/extensions/webmail/views.py b/extensions/webmail/views.py
index 4db1e21ec..888d314f7 100644
--- a/extensions/webmail/views.py
+++ b/extensions/webmail/views.py
@@ -211,11 +211,12 @@ def getattachment(request, folder, mail_id):
def move(request):
for arg in ["msgset", "to"]:
if not request.GET.has_key(arg):
- return
- mbc = IMAPconnector(user=request.user.username,
- password=request.session["password"])
- mbc.move(request.GET["msgset"], request.session["folder"], request.GET["to"])
- return folder(request, request.session["folder"], False)
+ raise WebmailError(_("Invalid request"))
+ mbc = get_imapconnector(request)
+ mbc.move(request.GET["msgset"], request.session["mbox"], request.GET["to"])
+ resp = listmailbox(request, request.session["mbox"])
+ resp.update(status="ok")
+ return ajax_simple_response(resp)
@login_required
@is_not_localadmin()
@@ -502,21 +503,33 @@ def delattachment(request):
# NEW CODE STARTS HERE
#
def render_mboxes_list(request, imapc):
+ curmbox = request.session.get("mbox", "INBOX")
return _render_to_string(request, "webmail/folders.html", {
"titlebar" : True,
- "selected" : request.session["mbox"],
+ "selected" : curmbox,
"folders" : imapc.getfolders(request.user),
"withmenu" : True,
"withunseen" : True
})
-def listmailbox(request):
- mbox = request.GET.get("name", "INBOX")
- request.session["mbox"] = mbox
- lst = ImapListing(request.user, request.session["password"],
- baseurl=mbox, folder=mbox, order="-date")
+def set_nav_params(request):
+ if not request.session.has_key("navparams"):
+ request.session["navparams"] = {}
+
+ request.session["pageid"] = \
+ int(request.GET.get("page", 1))
- return lst.render(request)
+def listmailbox(request, defmailbox="INBOX"):
+ mbox = request.GET.get("name", defmailbox)
+ request.session["mbox"] = mbox
+
+ set_nav_params(request)
+
+ lst = ImapListing(request.user, request.session["password"],
+ baseurl="?action=listmailbox&name=%s&" % mbox,
+ folder=mbox, order="-date")
+
+ return lst.render(request, request.session["pageid"])
@login_required
@is_not_localadmin()
@@ -559,6 +572,7 @@ def newindex(request):
defcallback="wm_updatelisting")
if not json:
+ curmbox = request.session.get("mbox", "INBOX")
imapc = get_imapconnector(request)
response["refreshrate"] = \
int(parameters.get_user(request.user, "REFRESH_INTERVAL")) * 1000
@@ -567,7 +581,7 @@ def newindex(request):
menufunc = globals()["%s_menu" % action]
except KeyError:
menufunc = globals()["listmailbox_menu"]
- response["menu"] = menufunc("", request.session["mbox"], request.user)
+ response["menu"] = menufunc("", curmbox, request.user)
return _render(request, "webmail/index.html", response)
response.update(status="ok", callback=action)
diff --git a/static/js/anchor_nav.js b/static/js/anchor_nav.js
index 56531f1a3..f17619c38 100644
--- a/static/js/anchor_nav.js
+++ b/static/js/anchor_nav.js
@@ -112,6 +112,7 @@ var AnchorNavigation = new Class({
for (var i = 0; i < elems.length; i++) {
this.setparamfromstring(elems[i]);
}
+ return this;
},
setparamfromstring: function(str) {
diff --git a/static/js/email_listing.js b/static/js/email_listing.js
index 97f561ecf..89b170616 100644
--- a/static/js/email_listing.js
+++ b/static/js/email_listing.js
@@ -4,9 +4,11 @@
*/
function navbarcallback(event) {
- event.stop();
- current_anchor.setparams(navparams);
- current_anchor.parse_string($(event.target).getParent().get("href")).update();
+ event.stop();
+ current_anchor.reset()
+ .setparams(navparams)
+ .updateparams(this.get("href"))
+ .update();
}
function updatelisting(resp) {
@@ -23,7 +25,7 @@ function updatelisting(resp) {
}
if ($defined(resp.navbar)) {
$("navbar").set("html", resp.navbar);
- $("navbar").getChildren("a").addEvent("click", navbarcallback);
+ $$("#navbar a").addEvent("click", navbarcallback);
}
}
diff --git a/templates/common/navbar.html b/templates/common/navbar.html
index 0d5ac4277..182fb4e86 100644
--- a/templates/common/navbar.html
+++ b/templates/common/navbar.html
@@ -2,18 +2,18 @@
{% if page.previous_page %}
-
+
-
+
{% endif %}
{% if page.next_page %}
-
+
-
+
{% endif %}