Skip to content

Commit

Permalink
[#2325]: Bootstrapify alphabet pager. Cleaned out old non-bootstrap p…
Browse files Browse the repository at this point in the history
…ager CSS.

Picked from release-dgu1 branch
  • Loading branch information
amercader committed May 23, 2012
1 parent 77d2a1f commit 4bde4a1
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 42 deletions.
45 changes: 29 additions & 16 deletions ckan/lib/alphabet_paginate.py
@@ -1,6 +1,7 @@
'''
Based on webhelpers.paginator, but each page is for items beginning
with a particular letter.
Based on webhelpers.paginator, but:
* each page is for items beginning with a particular letter
* output is suitable for Bootstrap
Example:
c.page = h.Page(
Expand Down Expand Up @@ -43,43 +44,55 @@ def __init__(self, collection, alpha_attribute, page, other_text, paging_thresho
self.other_text = other_text
self.paging_threshold = paging_threshold
self.controller_name = controller_name
self.available = dict( (c,0,) for c in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" )

self.letters = [char for char in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'] + [self.other_text]

# Work out which alphabet letters are 'available' i.e. have some results
# because we grey-out those which aren't.
self.available = dict( (c,0,) for c in self.letters )
for c in self.collection:
if isinstance(c, unicode):
x = c[0]
elif isinstance(c, dict):
x = c[self.alpha_attribute][0]
else:
x = getattr(c, self.alpha_attribute)[0]
x = x.upper()
if x not in self.letters:
x = self.other_text
self.available[x] = self.available.get(x, 0) + 1

def pager(self, q=None):
'''Returns pager html - for navigating between the pages.
e.g. Something like this:
<div class='pager'>
<span class="pager_curpage">A</span>
<a class="pager_link" href="/package/list?page=B">B</a>
<a class="pager_link" href="/package/list?page=C">C</a>
<ul class='pagination pagination-alphabet'>
<li class="active"><a href="/package/list?page=A">A</a></li>
<li><a href="/package/list?page=B">B</a></li>
<li><a href="/package/list?page=C">C</a></li>
...
<a class="pager_link" href="/package/list?page=Z">Z</a
<a class="pager_link" href="/package/list?page=Other">Other</a
</div>
<li class="disabled"><a href="/package/list?page=Z">Z</a></li>
<li><a href="/package/list?page=Other">Other</a></li>
</ul>
'''
if self.item_count < self.paging_threshold:
return ''
pages = []
page = q or self.page
letters = [char for char in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'] + [self.other_text]
for letter in letters:
for letter in self.letters:
href = url_for(controller=self.controller_name, action='index', page=letter)
link = HTML.a(href=href, c=letter)
if letter != page:
if self.available.get(letter, 0):
page_element = HTML.a(class_='pager_link', href=url_for(controller=self.controller_name, action='index', page=letter),c=letter)
li_class = ''
else:
page_element = HTML.span(class_="pager_empty", c=letter)
li_class = 'disabled'
else:
page_element = HTML.span(class_='pager_curpage', c=letter)
li_class = 'active'
attributes = {'class_': li_class} if li_class else {}
page_element = HTML.li(link, **attributes)
pages.append(page_element)
div = HTML.tag('div', class_='pager', *pages)
ul = HTML.tag('ul', *pages)
div = HTML.div(ul, class_='pagination pagination-alphabet')
return div


Expand Down
24 changes: 2 additions & 22 deletions ckan/public/css/style.css
Expand Up @@ -377,28 +377,8 @@ ul.no-break li {
/* ============== */
/* = Pagination = */
/* ============== */
.pager {
width: 100%;
text-align: center;
margin: 0 0 1.2em 0;
clear: both;
}
.pager span, .pager a {
text-decoration: none;
margin: 0em;
border: none;
padding: 0.3em 0.1em;
}
.pager a:hover, .pager a:active {
color: #fff;
background-color: #c22;
}
.pager span.pager_dotdot {
color: #aaa;
}
.pager span.pager_curpage {
font-weight: bold;
border: 1px solid #ddd;
.pagination-alphabet a {
padding: 0 6px;
}

/* ====== */
Expand Down
21 changes: 17 additions & 4 deletions ckan/tests/lib/test_alphabet_pagination.py
@@ -1,5 +1,7 @@
import re

from nose.tools import assert_equal

from ckan.tests import *
from ckan.tests import regex_related
from ckan.lib.create_test_data import CreateTestData
Expand Down Expand Up @@ -28,6 +30,16 @@ def setup_class(cls):
def teardown_class(cls):
model.repo.rebuild_db()

def test_00_model(self):
query = model.Session.query(model.Package)
page = h.AlphaPage(
collection=query,
alpha_attribute='title',
page='A',
other_text=other,
)
assert_equal(page.available, {'Other': 20, 'A': 10, 'C': 10, 'B': 10, 'E': 0, 'D': 10, 'G': 0, 'F': 0, 'I': 0, 'H': 0, 'K': 0, 'J': 0, 'M': 0, 'L': 0, 'O': 0, 'N': 0, 'Q': 0, 'P': 0, 'S': 0, 'R': 0, 'U': 0, 'T': 0, 'W': 0, 'V': 0, 'Y': 0, 'X': 0, 'Z': 0})

def test_01_package_page(self):
query = model.Session.query(model.Package)
page = h.AlphaPage(
Expand All @@ -37,11 +49,12 @@ def test_01_package_page(self):
other_text=other,
)
pager = page.pager()
assert pager.startswith('<div class="pager">'), pager
assert '<span class="pager_curpage">A</span>' in pager, pager
assert pager.startswith('<div class="pagination pagination-alphabet">'), pager
assert '<li class="active"><a href="/tag?page=A">A</a></li>' in pager, pager
url_base = '/packages'
assert re.search('\<span class="pager_empty"\>B\<\/span\>', pager), pager
assert re.search('\<span class="pager_empty"\>Other\<\/span\>', pager), pager
assert re.search(r'\<li\>\<a href="\/tag\?page=B"\>B\<\/a\>\<\/li\>', pager), pager
assert re.search(r'\<li class="disabled"\>\<a href="\/tag\?page=E"\>E\<\/a\>\<\/li\>', pager), pager
assert re.search(r'\<li\>\<a href="\/tag\?page=Other"\>Other\<\/a\>\<\/li\>', pager), pager


def test_02_package_items(self):
Expand Down

0 comments on commit 4bde4a1

Please sign in to comment.