|
|
|
class app.views.PaginatedList extends app.View
|
|
|
|
PER_PAGE = app.config.max_results
|
|
|
|
|
|
|
|
constructor: (@data) ->
|
|
|
|
(@constructor.events or= {}).click ?= 'onClick'
|
|
|
|
super
|
|
|
|
|
|
|
|
renderPaginated: ->
|
|
|
|
@page = 0
|
|
|
|
|
|
|
|
if @totalPages() > 1
|
|
|
|
@paginateNext()
|
|
|
|
else
|
|
|
|
@html @renderAll()
|
|
|
|
return
|
|
|
|
|
|
|
|
# render: (dataSlice) -> implemented by subclass
|
|
|
|
|
|
|
|
renderAll: ->
|
|
|
|
@render @data
|
|
|
|
|
|
|
|
renderPage: (page) ->
|
|
|
|
@render @data[((page - 1) * PER_PAGE)...(page * PER_PAGE)]
|
|
|
|
|
|
|
|
renderPageLink: (count) ->
|
|
|
|
@tmpl 'sidebarPageLink', count
|
|
|
|
|
|
|
|
renderPrevLink: (page) ->
|
|
|
|
@renderPageLink (page - 1) * PER_PAGE
|
|
|
|
|
|
|
|
renderNextLink: (page) ->
|
|
|
|
@renderPageLink @data.length - page * PER_PAGE
|
|
|
|
|
|
|
|
totalPages: ->
|
|
|
|
Math.ceil @data.length / PER_PAGE
|
|
|
|
|
|
|
|
paginate: (link) ->
|
|
|
|
$.lockScroll link.nextSibling or link.previousSibling, =>
|
|
|
|
$.batchUpdate @el, =>
|
|
|
|
if link.nextSibling then @paginatePrev link else @paginateNext link
|
|
|
|
return
|
|
|
|
return
|
|
|
|
return
|
|
|
|
|
|
|
|
paginateNext: ->
|
|
|
|
@remove @el.lastChild if @el.lastChild # remove link
|
|
|
|
@hideTopPage() if @page >= 2 # keep previous page into view
|
|
|
|
@page++
|
|
|
|
@append @renderPage(@page)
|
|
|
|
@append @renderNextLink(@page) if @page < @totalPages()
|
|
|
|
return
|
|
|
|
|
|
|
|
paginatePrev: ->
|
|
|
|
@remove @el.firstChild # remove link
|
|
|
|
@hideBottomPage()
|
|
|
|
@page--
|
|
|
|
@prepend @renderPage(@page - 1) # previous page is offset by one
|
|
|
|
@prepend @renderPrevLink(@page - 1) if @page >= 3
|
|
|
|
return
|
|
|
|
|
|
|
|
paginateTo: (object) ->
|
|
|
|
index = @data.indexOf(object)
|
|
|
|
if index >= PER_PAGE
|
|
|
|
@paginateNext() for [0...(index // PER_PAGE)]
|
|
|
|
return
|
|
|
|
|
|
|
|
hideTopPage: ->
|
|
|
|
n = if @page <= 2
|
|
|
|
PER_PAGE
|
|
|
|
else
|
|
|
|
PER_PAGE + 1 # remove link
|
|
|
|
@remove @el.firstChild for [0...n]
|
|
|
|
@prepend @renderPrevLink(@page)
|
|
|
|
return
|
|
|
|
|
|
|
|
hideBottomPage: ->
|
|
|
|
n = if @page is @totalPages()
|
|
|
|
@data.length % PER_PAGE or PER_PAGE
|
|
|
|
else
|
|
|
|
PER_PAGE + 1 # remove link
|
|
|
|
@remove @el.lastChild for [0...n]
|
|
|
|
@append @renderNextLink(@page - 1)
|
|
|
|
return
|
|
|
|
|
|
|
|
onClick: (event) =>
|
|
|
|
target = $.eventTarget(event)
|
|
|
|
if target.tagName is 'SPAN' # link
|
|
|
|
$.stopEvent(event)
|
|
|
|
@paginate target
|
|
|
|
return
|