From b278651d81fe6302181da3a19bff7d9673c72bd0 Mon Sep 17 00:00:00 2001 From: Stas Vilchik Date: Mon, 19 May 2014 10:59:05 +0200 Subject: [PATCH] SONAR-5209 Issues filtering --- .../coffee/component-viewer/header.coffee | 55 ++++++--- .../main/coffee/component-viewer/main.coffee | 65 +++++++++-- .../coffee/component-viewer/source.coffee | 4 +- .../src/main/hbs/component-viewer/header.hbs | 32 ++--- .../header/_issues-header.hbs | 109 ++++++++++-------- .../main/js/common/handlebars-extensions.js | 10 +- sonar-server/src/main/js/issues/extra.js | 2 +- 7 files changed, 183 insertions(+), 94 deletions(-) diff --git a/sonar-server/src/main/coffee/component-viewer/header.coffee b/sonar-server/src/main/coffee/component-viewer/header.coffee index 731268a19dc..d8e0e4b5968 100644 --- a/sonar-server/src/main/coffee/component-viewer/header.coffee +++ b/sonar-server/src/main/coffee/component-viewer/header.coffee @@ -27,13 +27,23 @@ define [ 'click .js-toggle-duplications': 'toggleDuplications' 'click .js-toggle-scm': 'toggleSCM' + 'click .js-filter-current-issue': 'filterByCurrentIssue' + 'click .js-filter-all-issues': 'filterByAllIssues' + 'click .js-filter-resolved-issues': 'filterByResolvedIssues' + 'click .js-filter-unresolved-issues': 'filterByUnresolvedIssues' + 'click .js-filter-false-positive-issues': 'filterByFalsePositiveIssues' + 'click .js-filter-blocker-issues': 'filterByBlockerIssues' + 'click .js-filter-critical-issues': 'filterByCriticalIssues' + 'click .js-filter-major-issues': 'filterByMajorIssues' + 'click .js-filter-minor-issues': 'filterByMinorIssues' + 'click .js-filter-info-issues': 'filterByInfoIssues' + 'click .js-filter-lines-to-cover': 'filterByLinesToCover' 'click .js-filter-covered-lines': 'filterByCoveredLines' 'click .js-filter-uncovered-lines': 'filterByUncoveredLines' 'click .js-filter-branches-to-cover': 'filterByBranchesToCover' 'click .js-filter-covered-branches': 'filterByCoveredBranches' 'click .js-filter-uncovered-branches': 'filterByUncoveredBranches' - 'click .js-filter-lines-to-cover-it': 'filterByLinesToCoverIT' 'click .js-filter-covered-lines-it': 'filterByCoveredLinesIT' 'click .js-filter-uncovered-lines-it': 'filterByUncoveredLinesIT' @@ -90,25 +100,40 @@ define [ toggleWorkspace: (e) -> @toggleSetting e, @options.main.showWorkspace, @options.main.hideWorkspace - filterByCoverage: (e, method) -> + filterLines: (e, method) -> @$('.component-viewer-header-expanded-bar-section-list .active').removeClass 'active' $(e.currentTarget).addClass 'active' _.result @options.main, method - filterByLinesToCover: (e) -> @filterByCoverage e, 'filterByLinesToCover' - filterByCoveredLines: (e) -> @filterByCoverage e, 'filterByCoveredLines' - filterByUncoveredLines: (e) -> @filterByCoverage e, 'filterByUncoveredLines' - filterByBranchesToCover: (e) -> @filterByCoverage e, 'filterByBranchesToCover' - filterByCoveredBranches: (e) -> @filterByCoverage e, 'filterByCoveredBranches' - filterByUncoveredBranches: (e) -> @filterByCoverage e, 'filterByUncoveredBranches' - - filterByLinesToCoverIT: (e) -> @filterByCoverage e, 'filterByLinesToCoverIT' - filterByCoveredLinesIT: (e) -> @filterByCoverage e, 'filterByCoveredLinesIT' - filterByUncoveredLinesIT: (e) -> @filterByCoverage e, 'filterByUncoveredLinesIT' - filterByBranchesToCoverIT: (e) -> @filterByCoverage e, 'filterByBranchesToCoverIT' - filterByCoveredBranchesIT: (e) -> @filterByCoverage e, 'filterByCoveredBranchesIT' - filterByUncoveredBranchesIT: (e) -> @filterByCoverage e, 'filterByUncoveredBranchesIT' + # Issues + filterByCurrentIssue: (e) -> @filterLines e, 'filterByCurrentIssue' + filterByAllIssues: (e) -> @filterLines e, 'filterByAllIssues' + filterByResolvedIssues: (e) -> @filterLines e, 'filterByResolvedIssues' + filterByUnresolvedIssues: (e) -> @filterLines e, 'filterByUnresolvedIssues' + filterByFalsePositiveIssues: (e) -> @filterLines e, 'filterByFalsePositiveIssues' + + filterByBlockerIssues: (e) -> @filterLines e, 'filterByBlockerIssues' + filterByCriticalIssues: (e) -> @filterLines e, 'filterByCriticalIssues' + filterByMajorIssues: (e) -> @filterLines e, 'filterByMajorIssues' + filterByMinorIssues: (e) -> @filterLines e, 'filterByMinorIssues' + filterByInfoIssues: (e) -> @filterLines e, 'filterByInfoIssues' + + + # Coverage + filterByLinesToCover: (e) -> @filterLines e, 'filterByLinesToCover' + filterByCoveredLines: (e) -> @filterLines e, 'filterByCoveredLines' + filterByUncoveredLines: (e) -> @filterLines e, 'filterByUncoveredLines' + filterByBranchesToCover: (e) -> @filterLines e, 'filterByBranchesToCover' + filterByCoveredBranches: (e) -> @filterLines e, 'filterByCoveredBranches' + filterByUncoveredBranches: (e) -> @filterLines e, 'filterByUncoveredBranches' + + filterByLinesToCoverIT: (e) -> @filterLines e, 'filterByLinesToCoverIT' + filterByCoveredLinesIT: (e) -> @filterLines e, 'filterByCoveredLinesIT' + filterByUncoveredLinesIT: (e) -> @filterLines e, 'filterByUncoveredLinesIT' + filterByBranchesToCoverIT: (e) -> @filterLines e, 'filterByBranchesToCoverIT' + filterByCoveredBranchesIT: (e) -> @filterLines e, 'filterByCoveredBranchesIT' + filterByUncoveredBranchesIT: (e) -> @filterLines e, 'filterByUncoveredBranchesIT' serializeData: -> diff --git a/sonar-server/src/main/coffee/component-viewer/main.coffee b/sonar-server/src/main/coffee/component-viewer/main.coffee index 1cdde9a823a..7c65a008829 100644 --- a/sonar-server/src/main/coffee/component-viewer/main.coffee +++ b/sonar-server/src/main/coffee/component-viewer/main.coffee @@ -20,6 +20,7 @@ define [ API_COMPONENT = "#{baseUrl}/api/components/app" API_SOURCES = "#{baseUrl}/api/sources/show" + API_ISSUES = "#{baseUrl}/api/issues/search" API_COVERAGE = "#{baseUrl}/api/coverage/show" API_SCM = "#{baseUrl}/api/sources/scm" API_MEASURES = "#{baseUrl}/api/resources" @@ -80,6 +81,8 @@ define [ model: @source main: @ + @requestIssuesOnce = false + onRender: -> if @settings.get 'workspace' @@ -128,6 +131,12 @@ define [ @source.set scm: data.scm + requestIssues: (key) -> + $.get API_ISSUES, components: key, ps: 10000, (data) => + @requestIssuesOnce = true + @source.set issues: data.issues + + requestCoverage: (key, type = 'UT') -> $.get API_COVERAGE, key: key, type: type, (data) => @source.set coverage: data.coverage @@ -176,11 +185,12 @@ define [ @render() - showIssues: (issues) -> + showIssues: (issue) -> @settings.set 'issues', true - if _.isArray(issues) && issues.length > 0 - @source.set 'issues', issues - @filterLinesByIssues() + if issue? + @currentIssue = issue.key + @source.set 'issues', [issue] + @filterByCurrentIssue() else @sourceView.render() @@ -222,6 +232,50 @@ define [ @sourceView.render() + filterByIssues: (predicate, requestIssues = true) -> + if requestIssues && !@requestIssuesOnce + @requestIssues(@key).done => @_filterByIssues(predicate) + else + @_filterByIssues(predicate) + + + _filterByIssues: (predicate) -> + issues = @source.get 'issues' + @settings.set 'issues', true + @sourceView.resetShowBlocks() + activeIssues = [] + issues.forEach (issue) => + if predicate issue + line = issue.line || 0 + @sourceView.addShowBlock line - LINES_AROUND_ISSUE, line + LINES_AROUND_ISSUE + activeIssues.push issue + @source.set 'activeIssues', activeIssues + @sourceView.render() + + + # Current Issue + filterByCurrentIssue: -> @filterByIssues ((issue) => issue.key == @currentIssue), false + + # All Issues + filterByAllIssues: -> @filterByIssues -> true + + # Resolved Issues + filterByResolvedIssues: -> @filterByIssues (issue) -> !!issue.resolution + + # Unresolved Issues + filterByUnresolvedIssues: -> @filterByIssues (issue) -> !issue.resolution + + # False Positive + filterByFalsePositiveIssues: -> @filterByIssues (issue) -> issue.resolution == 'FALSE-POSITIVE' + + # Severity + filterByBlockerIssues: -> @filterByIssues (issue) -> issue.severity == 'BLOCKER' && !issue.resolution + filterByCriticalIssues: -> @filterByIssues (issue) -> issue.severity == 'CRITICAL' && !issue.resolution + filterByMajorIssues: -> @filterByIssues (issue) -> issue.severity == 'MAJOR' && !issue.resolution + filterByMinorIssues: -> @filterByIssues (issue) -> issue.severity == 'MINOR' && !issue.resolution + filterByInfoIssues: -> @filterByIssues (issue) -> issue.severity == 'INFO' && !issue.resolution + + filterByCoverage: (predicate) -> @requestCoverage(@key).done => @_filterByCoverage(predicate) @@ -258,9 +312,6 @@ define [ filterByUncoveredBranchesIT: -> @filterByCoverageIT (c) -> c[3]? && c[4]? && (c[3] > c[4]) - - - addTransition: (key, transition, optionsForCurrent, options) -> if optionsForCurrent? last = @workspace.at(@workspace.length - 1) diff --git a/sonar-server/src/main/coffee/component-viewer/source.coffee b/sonar-server/src/main/coffee/component-viewer/source.coffee index b5b01020a8b..fdd1fa9f057 100644 --- a/sonar-server/src/main/coffee/component-viewer/source.coffee +++ b/sonar-server/src/main/coffee/component-viewer/source.coffee @@ -59,7 +59,7 @@ define [ @delegateEvents() @showSettings = false @renderExpandButtons() - @renderIssues() if @options.main.settings.get('issues') && @model.has('issues') + @renderIssues() if @options.main.settings.get('issues') && @model.has('activeIssues') renderExpandButtons: -> @@ -81,7 +81,7 @@ define [ renderIssues: -> - issues = @model.get 'issues' + issues = @model.get 'activeIssues' issues.forEach (issue) => line = issue.line || 0 row = @$("[data-line-number=#{line}]") diff --git a/sonar-server/src/main/hbs/component-viewer/header.hbs b/sonar-server/src/main/hbs/component-viewer/header.hbs index b4070fded78..c039f3e2a4b 100644 --- a/sonar-server/src/main/hbs/component-viewer/header.hbs +++ b/sonar-server/src/main/hbs/component-viewer/header.hbs @@ -31,32 +31,32 @@
- {{#if component.measures.fDebt}}
- {{component.measures.fDebt}} + {{default component.measures.fDebt 0}} Debt
- {{/if}} {{#if component.measures.fIssues}}
{{component.measures.fIssues}} {{t 'metric.violations.name'}}
{{/if}} -
+{{#if component.measures.fIssues}} +
+
Severities
+ +
+{{/if}} -
-
Rules
-
    -
-
+{{#if component.measures.fIssues}} +
+
Rules
+
    +
+
+{{/if}}
-
 
+
Issues