Skip to content

Instantly share code, notes, and snippets.

@minibikini
Created May 23, 2013 15:21
Show Gist options
  • Save minibikini/5636869 to your computer and use it in GitHub Desktop.
Save minibikini/5636869 to your computer and use it in GitHub Desktop.
{{#if isActive}}
<div class="pagination pagination-centered">
<ul>
<li {{bindAttr class="hasPrevious::disabled"}}><a href="#" {{action "previousPage"}}>←</a></li>
{{#each pages}}
<li {{bindAttr class="active disabled"}}>
<a href="#" {{action "openPage" this}}>{{number}}</a></li>
{{/each}}
<li {{bindAttr class="hasNext::disabled"}}><a href="#" {{action "nextPage"}}>→</a></li>
</ul>
</div>
{{/if}}
module.exports = Em.ArrayController.extend Em.PaginationSupport,
load: (->
query =
skip: @get 'rangeStart'
limit: @get 'rangeWindowSize'
@set 'content', App.EliteReport.find query
).observes 'rangeStart', 'rangeWindowSize'
totalBinding: 'content.meta.total'
Ember.PaginationSupport = Ember.Mixin.create
total: 0
rangeStart: 0
rangeWindowSize: 10
maxPagesInline: 9
pages: Em.A
isActive: Em.computed 'total', 'content.isLoaded', ->
@get('content.isLoaded') and @get('total') > @get('rangeWindowSize')
rangeStop: Em.computed 'total', 'rangeStart', 'rangeWindowSize', ->
rangeStop = @get('rangeStart') + @get('rangeWindowSize')
total = @get('total')
if rangeStop < total then rangeStop else total
page: Em.computed 'rangeStart', 'rangeWindowSize', ->
(@get('rangeStart') / @get('rangeWindowSize')) + 1
totalPages: Em.computed 'total', 'rangeWindowSize', ->
Math.ceil @get('total') / @get('rangeWindowSize')
hasPrevious: Em.computed 'rangeStart', ->
@get('rangeStart') > 0
hasNext: Em.computed 'rangeStop', 'total', ->
@get('rangeStop') < @get('total')
didRequestRange: Em.K
nextPage: ->
if @get 'hasNext'
@incrementProperty 'rangeStart', @get('rangeWindowSize')
previousPage: ->
if @get 'hasPrevious'
@decrementProperty 'rangeStart', @get('rangeWindowSize')
rangeDidChange: (->
@didRequestRange @get('rangeStart'), @get('rangeStop')
).observes('rangeStart', 'rangeStop')
openPage: (page) ->
return if page.disabled
@set 'rangeStart', @get('rangeWindowSize') * (page.number - 1)
setPages: (->
return @set 'pages', [] unless @get 'isActive'
totalPages = @get 'totalPages'
buttons = @get 'maxPagesInline'
currentPage = lowerLimit = upperLimit = Math.min(@get('page'), totalPages)
b = 1
while b < buttons && b < totalPages
if lowerLimit > 1
lowerLimit--
b++
if b < buttons && upperLimit < totalPages
upperLimit++
b++
pages = []
if lowerLimit > 1
lowerLimit += 2
pages.push number:1
pages.push {number:'...', disabled: yes}
if upperLimit < totalPages
upperLimit -=2
for i in [lowerLimit..upperLimit]
pages.push
number: i
active: i is @get('page')
if upperLimit < totalPages
pages.push {number:'...', disabled: yes}
pages.push number: totalPages
@set 'pages', pages
).observes 'isActive'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment