]> source.dussan.org Git - sonarqube.git/commitdiff
Rework the select filters
authorStas Vilchik <vilchiks@gmail.com>
Mon, 24 Feb 2014 14:10:52 +0000 (15:10 +0100)
committerStas Vilchik <vilchiks@gmail.com>
Mon, 24 Feb 2014 14:10:52 +0000 (15:10 +0100)
12 files changed:
sonar-server/src/main/webapp/WEB-INF/app/views/navigator/_filter_templates.html.erb
sonar-server/src/main/webapp/javascripts/issues-extra.js
sonar-server/src/main/webapp/javascripts/issues.js
sonar-server/src/main/webapp/javascripts/measures.js
sonar-server/src/main/webapp/javascripts/navigator/filters/action-plan-filters.js
sonar-server/src/main/webapp/javascripts/navigator/filters/ajax-select-filters.js
sonar-server/src/main/webapp/javascripts/navigator/filters/choice-filters.js [new file with mode: 0644]
sonar-server/src/main/webapp/javascripts/navigator/filters/favorite-filters.js
sonar-server/src/main/webapp/javascripts/navigator/filters/more-criteria-filters.js
sonar-server/src/main/webapp/javascripts/navigator/filters/resolution-filters.js [deleted file]
sonar-server/src/main/webapp/javascripts/navigator/filters/rule-filters.js
sonar-server/src/main/webapp/javascripts/navigator/filters/select-filters.js [deleted file]

index 3525cade23bc8ce054cde486a9c787ea8b8cee38..dc17943cd065245b973b9aaee8b1809c7f8210b7 100644 (file)
   <ul class="navigator-filter-select-list choices"></ul>
 </script>
 
+<script id="choiceFilterTemplate" type="text/x-handlebars-template">
+  <ul class="navigator-filter-select-list choices"></ul>
+  <ul class="navigator-filter-select-list opposite"></ul>
+</script>
+
+<script id="choiceFilterItemTemplate" type="text/x-handlebars-template">
+  <li>
+    <label title="{{text}}"> {{! TODO: escape }}
+      <input type="checkbox" value="{{id}}" {{#if checked}}checked{{/if}}>
+      {{#if icon}}<i class="icon-{{icon}}"></i>{{/if}}
+      <span>
+        {{text}}
+        {{#if category}}
+          <br>
+          <span class="subtitle">{{category}}</span>
+        {{/if}}
+      </span>
+    </label>
+  </li>
+</script>
+
 <script id="ajaxSelectFilterTemplate" type="text/template">
   <div class="navigator-filter-search">
     <input type="text">
   </div>
-  <ul class="navigator-filter-select-list selection"></ul>
   <ul class="navigator-filter-select-list choices"></ul>
+  <ul class="navigator-filter-select-list opposite"></ul>
 </script>
 
 <script id="rangeFilterTemplate" type="text/template">
index 972371fd552526563b3c251a0466714ee268fe47..62a59c7cf4fb76d24bd0c75778df96fd8bc0b88f 100644 (file)
@@ -1104,7 +1104,7 @@ define(
 
         applyFavorite: function (e) {
           var id = $j(e.target).data('id'),
-              filter = new window.SS.FavoriteFilter({ id: id }),
+              filter = new FavoriteFilter({ id: id }),
               app = this.options.filterView.options.app;
 
           filter.fetch({
index 4fec1b5ea9347e1b4dfd460247cc534531c94366..e1c20eb6192c73abc6e4b04101d4982e6efb99e8 100644 (file)
@@ -32,9 +32,8 @@ requirejs(
       'navigator/filters/filter-bar',
       'navigator/filters/base-filters',
       'navigator/filters/checkbox-filters',
-      'navigator/filters/select-filters',
+      'navigator/filters/choice-filters',
       'navigator/filters/ajax-select-filters',
-      'navigator/filters/resolution-filters',
       'navigator/filters/favorite-filters',
       'navigator/filters/range-filters',
       'navigator/filters/context-filters',
@@ -44,8 +43,8 @@ requirejs(
 
       'handlebars-extensions'
     ],
-    function (Backbone, Marionette, Handlebars, moment, Extra, FilterBar, BaseFilters, CheckboxFilterView, SelectFilters,
-              AjaxSelectFilters, ResolutionFilterView, FavoriteFilters, RangeFilters, ContextFilterView,
+    function (Backbone, Marionette, Handlebars, moment, Extra, FilterBar, BaseFilters, CheckboxFilterView,
+              ChoiceFilters, AjaxSelectFilters, FavoriteFilters, RangeFilters, ContextFilterView,
               ReadOnlyFilterView, ActionPlanFilterView, RuleFilterView) {
       Handlebars.registerPartial('detailInnerTemplate', jQuery('#issue-detail-inner-template').html());
 
@@ -116,7 +115,7 @@ requirejs(
           new BaseFilters.Filter({
             name: window.SS.phrases.severity,
             property: 'severities',
-            type: SelectFilters.SelectFilterView,
+            type: ChoiceFilters.ChoiceFilterView,
             enabled: true,
             optional: false,
             choices: {
@@ -138,7 +137,7 @@ requirejs(
           new BaseFilters.Filter({
             name: window.SS.phrases.status,
             property: 'statuses',
-            type: SelectFilters.SelectFilterView,
+            type: ChoiceFilters.ChoiceFilterView,
             enabled: true,
             optional: false,
             choices: {
@@ -162,17 +161,20 @@ requirejs(
             property: 'assignees',
             type: AjaxSelectFilters.AssigneeFilterView,
             enabled: true,
-            optional: false
+            optional: false,
+            choices: {
+              '!assigned': window.SS.phrases.unassigned
+            }
           }),
 
           new BaseFilters.Filter({
             name: window.SS.phrases.resolution,
             property: 'resolutions',
-            type: ResolutionFilterView,
+            type: ChoiceFilters.ChoiceFilterView,
             enabled: true,
             optional: false,
             choices: {
-              'UNRESOLVED': window.SS.phrases.resolutions.UNRESOLVED,
+              '!resolved': window.SS.phrases.resolutions.UNRESOLVED,
               'FALSE-POSITIVE': window.SS.phrases.resolutions['FALSE-POSITIVE'],
               'FIXED': window.SS.phrases.resolutions.FIXED,
               'REMOVED': window.SS.phrases.resolutions.REMOVED
@@ -185,7 +187,10 @@ requirejs(
             type: ActionPlanFilterView,
             enabled: false,
             optional: true,
-            projectFilter: projectFilter
+            projectFilter: projectFilter,
+            choices: {
+              '!planned': window.SS.phrases.unplanned
+            }
           }),
 
           new BaseFilters.Filter({
index 4f6e7278d00c6d69fdf5ceb8b7df0f8d6896586e..2314f18010319a0ed077c9df638b4c57f0284ab1 100644 (file)
@@ -13,6 +13,9 @@ requirejs.config({
     },
     'backbone': {
       exports: 'Backbone'
+    },
+    'handlebars': {
+      exports: 'Handlebars'
     }
   }
 
@@ -24,14 +27,14 @@ requirejs(
       'navigator/filters/filter-bar',
       'navigator/filters/base-filters',
       'navigator/filters/checkbox-filters',
-      'navigator/filters/select-filters',
+      'navigator/filters/choice-filters',
       'navigator/filters/ajax-select-filters',
       'navigator/filters/favorite-filters',
       'navigator/filters/range-filters',
       'navigator/filters/string-filters',
       'navigator/filters/metric-filters'
     ],
-    function (Backbone, Marionette, FilterBar, BaseFilters, CheckboxFilterView, SelectFilters, AjaxSelectFilters,
+    function (Backbone, Marionette, FilterBar, BaseFilters, CheckboxFilterView, ChoiceFilters, AjaxSelectFilters,
               FavoriteFilters, RangeFilters, StringFilterView, MetricFilterView) {
 
       _.templateSettings = {
@@ -67,7 +70,7 @@ requirejs(
           new BaseFilters.Filter({
             name: window.SS.phrases.components,
             property: 'qualifiers[]',
-            type: SelectFilters.SelectFilterView,
+            type: ChoiceFilters.ChoiceFilterView,
             enabled: true,
             optional: false,
             choices: window.SS.qualifiers,
@@ -77,7 +80,7 @@ requirejs(
           new BaseFilters.Filter({
             name: window.SS.phrases.alert,
             property: 'alertLevels[]',
-            type: SelectFilters.SelectFilterView,
+            type: ChoiceFilters.ChoiceFilterView,
             enabled: false,
             optional: true,
             choices: {
@@ -127,7 +130,7 @@ requirejs(
             new BaseFilters.Filter({
               name: window.SS.phrases.language,
               property: 'languages[]',
-              type: SelectFilters.SelectFilterView,
+              type: ChoiceFilters.ChoiceFilterView,
               enabled: false,
               optional: true,
               choices: window.SS.languages
index df0f8c4e385055693dec283fd77f3538e56ef4f8..7503e344d2a682da391942f1bea0b610232503e6 100644 (file)
@@ -1,54 +1,9 @@
-define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-filters'], function (Backbone, BaseFilters, SelectFilters) {
+define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/choice-filters'], function (Backbone, BaseFilters, ChoiceFilters) {
 
-  var UNPLANNED = '<unplanned>';
-
-
-  var ActionPlanDetailsFilterView = SelectFilters.DetailsSelectFilterView.extend({
-
-    addToSelection: function(e) {
-      var id = $j(e.target).val(),
-          model = this.options.filterView.choices.findWhere({ id: id });
-
-      if (this.model.get('multiple') && id !== UNPLANNED) {
-        this.options.filterView.selection.add(model);
-        this.options.filterView.choices.remove(model);
-
-        var unplanned = this.options.filterView.selection.findWhere({ id: UNPLANNED });
-        if (unplanned) {
-          this.options.filterView.choices.add(unplanned);
-          this.options.filterView.selection.remove(unplanned);
-        }
-      } else {
-        this.options.filterView.choices.add(this.options.filterView.selection.models);
-        this.options.filterView.choices.remove(model);
-        this.options.filterView.selection.reset([model]);
-      }
-
-      this.updateValue();
-      this.updateLists();
-    },
-
-
-    resetChoices: function() {
-      if (this.options.filterView.selection.findWhere({ id: UNPLANNED })) {
-        this.options.filterView.choices.reset([]);
-      } else {
-        this.options.filterView.choices.reset([{
-          id: UNPLANNED,
-          text: window.SS.phrases.unplanned,
-          special: true
-        }]);
-      }
-    }
-  });
-
-
-  return SelectFilters.SelectFilterView.extend({
+  return ChoiceFilters.ChoiceFilterView.extend({
 
     initialize: function() {
-      SelectFilters.SelectFilterView.prototype.initialize.call(this, {
-        detailsView: ActionPlanDetailsFilterView
-      });
+      ChoiceFilters.ChoiceFilterView.prototype.initialize.apply(this, arguments);
       this.projectFilter = this.model.get('projectFilter');
       this.listenTo(this.projectFilter, 'change:value', this.onChangeProjectFilter);
       this.onChangeProjectFilter();
@@ -67,7 +22,7 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
 
     showDetails: function() {
       if (!this.$el.is('.navigator-filter-inactive')) {
-        SelectFilters.SelectFilterView.prototype.showDetails.apply(this, arguments);
+        ChoiceFilters.ChoiceFilterView.prototype.showDetails.apply(this, arguments);
       }
     },
 
@@ -88,7 +43,6 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
         title: window.SS.phrases.actionPlanNotAvailable
       });
       this.model.trigger('change:enabled');
-      this.selection.reset([]);
       this.choices.reset([]);
       this.detailsView.updateLists();
       this.detailsView.updateValue();
@@ -109,7 +63,6 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
                       return plan.status === 'CLOSED';
                     }), 'name');
 
-            that.selection.reset([]);
             that.choices.reset(nonClosedActionPlans.map(function(plan) {
               return {
                 id: plan.key,
@@ -117,20 +70,14 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
                 category: plan.fDeadLine
               }
             }));
-            that.choices.add(new Backbone.Model({
-              id: UNPLANNED,
-              text: window.SS.phrases.unplanned,
-              special: true
-            }));
-
+            _.each(that.model.get('choices'), function(v, k) {
+              that.choices.add(new Backbone.Model({ id: k, text: v }));
+            });
             var value = that.model.get('value');
-            if (that.choices && that.selection && value && value.length > 0) {
-              value.forEach(function(id) {
-                var model = that.choices.findWhere({ id: id });
-                that.selection.add(model);
-                that.choices.remove(model);
-              });
-            }
+            _.each(value, function(v) {
+              var cModel = that.choices.findWhere({ id: v });
+              cModel.set('checked', true);
+            });
             that.detailsView.updateValue();
             that.render();
 
@@ -139,53 +86,17 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
     },
 
 
-    restoreFromQuery: function(q) {
-      var param = _.findWhere(q, { key: this.model.get('property') }),
-          planned = _.findWhere(q, { key: 'planned' });
-
-      if (!!planned) {
-        if (!param) {
-          param = { value: UNPLANNED };
-        } else {
-          param.value += ',' + UNPLANNED;
-        }
-      }
-
-      if (param && param.value) {
-        this.model.set('enabled', true);
-        this.restore(param.value);
-      } else {
-        this.clear();
-      }
-    },
-
-
     restore: function(value) {
       if (_.isString(value)) {
         value = value.split(',');
       }
 
-      if (this.choices && this.selection && value.length > 0) {
+      if (this.choices && value.length > 0) {
         this.model.set({ value: value, enabled: true });
         this.onChangeProjectFilter();
       } else {
         this.clear();
       }
-    },
-
-
-    formatValue: function() {
-      var q = {};
-      if (this.model.has('property') && this.model.has('value') && this.model.get('value').length > 0) {
-        var assignees = _.without(this.model.get('value'), UNPLANNED);
-        if (assignees.length > 0) {
-          q[this.model.get('property')] = assignees.join(',');
-        }
-        if (this.model.get('value').length > assignees.length) {
-          q.planned = false;
-        }
-      }
-      return q;
     }
 
   });
index 699deb47ffe7f251510eca29b76c0b01cd41ddd5..013a8849ed3eb5a3b34f7cc6fa1a6c674735a859 100644 (file)
@@ -1,11 +1,12 @@
-define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-filters'], function (Backbone, BaseFilters, SelectFilters) {
+define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/choice-filters'], function (Backbone, BaseFilters, ChoiceFilters) {
 
   var PAGE_SIZE = 100,
-      UNASSIGNED = '<unassigned>';
+      UNASSIGNED = '';
 
 
 
   var Suggestions = Backbone.Collection.extend({
+    comparator: 'checked',
 
     initialize: function() {
       this.more = false;
@@ -90,12 +91,13 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
 
 
 
-  var AjaxSelectDetailsFilterView = SelectFilters.DetailsSelectFilterView.extend({
+  var AjaxSelectDetailsFilterView = ChoiceFilters.DetailsChoiceFilterView.extend({
     template: '#ajaxSelectFilterTemplate',
+    listTemplate: '#choiceFilterTemplate',
 
 
-    onRender: function() {
-      this.resetChoices();
+    render: function() {
+      ChoiceFilters.DetailsChoiceFilterView.prototype.render.apply(this, arguments);
 
       var that = this,
           keyup = function(e) {
@@ -123,16 +125,19 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
       this.query = this.$('.navigator-filter-search input').val();
       if (this.query.length > 1) {
         this.$el.addClass('fetching');
+        var selected = that.options.filterView.getSelected();
         this.options.filterView.choices.fetch({
           data: {
             s: this.query,
             ps: PAGE_SIZE
           },
           success: function() {
-            var choices = that.options.filterView.choices.reject(function(item) {
-              return that.options.filterView.selection.findWhere({ id: item.get('id') });
+            selected.each(function(item) {
+              that.options.filterView.choices.unshift(item);
+            });
+            _.each(that.model.get('choices'), function(v, k) {
+              that.options.filterView.choices.add(new Backbone.Model({ id: k, text: v }));
             });
-            that.options.filterView.choices.reset(choices);
             that.updateLists();
             that.$el.removeClass('fetching');
           }
@@ -163,12 +168,20 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
 
 
     resetChoices: function() {
-      this.options.filterView.choices.reset([]);
+      var that = this;
+      this.options.filterView.choices.reset(this.options.filterView.choices.filter(function(item) {
+        return item.get('checked');
+      }));
+      _.each(this.model.get('choices'), function(v, k) {
+        that.options.filterView.choices.add(new Backbone.Model({ id: k, text: v }));
+      });
     },
 
 
     onShow: function() {
-      SelectFilters.DetailsSelectFilterView.prototype.onShow.apply(this, arguments);
+      ChoiceFilters.DetailsChoiceFilterView.prototype.onShow.apply(this, arguments);
+      this.resetChoices();
+      this.render();
       this.$('.navigator-filter-search input').focus();
     }
 
@@ -176,10 +189,10 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
 
 
 
-  var AjaxSelectFilterView = SelectFilters.SelectFilterView.extend({
+  var AjaxSelectFilterView = ChoiceFilters.ChoiceFilterView.extend({
 
     isDefaultValue: function() {
-      return this.selection.length === 0;
+      return this.getSelected().length === 0;
     },
 
 
@@ -199,13 +212,8 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
         value = value.split(',');
       }
 
-      if (this.choices && this.selection && value.length > 0) {
-        this.selection.reset([]);
-        this.model.set({
-          value: value,
-          enabled: true
-        });
-
+      if (this.choices && value.length > 0) {
+        this.model.set({ value: value, enabled: true });
         if (_.isArray(param.text) && param.text.length === value.length) {
           this.restoreFromText(value, param.text);
         } else {
@@ -220,9 +228,10 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
     restoreFromText: function(value, text) {
       var that = this;
       _.each(value, function(v, i) {
-        that.selection.add(new Backbone.Model({
+        that.choices.add(new Backbone.Model({
           id: v,
-          text: text[i]
+          text: text[i],
+          checked: true
         }));
       });
       this.onRestore(value);
@@ -249,12 +258,10 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
 
     clear: function() {
       this.model.unset('value');
-      if (this.selection && this.choices) {
+      if (this.choices) {
         this.choices.reset([]);
-        this.selection.reset([]);
-        this.detailsView.updateLists();
       }
-      this.renderBase();
+      this.render();
     },
 
 
@@ -267,11 +274,9 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
   var ComponentFilterView = AjaxSelectFilterView.extend({
 
     initialize: function() {
-      BaseFilters.BaseFilterView.prototype.initialize.call(this, {
+      AjaxSelectFilterView.prototype.initialize.call(this, {
         detailsView: AjaxSelectDetailsFilterView
       });
-
-      this.selection = new ComponentSuggestions();
       this.choices = new ComponentSuggestions();
     },
 
@@ -303,7 +308,6 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
         detailsView: AjaxSelectDetailsFilterView
       });
 
-      this.selection = new ProjectSuggestions();
       this.choices = new ProjectSuggestions();
     },
 
@@ -317,9 +321,10 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
             data: { resource: v }
           })
           .done(function (r) {
-            that.selection.add(new Backbone.Model({
+            that.choices.add(new Backbone.Model({
               id: r[0].key,
-              text: r[0].name
+              text: r[0].name,
+              checked: true
             }));
           });
     }
@@ -328,111 +333,16 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
 
 
 
-  var AssigneeDetailsFilterView = AjaxSelectDetailsFilterView.extend({
-
-    addToSelection: function(e) {
-      var id = $j(e.target).val(),
-          model = this.options.filterView.choices.findWhere({ id: id });
-
-      if (this.model.get('multiple') && id !== UNASSIGNED) {
-        this.options.filterView.selection.add(model);
-        this.options.filterView.choices.remove(model);
-
-        var unassigned = this.options.filterView.selection.findWhere({ id: UNASSIGNED });
-        if (unassigned) {
-          this.options.filterView.choices.add(unassigned);
-          this.options.filterView.selection.remove(unassigned);
-        }
-      } else {
-        this.options.filterView.choices.add(this.options.filterView.selection.models);
-        this.options.filterView.choices.remove(model);
-        this.options.filterView.selection.reset([model]);
-      }
-
-      this.updateValue();
-      this.updateLists();
-    },
-
-
-    resetChoices: function() {
-      if (this.options.filterView.selection.findWhere({ id: UNASSIGNED })) {
-        this.options.filterView.choices.reset([]);
-      } else {
-        this.options.filterView.choices.reset([{
-          id: UNASSIGNED,
-          text: window.SS.phrases.unassigned,
-          special: true
-        }]);
-      }
-    },
-
-
-    onShow: function() {
-      AjaxSelectDetailsFilterView.prototype.onShow.apply(this, arguments);
-      this.$('.navigator-filter-search input').focus();
-    }
-
-  });
-
-
-
   var AssigneeFilterView = AjaxSelectFilterView.extend({
 
     initialize: function() {
       BaseFilters.BaseFilterView.prototype.initialize.call(this, {
-        detailsView: AssigneeDetailsFilterView
+        detailsView: AjaxSelectDetailsFilterView
       });
 
-      this.selection = new UserSuggestions();
       this.choices = new UserSuggestions();
     },
 
-
-    restoreFromQuery: function(q) {
-      var param = _.findWhere(q, { key: this.model.get('property') }),
-          assigned = _.findWhere(q, { key: 'assigned' });
-
-      if (!!assigned) {
-        if (!param) {
-          param = { value: UNASSIGNED };
-        } else {
-          param.value += ',' + UNASSIGNED;
-        }
-      }
-
-      if (param && param.value) {
-        this.model.set('enabled', true);
-        this.restore(param.value, param);
-      } else {
-        this.clear();
-      }
-    },
-
-
-    restoreFromText: function(value) {
-      if (_.indexOf(value, UNASSIGNED) !== -1) {
-        this.choices.reset([]);
-      }
-
-      AjaxSelectFilterView.prototype.restoreFromText.apply(this, arguments);
-    },
-
-
-    restoreByRequests: function(value) {
-      if (_.indexOf(value, UNASSIGNED) !== -1) {
-        this.selection.add(new Backbone.Model({
-          id: UNASSIGNED,
-          text: window.SS.phrases.unassigned,
-          special: true
-        }));
-        this.choices.reset([]);
-        value = _.reject(value, function(k) { return k === UNASSIGNED; });
-      }
-
-      AjaxSelectFilterView.prototype.restoreByRequests.call(this, value);
-    },
-
-
     createRequest: function(v) {
       var that = this;
       return $j
@@ -442,37 +352,12 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
             data: { logins: v }
           })
           .done(function (r) {
-            that.selection.add(new Backbone.Model({
+            that.choices.add(new Backbone.Model({
               id: r.users[0].login,
-              text: r.users[0].name + ' (' + r.users[0].login + ')'
+              text: r.users[0].name + ' (' + r.users[0].login + ')',
+              checked: true
             }));
           });
-    },
-
-
-    clear: function() {
-      this.model.unset('value');
-      if (this.selection && this.choices) {
-        this.detailsView.resetChoices();
-        this.selection.reset([]);
-      }
-      this.renderBase();
-      this.detailsView.updateLists();
-    },
-
-
-    formatValue: function() {
-      var q = {};
-      if (this.model.has('property') && this.model.has('value') && this.model.get('value').length > 0) {
-        var assignees = _.without(this.model.get('value'), UNASSIGNED);
-        if (assignees.length > 0) {
-          q[this.model.get('property')] = assignees.join(',');
-        }
-        if (this.model.get('value').length > assignees.length) {
-          q.assigned = false;
-        }
-      }
-      return q;
     }
 
   });
@@ -500,9 +385,10 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
             data: { logins: v }
           })
           .done(function (r) {
-            that.selection.add(new Backbone.Model({
+            that.choices.add(new Backbone.Model({
               id: r.users[0].login,
-              text: r.users[0].name + ' (' + r.users[0].login + ')'
+              text: r.users[0].name + ' (' + r.users[0].login + ')',
+              checked: true
             }));
           });
     }
diff --git a/sonar-server/src/main/webapp/javascripts/navigator/filters/choice-filters.js b/sonar-server/src/main/webapp/javascripts/navigator/filters/choice-filters.js
new file mode 100644 (file)
index 0000000..8a679fc
--- /dev/null
@@ -0,0 +1,363 @@
+define(['handlebars', 'navigator/filters/base-filters'], function (Handlebars, BaseFilters) {
+
+  var DetailsChoiceFilterView = BaseFilters.DetailsFilterView.extend({
+    template: Handlebars.compile(jQuery('#choiceFilterTemplate').html()),
+    itemTemplate: Handlebars.compile(jQuery('#choiceFilterItemTemplate').html()),
+
+
+    events: function() {
+      return {
+        'change input[type=checkbox]': 'onCheck'
+      };
+    },
+
+
+    render: function() {
+      BaseFilters.DetailsFilterView.prototype.render.apply(this, arguments);
+      this.updateLists();
+    },
+
+
+    renderList: function(collection, selector) {
+      var that = this,
+          container = this.$(selector);
+
+      container.empty().toggleClass('hidden', collection.length === 0);
+      collection.each(function(item) {
+        container.append(that.itemTemplate(item.toJSON()));
+      });
+    },
+
+
+    updateLists: function() {
+      var choices = new Backbone.Collection(this.options.filterView.choices.reject(function(item) {
+            return item.get('id')[0] === '!';
+          })),
+          opposite = new Backbone.Collection(this.options.filterView.choices.filter(function(item) {
+            return item.get('id')[0] === '!';
+          }));
+
+      this.renderList(choices, '.choices');
+      this.renderList(opposite, '.opposite');
+
+      var current = this.currentChoice || 0;
+      this.updateCurrent(current);
+    },
+
+
+    onCheck: function(e) {
+      var checkbox = jQuery(e.target),
+          id = checkbox.val(),
+          checked = checkbox.prop('checked');
+
+      if (this.model.get('multiple')) {
+        if (checkbox.closest('.opposite').length > 0) {
+          this.options.filterView.choices.reject(function(item) {
+            return item.get('id')[0] === '!'
+          }).forEach(function(item) {
+                item.set('checked', false);
+              });
+        } else {
+          this.options.filterView.choices.filter(function(item) {
+            return item.get('id')[0] === '!'
+          }).forEach(function(item) {
+                item.set('checked', false);
+              });
+        }
+      } else {
+        this.options.filterView.choices.each(function(item) {
+          item.set('checked', false);
+        });
+      }
+
+      this.options.filterView.choices.get(id).set('checked', checked);
+      this.updateValue();
+      this.updateLists();
+    },
+
+
+    updateValue: function() {
+      this.model.set('value', this.options.filterView.getSelected().map(function(m) {
+        return m.get('id');
+      }));
+    },
+
+
+    updateCurrent: function(index) {
+      this.currentChoice = index;
+      this.$('label').removeClass('current')
+          .eq(this.currentChoice).addClass('current');
+    },
+
+
+    onShow: function() {
+      this.bindedOnKeyDown = _.bind(this.onKeyDown, this);
+      $j('body').on('keydown', this.bindedOnKeyDown);
+    },
+
+
+    onHide: function() {
+      $j('body').off('keydown', this.bindedOnKeyDown);
+    },
+
+
+    onKeyDown: function(e) {
+      switch (e.keyCode) {
+        case 38:
+          e.preventDefault();
+          this.selectPrevChoice();
+          break;
+        case 40:
+          e.preventDefault();
+          this.selectNextChoice();
+          break;
+        case 13:
+          e.preventDefault();
+          this.selectCurrent();
+          break;
+      }
+    },
+
+
+    selectNextChoice: function() {
+      if (this.$('label').length > this.currentChoice + 1) {
+        this.updateCurrent(this.currentChoice + 1);
+        this.scrollNext();
+      }
+    },
+
+
+    scrollNext: function() {
+      var currentLabel = this.$('label').eq(this.currentChoice);
+      if (currentLabel.length > 0) {
+        var list = currentLabel.closest('ul'),
+            labelPos = currentLabel.offset().top - list.offset().top + list.scrollTop(),
+            deltaScroll = labelPos - list.height() + currentLabel.outerHeight();
+
+        if (deltaScroll > 0) {
+          list.scrollTop(deltaScroll);
+        }
+      }
+    },
+
+
+    selectPrevChoice: function() {
+      if (this.currentChoice > 0) {
+        this.updateCurrent(this.currentChoice - 1);
+        this.scrollPrev();
+      }
+    },
+
+
+    scrollPrev: function() {
+      var currentLabel = this.$('label').eq(this.currentChoice);
+      if (currentLabel.length > 0) {
+        var list = currentLabel.closest('ul'),
+            labelPos = currentLabel.offset().top - list.offset().top;
+
+        if (labelPos < 0) {
+          list.scrollTop(list.scrollTop() + labelPos);
+        }
+      }
+    },
+
+
+    selectCurrent: function() {
+      this.$('label').eq(this.currentChoice).click();
+    },
+
+
+    serializeData: function() {
+      return _.extend({}, this.model.toJSON(), {
+        choices: new Backbone.Collection(this.options.filterView.choices.reject(function(item) {
+          return item.get('id')[0] === '!';
+        })).toJSON(),
+        opposite: new Backbone.Collection(this.options.filterView.choices.filter(function(item) {
+          return item.get('id')[0] === '!';
+        })).toJSON()
+      });
+    }
+
+  });
+
+
+
+  var ChoiceFilterView = BaseFilters.BaseFilterView.extend({
+
+    initialize: function(options) {
+      BaseFilters.BaseFilterView.prototype.initialize.call(this, {
+        detailsView: (options && options.detailsView) ? options.detailsView : DetailsChoiceFilterView
+      });
+
+      var index = 0,
+          icons = this.model.get('choiceIcons');
+
+      this.choices = new Backbone.Collection(
+          _.map(this.model.get('choices'), function(value, key) {
+            var model = new Backbone.Model({
+              id: key,
+              text: value,
+              checked: false,
+              index: index++
+            });
+
+            if (icons && icons[key]) {
+              model.set('icon', icons[key]);
+            }
+
+            return model;
+          }), { comparator: 'index' }
+      );
+    },
+
+
+    getSelected: function() {
+      return this.choices.filter(function(m) {
+        return m.get('checked');
+      });
+    },
+
+
+    renderInput: function() {
+      var input = $j('<select>')
+          .prop('name', this.model.get('property'))
+          .prop('multiple', true)
+          .css('display', 'none');
+      this.choices.each(function(item) {
+        var option = $j('<option>')
+            .prop('value', item.get('id'))
+            .prop('selected', item.get('checked'))
+            .text(item.get('text'));
+        option.appendTo(input);
+      });
+      input.appendTo(this.$el);
+    },
+
+
+    renderValue: function() {
+      var value = this.getSelected().map(function(item) {
+            return item.get('text');
+          }),
+          defaultValue = this.model.has('defaultValue') ?
+              this.model.get('defaultValue') :
+              this.model.get('multiple') ? window.SS.phrases.all : window.SS.phrases.any;
+
+      return this.isDefaultValue() ? defaultValue : value.join(', ');
+    },
+
+
+    isDefaultValue: function() {
+      var selected = this.getSelected();
+      return selected.length === 0;
+    },
+
+
+    disable: function() {
+      this.choices.each(function(item) {
+        item.set('checked', false);
+      });
+      BaseFilters.BaseFilterView.prototype.disable.apply(this, arguments);
+    },
+
+
+    restoreFromQuery: function(q) {
+      var param = _.findWhere(q, { key: this.model.get('property') });
+
+      if (this.choices) {
+        this.choices.forEach(function(item) {
+          if (item.get('id')[0] === '!') {
+            var x = _.findWhere(q, { key: item.get('id').substr(1) });
+            if (x) {
+              if (!param) {
+                param = { value: item.get('id') };
+              } else {
+                param.value += ',' + item.get('id');
+              }
+            }
+          }
+        });
+      }
+
+      if (param && param.value) {
+        this.model.set('enabled', true);
+        this.restore(param.value, param);
+      } else {
+        this.clear();
+      }
+    },
+
+
+    restore: function(value) {
+      if (_.isString(value)) {
+        value = value.split(',');
+      }
+
+      if (this.choices && value.length > 0) {
+        var that = this;
+
+        that.choices.each(function(item) {
+          item.set('checked', false);
+        });
+
+        _.each(value, function(v) {
+          var cModel = that.choices.findWhere({ id: v });
+          cModel.set('checked', true);
+        });
+
+        this.model.set({
+          value: value,
+          enabled: true
+        });
+
+        this.render();
+      } else {
+        this.clear();
+      }
+    },
+
+
+    clear: function() {
+      if (this.choices) {
+        this.choices.each(function(item) {
+          item.set('checked', false);
+        });
+      }
+      this.model.unset('value');
+      this.detailsView.render();
+      if (this.detailsView.updateCurrent) {
+        this.detailsView.updateCurrent(0);
+      }
+    },
+
+
+    formatValue: function() {
+      var q = {};
+      if (this.model.has('property') && this.model.has('value') && this.model.get('value').length > 0) {
+        var opposite = _.filter(this.model.get('value'), function(item) {
+          return item[0] === '!';
+        });
+        if (opposite.length > 0) {
+          opposite.forEach(function(item) {
+            q[item.substr(1)] = false;
+          });
+        } else {
+          q[this.model.get('property')] = this.model.get('value').join(',');
+        }
+      }
+      return q;
+    }
+
+  });
+
+
+
+  /*
+   * Export public classes
+   */
+
+  return {
+    DetailsChoiceFilterView: DetailsChoiceFilterView,
+    ChoiceFilterView: ChoiceFilterView
+  };
+
+});
index 26ecad588ac0b96c0b2809d64250b58f57b903a0..86d1da171f703d3683a43df35d6a050de6d91e67 100644 (file)
@@ -1,4 +1,4 @@
-define(['backbone', 'backbone.marionette', 'navigator/filters/base-filters', 'navigator/filters/select-filters'], function (Backbone, Marionette, BaseFilters, SelectFilters) {
+define(['backbone', 'backbone.marionette', 'navigator/filters/base-filters', 'navigator/filters/choice-filters'], function (Backbone, Marionette, BaseFilters, ChoiceFilters) {
 
   var DetailsFavoriteFilterView = BaseFilters.DetailsFilterView.extend({
     template: '#detailsFavoriteFilterTemplate',
@@ -39,13 +39,13 @@ define(['backbone', 'backbone.marionette', 'navigator/filters/base-filters', 'na
 
 
 
-  var FavoriteFilterView = SelectFilters.SelectFilterView.extend({
+  var FavoriteFilterView = ChoiceFilters.ChoiceFilterView.extend({
     template: '#favoriteFilterTemplate',
     className: 'navigator-filter navigator-filter-favorite',
 
 
     initialize: function() {
-      BaseFilters.BaseFilterView.prototype.initialize.call(this, {
+      ChoiceFilters.ChoiceFilterView.prototype.initialize.call(this, {
         detailsView: DetailsFavoriteFilterView
       });
     },
index 39e948040ecc8ef8a62bf8ed8475e86d9ff455a4..740c04e2c02574ce7c75b2f6d3b0edc4f2baa8cd 100644 (file)
@@ -1,4 +1,4 @@
-define(['navigator/filters/base-filters', 'navigator/filters/select-filters'], function (BaseFilters, SelectFilters) {
+define(['navigator/filters/base-filters', 'navigator/filters/choice-filters'], function (BaseFilters, ChoiceFilters) {
 
   var DetailsMoreCriteriaFilterView = BaseFilters.DetailsFilterView.extend({
     template: '#detailsMoreCriteriaFilterTemplate',
@@ -19,13 +19,13 @@ define(['navigator/filters/base-filters', 'navigator/filters/select-filters'], f
 
 
 
-  var MoreCriteriaFilterView = SelectFilters.SelectFilterView.extend({
+  var MoreCriteriaFilterView = ChoiceFilters.ChoiceFilterView.extend({
     template: '#moreCriteriaFilterTemplate',
     className: 'navigator-filter navigator-filter-more-criteria',
 
 
     initialize: function() {
-      BaseFilters.BaseFilterView.prototype.initialize.call(this, {
+      ChoiceFilters.ChoiceFilterView.prototype.initialize.call(this, {
         detailsView: DetailsMoreCriteriaFilterView
       });
     },
diff --git a/sonar-server/src/main/webapp/javascripts/navigator/filters/resolution-filters.js b/sonar-server/src/main/webapp/javascripts/navigator/filters/resolution-filters.js
deleted file mode 100644 (file)
index f14d0ce..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-define(['navigator/filters/base-filters', 'navigator/filters/select-filters'], function (BaseFilters, SelectFilters) {
-
-  var UNRESOLVED = 'UNRESOLVED';
-
-  var ResolutionDetailFilterView = SelectFilters.DetailsSelectFilterView.extend({
-
-    addToSelection: function(e) {
-      var id = $j(e.target).val(),
-          model = this.options.filterView.choices.findWhere({ id: id });
-
-      if (this.model.get('multiple') && id !== UNRESOLVED) {
-        this.options.filterView.selection.add(model);
-        this.options.filterView.choices.remove(model);
-
-        var unresolved = this.options.filterView.selection.findWhere({ id: UNRESOLVED });
-        if (unresolved) {
-          this.options.filterView.choices.add(unresolved);
-          this.options.filterView.selection.remove(unresolved);
-        }
-      } else {
-        this.options.filterView.choices.add(this.options.filterView.selection.models);
-        this.options.filterView.choices.remove(model);
-        this.options.filterView.selection.reset([model]);
-      }
-
-      this.updateValue();
-      this.updateLists();
-    }
-
-  });
-
-
-  return SelectFilters.SelectFilterView.extend({
-
-    initialize: function() {
-      SelectFilters.SelectFilterView.prototype.initialize.call(this, {
-        detailsView: ResolutionDetailFilterView
-      });
-
-      var unresolved = this.choices.findWhere({ id: UNRESOLVED });
-      unresolved.set('special', true);
-    },
-
-
-    restoreFromQuery: function(q) {
-      var param = _.findWhere(q, { key: this.model.get('property') }),
-          resolved = _.findWhere(q, { key: 'resolved' });
-
-      if (!!resolved) {
-        if (!param) {
-          param = { value: UNRESOLVED };
-        } else {
-          param.value += ',' + UNRESOLVED;
-        }
-      }
-
-      if (param && param.value) {
-        this.model.set('enabled', true);
-        this.restore(param.value, param);
-      } else {
-        this.clear();
-      }
-    },
-
-
-    formatValue: function() {
-      var q = {},
-          resolutions = this.model.get('value');
-      if (this.model.has('property') && resolutions) {
-        var unresolved = resolutions.indexOf(UNRESOLVED) !== -1;
-
-        if (unresolved) {
-          q.resolved = false;
-        } else {
-          q[this.model.get('property')] = resolutions.join(',');
-        }
-      }
-      return q;
-    }
-
-  });
-
-});
index d356ff779887449f93fa9370f9e3592ff14dc83b..26e908f9090caf524b995361c0f439badcebfc03 100644 (file)
@@ -36,11 +36,10 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/ajax-se
   return AjaxSelectFilters.AjaxSelectFilterView.extend({
 
     initialize: function() {
-      BaseFilters.BaseFilterView.prototype.initialize.call(this, {
+      AjaxSelectFilters.AjaxSelectFilterView.prototype.initialize.call(this, {
         detailsView: AjaxSelectFilters.AjaxSelectDetailsFilterView
       });
 
-      this.selection = new RuleSuggestions();
       this.choices = new RuleSuggestions();
     },
 
diff --git a/sonar-server/src/main/webapp/javascripts/navigator/filters/select-filters.js b/sonar-server/src/main/webapp/javascripts/navigator/filters/select-filters.js
deleted file mode 100644 (file)
index 4bfd796..0000000
+++ /dev/null
@@ -1,327 +0,0 @@
-define(['navigator/filters/base-filters'], function (BaseFilters) {
-
-  var DetailsSelectFilterView = BaseFilters.DetailsFilterView.extend({
-    template: '#selectFilterTemplate',
-    itemTemplate: '#selectFilterItemTemplate',
-
-
-    events: function() {
-      return {
-        'change .choices input[type=checkbox]': 'addToSelection',
-        'change .selection input[type=checkbox]': 'removeFromSelection'
-      };
-    },
-
-
-    render: function() {
-      BaseFilters.DetailsFilterView.prototype.render.apply(this, arguments);
-      this.updateLists();
-    },
-
-
-    renderList: function(collection, selector, checked) {
-      var that = this,
-          container = this.$(selector),
-          t = _.template($j(this.itemTemplate).html());
-
-      container.empty().toggleClass('hidden', collection.length === 0);
-      collection.each(function(item) {
-        container.append(t(_.extend(
-            {
-              item: item.toJSON(),
-              checked: checked
-            }, that.model.toJSON())));
-      });
-    },
-
-
-    updateLists: function() {
-      this.renderList(this.options.filterView.selection, '.selection', true);
-      this.renderList(this.options.filterView.choices, '.choices', false);
-
-      var current = this.currentChoice || 0;
-      this.updateCurrent(current);
-    },
-
-
-    addToSelection: function(e) {
-      var id = $j(e.target).val(),
-          model = this.options.filterView.choices.findWhere({ id: id });
-
-      if (this.model.get('multiple')) {
-        this.options.filterView.selection.add(model);
-        this.options.filterView.choices.remove(model);
-      } else {
-        this.options.filterView.choices.add(this.options.filterView.selection.models);
-        this.options.filterView.choices.remove(model);
-        this.options.filterView.selection.reset([model]);
-      }
-
-      this.updateValue();
-      this.updateLists();
-    },
-
-
-    removeFromSelection: function(e) {
-      var id = $j(e.target).val(),
-          model = this.options.filterView.selection.findWhere({ id: id });
-
-      this.options.filterView.choices.add(model);
-      this.options.filterView.selection.remove(model);
-
-      this.updateValue();
-      this.updateLists();
-    },
-
-
-    updateValue: function() {
-      this.model.set('value', this.options.filterView.selection.map(function(m) {
-        return m.get('id');
-      }));
-    },
-
-
-    updateCurrent: function(index) {
-      this.currentChoice = index;
-      this.$('label').removeClass('current')
-          .eq(this.currentChoice).addClass('current');
-    },
-
-
-    onShow: function() {
-      this.bindedOnKeyDown = _.bind(this.onKeyDown, this);
-      $j('body').on('keydown', this.bindedOnKeyDown);
-    },
-
-
-    onHide: function() {
-      $j('body').off('keydown', this.bindedOnKeyDown);
-    },
-
-
-    onKeyDown: function(e) {
-      switch (e.keyCode) {
-        case 38:
-          e.preventDefault();
-          this.selectPrevChoice();
-          break;
-        case 40:
-          e.preventDefault();
-          this.selectNextChoice();
-          break;
-        case 13:
-          e.preventDefault();
-          this.selectCurrent();
-          break;
-      }
-    },
-
-
-    selectNextChoice: function() {
-      if (this.$('label').length > this.currentChoice + 1) {
-        this.updateCurrent(this.currentChoice + 1);
-        this.scrollNext();
-      }
-    },
-
-
-    scrollNext: function() {
-      var currentLabel = this.$('label').eq(this.currentChoice);
-      if (currentLabel.length > 0) {
-        var list = currentLabel.closest('ul'),
-            labelPos = currentLabel.offset().top - list.offset().top + list.scrollTop(),
-            deltaScroll = labelPos - list.height() + currentLabel.outerHeight();
-
-        if (deltaScroll > 0) {
-          list.scrollTop(deltaScroll);
-        }
-      }
-    },
-
-
-    selectPrevChoice: function() {
-      if (this.currentChoice > 0) {
-        this.updateCurrent(this.currentChoice - 1);
-        this.scrollPrev();
-      }
-    },
-
-
-    scrollPrev: function() {
-      var currentLabel = this.$('label').eq(this.currentChoice);
-      if (currentLabel.length > 0) {
-        var list = currentLabel.closest('ul'),
-            labelPos = currentLabel.offset().top - list.offset().top;
-
-        if (labelPos < 0) {
-          list.scrollTop(list.scrollTop() + labelPos);
-        }
-      }
-    },
-
-
-    selectCurrent: function() {
-      this.$('label').eq(this.currentChoice).click();
-    },
-
-
-    serializeData: function() {
-      return _.extend({}, this.model.toJSON(), {
-        selection: this.options.filterView.selection.toJSON(),
-        choices: this.options.filterView.choices.toJSON()
-      });
-    }
-  });
-
-
-
-  var SelectFilterView = BaseFilters.BaseFilterView.extend({
-    className: 'navigator-filter',
-
-
-    initialize: function(options) {
-      BaseFilters.BaseFilterView.prototype.initialize.call(this, {
-        detailsView: (options && options.detailsView) ? options.detailsView : DetailsSelectFilterView
-      });
-
-
-      this.selection = new Backbone.Collection([], { comparator: 'index' });
-
-      var index = 0,
-          icons = this.model.get('choiceIcons');
-
-      this.choices = new Backbone.Collection(
-          _.map(this.model.get('choices'), function(value, key) {
-            var model = new Backbone.Model({
-              id: key,
-              text: value,
-              index: index++
-            });
-
-            if (icons && icons[key]) {
-              model.set('icon', icons[key]);
-            }
-
-            return model;
-          }), { comparator: 'index' }
-      );
-    },
-
-
-    renderInput: function() {
-      var input = $j('<select>')
-          .prop('name', this.model.get('property'))
-          .prop('multiple', true)
-          .css('display', 'none');
-      this.selection.each(function(item) {
-        var option = $j('<option>')
-            .prop('value', item.get('id'))
-            .prop('selected', true)
-            .text(item.get('text'));
-        option.appendTo(input);
-      });
-      this.choices.each(function(item) {
-        var option = $j('<option>')
-            .prop('value', item.get('id'))
-            .text(item.get('text'));
-        option.appendTo(input);
-      });
-      input.appendTo(this.$el);
-    },
-
-
-    renderValue: function() {
-      var value = this.selection.map(function(item) {
-            return item.get('text');
-          }),
-          defaultValue = this.model.has('defaultValue') ?
-              this.model.get('defaultValue') :
-              this.model.get('multiple') ? window.SS.phrases.all : window.SS.phrases.any;
-
-      return this.isDefaultValue() ? defaultValue : value.join(', ');
-    },
-
-
-    isDefaultValue: function() {
-      return this.selection.length === 0 || this.choices.length === 0;
-    },
-
-
-    disable: function() {
-      this.choices.add(this.selection.models);
-      this.selection.reset([]);
-      BaseFilters.BaseFilterView.prototype.disable.apply(this, arguments);
-    },
-
-
-    restore: function(value) {
-      if (_.isString(value)) {
-        value = value.split(',');
-      }
-
-      if (this.choices && this.selection && value.length > 0) {
-        var that = this;
-        this.choices.add(this.selection.models);
-        this.selection.reset([]);
-
-        _.each(value, function(v) {
-          var cModel = that.choices.findWhere({ id: v });
-
-          if (cModel) {
-            that.selection.add(cModel);
-            that.choices.remove(cModel);
-          }
-        });
-
-        this.detailsView.updateLists();
-
-        this.model.set({
-          value: value,
-          enabled: true
-        });
-
-        this.renderBase();
-      } else {
-        this.clear();
-      }
-    },
-
-
-    clear: function() {
-      var that = this;
-      if (this.selection && this.choices) {
-        this.selection.each(function(m) {
-          that.choices.add(m);
-        });
-        this.selection.reset([]);
-      }
-      this.model.unset('value');
-      this.detailsView.render();
-      if (this.detailsView.updateCurrent) {
-        this.detailsView.updateCurrent(0);
-      }
-    },
-
-
-    formatValue: function() {
-      var q = {};
-      if (this.model.has('property') && this.model.has('value') && this.model.get('value').length > 0) {
-        q[this.model.get('property')] = this.model.get('value').join(',');
-      }
-      return q;
-    }
-
-  });
-
-
-
-  /*
-   * Export public classes
-   */
-
-  return {
-    DetailsSelectFilterView: DetailsSelectFilterView,
-    SelectFilterView: SelectFilterView
-  };
-
-});