From d219680904ccdd17d56d6fbac4c84b6b2184f809 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 15 Oct 2014 12:21:03 +0200 Subject: [PATCH] Enable infinite scroll for the quota listing. see #585 --- .../extensions/admin/static/admin/js/admin.js | 26 ++++++++ .../admin/templates/admin/identities.html | 9 +-- .../templates/admin/identity_headers.html | 5 ++ .../admin/templates/admin/quota_headers.html | 5 ++ .../admin/templates/admin/quotas.html | 39 +++++------- .../admin/templatetags/admin_tags.py | 3 +- modoboa/extensions/admin/urls.py | 1 + modoboa/extensions/admin/views/identity.py | 62 ++++++++++++------- modoboa/lib/templatetags/lib_tags.py | 1 - modoboa/static/js/listing.js | 3 +- 10 files changed, 95 insertions(+), 59 deletions(-) create mode 100644 modoboa/extensions/admin/templates/admin/identity_headers.html create mode 100644 modoboa/extensions/admin/templates/admin/quota_headers.html diff --git a/modoboa/extensions/admin/static/admin/js/admin.js b/modoboa/extensions/admin/static/admin/js/admin.js index c0c1a5b72..9c54f4d80 100644 --- a/modoboa/extensions/admin/static/admin/js/admin.js +++ b/modoboa/extensions/admin/static/admin/js/admin.js @@ -296,6 +296,24 @@ Identities.prototype = { }); }, + /** + * Add a type to let the server know what kind of object we expect. + * + * @this Listing + */ + get_load_page_args: function() { + var args = Admin.prototype.get_load_page_args.call(this); + + if (this.navobj.getbaseurl() == "list") { + args.objtype = "identity"; + this.options.eor_message = gettext("No more identity to show"); + } else { + args.objtype = "quota"; + this.options.eor_message = gettext("No more quota to show"); + } + return args; + }, + /** * A new page has been received, inject it. * @@ -313,6 +331,14 @@ Identities.prototype = { * @param {Object} data - response of the ajax call (JSON) */ list_cb: function(data) { + if ($(".sidebar li.active").length === 0) { + var menu = this.navobj.getbaseurl(); + if (menu == "list") { + menu = "identities"; + } + $("a[name={0}]".format(menu)).parent().addClass("active"); + } + $("#objects_table thead tr").html(data.headers); Admin.prototype.list_cb.call(this, data); this.init_identity_links(data); }, diff --git a/modoboa/extensions/admin/templates/admin/identities.html b/modoboa/extensions/admin/templates/admin/identities.html index ca1e434b1..705f914e5 100644 --- a/modoboa/extensions/admin/templates/admin/identities.html +++ b/modoboa/extensions/admin/templates/admin/identities.html @@ -7,17 +7,10 @@ $(document).ready(function() { admin = new Identities({ domain_list_url: "{% url 'admin:domain_flat_list' %}", - load_page_url: "{% url 'admin:_identity_list' %}" + load_page_url: "{% url 'admin:identity_page' %}" }); }); {% extra_static_content "identities" user %} {% endblock %} {% block actions %}{% identities_menu user "identities" %}{% endblock %} - -{% block table_header %} -{% trans "Name" %} -{% trans "Fullname/Recipient" %} -{% trans "Tags" %} -{% trans "Actions" %} -{% endblock %} diff --git a/modoboa/extensions/admin/templates/admin/identity_headers.html b/modoboa/extensions/admin/templates/admin/identity_headers.html new file mode 100644 index 000000000..53c18e745 --- /dev/null +++ b/modoboa/extensions/admin/templates/admin/identity_headers.html @@ -0,0 +1,5 @@ +{% load i18n %} +{% trans "Name" %} +{% trans "Fullname/Recipient" %} +{% trans "Tags" %} +{% trans "Actions" %} diff --git a/modoboa/extensions/admin/templates/admin/quota_headers.html b/modoboa/extensions/admin/templates/admin/quota_headers.html new file mode 100644 index 000000000..e496973e0 --- /dev/null +++ b/modoboa/extensions/admin/templates/admin/quota_headers.html @@ -0,0 +1,5 @@ +{% load i18n %} +{% trans "Address" %} +{% trans "Value" %} +{% trans "Limit" %} +{% trans "Usage (%)" %} diff --git a/modoboa/extensions/admin/templates/admin/quotas.html b/modoboa/extensions/admin/templates/admin/quotas.html index d987421e7..266474b21 100644 --- a/modoboa/extensions/admin/templates/admin/quotas.html +++ b/modoboa/extensions/admin/templates/admin/quotas.html @@ -1,24 +1,15 @@ -{% load i18n lib_tags admin_tags %} - - - - - - - - - - - {% for mbox in mboxes %} - - - - - {% endfor %} - -
{% trans "Address" %}{% trans "Value" %}{% trans "Limit" %}{% trans "Usage (%)" %}
{% identity_modify_link mbox.user "mail" %}{{ mbox.get_quota }}M{{ mbox.quota }}M -
-
-
-
+{% load lib_tags admin_tags %} + +{% for mbox in mboxes %} + + {% identity_modify_link mbox.user "mail" %} + {{ mbox.get_quota }}M + {{ mbox.quota }}M + +
+
+
+ + +{% endfor %} diff --git a/modoboa/extensions/admin/templatetags/admin_tags.py b/modoboa/extensions/admin/templatetags/admin_tags.py index eaba5c93a..d79e04817 100644 --- a/modoboa/extensions/admin/templatetags/admin_tags.py +++ b/modoboa/extensions/admin/templatetags/admin_tags.py @@ -119,8 +119,7 @@ def identities_menu(user, selection=None): return render_to_string('common/menulist.html', { "entries": entries, - "user": user, - "selection": selection + "user": user }) diff --git a/modoboa/extensions/admin/urls.py b/modoboa/extensions/admin/urls.py index 3756372a6..a75852cec 100644 --- a/modoboa/extensions/admin/urls.py +++ b/modoboa/extensions/admin/urls.py @@ -23,6 +23,7 @@ urlpatterns += patterns( url(r'^identities/$', 'identities', name="identity_list"), url(r'^identities/list/$', '_identities', name="_identity_list"), url(r'^identities/quotas/$', 'list_quotas', name="quota_list"), + url(r'^identities/page/$', 'get_next_page', name="identity_page"), url(r'^accounts/list/$', 'accounts_list', name="account_list"), url(r'^accounts/new/$', 'newaccount', name="account_add"), diff --git a/modoboa/extensions/admin/views/identity.py b/modoboa/extensions/admin/views/identity.py index 7411cebbb..8157061d6 100644 --- a/modoboa/extensions/admin/views/identity.py +++ b/modoboa/extensions/admin/views/identity.py @@ -54,6 +54,8 @@ def _identities(request): if page is None: context["length"] = 0 else: + context["headers"] = _render_to_string( + request, "admin/identity_headers.html", {}) context["rows"] = _render_to_string( request, "admin/identities_table.html", { "identities": page.object_list @@ -63,30 +65,9 @@ def _identities(request): return render_to_json_response(context) -@login_required -@user_passes_test( - lambda u: u.has_perm("admin.add_user") or u.has_perm("admin.add_alias") -) -@ensure_csrf_cookie -def identities(request, tplname="admin/identities.html"): - return render(request, tplname, { - "selection": "identities", - "deflocation": "list/" - }) - - -@login_required -@permission_required("core.add_user") -def accounts_list(request): - accs = User.objects.filter(is_superuser=False) \ - .exclude(groups__name='SimpleUsers') - res = [a.username for a in accs.all()] - return render_to_json_response(res) - - @login_required @permission_required("admin.add_mailbox") -def list_quotas(request, tplname="admin/quotas.html"): +def list_quotas(request): from modoboa.lib.dbutils import db_type sort_order, sort_dir = get_sort_order(request.GET, "address") @@ -118,8 +99,10 @@ def list_quotas(request, tplname="admin/quotas.html"): if page is None: context["length"] = 0 else: + context["headers"] = _render_to_string( + request, "admin/quota_headers.html", {}) context["rows"] = _render_to_string( - request, tplname, { + request, "admin/quotas.html", { "mboxes": page } ) @@ -127,6 +110,39 @@ def list_quotas(request, tplname="admin/quotas.html"): return render_to_json_response(context) +@login_required +@user_passes_test( + lambda u: u.has_perm("admin.add_user") or u.has_perm("admin.add_alias") + or u.has_perm("admin.add_mailbox") +) +def get_next_page(request): + """Return the next page of the identity list.""" + if request.GET.get("objtype", "identity") == "identity": + return _identities(request) + return list_quotas(request) + + +@login_required +@user_passes_test( + lambda u: u.has_perm("admin.add_user") or u.has_perm("admin.add_alias") +) +@ensure_csrf_cookie +def identities(request, tplname="admin/identities.html"): + return render(request, tplname, { + "selection": "identities", + "deflocation": "list/" + }) + + +@login_required +@permission_required("core.add_user") +def accounts_list(request): + accs = User.objects.filter(is_superuser=False) \ + .exclude(groups__name='SimpleUsers') + res = [a.username for a in accs.all()] + return render_to_json_response(res) + + @login_required @permission_required("core.add_user") @transaction.commit_on_success diff --git a/modoboa/lib/templatetags/lib_tags.py b/modoboa/lib/templatetags/lib_tags.py index b1d6562ed..23d553cc2 100644 --- a/modoboa/lib/templatetags/lib_tags.py +++ b/modoboa/lib/templatetags/lib_tags.py @@ -3,7 +3,6 @@ from datetime import datetime from django import template from django.template import Template, Context -from django.template.loader import render_to_string from modoboa.lib import events diff --git a/modoboa/static/js/listing.js b/modoboa/static/js/listing.js index 1ead814f9..e3d6c7b8f 100644 --- a/modoboa/static/js/listing.js +++ b/modoboa/static/js/listing.js @@ -129,7 +129,7 @@ Listing.prototype = { */ end_of_list_reached: function(element) { $("#" + this.options.main_table_id).after( - $("
{0}
".format( + $("
{0}
".format( this.options.eor_message )) ); @@ -151,6 +151,7 @@ Listing.prototype = { if ($scroll_container.data("infinite-scroll") !== undefined) { $scroll_container.infinite_scroll("reset_loaded_pages", data.pages); $scroll_container.infinite_scroll("resume"); + $("#eor_message").remove(); } else { $scroll_container.infinite_scroll({ initial_pages: data.pages,