]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-4854 Action plans
authorStas Vilchik <vilchiks@gmail.com>
Tue, 18 Feb 2014 12:15:01 +0000 (18:15 +0600)
committerStas Vilchik <vilchiks@gmail.com>
Tue, 18 Feb 2014 12:15:01 +0000 (18:15 +0600)
plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties
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/action-plan-filters.js
sonar-server/src/main/webapp/javascripts/navigator/filters/ajax-select-filters.js
sonar-server/src/main/webapp/javascripts/navigator/filters/select-filters.js
sonar-server/src/main/webapp/stylesheets/navigator.css
sonar-server/src/main/webapp/stylesheets/navigator/filters.css
sonar-server/src/main/webapp/stylesheets/navigator/filters.less

index 70d09562586c7ed1272f9759d06d5fe77c113688..ac6d51a26e8ea2160019823c4e254e7865706405 100644 (file)
@@ -619,6 +619,7 @@ issue_filter.header.assignee=Assignee
 issue_filter.header.creation_date=Created
 issue_filter.header.resolution=Resolution
 issue_filter.header.update_date=Updated
+issue_filter.criteria.actionPlans=Action Plans
 issue_filter.criteria.assignee=Assignee
 issue_filter.criteria.created=Created
 issue_filter.criteria.created_at=Created at
index 7122a2b0742140e0162cf36d1b72d3db1a66d9bb..04c1ec08fa5a6c9dc20104dbb0f1ffcd16848cc8 100644 (file)
@@ -49,6 +49,7 @@
     favorites: <%= render :partial => 'issues/filter_favourites' -%>,
 
     phrases: {
+      'actionPlans':   '<%= escape_javascript message('issue_filter.criteria.actionPlans') -%>',
       'any':           '<%= escape_javascript message('any') -%>',
       'anytime':       '<%= escape_javascript message('anytime') -%>',
       'all':           '<%= escape_javascript message('all') -%>',
index ec97d79f0f2aef3287ec8cfcb9181c2630d5ff58..1781f0fbe8c1e14818af235f7f0be47d126500be 100644 (file)
@@ -98,15 +98,16 @@ requirejs(
 
 
       NavigatorApp.addInitializer(function () {
-        this.filters.add([
-          new BaseFilters.Filter({
+        var projectFilter = new BaseFilters.Filter({
             name: window.SS.phrases.project,
             property: 'componentRoots',
             type: AjaxSelectFilters.ProjectFilterView,
             enabled: true,
             optional: false
-          }),
+          });
+        this.filters.add(projectFilter);
 
+        this.filters.add([
           new BaseFilters.Filter({
             name: window.SS.phrases.severity,
             property: 'severities',
@@ -160,25 +161,12 @@ requirejs(
           }),
 
           new BaseFilters.Filter({
-            name: window.SS.phrases.resolution,
-            property: 'resolutions',
-            type: ResolutionFilterView,
+            name: window.SS.phrases.actionPlans,
+            property: 'actionPlans',
+            type: ActionPlanFilterView,
             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
-            }
-          }),
-
-          new BaseFilters.Filter({
-            name: window.SS.phrases.reporter,
-            property: 'reporters',
-            type: AjaxSelectFilters.ReporterFilterView,
-            enabled: false,
-            optional: true
+            projectFilter: projectFilter
           }),
 
           new BaseFilters.Filter({
@@ -200,11 +188,27 @@ requirejs(
           }),
 
           new BaseFilters.Filter({
-            property: 'actionPlans',
-            type: ContextFilterView,
-            enabled: true,
-            optional: false
-          })
+            name: window.SS.phrases.reporter,
+            property: 'reporters',
+            type: AjaxSelectFilters.ReporterFilterView,
+            enabled: false,
+            optional: true
+          }),
+
+          new BaseFilters.Filter({
+            name: window.SS.phrases.resolution,
+            property: 'resolutions',
+            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
+            }
+          }),
+
         ]);
 
 
index 542a9de3889956428d678053210bd4bec3f1842c..8b3ab8d8f7698f2673281e8a4dbbedfa31d43b85 100644 (file)
@@ -2,6 +2,94 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
 
   return SelectFilters.SelectFilterView.extend({
 
+    initialize: function() {
+      SelectFilters.SelectFilterView.prototype.initialize.apply(this, arguments);
+      this.projectFilter = this.model.get('projectFilter');
+      this.listenTo(this.projectFilter, 'change:value', this.onChangeProjectFilter);
+      this.onChangeProjectFilter();
+    },
+
+
+    onChangeProjectFilter: function() {
+      var projects = this.projectFilter.get('value');
+      if (_.isArray(projects) && projects.length === 1) {
+        return this.fetchActionPlans(projects[0]);
+      } else {
+        return this.makeInactive();
+      }
+    },
+
+
+    showDetails: function() {
+      if (!this.$el.is('.navigator-filter-inactive')) {
+        SelectFilters.SelectFilterView.prototype.showDetails.apply(this, arguments);
+      }
+    },
+
+
+    makeActive: function() {
+      this.$el.removeClass('navigator-filter-inactive');
+    },
+
+
+    makeInactive: function() {
+      this.selection.reset([]);
+      this.choices.reset([]);
+      this.detailsView.updateLists();
+      this.detailsView.updateValue();
+      this.$el.addClass('navigator-filter-inactive');
+    },
+
+
+    fetchActionPlans: function(project) {
+      var that = this;
+      return jQuery.ajax({
+        url: baseUrl + '/api/action_plans/search',
+        type: 'GET',
+        data: { project: project }
+      }).done(function(r) {
+            var nonClosedActionPlans =
+                _.sortBy(_.reject(r.actionPlans, function(plan) {
+                      return plan.status === 'CLOSED';
+                    }), 'name');
+
+            that.selection.reset([]);
+            that.choices.reset(nonClosedActionPlans.map(function(plan) {
+              return {
+                id: plan.key,
+                text: plan.name
+              }
+            }));
+
+            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);
+              });
+            }
+            that.detailsView.updateValue();
+            that.render();
+
+            that.makeActive();
+          });
+    },
+
+
+    restore: function(value) {
+      if (_.isString(value)) {
+        value = value.split(',');
+      }
+
+      if (this.choices && this.selection && value.length > 0) {
+        this.model.set({ value: value, enabled: true });
+        this.onChangeProjectFilter();
+      } else {
+        this.clear();
+      }
+    }
+
   });
 
 });
index 5b0e228d269045355b7a8d06bc8e3ebd87259e34..d01678ade945fa88c6b88c8e0f207d611bf0f538 100644 (file)
@@ -203,8 +203,6 @@ define(['backbone', 'navigator/filters/base-filters', 'navigator/filters/select-
         this.model.set({
           value: value,
           enabled: true
-        }, {
-          silent: true
         });
 
         if (_.isArray(param.text) && param.text.length === value.length) {
index 4998418e72fe715a6bf9e19dc257689d7f8312eb..4bfd796b4284603781d7058e7c8d034697a0d7eb 100644 (file)
@@ -278,8 +278,6 @@ define(['navigator/filters/base-filters'], function (BaseFilters) {
         this.model.set({
           value: value,
           enabled: true
-        }, {
-          silent: true
         });
 
         this.renderBase();
index c4f3dbd5b1e811b4a7be774d0bc37168e4c69a6f..f1e84368c4de046cfb26c329d89976f61407b3fa 100644 (file)
   padding-right: 0;
 }
 .navigator-filter-inline,
-.navigator-filter-read-only {
+.navigator-filter-read-only,
+.navigator-filter-inactive {
   cursor: default;
 }
 .navigator-filter-inline:hover,
 .navigator-filter-read-only:hover,
+.navigator-filter-inactive:hover,
 .navigator-filter-inline.active,
-.navigator-filter-read-only.active {
+.navigator-filter-read-only.active,
+.navigator-filter-inactive.active {
   border-color: transparent;
   background: transparent;
 }
 .navigator-filter-inline .navigator-filter-label:after {
   content: "";
 }
+.navigator-filter-inactive {
+  opacity: 0.5;
+}
 .navigator-filter-label {
   display: inline-block;
   vertical-align: middle;
index 954e15b075745524beeb705a7b21e5344f089e0c..4779eca34d1572966c9a38a1dbe70f3f2e3d35b2 100644 (file)
   padding-right: 0;
 }
 .navigator-filter-inline,
-.navigator-filter-read-only {
+.navigator-filter-read-only,
+.navigator-filter-inactive {
   cursor: default;
 }
 .navigator-filter-inline:hover,
 .navigator-filter-read-only:hover,
+.navigator-filter-inactive:hover,
 .navigator-filter-inline.active,
-.navigator-filter-read-only.active {
+.navigator-filter-read-only.active,
+.navigator-filter-inactive.active {
   border-color: transparent;
   background: transparent;
 }
 .navigator-filter-inline .navigator-filter-label:after {
   content: "";
 }
+.navigator-filter-inactive {
+  opacity: 0.5;
+}
 .navigator-filter-label {
   display: inline-block;
   vertical-align: middle;
index f644cb4540787de93ab3cad5d9440918d4964e84..e4a6096faedc55a488b91dd076ca8f417236313a 100644 (file)
@@ -68,7 +68,8 @@
 }
 
 .navigator-filter-inline,
-.navigator-filter-read-only {
+.navigator-filter-read-only,
+.navigator-filter-inactive {
   cursor: default;
 
   &:hover,
     content: "";
 }
 
+.navigator-filter-inactive {
+  opacity: 0.5;
+}
+
 .navigator-filter-label {
   display: inline-block;
   vertical-align: middle;