From ac814f14cd8139872e407c5e3f8f7c5f111f68fd Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Mon, 25 Nov 2013 10:35:30 +0100 Subject: [PATCH] More intuitive message selection. --- .../amavis/static/amavis/css/quarantine.css | 4 ++ .../amavis/static/amavis/js/quarantine.js | 51 ++++++++++++++++--- .../amavis/templates/amavis/index.html | 2 +- .../templates/amavis/main_action_bar.html | 43 ++++++++++++---- .../amavis/templatetags/amavis_tags.py | 44 +++------------- modoboa/extensions/amavis/views.py | 2 +- modoboa/static/css/custom.css | 5 ++ modoboa/static/js/jquery.htmltable.js | 6 +++ 8 files changed, 104 insertions(+), 53 deletions(-) diff --git a/modoboa/extensions/amavis/static/amavis/css/quarantine.css b/modoboa/extensions/amavis/static/amavis/css/quarantine.css index a343229f4..2f7575752 100644 --- a/modoboa/extensions/amavis/static/amavis/css/quarantine.css +++ b/modoboa/extensions/amavis/static/amavis/css/quarantine.css @@ -8,6 +8,10 @@ z-index: 10; } +#menubar input[type="checkbox"] { + margin: 0; +} + #listing { position: fixed; padding: 0 15px; diff --git a/modoboa/extensions/amavis/static/amavis/js/quarantine.js b/modoboa/extensions/amavis/static/amavis/js/quarantine.js index 61bf66522..cda5304a9 100644 --- a/modoboa/extensions/amavis/static/amavis/js/quarantine.js +++ b/modoboa/extensions/amavis/static/amavis/js/quarantine.js @@ -19,6 +19,7 @@ Quarantine.prototype = { this.listen(); this.set_msgtype(); + $(document).on('click', '#selectall', this.toggle_selection); $("#searchfield").searchbar({navobj: this.navobj}); }, @@ -92,20 +93,42 @@ Quarantine.prototype = { this.navobj.update(); }, - selectmsgs: function(e) { - e.preventDefault(); - var type = $(e.target).attr("href"); - - if (type == "") { + /* + * Toggle message selection when the top checkbox's state is + * modified. + * + * If it is checked, all messages are selected. Otherwise, the + * current selection is resetted. + */ + toggle_selection: function(e) { + if (!$('#selectall').prop('checked')) { $("#emails").htmltable("clear_selection"); return; } + $("td[name=type]").each(function() { + var $this = $(this); + $("#emails").htmltable("select_row", $this.parent()); + }); + }, + + /* + * Select all messages of a specific type. + */ + selectmsgs: function(e) { + e.preventDefault(); + var type = get_target(e, 'a').attr("href"); + var counter = 0; + $("td[name=type]").each(function() { var $this = $(this); if ($this.find('span').html().trim() == type) { $("#emails").htmltable("select_row", $this.parent()); + counter++; } }); + if (counter) { + $("#selectall").prop('checked', true); + } }, /* @@ -227,12 +250,28 @@ Quarantine.prototype = { $.proxy(this.viewmail_cb, this)); }, + activate_buttons: function($tr) { + $("a[name=release-multi]").removeClass('disabled'); + $("a[name=delete-multi]").removeClass('disabled'); + }, + + deactivate_buttons: function($tr) { + if (!this.htmltable.current_selection().length) { + $("a[name=release-multi]").addClass('disabled'); + $("a[name=delete-multi]").addClass('disabled'); + } + }, + listing_cb: function(data) { this.update_page(data); this.navobj.delparam("rcpt").update(); this.set_msgtype(); - $("#emails").htmltable(); + $("#emails").htmltable({ + tr_selected_event: this.activate_buttons, + tr_unselected_event: $.proxy(this.deactivate_buttons, this) + }); this.htmltable = $("#emails").data("htmltable"); + this.deactivate_buttons(); }, viewmail_cb: function(data) { diff --git a/modoboa/extensions/amavis/templates/amavis/index.html b/modoboa/extensions/amavis/templates/amavis/index.html index 1e1205a0d..aceed6622 100644 --- a/modoboa/extensions/amavis/templates/amavis/index.html +++ b/modoboa/extensions/amavis/templates/amavis/index.html @@ -19,6 +19,6 @@ $(document).ready(function() { {% endblock %} {% block fixed_content %} - +
{% endblock %} diff --git a/modoboa/extensions/amavis/templates/amavis/main_action_bar.html b/modoboa/extensions/amavis/templates/amavis/main_action_bar.html index 5c419d067..54cbe6ab8 100644 --- a/modoboa/extensions/amavis/templates/amavis/main_action_bar.html +++ b/modoboa/extensions/amavis/templates/amavis/main_action_bar.html @@ -1,13 +1,38 @@ -{% extends "common/buttons_list.html" %}{% load i18n %} -{% block extracontent %}{% include "common/email_searchbar.html" with extraopts=extraopts %} +{% load lib_tags i18n %} +
+ + + + {% include "common/email_searchbar.html" with extraopts=extraopts %}
+ {% trans "Display" %}
- - - - - - + + + + + +
-{% endblock %} +
diff --git a/modoboa/extensions/amavis/templatetags/amavis_tags.py b/modoboa/extensions/amavis/templatetags/amavis_tags.py index 8c64cd677..d5b0ec620 100644 --- a/modoboa/extensions/amavis/templatetags/amavis_tags.py +++ b/modoboa/extensions/amavis/templatetags/amavis_tags.py @@ -66,41 +66,13 @@ def viewm_menu_simple(user, mail_id, rcpt, secret_id=""): @register.simple_tag -def quar_menu(user): - entries = [ - {"name": "release-multi", - "url": reverse('modoboa.extensions.amavis.views.process'), - "img": "icon-white icon-ok", - "class": "btn-success", - "label": _("Release")}, - {"name": "delete-multi", - "img": "icon-white icon-trash", - "class": "btn-danger", - "url": reverse('modoboa.extensions.amavis.views.process'), - "label": _("Delete")}, - {"name": "select", - "url": "", - "label": _("Content Class"), - "menu": [ - {"name": "selectmsgs", - "url": "", - "label": _("Nothing")}, - {"name": "selectmsgs", - "url": "S", - "label": _("Spam")}, - {"name": "selectmsgs", - "url": "V", - "label": _("Virus")}, - {"name": "selectmsgs", - "url": "H", - "label": _("Bad header")}, - {"name": "selectmsgs", - "url": "M", - "label": _("Bad MIME")} - ]} - ] - extraopts = [{"name": "to", "label": _("To")}] +def quar_menu(): + """Render the quarantine listing menu. + + :rtype: str + :return: resulting HTML + """ + extraopts = [{"name": "to", "label": _("To")}] return render_to_string('amavis/main_action_bar.html', { - 'entries': entries, 'extraopts': extraopts, - 'STATIC_URL': settings.STATIC_URL, 'extraclasses': 'pull-left' + 'extraopts': extraopts }) diff --git a/modoboa/extensions/amavis/views.py b/modoboa/extensions/amavis/views.py index fc39c5d15..2a95ac19c 100644 --- a/modoboa/extensions/amavis/views.py +++ b/modoboa/extensions/amavis/views.py @@ -79,7 +79,7 @@ def _listing(request): paginbar = pagination_bar(page) ctx = getctx("ok", listing=content, paginbar=paginbar, page=page.number) if request.session.get('location', 'listing') != 'listing': - ctx['menu'] = quar_menu(request.user) + ctx['menu'] = quar_menu() request.session['location'] = 'listing' return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") diff --git a/modoboa/static/css/custom.css b/modoboa/static/css/custom.css index 51f53fe4a..96e75372e 100644 --- a/modoboa/static/css/custom.css +++ b/modoboa/static/css/custom.css @@ -120,4 +120,9 @@ body { .menubar-text { display: inline; vertical-align: middle; +} + +.label-title { + vertical-align: middle; + margin: 0 10px; } \ No newline at end of file diff --git a/modoboa/static/js/jquery.htmltable.js b/modoboa/static/js/jquery.htmltable.js index 1d719d7a7..6ee6daf2e 100644 --- a/modoboa/static/js/jquery.htmltable.js +++ b/modoboa/static/js/jquery.htmltable.js @@ -37,8 +37,14 @@ this.last_selection = $tr; if ($tr.hasClass(this.options.tr_selected_class)) { $tr.removeClass(this.options.tr_selected_class); + if (this.options.tr_unselected_event != undefined) { + this.options.tr_unselected_event($tr); + } } else { $tr.addClass(this.options.tr_selected_class); + if (this.options.tr_selected_event != undefined) { + this.options.tr_selected_event($tr); + } } },