(function($) {
AnsPress.models.Filter = Backbone.Model.extend({
defaults: {
active: false,
label: '',
value: ''
}
});
AnsPress.collections.Filters = Backbone.Collection.extend({
model: AnsPress.models.Filter
});
AnsPress.activeListFilters = $('#ap_current_filters').length > 0 ? JSON.parse($('#ap_current_filters').html()) : {};
AnsPress.views.Filter = Backbone.View.extend({
//tagName: 'li',
id: function(){
return this.model.id;
},
nameAttr: function(){
if(this.multiple) return ''+this.model.get('key')+'[]';
return this.model.get('key');
},
isActive: function(){
if(this.model.get('active'))
return this.model.get('active');
if(this.active)
return this.active;
var get_value = AnsPress.getUrlParam(this.model.get('key'));
if(!_.isEmpty(get_value)){
var value = this.model.get('value');
if(!_.isArray(get_value) && get_value === value)
return true;
if(_.contains(get_value, value)){
this.active = true;
return true;
}
}
this.active = false;
return false;
},
className: function(){
return this.isActive() ? 'active' : '';
},
inputType: function(){
return this.multiple ? 'checkbox' : 'radio';
},
initialize: function(options){
this.model = options.model;
this.multiple = options.multiple;
this.listenTo(this.model, 'remove', this.removed);
},
template: '',
events: {
'change input': 'clickFilter'
},
render: function(){
var t = _.template(this.template);
var json = this.model.toJSON();
json.name = this.nameAttr();
json.active = this.isActive();
json.inputType = this.inputType();
this.removeHiddenField();
this.$el.html(t(json));
return this;
},
removeHiddenField: function(){
$('input[name="'+this.nameAttr()+'"][value="'+this.model.get('value')+'"]').remove();
},
clickFilter: function(e){
e.preventDefault();
$(e.target).closest('form').submit();
},
removed: function(){
this.remove();
}
});
AnsPress.views.Filters = Backbone.View.extend({
className: 'ap-dropdown-menu',
searchTemplate: '
',
template: '',
initialize: function(options){
this.model = options.model;
this.multiple = options.multiple;
this.filter = options.filter;
this.nonce = options.nonce;
this.listenTo(this.model, 'add', this.added);
},
events: {
'keypress [search-filter]': 'searchInput'
},
renderItem: function(filter){
var view = new AnsPress.views.Filter({model: filter, multiple: this.multiple});
this.$el.find('filter-items').append(view.render().$el);
},
render: function(){
var self = this;
if(this.multiple)
this.$el.append(this.searchTemplate);
this.$el.append(this.template);
this.model.each(function(filter){
self.renderItem(filter);
});
return this;
},
search: function(q, e){
var self = this;
var args = { __nonce: this.nonce, ap_ajax_action: 'load_filter_'+this.filter, search: q, filter: this.filter };
AnsPress.showLoading(e);
AnsPress.ajax({
data: args,
success: function(data){
AnsPress.hideLoading(e);
if(data.success){
self.nonce = data.nonce;
while (model = self.model.first()) {
model.destroy();
}
self.model.add(data.items);
}
}
});
},
searchInput: function(e){
var self = this;
clearTimeout(this.searchTO);
this.searchTO = setTimeout(function(){
self.search($(e.target).val(), e.target);
}, 600);
},
added: function(model){
this.renderItem(model);
}
});
AnsPress.views.List = Backbone.View.extend({
el: '#ap-filters',
initialize: function(){
},
events: {
'click [ap-filter]:not(.loaded)': 'loadFilter',
'click #ap-filter-reset': 'resetFilter'
},
loadFilter: function(e){
e.preventDefault();
var self = this;
AnsPress.showLoading(e.currentTarget);
var q = $.parseJSON($(e.currentTarget).attr('apquery'));
q.ap_ajax_action = 'load_filter_'+q.filter;
AnsPress.ajax({
data: q,
success: function(data){
AnsPress.hideLoading(e.currentTarget);
$(e.currentTarget).addClass('loaded');
var filters = new AnsPress.collections.Filters(data.items);
var view = new AnsPress.views.Filters({model: filters, multiple: data.multiple, filter: q.filter, nonce: data.nonce});
$(e.currentTarget).after(view.render().$el);
}
});
},
resetFilter: function(e){
$('#ap-filters input[type="hidden"]').remove();
$('#ap-filters input[type="checkbox"]').prop('checked', false);
}
});
$(document).ready(function(){
new AnsPress.views.List();
});
})(jQuery);