diff --git a/extensions/webmail/imap_listing.py b/extensions/webmail/imap_listing.py index a6cfa86a2..4f16e3ea0 100644 --- a/extensions/webmail/imap_listing.py +++ b/extensions/webmail/imap_listing.py @@ -183,11 +183,12 @@ class IMAPconnector(object): self.messages = data[0].split() return len(self.messages) - def _parse_folder_name(self, dict, parts): + def _parse_folder_name(self, dict, prefix, delimiter, parts): if not len(parts): return - dict[parts[0]] = {} - self._parse_folder_name(dict[parts[0]], parts[1:]) + path = "%s%s%s" % (prefix, delimiter, parts[0]) + dict[parts[0]] = {"path" : path, "sub" : {}} + self._parse_folder_name(dict[parts[0]]["sub"], path, delimiter, parts[1:]) def listfolders(self, topfolder='INBOX', md_folders=[]): list_response_pattern = re.compile(r'\((?P.*?)\) "(?P.*)" (?P.*)') @@ -198,8 +199,8 @@ class IMAPconnector(object): name = name.strip('"').decode("imap4-utf-7") if re.search("\%s" % delimiter, name): parts = name.split(".") - dict = {} - self._parse_folder_name(dict, parts[1:]) + dict = {"path" : parts[0], "sub" : {}} + self._parse_folder_name(dict["sub"], parts[0], delimiter, parts[1:]) result[parts[0]] = dict continue present = False @@ -280,6 +281,18 @@ class ImapListing(EmailListing): self.mbc.criterions = [] EmailListing.__init__(self, **kwargs) + def __parse_folders(self, folders): + result = [] + for fd in sorted(folders.keys()): + descr = {"name" : fd} + if folders[fd] is not None: + descr["path"] = folders[fd]["path"] + if folders[fd]["sub"] != {}: + descr["icon"] = "subfolders.png" + descr["sub"] = self.__parse_folders(folders[fd]["sub"]) + result += [descr] + return result + def getfolders(self): md_folders = [{"name" : "INBOX", "icon" : "overview.png"}, {"name" : 'Drafts'}, @@ -287,11 +300,7 @@ class ImapListing(EmailListing): {"name" : 'Sent'}, {"name" : 'Trash', "icon" : "trash.png"}] folders = self.mbc.listfolders(md_folders=md_folders) - for fd in sorted(folders.keys()): - descr = {"name" : fd} - if folders[fd] != None: - descr["icon"] = "subfolders.png" - md_folders += [descr] + md_folders += self.__parse_folders(folders) return md_folders def parse_search_parameters(self, criterion, pattern): diff --git a/extensions/webmail/templates/index.html b/extensions/webmail/templates/index.html index 1ca47b349..29bc90f4e 100644 --- a/extensions/webmail/templates/index.html +++ b/extensions/webmail/templates/index.html @@ -1,5 +1,6 @@ {% extends "common/email_listing.html" %} {% load i18n %} +{% load webextras %} {% block css %} #listing { position: absolute; @@ -63,6 +64,7 @@ table#emails > tbody { .box li.selected { background: #ffffcc; + position: relative; } .box a:link, .box a:visited { @@ -109,6 +111,17 @@ tr.selected { background: #ffffcc; } +ul.hidden { + display: none; +} + +ul.visible { + background: white; + display: block; + padding-bottom: 0; + padding-left: 10px; +} + {% endblock %} {% block js %} wm_updatelisting = function(resp) { @@ -116,9 +129,6 @@ tr.selected { $$("a[name=compose]").addEvent("click", loadCompose); $$("a[name=empty]").addEvent("click", empty); - if (!checkSelection()) { - select($$("a[href=INBOX]")); - } } empty = function(event) { @@ -128,17 +138,6 @@ tr.selected { }}).get(); } - checkSelection = function() { - var selection = false; - - $$("a[name=loadfolder]").each(function(item) { - if (!selection) { - selection = item.getParent().hasClass("selected"); - } - }); - return selection; - } - select = function(obj) { $$("a[name=loadfolder]").each(function(item) { item.getParent().removeClass("selected"); @@ -146,6 +145,14 @@ tr.selected { }); obj.getParent().removeClass("droppable"); obj.getParent().addClass("selected"); + + $$(obj.getParents("ul[class*=hidden]")).each(function(item) { + item.removeClass("hidden"); + item.addClass("visible"); + $$("img[name=" + item.get("name") + "]").each(function(item) { + item.set("src", "/static/pics/folder-open.png"); + }); + }); } register_callback("viewmail", function(resp) { @@ -221,6 +228,18 @@ tr.selected { } register_callback("folder", function(resp) { wm_updatelisting(resp); + select($$("a[href=" + current_anchor.getbaseurl() + "]")); + $$("img[class=clickable]").addEvent("click", function(evt) { + $$("ul[name=" + evt.target.get("name") + "]").each(function(item) { + if (item.hasClass("hidden")) { + evt.target.set("src", "/static/pics/folder-open.png"); + item.removeClass("hidden").addClass("visible"); + } else { + evt.target.set("src", "/static/pics/subfolders.png"); + item.removeClass("visible").addClass("hidden"); + } + }); + }); searchbox_init(); if (navparams.has("order")) { src = navparams.get("order").charAt(0) == "-" ? "down_arrow.png" : "up_arrow.png"; @@ -346,20 +365,7 @@ tr.selected {

{% trans "Folders" %}

{% endblock %} -{% block menu %} - -{% endblock %} diff --git a/extensions/webmail/templatetags/webextras.py b/extensions/webmail/templatetags/webextras.py index 3e2660ddc..4ee9340df 100644 --- a/extensions/webmail/templatetags/webextras.py +++ b/extensions/webmail/templatetags/webextras.py @@ -7,22 +7,6 @@ from mailng.extensions.webmail.imap_listing import IMAPheader register = template.Library() -def backurl(session, **kwargs): - res = session["folder"] - params = "" - for key in ["page"]: - if key in session.keys(): - if params != "": - params += "&" - params += "%s=%s" % (key, session[key]) - for k, v in kwargs.iteritems(): - if params != "": - params += "&" - params += "%s=%s" % (k, v) - if params != "": - res += "?%s" % params - return res - @register.simple_tag def viewm_menu(selection, backurl, folder, mail_id, perms): entries = [ @@ -99,3 +83,23 @@ def listing_menu(selection, folder, perms): "perms" : perms}) searchbar = render_to_string("common/email_searchbar.html", {}) return menu + searchbar + +@register.simple_tag +def print_folders(folders): + result = "" + for fd in folders: + if fd.has_key("icon"): + icon = fd["icon"] + else: + icon = "folder.png" + result += "
  • \n" + result += "%s\n" \ + % (fd.has_key("path") and fd["path"] or fd["name"], fd["name"]) + if fd.has_key("sub"): + result += "\n" \ + % (fd["path"], icon) + result += "\n" + else: + result += "\n" % icon + result += "
  • \n" + return result diff --git a/static/js/common.js b/static/js/common.js index e117c264b..53260efb5 100644 --- a/static/js/common.js +++ b/static/js/common.js @@ -155,6 +155,10 @@ function HashWrapper(deflocation) { return this; }; + this.getbaseurl = function() { + return this.base.substr(0, this.base.length - 1); + }; + this.delparam = function(name) { if (!this.params.has(name)) { return false;