Skip to content

Instantly share code, notes, and snippets.

@iorlas
Created April 9, 2015 17:30
Show Gist options
  • Save iorlas/562d88bf90a6ee2bf3d3 to your computer and use it in GitHub Desktop.
Save iorlas/562d88bf90a6ee2bf3d3 to your computer and use it in GitHub Desktop.
class BaseCollection
model: null
params: {} # main filter params
items: []
constructor: (@model, @params, extra) ->
_.extend @, extra if extra
reload: ->
@model.prototype.promise (resolve, reject) =>
@isLoading = true
@model.prototype.http.get "#{@model.prototype.url}",
params: @requestParams()
.success (data) =>
resolve @processData(data)
.catch reject
.finally => @isLoading = false
requestParams: -> _.extend {}, @params
processData: (items) ->
@items = items.map (item) => new @model(item)
@ # so in resolve we will get paginator object
class @Collection extends BaseCollection
inlineFilterParams: {}
inlineFilter: (params) ->
requestParams: ->
_.extend super(), @inlineFilterParams
class @SortableCollection extends Collection
sorter: null
sortReversed: false
requestParams: ->
params = super()
_.extend params,
ordering: (if @sortReversed then '-' else '') + @sorter if @sorter
orderBy: (sorter) ->
return if @isLoading
if @sorter is sorter
@sortReversed = not @sortReversed
else
@sorter = sorter
@sortReversed = false
@reload()
class @PaginatedCollection extends SortableCollection
perPage: 10
page: 1
totalPages: 1
_prevParams: {}
processData: (data) ->
@totalPages = data.num_pages
@page = data.page
super data.results
requestParams: ->
params = super()
_.extend params,
per_page: @perPage
#if filters are changed, reset to page 1
if not _.isEqual(_prevParams, params)
@page = 1
_prevParams = params
#finalize
params.page = @page
params
goto: (page) ->
return if @isLoading
@page = page
@reload()
gotoNext: -> goto Math.min(@numPages, @page + 1)
gotoPrev: -> goto Math.max(1, @page - 1)
setPerPage: (num) ->
return if @isLoading
@perPage = num
@load 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment