From: Stas Vilchik Date: Tue, 18 Feb 2014 12:15:01 +0000 (+0600) Subject: SONAR-4854 Action plans X-Git-Tag: 4.3~730^2~16 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=40c6e7690b979d4ce4d621d37594ea9a10e88fb4;p=sonarqube.git SONAR-4854 Action plans --- diff --git a/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties b/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties index 70d09562586..ac6d51a26e8 100644 --- a/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties +++ b/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties @@ -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 diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/issues/search.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/issues/search.html.erb index 7122a2b0742..04c1ec08fa5 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/issues/search.html.erb +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/issues/search.html.erb @@ -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') -%>', diff --git a/sonar-server/src/main/webapp/javascripts/issues.js b/sonar-server/src/main/webapp/javascripts/issues.js index ec97d79f0f2..1781f0fbe8c 100644 --- a/sonar-server/src/main/webapp/javascripts/issues.js +++ b/sonar-server/src/main/webapp/javascripts/issues.js @@ -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 + } + }), + ]); diff --git a/sonar-server/src/main/webapp/javascripts/navigator/filters/action-plan-filters.js b/sonar-server/src/main/webapp/javascripts/navigator/filters/action-plan-filters.js index 542a9de3889..8b3ab8d8f76 100644 --- a/sonar-server/src/main/webapp/javascripts/navigator/filters/action-plan-filters.js +++ b/sonar-server/src/main/webapp/javascripts/navigator/filters/action-plan-filters.js @@ -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(); + } + } + }); }); diff --git a/sonar-server/src/main/webapp/javascripts/navigator/filters/ajax-select-filters.js b/sonar-server/src/main/webapp/javascripts/navigator/filters/ajax-select-filters.js index 5b0e228d269..d01678ade94 100644 --- a/sonar-server/src/main/webapp/javascripts/navigator/filters/ajax-select-filters.js +++ b/sonar-server/src/main/webapp/javascripts/navigator/filters/ajax-select-filters.js @@ -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) { 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 index 4998418e72f..4bfd796b428 100644 --- a/sonar-server/src/main/webapp/javascripts/navigator/filters/select-filters.js +++ b/sonar-server/src/main/webapp/javascripts/navigator/filters/select-filters.js @@ -278,8 +278,6 @@ define(['navigator/filters/base-filters'], function (BaseFilters) { this.model.set({ value: value, enabled: true - }, { - silent: true }); this.renderBase(); diff --git a/sonar-server/src/main/webapp/stylesheets/navigator.css b/sonar-server/src/main/webapp/stylesheets/navigator.css index c4f3dbd5b1e..f1e84368c4d 100644 --- a/sonar-server/src/main/webapp/stylesheets/navigator.css +++ b/sonar-server/src/main/webapp/stylesheets/navigator.css @@ -405,19 +405,25 @@ 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; diff --git a/sonar-server/src/main/webapp/stylesheets/navigator/filters.css b/sonar-server/src/main/webapp/stylesheets/navigator/filters.css index 954e15b0757..4779eca34d1 100644 --- a/sonar-server/src/main/webapp/stylesheets/navigator/filters.css +++ b/sonar-server/src/main/webapp/stylesheets/navigator/filters.css @@ -64,19 +64,25 @@ 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; diff --git a/sonar-server/src/main/webapp/stylesheets/navigator/filters.less b/sonar-server/src/main/webapp/stylesheets/navigator/filters.less index f644cb45407..e4a6096faed 100644 --- a/sonar-server/src/main/webapp/stylesheets/navigator/filters.less +++ b/sonar-server/src/main/webapp/stylesheets/navigator/filters.less @@ -68,7 +68,8 @@ } .navigator-filter-inline, -.navigator-filter-read-only { +.navigator-filter-read-only, +.navigator-filter-inactive { cursor: default; &:hover, @@ -82,6 +83,10 @@ content: ""; } +.navigator-filter-inactive { + opacity: 0.5; +} + .navigator-filter-label { display: inline-block; vertical-align: middle;