/*jshint multistr:true */ this.recline = this.recline || {}; this.recline.View = this.recline.View || {}; (function($, my) { my.FilterEditor = Backbone.View.extend({ className: 'recline-filter-editor well', template: ' \
\

Filters

\ Add filter \ \
\ {{#filters}} \ {{{filterRender}}} \ {{/filters}} \ {{#filters.length}} \ \ {{/filters.length}} \
\
\ ', filterTemplates: { term: ' \
\
\ \ {{field}} {{type}} \ × \ \ \
\
\ ', range: ' \
\
\ \ {{field}} {{type}} \ × \ \ \ \ \ \
\
\ ', geo_distance: ' \
\
\ \ {{field}} {{type}} \ × \ \ \ \ \ \ \ \
\
\ ' }, events: { 'click .js-remove-filter': 'onRemoveFilter', 'click .js-add-filter': 'onAddFilterShow', 'submit form.js-edit': 'onTermFiltersUpdate', 'submit form.js-add': 'onAddFilter' }, initialize: function() { this.el = $(this.el); _.bindAll(this, 'render'); this.model.fields.bind('all', this.render); this.model.queryState.bind('change', this.render); this.model.queryState.bind('change:filters:new-blank', this.render); this.render(); }, render: function() { var self = this; var tmplData = $.extend(true, {}, this.model.queryState.toJSON()); // we will use idx in list as there id ... tmplData.filters = _.map(tmplData.filters, function(filter, idx) { filter.id = idx; return filter; }); tmplData.fields = this.model.fields.toJSON(); tmplData.filterRender = function() { return Mustache.render(self.filterTemplates[this.type], this); }; var out = Mustache.render(this.template, tmplData); this.el.html(out); }, onAddFilterShow: function(e) { e.preventDefault(); var $target = $(e.target); $target.hide(); this.el.find('form.js-add').show(); }, onAddFilter: function(e) { e.preventDefault(); var $target = $(e.target); $target.hide(); var filterType = $target.find('select.filterType').val(); var field = $target.find('select.fields').val(); var fieldType = this.model.fields.find(function (e) { return e.get('id') === field }).get('type'); this.model.queryState.addFilter({type: filterType, field: field, fieldType: fieldType}); // trigger render explicitly as queryState change will not be triggered (as blank value for filter) this.render(); }, onRemoveFilter: function(e) { e.preventDefault(); var $target = $(e.target); var filterId = $target.closest('.filter').attr('data-filter-id'); this.model.queryState.removeFilter(filterId); }, onTermFiltersUpdate: function(e) { var self = this; e.preventDefault(); var filters = self.model.queryState.get('filters'); var $form = $(e.target); _.each($form.find('input'), function(input) { var $input = $(input); var filterType = $input.attr('data-filter-type'); var fieldId = $input.attr('data-filter-field'); var filterIndex = parseInt($input.attr('data-filter-id')); var name = $input.attr('name'); var value = $input.val(); switch (filterType) { case 'term': filters[filterIndex].term = value; break; case 'range': filters[filterIndex][name] = value; break; case 'geo_distance': if(name === 'distance') { filters[filterIndex].distance = parseFloat(value); } else { filters[filterIndex].point[name] = parseFloat(value); } break; } }); self.model.queryState.set({filters: filters}); self.model.queryState.trigger('change'); } }); })(jQuery, recline.View);