You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
devdocs/assets/javascripts/views/list/paginated_list.coffee

90 lines
2.1 KiB

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) =>
if event.target.tagName is 'SPAN' # link
$.stopEvent(event)
@paginate event.target
return