104 lines
3.3 KiB
JavaScript
104 lines
3.3 KiB
JavaScript
(function(define) {
|
|
define([
|
|
'backbone',
|
|
'js/discovery/models/course_card'
|
|
], function(Backbone, CourseCard) {
|
|
'use strict';
|
|
|
|
return Backbone.Collection.extend({
|
|
|
|
model: CourseCard,
|
|
pageSize: 20,
|
|
totalCount: 0,
|
|
latestModelsCount: 0,
|
|
searchTerm: '',
|
|
selectedFacets: {},
|
|
facets: {},
|
|
page: 0,
|
|
url: '/search/course_discovery/',
|
|
fetchXhr: null,
|
|
|
|
performSearch: function(searchTerm, facets) {
|
|
this.fetchXhr && this.fetchXhr.abort();
|
|
this.searchTerm = searchTerm || '';
|
|
this.selectedFacets = facets || {};
|
|
var data = this.preparePostData(0);
|
|
this.resetState();
|
|
this.fetchXhr = this.fetch({
|
|
data: data,
|
|
type: 'POST',
|
|
success: function(self, xhr) {
|
|
self.trigger('search');
|
|
},
|
|
error: function(self, xhr) {
|
|
self.trigger('error');
|
|
}
|
|
});
|
|
},
|
|
|
|
loadNextPage: function() {
|
|
this.fetchXhr && this.fetchXhr.abort();
|
|
var data = this.preparePostData(this.page + 1);
|
|
this.fetchXhr = this.fetch({
|
|
data: data,
|
|
type: 'POST',
|
|
success: function(self, xhr) {
|
|
self.page += 1;
|
|
self.trigger('next');
|
|
},
|
|
error: function(self, xhr) {
|
|
self.trigger('error');
|
|
},
|
|
add: true,
|
|
reset: false,
|
|
remove: false
|
|
});
|
|
},
|
|
|
|
preparePostData: function(pageNumber) {
|
|
var data = {
|
|
search_string: this.searchTerm,
|
|
page_size: this.pageSize,
|
|
page_index: pageNumber
|
|
};
|
|
if (this.selectedFacets.length > 0) {
|
|
this.selectedFacets.each(function(facet) {
|
|
data[facet.get('type')] = facet.get('query');
|
|
});
|
|
}
|
|
return data;
|
|
},
|
|
|
|
parse: function(response) {
|
|
var results = response.results || [];
|
|
this.latestModelsCount = results.length;
|
|
this.totalCount = response.total;
|
|
if (typeof response.facets !== 'undefined') {
|
|
this.facets = response.facets;
|
|
} else {
|
|
this.facets = [];
|
|
}
|
|
return _.map(results, function(result) {
|
|
return result.data;
|
|
});
|
|
},
|
|
|
|
resetState: function() {
|
|
this.reset();
|
|
this.page = 0;
|
|
this.totalCount = 0;
|
|
this.latestModelsCount = 0;
|
|
},
|
|
|
|
hasNextPage: function() {
|
|
return this.totalCount - ((this.page + 1) * this.pageSize) > 0;
|
|
},
|
|
|
|
latestModels: function() {
|
|
return this.last(this.latestModelsCount);
|
|
}
|
|
|
|
});
|
|
});
|
|
}(define || RequireJS.define));
|