From ce9ffbbfe5bc31c9bf6922ba9682422bae715733 Mon Sep 17 00:00:00 2001 From: tonio Date: Tue, 27 Apr 2010 18:54:24 +0200 Subject: [PATCH] New "actions" menu in folder listing. Available operations are : * compact folder (ie. expunge IMAP command) * empty folder (only for Trash, we need to do it) --- extensions/webmail/imap_listing.py | 4 +++ extensions/webmail/main.py | 6 +++++ extensions/webmail/templates/index.html | 5 ++++ extensions/webmail/templatetags/webextras.py | 26 +++++++++++++------ extensions/webmail/urls.py | 1 + static/js/common.js | 7 +++++ static/pics/compress.png | Bin 0 -> 540 bytes templates/main/menu.html | 8 ++++-- 8 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 static/pics/compress.png diff --git a/extensions/webmail/imap_listing.py b/extensions/webmail/imap_listing.py index 1c63ef6c0..e095cbf40 100644 --- a/extensions/webmail/imap_listing.py +++ b/extensions/webmail/imap_listing.py @@ -241,6 +241,10 @@ class IMAPconnector(object): self.m.store(num, "+FLAGS", "\\Deleted") self.m.expunge() + def compact(self, folder): + self.m.select(self._encodefolder(folder)) + self.m.expunge() + def fetch(self, start=None, stop=None, folder=None, all=False): if not start and not stop: return [] diff --git a/extensions/webmail/main.py b/extensions/webmail/main.py index c48d6b8ca..d6c97efac 100644 --- a/extensions/webmail/main.py +++ b/extensions/webmail/main.py @@ -206,6 +206,12 @@ def empty(request, name): mbc.empty(name) return folder(request, name, False) +@login_required +def compact(request, name): + mbc = IMAPconnector(request) + mbc.compact(name) + return folder(request, name, False) + def render_compose(request, form, posturl, bodyheader=None, body=None): menu = compose_menu("", __get_current_url(request), request.user.get_all_permissions()) diff --git a/extensions/webmail/templates/index.html b/extensions/webmail/templates/index.html index a3bcd3993..a15dd4eaf 100644 --- a/extensions/webmail/templates/index.html +++ b/extensions/webmail/templates/index.html @@ -279,6 +279,11 @@ ul.visible { $$("a[name=mark-read]").addEvent("click", buildmarkrequest); $$("a[name=mark-unread]").addEvent("click", buildmarkrequest); + $$("a[name=fdaction]").addEvent("click", function(evt) { + evt.stop(); + current_anchor.parse_string(evt.target.get("href"), true).update(); + }); + $$("tr").each(function(item) { new Drag.Move(item, { droppables: ".droppable", diff --git a/extensions/webmail/templatetags/webextras.py b/extensions/webmail/templatetags/webextras.py index 6afec6c47..da6fc0f75 100644 --- a/extensions/webmail/templatetags/webextras.py +++ b/extensions/webmail/templatetags/webextras.py @@ -59,7 +59,7 @@ def listing_menu(selection, folder, perms): "url" : reverse(webmail.main.compose), "img" : "/static/pics/edit.png", "label" : _("New message")}, - {"name" : "actions", + {"name" : "mark", "img" : "/static/pics/domains.png", "label" : _("Mark messages"), "class" : "menubardropdown", @@ -71,15 +71,25 @@ def listing_menu(selection, folder, perms): "label" : _("As unread"), "url" : reverse(webmail.main.mark, args=[folder]) + "?status=unread"} ] + }, + {"name" : "actions", + "img" : "/static/pics/settings.png", + "label" : _("Actions"), + "class" : "menubardropdown", + "width" : "150", + "menu" : [ + {"name" : "fdaction", + "label" : _("Compact folder"), + "img" : "/static/pics/compress.png", + "url" : "compact/%s/" % folder}, + {"name" : "fdaction", + "label" : _("Empty folder"), + "img" : "/static/pics/clear.png", + "url" : folder == "Trash" \ + and reverse(webmail.main.empty, args=[folder]) or ""} + ] } ] - if folder in ["Trash"]: - entries += [ - {"name" : "empty", - "url" : reverse(webmail.main.empty, args=[folder]), - "img" : "/static/pics/clear.png", - "label" : _("Empty trash")} - ] menu = render_to_string("main/menu.html", {"selection" : selection, "entries" : entries, "perms" : perms}) diff --git a/extensions/webmail/urls.py b/extensions/webmail/urls.py index ec679a88d..88d9a99a6 100644 --- a/extensions/webmail/urls.py +++ b/extensions/webmail/urls.py @@ -6,6 +6,7 @@ urlpatterns = patterns('mailng.extensions.webmail.main', (r'^move/$', "move"), (r'^mark/(?P.+)/$', "mark"), (r'^empty/(?P.+)/$', "empty"), + (r'^compact/(?P.+)/$', "compact"), (r'^(?P.+)/(?P[\w\-\+]+)/part/$', 'getattachment'), (r'^(?P.+)/(?P[\w\-\+]+)/delete/$', 'delete'), (r'^(?P.+)/(?P[\w\-\+]+)/content/$', 'getmailcontent'), diff --git a/static/js/common.js b/static/js/common.js index 53260efb5..cc9e17566 100644 --- a/static/js/common.js +++ b/static/js/common.js @@ -170,6 +170,8 @@ function HashWrapper(deflocation) { parse_menubar = function(id) { if ($(id)) { + var first = true; + $(id).getElements('li.dropdown').each(function(elem){ var list = elem.getElement('ul.links'); var myFx = new Fx.Slide(list, { @@ -190,6 +192,11 @@ parse_menubar = function(id) { myFx.slideOut(); } }); + if (!first) { + elem.setStyle("margin-left", "10em"); + } else { + first = false; + } }); SqueezeBox.assign($$('a.boxed'), { parse: 'rel', diff --git a/static/pics/compress.png b/static/pics/compress.png new file mode 100644 index 0000000000000000000000000000000000000000..9015426153054c0b529b4d9ebdfa06a221d568ac GIT binary patch literal 540 zcmV+%0^|LOP)Vhlm95D^5CAW0*NO~l4h2`Gn+SSXee3p=k!DITN| zloYWEXca63MGv(U^qPobY>b#9Dp8{0UEbTVcsUg#cu}XB*@6F?*_nZVGy!PT%rNk5 zliHE-nb49(%`}10vsV}N{rqDUTQ;Bo7$dnCNIoxON&^{bA}^laGjk880qPdu^yOBT zEWa_clc&Tx2f*4|8y`gof^!a2aQL`dICk+4OK+dE`@k5lTlYsTutSWPkfmY@o;2kB zMZE(6RQjtR27v0WeY98J5hzgEvJDN{um$>(l@Gjpa+{MEra-d|pH&4=2yN1juSixu z;fgT;7AQWtIU$FSo`duYWUHV7)eJ(4YRG+92Ww!@-u*n7y$)#60)BA&kYbGBD?sJP zdQc>%Uxr2wvM|?-q){`MfcjsaLA`SadgR1;mgk#Ysp6f7xO?jg<1;~QC+VXy zJ@MAA0M19> -