diff --git a/css/multiview.css b/css/multiview.css index 1c9cb4e2..96afa99f 100644 --- a/css/multiview.css +++ b/css/multiview.css @@ -96,14 +96,21 @@ * Filter Editor *********************************************************/ -.recline-filter-editor .filter-term .input-append a { - margin-left: -5px; +.recline-filter-editor { + padding: 8px; } -.recline-facet-viewer .facet-summary label { - display: inline; +.recline-filter-editor .filter-term a { + font-size: 18px; } +.recline-filter-editor input, +.recline-filter-editor select +{ + width: 175px; +} + + /********************************************************** * Fields Widget *********************************************************/ diff --git a/src/model.js b/src/model.js index 11eca39f..2628903e 100644 --- a/src/model.js +++ b/src/model.js @@ -425,7 +425,7 @@ my.Query = Backbone.Model.extend({ addTermFilter: function(fieldId, value) { var filters = this.get('filters'); var filter = { term: {} }; - filter.term[fieldId] = value; + filter.term[fieldId] = value || ''; filters.push(filter); this.set({filters: filters}); // change does not seem to be triggered automatically diff --git a/src/view.multiview.js b/src/view.multiview.js index 96447891..1401dc36 100644 --- a/src/view.multiview.js +++ b/src/view.multiview.js @@ -224,10 +224,16 @@ my.MultiView = Backbone.View.extend({ this.el.find('.query-editor-here').append(queryEditor.el); var filterEditor = new recline.View.FilterEditor({ - model: this.model.queryState + model: this.model }); this.$filterEditor = filterEditor.el; - this.el.find('.header').append(filterEditor.el); + $dataSidebar.append(filterEditor.el); + // are there actually any filters to show? + if (this.model.get('filters') && this.model.get('filters').length > 0) { + this.$filterEditor.show(); + } else { + this.$filterEditor.hide(); + } var fieldsView = new recline.View.Fields({ model: this.model diff --git a/src/widget.filtereditor.js b/src/widget.filtereditor.js index 459a18f2..23fd6316 100644 --- a/src/widget.filtereditor.js +++ b/src/widget.filtereditor.js @@ -8,37 +8,45 @@ this.recline.View = this.recline.View || {}; my.FilterEditor = Backbone.View.extend({ className: 'recline-filter-editor well', template: ' \ -
\ -
\ -

Filters

\ -
\ -
\ -
\ -
\ -
\ - {{#termFilters}} \ -
\ - \ -
\ -
\ - \ - \ -
\ -
\ -
\ - {{/termFilters}} \ -
\ -
\ -

To add a filter use the column menu in the grid view.

\ - \ +
\ +

Filters

\ + Add filter \ + \ +
\ + \ + \ + \ + \ + \ +
\ + \ +
\ + {{#termFilters}} \ +
\ + \ +
\ + \ + × \
\ - \ -
\ +
\ + {{/termFilters}} \ + {{#termFilters.length}} \ + \ + {{/termFilters.length}} \ + \
\ ', events: { 'click .js-remove-filter': 'onRemoveFilter', - 'submit form': 'onTermFiltersUpdate' + 'click .js-add-filter': 'onAddFilterShow', + 'submit form.js-edit': 'onTermFiltersUpdate', + 'submit form.js-add': 'onAddFilter' }, initialize: function() { this.el = $(this.el); @@ -48,7 +56,7 @@ my.FilterEditor = Backbone.View.extend({ this.render(); }, render: function() { - var tmplData = $.extend(true, {}, this.model.toJSON()); + 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; @@ -66,14 +74,27 @@ my.FilterEditor = Backbone.View.extend({ value: filter.term[fieldId] }; }); + tmplData.fields = this.model.fields.toJSON(); var out = Mustache.render(this.template, tmplData); this.el.html(out); - // are there actually any facets to show? - if (this.model.get('filters').length > 0) { - this.el.show(); - } else { - this.el.hide(); + }, + 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(); + if (filterType === 'term') { + this.model.queryState.addTermFilter(field); } + // trigger render explicitly as queryState change will not be triggered (as blank value for filter) + this.render(); }, onRemoveFilter: function(e) { e.preventDefault(); diff --git a/test/index.html b/test/index.html index 62eb36ac..2e3aa91c 100644 --- a/test/index.html +++ b/test/index.html @@ -62,6 +62,7 @@ +

Qunit Tests

diff --git a/test/widget.filtereditor.test.js b/test/widget.filtereditor.test.js new file mode 100644 index 00000000..86bb1b84 --- /dev/null +++ b/test/widget.filtereditor.test.js @@ -0,0 +1,26 @@ +module("Widget - Filter Editor"); + +test('basics', function () { + var dataset = Fixture.getDataset(); + var view = new recline.View.FilterEditor({ + model: dataset + }); + $('.fixtures').append(view.el); + assertPresent('.js-add-filter', view.elSidebar); + var $addForm = view.el.find('form.js-add'); + ok(!$addForm.is(":visible")); + view.el.find('.js-add-filter').click(); + ok(!view.el.find('.js-add-filter').is(":visible")); + ok($addForm.is(":visible")); + + $addForm.find('select.fields').val('country'); + $addForm.submit(); + ok(!$addForm.is(":visible")); + $editForm = view.el.find('form.js-edit'); + equal($editForm.find('.filter-term').length, 1) + + equal(_.keys(dataset.queryState.attributes.filters[0].term)[0], 'country'); + + view.remove(); +}); +