var _ = require('underscore'); var Backbone = require('backbone'); module.exports = function() { this.prototype.setFilter = function(filter, options) { options = _.extend({ reset : true }, options || {}); this.state.filterKey = filter[0]; this.state.filterValue = filter[1]; if (options.reset) { if (this.mode !== 'server') { this.fullCollection.resetFiltered(); } else { return this.fetch(); } } }; this.prototype.setFilterMode = function(mode, options) { return this.setFilter(this.filterModes[mode], options); }; var originalMakeFullCollection = this.prototype._makeFullCollection; this.prototype._makeFullCollection = function(models, options) { var self = this; self.shadowCollection = originalMakeFullCollection.call(this, models, options); var filterModel = function(model) { if (!self.state.filterKey || !self.state.filterValue) { return true; } else { return model.get(self.state.filterKey) === self.state.filterValue; } }; self.shadowCollection.filtered = function() { return this.filter(filterModel); }; var filteredModels = self.shadowCollection.filtered(); var fullCollection = originalMakeFullCollection.call(this, filteredModels, options); fullCollection.resetFiltered = function(options) { Backbone.Collection.prototype.reset.call(this, self.shadowCollection.filtered(), options); }; fullCollection.reset = function(models, options) { self.shadowCollection.reset(models, options); self.fullCollection.resetFiltered(); }; return fullCollection; }; _.extend(this.prototype.state, { filterKey : null, filterValue : null }); _.extend(this.prototype.queryParams, { filterKey : 'filterKey', filterValue : 'filterValue' }); return this; };