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

{{t.Filters}}

\ {{t.Add_filter}} \ \
\ {{#filters}} \ {{{filterRender}}} \ {{/filters}} \ {{#filters.length}} \ \ {{/filters.length}} \
\
\ ', filterTemplates: { term: ' \
\
\ \ {{field}} {{type}} \ {{t.Remove_this_filter}} \ \ \
\
\ ', range: ' \
\
\ \ {{field}} {{type}} \ {{t.Remove_this_filter}} \ \
\ \ \
\
\ \ \
\
\
\ ', geo_distance: ' \
\
\ \ {{field}} {{type}} \ {{t.Remove_this_filter}} \ \
\ \ \
\
\ \ \
\
\ \ \
\
\
\ ' }, events: { 'click .js-remove-filter': 'onRemoveFilter', 'click .js-add-filter': 'onAddFilterShow', 'submit form.js-edit': 'onTermFiltersUpdate', 'submit form.js-add': 'onAddFilter' }, initialize: function() { _.bindAll(this, 'render'); this.listenTo(this.model.fields, 'all', this.render); this.listenTo(this.model.queryState, 'change 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() { var filterData = I18nMessages('recline', recline.View.translations).injectMustache(this); return Mustache.render(self.filterTemplates[this.type], filterData); }; tmplData = I18nMessages('recline', recline.View.translations).injectMustache(tmplData); 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(); this.model.queryState.addFilter({type: filterType, field: field}); }, onRemoveFilter: function(e) { e.preventDefault(); var $target = $(e.target); var filterId = $target.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'), 10); 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, from: 0}); self.model.queryState.trigger('change'); } }); })(jQuery, recline.View);