CartoDB/cartodb20

View on GitHub
lib/assets/javascripts/builder/components/pagination-search/pagination-search-model.js

Summary

Maintainability
A
50 mins
Test Coverage
var Backbone = require('backbone');

/**
 * Model representing the query string params for a "paged search" of a collection (matching the server-side APIs).
 *
 * @example usage
 *   pagedSearch = new PaginationSearchModel({ … })
 *   pagedSearch.fetch(collection) // => jqXHR, GET /collection/123?page=1&per_page20
 *   pagedSearch.set({ page: 2, per_page: 10, q: 'test' });
 *   pagedSearch.fetch(collection) // => GET /collection/123?page=2&per_page10&q=test
 */
module.exports = Backbone.Model.extend({

  defaults: {
    per_page: 20,
    page: 1,
    q: ''
  },

  initialize: function (attrs, opts) {
    if (!opts.collection) throw new Error('collection is required');
    if (!opts.collection.totalCount) throw new Error('collection requires to implement totalCount method');

    this.collection = opts.collection;
    this._initBinds();
  },

  _initBinds: function () {
    this.collection.on('sync', this._updateStateFetched, this);
    this.collection.on('error', this._updateStateError, this);
  },

  fetch: function () {
    this.trigger('fetching', this);
    return this.collection.fetch({
      data: this.attributes
    }, {reset: true});
  },

  _updateStateFetched: function () {
    this.trigger('fetched', this);
  },

  _updateStateError: function () {
    this.trigger('error', this);
  }
});