Ticket #35 : almost functional. There is still a bug when opening a root and clicking on a sub-folder => it is impossible to close the root after that.

This commit is contained in:
tonio
2010-04-26 18:10:59 +02:00
parent 1fc8f45a09
commit e1c0e0af70
4 changed files with 77 additions and 54 deletions
+19 -10
View File
@@ -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<flags>.*?)\) "(?P<delimiter>.*)" (?P<name>.*)')
@@ -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):
+34 -28
View File
@@ -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 {
<div id="leftcol" class="box">
<h3>{% trans "Folders" %}</h3>
<ul>
{% for fd in folders %}
{% url extensions.webmail.main.folder fd.name as fdurl %}
<li class="droppable">
<a href="{{ fd.name }}" name="loadfolder">
{% if fd.icon %}<img src="/static/pics/{{ fd.icon }}" />
{% else %}<img src="/static/pics/folder.png" />
{% endif %}
{{ fd.name }}
</a>
</li>
{% endfor %}
{% print_folders folders %}
</ul>
</div>
{% endblock %}
{% block menu %}
{% endblock %}
+20 -16
View File
@@ -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 += "<li class='droppable'>\n"
result += "<a href='%s' name='loadfolder'>%s</a>\n" \
% (fd.has_key("path") and fd["path"] or fd["name"], fd["name"])
if fd.has_key("sub"):
result += "<img name='%s' class='clickable' src='/static/pics/%s' />\n" \
% (fd["path"], icon)
result += "<ul name='%s' class='hidden'>" % (fd["path"]) + print_folders(fd["sub"]) + "</ul>\n"
else:
result += "<img src='/static/pics/%s' />\n" % icon
result += "</li>\n"
return result
+4
View File
@@ -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;