diff --git a/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/choose.html b/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/choose.html
index 969f4cd4d..8ed38af01 100644
--- a/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/choose.html
+++ b/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/choose.html
@@ -4,9 +4,10 @@
{% if items %}
- {% include "wagtailsnippets/snippets/list.html" with choosing=1 %}
+ {% include "wagtailsnippets/chooser/list.html" with choosing=1 %}
{% else %}
{% url 'wagtailsnippets_create' content_type.app_label content_type.model as wagtailsnippets_create_snippet_url %}
{% blocktrans %}You haven't created any {{ snippet_type_name }} snippets. Why not create one now{% endblocktrans %}
{% endif %}
+
diff --git a/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/choose.js b/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/choose.js
index 5138f67d0..d902578b2 100644
--- a/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/choose.js
+++ b/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/choose.js
@@ -1,6 +1,39 @@
function(modal) {
- $('a.snippet-choice', modal.body).click(function() {
- modal.loadUrl(this.href);
+
+ var listingUrl = $('#snippet-chooser-list', modal.body).data('url');
+ console.log(listingUrl);
+
+ function ajaxifyLinks (context) {
+ $('a.snippet-choice', modal.body).click(function() {
+ modal.loadUrl(this.href);
+ return false;
+ });
+
+ $('.pagination a', context).click(function() {
+ var page = this.getAttribute("data-page");
+ setPage(page);
+ return false;
+ });
+ }
+
+ function setPage(page) {
+
+ $.ajax({
+ url: listingUrl,
+ data: {p: page},
+ dataType: "html",
+ success: function(data, status, xhr) {
+ var response = eval('(' + data + ')');
+ $(modal.body).html(response.html);
+ if (response.onload) {
+ response.onload(self);
+ }
+ ajaxifyLinks($('#snippet-chooser-list'));
+ }
+ });
return false;
- });
+ }
+
+ ajaxifyLinks(modal.body);
+
}
\ No newline at end of file
diff --git a/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/list.html b/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/list.html
new file mode 100644
index 000000000..dbda9d21f
--- /dev/null
+++ b/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/list.html
@@ -0,0 +1,29 @@
+{% load i18n %}
+
+{% url "wagtailsnippets_choose" content_type.app_label content_type.model as linkurl %}
+
+
+
+
+
+
+
+
+
+ {% for snippet in items %}
+
+ |
+ {% if choosing %}
+
+ {% else %}
+
+ {% endif %}
+ |
+
+ {% endfor %}
+
+
+
+{% include "wagtailadmin/shared/pagination_nav.html" with items=items is_ajax=1 %}
diff --git a/wagtail/wagtailsnippets/templates/wagtailsnippets/snippets/list.html b/wagtail/wagtailsnippets/templates/wagtailsnippets/snippets/list.html
index 9f34de323..6cc758e23 100644
--- a/wagtail/wagtailsnippets/templates/wagtailsnippets/snippets/list.html
+++ b/wagtail/wagtailsnippets/templates/wagtailsnippets/snippets/list.html
@@ -21,4 +21,7 @@
{% endfor %}
-
\ No newline at end of file
+
+
+
+{% include "wagtailadmin/shared/pagination_nav.html" with items=items is_ajax=is_ajax linkurl=linkurl %}
diff --git a/wagtail/wagtailsnippets/tests.py b/wagtail/wagtailsnippets/tests.py
index 4ebbb6d99..3f41b7e99 100644
--- a/wagtail/wagtailsnippets/tests.py
+++ b/wagtail/wagtailsnippets/tests.py
@@ -1,3 +1,4 @@
+from django.http import Http404
from django.test import TestCase
from django.core.urlresolvers import reverse
from django.db import models
@@ -43,6 +44,14 @@ class TestSnippetListView(TestCase, WagtailTestUtils):
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'wagtailsnippets/snippets/type_index.html')
+ def test_simple_pagination(self):
+
+ pages = ['0', '1', '-1', '9999', 'Not a page']
+ for page in pages:
+ response = self.get({'p': page})
+ self.assertEqual(response.status_code, 200)
+ self.assertTemplateUsed(response, 'wagtailsnippets/snippets/type_index.html')
+
def test_displays_add_button(self):
self.assertContains(self.get(), "Add advert")
@@ -219,3 +228,48 @@ class TestUsedBy(TestCase):
def test_snippet_used_by(self):
advert = Advert.objects.get(id=1)
self.assertEqual(type(advert.get_usage()[0]), Page)
+
+
+class TestSnippetChoose(TestCase, WagtailTestUtils):
+ fixtures = ['wagtail/tests/fixtures/test.json']
+
+ def setUp(self):
+ self.login()
+
+ def get(self, params=None):
+ return self.client.get(reverse('wagtailsnippets_choose',
+ args=('tests', 'advert')),
+ params or {})
+
+ def test_simple(self):
+ response = self.get()
+ self.assertTemplateUsed(response, 'wagtailsnippets/chooser/choose.html')
+
+ def test_simple_pagination(self):
+
+ pages = ['0', '1', '-1', '9999', 'Not a page']
+ for page in pages:
+ response = self.get({'p': page})
+ self.assertEqual(response.status_code, 200)
+ self.assertTemplateUsed(response, 'wagtailsnippets/chooser/choose.html')
+
+
+class TestSnippetChosen(TestCase, WagtailTestUtils):
+ fixtures = ['wagtail/tests/fixtures/test.json']
+
+ def setUp(self):
+ self.login()
+
+ def get(self, pk, params=None):
+ return self.client.get(reverse('wagtailsnippets_chosen',
+ args=('tests', 'advert', pk)),
+ params or {})
+
+ def test_choose_a_page(self):
+ response = self.get(pk=Advert.objects.all()[0].pk)
+ self.assertTemplateUsed(response, 'wagtailsnippets/chooser/chosen.js')
+
+ def test_choose_a_non_existing_page(self):
+
+ response = self.get(999999)
+ self.assertEqual(response.status_code, 404)
diff --git a/wagtail/wagtailsnippets/views/chooser.py b/wagtail/wagtailsnippets/views/chooser.py
index fdbcb6f4a..ec18a0550 100644
--- a/wagtail/wagtailsnippets/views/chooser.py
+++ b/wagtail/wagtailsnippets/views/chooser.py
@@ -1,4 +1,5 @@
import json
+from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from six import text_type
@@ -16,13 +17,23 @@ def choose(request, content_type_app_name, content_type_model_name):
items = model.objects.all()
+ p = request.GET.get("p", 1)
+ paginator = Paginator(items, 25)
+
+ try:
+ paginated_items = paginator.page(p)
+ except PageNotAnInteger:
+ paginated_items = paginator.page(1)
+ except EmptyPage:
+ paginated_items = paginator.page(paginator.num_pages)
+
return render_modal_workflow(
request,
'wagtailsnippets/chooser/choose.html', 'wagtailsnippets/chooser/choose.js',
{
'content_type': content_type,
'snippet_type_name': snippet_type_name,
- 'items': items,
+ 'items': paginated_items,
}
)
diff --git a/wagtail/wagtailsnippets/views/snippets.py b/wagtail/wagtailsnippets/views/snippets.py
index 971aacc7e..305b3fe28 100644
--- a/wagtail/wagtailsnippets/views/snippets.py
+++ b/wagtail/wagtailsnippets/views/snippets.py
@@ -94,11 +94,22 @@ def list(request, content_type_app_name, content_type_model_name):
items = model.objects.all()
+ # Pagination
+ p = request.GET.get('p', 1)
+ paginator = Paginator(items, 20)
+
+ try:
+ paginated_items = paginator.page(p)
+ except PageNotAnInteger:
+ paginated_items = paginator.page(1)
+ except EmptyPage:
+ paginated_items = paginator.page(paginator.num_pages)
+
return render(request, 'wagtailsnippets/snippets/type_index.html', {
'content_type': content_type,
'snippet_type_name': snippet_type_name,
'snippet_type_name_plural': snippet_type_name_plural,
- 'items': items,
+ 'items': paginated_items,
})