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