mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-19 05:58:34 +02:00
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:
@@ -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):
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user