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 %}
-
-
-
- | {% trans "Address" %} |
- {% trans "Value" %} |
- {% trans "Limit" %} |
- {% trans "Usage (%)" %} |
-
-
-
- {% for mbox in mboxes %}
- | {% identity_modify_link mbox.user "mail" %} |
- {{ mbox.get_quota }}M |
- {{ mbox.quota }}M |
-
-
- |
-
{% endfor %}
-
-
+{% 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,