78 lines
1.9 KiB
JavaScript
78 lines
1.9 KiB
JavaScript
/* global Metamaps */
|
|
|
|
import Backbone from 'backbone'
|
|
Backbone.$ = window.$
|
|
|
|
import Loading from '../Loading'
|
|
|
|
import Map from './Map'
|
|
|
|
const MapCollection = Backbone.Collection.extend({
|
|
model: Map,
|
|
initialize: function (models, options) {
|
|
this.id = options.id
|
|
this.sortBy = options.sortBy
|
|
|
|
if (options.mapperId) {
|
|
this.mapperId = options.mapperId
|
|
}
|
|
|
|
// this.page represents the NEXT page to fetch
|
|
this.page = models.length > 0 ? (models.length < 20 ? 'loadedAll' : 2) : 1
|
|
},
|
|
url: function () {
|
|
if (!this.mapperId) {
|
|
return '/explore/' + this.id + '.json'
|
|
} else {
|
|
return '/explore/mapper/' + this.mapperId + '.json'
|
|
}
|
|
},
|
|
comparator: function (a, b) {
|
|
a = a.get(this.sortBy)
|
|
b = b.get(this.sortBy)
|
|
var temp
|
|
if (this.sortBy === 'name') {
|
|
a = a ? a.toLowerCase() : ''
|
|
b = b ? b.toLowerCase() : ''
|
|
} else {
|
|
// this is for updated_at and created_at
|
|
temp = a
|
|
a = b
|
|
b = temp
|
|
a = (new Date(a)).getTime()
|
|
b = (new Date(b)).getTime()
|
|
}
|
|
return a > b ? 1 : a < b ? -1 : 0
|
|
},
|
|
getMaps: function (cb) {
|
|
var self = this
|
|
|
|
Loading.show()
|
|
|
|
if (this.page !== 'loadedAll') {
|
|
var numBefore = this.length
|
|
this.fetch({
|
|
remove: false,
|
|
silent: true,
|
|
data: { page: this.page },
|
|
success: function (collection, response, options) {
|
|
// you can pass additional options to the event you trigger here as well
|
|
if (collection.length - numBefore < 20) {
|
|
self.page = 'loadedAll'
|
|
} else {
|
|
self.page += 1
|
|
}
|
|
self.trigger('successOnFetch', cb)
|
|
},
|
|
error: function (collection, response, options) {
|
|
// you can pass additional options to the event you trigger here as well
|
|
self.trigger('errorOnFetch')
|
|
}
|
|
})
|
|
} else {
|
|
self.trigger('successOnFetch', cb)
|
|
}
|
|
}
|
|
})
|
|
|
|
export default MapCollection
|