]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-4854 Unresolved criteria
authorStas Vilchik <vilchiks@gmail.com>
Mon, 17 Feb 2014 11:18:13 +0000 (17:18 +0600)
committerStas Vilchik <vilchiks@gmail.com>
Mon, 17 Feb 2014 11:18:13 +0000 (17:18 +0600)
sonar-server/src/main/webapp/WEB-INF/app/views/issues/search.html.erb
sonar-server/src/main/webapp/javascripts/issues.js
sonar-server/src/main/webapp/javascripts/navigator/filters/resolution-filters.js [new file with mode: 0644]
sonar-server/src/main/webapp/javascripts/navigator/filters/select-filters.js

index 722fae1fa1cc1067e2c2e6c535a4fce49c75e07f..532c05b27dc929a4a36c6df845fe70f12c40535d 100644 (file)
@@ -95,6 +95,7 @@
       assignee:        '<%= escape_javascript message('issue_filter.criteria.assignee') -%>',
       resolution:      '<%= escape_javascript message('issue_filter.criteria.resolution') -%>',
       resolutions: {
+        'UNRESOLVED':  '<%= escape_javascript message('unresolved') -%>',
         'FALSE-POSITIVE': '<%= escape_javascript message('issue.resolution.FALSE-POSITIVE') -%>',
         'FIXED':       '<%= escape_javascript message('issue.resolution.FIXED') -%>',
         'REMOVED':     '<%= escape_javascript message('issue.resolution.REMOVED') -%>'
index 1a06a92f4ad835332925290847c7507b35f142c8..18704e2d3fa5728ababb93409a91e5f173764040 100644 (file)
@@ -30,13 +30,15 @@ requirejs(
       'navigator/filters/checkbox-filters',
       'navigator/filters/select-filters',
       'navigator/filters/ajax-select-filters',
+      'navigator/filters/resolution-filters',
       'navigator/filters/favorite-filters',
       'navigator/filters/range-filters',
       'navigator/filters/context-filters',
 
       'handlebars-extensions'
     ],
-    function (Backbone, Marionette, Handlebars, Extra, FilterBar, BaseFilters, CheckboxFilterView, SelectFilters, AjaxSelectFilters, FavoriteFilters, RangeFilters, ContextFilterView) {
+    function (Backbone, Marionette, Handlebars, Extra, FilterBar, BaseFilters, CheckboxFilterView, SelectFilters,
+              AjaxSelectFilters, ResolutionFilterView, FavoriteFilters, RangeFilters, ContextFilterView) {
       Handlebars.registerPartial('detailInnerTemplate', jQuery('#issue-detail-inner-template').html());
 
 
@@ -157,10 +159,11 @@ requirejs(
           new BaseFilters.Filter({
             name: window.SS.phrases.resolution,
             property: 'resolutions',
-            type: SelectFilters.SelectFilterView,
+            type: ResolutionFilterView,
             enabled: false,
             optional: true,
             choices: {
+              'UNRESOLVED': 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
@@ -184,13 +187,6 @@ requirejs(
             optional: true
           }),
 
-          new BaseFilters.Filter({
-            property: 'resolved',
-            type: ContextFilterView,
-            enabled: true,
-            optional: false
-          }),
-
           new BaseFilters.Filter({
             property: 'actionPlans',
             type: ContextFilterView,
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
new file mode 100644 (file)
index 0000000..7977ff9
--- /dev/null
@@ -0,0 +1,80 @@
+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
+      });
+    },
+
+
+    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 7517356cc4efa79c29ea2a5a8e70325a6341c0fb..4998418e72fe715a6bf9e19dc257689d7f8312eb 100644 (file)
@@ -179,9 +179,9 @@ define(['navigator/filters/base-filters'], function (BaseFilters) {
     className: 'navigator-filter',
 
 
-    initialize: function() {
+    initialize: function(options) {
       BaseFilters.BaseFilterView.prototype.initialize.call(this, {
-        detailsView: DetailsSelectFilterView
+        detailsView: (options && options.detailsView) ? options.detailsView : DetailsSelectFilterView
       });