aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStas Vilchik <vilchiks@gmail.com>2014-04-25 17:01:21 +0600
committerStas Vilchik <vilchiks@gmail.com>2014-04-25 17:01:35 +0600
commitd37265f71e7d98d37ed77e1b3e0972e89e6996cd (patch)
treed25499e65d370b45e2d0d0e4afce89dc38750c03
parent82b00b87c20e172ff0d6385458fbb03ce9b46d80 (diff)
downloadsonarqube-d37265f71e7d98d37ed77e1b3e0972e89e6996cd.tar.gz
sonarqube-d37265f71e7d98d37ed77e1b3e0972e89e6996cd.zip
Component Viewer: header
-rw-r--r--sonar-server/src/main/coffee/component-viewer/main.coffee38
-rw-r--r--sonar-server/src/main/coffee/component-viewer/source.coffee7
-rw-r--r--sonar-server/src/main/hbs/component-viewer/source.hbs63
-rw-r--r--sonar-server/src/main/js/issues/extra.js7
-rw-r--r--sonar-server/src/main/less/component-viewer.less47
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/app/views/issues/search.html.erb32
6 files changed, 186 insertions, 8 deletions
diff --git a/sonar-server/src/main/coffee/component-viewer/main.coffee b/sonar-server/src/main/coffee/component-viewer/main.coffee
index 4d55a066ebb..5601a7b88d1 100644
--- a/sonar-server/src/main/coffee/component-viewer/main.coffee
+++ b/sonar-server/src/main/coffee/component-viewer/main.coffee
@@ -16,6 +16,15 @@ define [
API_SOURCES = "#{baseUrl}/api/sources"
API_RESOURCES = "#{baseUrl}/api/resources"
+ SOURCE_METRIC_LIST = 'lines,ncloc,functions,accessors,classes,statements,complexity,function_complexity,' +
+ 'comment_lines_density,comment_lines,public_documented_api_density,public_undocumented_api,' +
+ 'public_api'
+
+ COVERAGE_METRIC_LIST = 'coverage,line_coverage,branch_coverage,' +
+ 'coverage_line_hits_data,covered_conditions_by_line,conditions_by_line'
+
+ ISSUES_METRIC_LIST = 'blocker_violations,critical_violations,major_violations,minor_violations,info_violations'
+
class ComponentViewer extends Marionette.Layout
@@ -62,6 +71,14 @@ define [
@component.set data[0]
+ requestComponentCoverage: (key) ->
+ $.get API_RESOURCES, resource: key, metrics: COVERAGE_METRIC_LIST
+
+
+ requestComponentIssues: (key) ->
+ $.get API_RESOURCES, resource: key, metrics: ISSUES_METRIC_LIST
+
+
requestSource: (key) ->
$.get API_SOURCES, resource: key, (data) =>
@source.set source: data[0]
@@ -83,6 +100,16 @@ define [
coverage: coverage
coverageConditions: coverageConditions
conditions: conditions
+ coverageMeasures = _.reject data[0].msr, (m) ->
+ m.key == 'coverage_line_hits_data' || m.key == 'covered_conditions_by_line' || m.key == 'conditions_by_line'
+ @component.set 'coverageMeasures', coverageMeasures
+
+
+ extractIssues: (data) ->
+ issuesMeasures = {}
+ data[0].msr.forEach (q) ->
+ issuesMeasures[q.key] = q.frmt_val
+ @component.set 'issuesMeasures', issuesMeasures
open: (key) ->
@@ -94,7 +121,7 @@ define [
@key = key
@sourceView.showSpinner()
source = @requestSource key
- component = @requestComponent key
+ component = @requestComponent key, SOURCE_METRIC_LIST
$.when(source, component).done =>
@workspace.where(key: key).forEach (model) =>
model.set 'component': @component.toJSON()
@@ -105,8 +132,7 @@ define [
showCoverage: ->
@settings.set 'coverage', true
unless @source.has 'coverage'
- metrics = 'coverage_line_hits_data,covered_conditions_by_line,conditions_by_line'
- @requestComponent(@key, metrics).done (data) =>
+ @requestComponentCoverage(@key).done (data) =>
@extractCoverage data
@sourceView.render()
else
@@ -130,6 +156,12 @@ define [
showIssues: (issues) ->
@settings.set 'issues', true
+
+ unless @source.has 'issues'
+ @requestComponentIssues(@key).done (data) =>
+ @extractIssues data
+ @sourceView.render()
+
if _.isArray(issues) && issues.length > 0
@source.set 'issues', issues
@sourceView.render()
diff --git a/sonar-server/src/main/coffee/component-viewer/source.coffee b/sonar-server/src/main/coffee/component-viewer/source.coffee
index 72f7c7e7b14..74b37753166 100644
--- a/sonar-server/src/main/coffee/component-viewer/source.coffee
+++ b/sonar-server/src/main/coffee/component-viewer/source.coffee
@@ -21,7 +21,8 @@ define [
events:
- 'click .settings-toggle button': 'toggleSettings'
+ 'click .js-toggle-settings': 'toggleSettings'
+ 'click .js-toggle-measures': 'toggleMeasures'
'change #source-coverage': 'toggleCoverage'
'change #source-workspace': 'toggleWorkspace'
'click .coverage-tests': 'showCoveragePopup'
@@ -53,6 +54,10 @@ define [
@$('.component-viewer-source-settings').toggleClass 'open'
+ toggleMeasures: ->
+ @$('.component-viewer-measures-section').toggleClass 'brief'
+
+
toggleCoverage: (e) ->
active = $(e.currentTarget).is ':checked'
@showSettings = true
diff --git a/sonar-server/src/main/hbs/component-viewer/source.hbs b/sonar-server/src/main/hbs/component-viewer/source.hbs
index 53c30e18648..c6372ef5da1 100644
--- a/sonar-server/src/main/hbs/component-viewer/source.hbs
+++ b/sonar-server/src/main/hbs/component-viewer/source.hbs
@@ -6,7 +6,7 @@
<th class="stat"></th>
{{/if}}
<th class="stat settings-toggle">
- <button class="button-clean">
+ <button class="button-clean js-toggle-settings">
<i class="icon-settings"></i></i>
</button>
</th>
@@ -37,6 +37,67 @@
{{qualifierIcon component.qualifier}} <span class="component-viewer-title">{{component.name}}</span>
</th>
</tr>
+ <tr>
+ {{#if settings.coverage}}
+ <th class="stat"></th>
+ <th class="stat"></th>
+ {{/if}}
+ <th class="stat settings-toggle">
+ <button class="button-clean js-toggle-measures"><i class="icon-list"></i></button>
+ </th>
+ <th class="measures">
+ <ul class="component-viewer-measures">
+ <li class="component-viewer-measures-section brief">
+ <dl>
+ {{#each component.msr}}
+ <dt>{{t 'metric' key 'name'}}</dt><dd>{{frmt_val}}</dd>
+ {{/each}}
+ </dl>
+ </li>
+ {{#if settings.issues}}
+ <li class="component-viewer-measures-section brief">
+ {{#if component.issuesMeasures}}
+ {{#with component.issuesMeasures}}
+ <dl>
+ <dt>Issues</dt>
+ <dd>
+ {{#if blocker_violations}}
+ <i class="icon-severity-blocker"></i>{{blocker_violations}}&nbsp;
+ {{/if}}
+ {{#if critical_violations}}
+ <i class="icon-severity-critical"></i>{{critical_violations}}&nbsp;
+ {{/if}}
+ {{#if major_violations}}
+ <i class="icon-severity-major"></i>{{major_violations}}&nbsp;
+ {{/if}}
+ {{#if minor_violations}}
+ <i class="icon-severity-minor"></i>{{minor_violations}}&nbsp;
+ {{/if}}
+ {{#if info_violations}}
+ <i class="icon-severity-info"></i>{{info_violations}}&nbsp;
+ {{/if}}
+ </dd>
+ </dl>
+ {{/with}}
+ {{/if}}
+ </li>
+ {{/if}}
+ {{#if settings.coverage}}
+ <li class="component-viewer-measures-section brief">
+ {{#if component.coverageMeasures}}
+ <dl>
+ {{#each component.coverageMeasures}}
+ <dt>{{t 'metric' key 'name'}}</dt><dd>{{frmt_val}}</dd>
+ {{/each}}
+ </dl>
+ {{/if}}
+ </li>
+ {{/if}}
+ <li class="component-viewer-measures-section">
+ </li>
+ </ul>
+ </th>
+ </tr>
</thead>
<tbody>
<tr class="row" data-line-number="0">
diff --git a/sonar-server/src/main/js/issues/extra.js b/sonar-server/src/main/js/issues/extra.js
index b2e3c025e79..a9c8069819a 100644
--- a/sonar-server/src/main/js/issues/extra.js
+++ b/sonar-server/src/main/js/issues/extra.js
@@ -180,8 +180,11 @@ define(
componentViewer.open(that.model.get('component')).done(function() {
componentViewer.showIssues([that.model.toJSON()], true);
- var top = componentViewer.$('.code-issues:first').closest('tr').position().top;
- jQuery('.navigator-details').scrollTop(top - 40);
+ var row = componentViewer.$('.code-issue:first').closest('.row');
+ if (row.data('line-number') > 0) {
+ var top = row.position().top;
+ jQuery('.navigator-details').scrollTop(top - 40);
+ }
});
};
diff --git a/sonar-server/src/main/less/component-viewer.less b/sonar-server/src/main/less/component-viewer.less
index 03d66e988da..6f1d21d59e2 100644
--- a/sonar-server/src/main/less/component-viewer.less
+++ b/sonar-server/src/main/less/component-viewer.less
@@ -95,6 +95,7 @@
}
&.settings-toggle {
+ vertical-align: top;
border-right: 1px solid @barBorderColor;
text-align: center;
white-space: nowrap;
@@ -127,6 +128,7 @@
.sources2 .lid {
min-width: 18px;
+ padding-left: 10px;
padding-right: 10px;
}
@@ -134,6 +136,13 @@
cursor: pointer;
}
+ .sources2 .measures {
+ padding: 4px 5px;
+ border-left: 1px solid @barBorderColor;
+ border-bottom: 1px solid @barBorderColor;
+ background-color: @barBackgroundColor;
+ }
+
.sources2 .issue pre {
background-color: #ff9090;
}
@@ -172,6 +181,44 @@
}
+.component-viewer-measures {
+ font-size: 0;
+}
+
+.component-viewer-measures-section {
+ display: inline-block;
+ vertical-align: top;
+ width: 25%;
+ max-width: 260px;
+ padding-right: 40px;
+ .box-sizing(border-box);
+ font-size: @baseFontSize;
+
+ &.brief {
+ dt { display: none; }
+ dt:first-of-type { display: block; }
+ dd { display: none; }
+ dd:first-of-type { display: block; }
+ }
+
+ &:not(.brief) {
+ padding-top: 3px;
+ padding-bottom: 3px;
+ }
+
+ dt {
+ float: left;
+ clear: left;
+ }
+
+ dd {
+ float: right;
+ font-weight: bold;
+ }
+}
+
+
+
@popupArrowSize: 8px;
.component-viewer-popup {
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 c30a3ecbef0..d09c9d319c3 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
@@ -208,6 +208,36 @@
'severity.CRITICAL': '<%= escape_javascript message('severity.CRITICAL') -%>',
'severity.MAJOR': '<%= escape_javascript message('severity.MAJOR') -%>',
'severity.MINOR': '<%= escape_javascript message('severity.MINOR') -%>',
- 'severity.INFO': '<%= escape_javascript message('severity.INFO') -%>'
+ 'severity.INFO': '<%= escape_javascript message('severity.INFO') -%>',
+
+ 'metric.accessors.name': '<%= escape_javascript message('metric.accessors.name') -%>',
+ 'metric.alert_status.name': '<%= escape_javascript message('metric.alert_status.name') -%>',
+ 'metric.classes.name': '<%= escape_javascript message('metric.classes.name') -%>',
+ 'metric.comment_blank_lines.name': '<%= escape_javascript message('metric.comment_blank_lines.name') -%>',
+ 'metric.comment_lines.name': '<%= escape_javascript message('metric.comment_lines.name') -%>',
+ 'metric.comment_lines_density.name': '<%= escape_javascript message('metric.comment_lines_density.name') -%>',
+ 'metric.commented_out_code_lines.name': '<%= escape_javascript message('metric.commented_out_code_lines.name') -%>',
+ 'metric.complexity.name': '<%= escape_javascript message('metric.complexity.name') -%>',
+ 'metric.directories.name': '<%= escape_javascript message('metric.directories.name') -%>',
+ 'metric.files.name': '<%= escape_javascript message('metric.files.name') -%>',
+ 'metric.functions.name': '<%= escape_javascript message('metric.functions.name') -%>',
+ 'metric.generated_lines.name': '<%= escape_javascript message('metric.generated_lines.name') -%>',
+ 'metric.generated_ncloc.name': '<%= escape_javascript message('metric.generated_ncloc.name') -%>',
+ 'metric.lines.name': '<%= escape_javascript message('metric.lines.name') -%>',
+ 'metric.ncloc.name': '<%= escape_javascript message('metric.ncloc.name') -%>',
+ 'metric.packages.name': '<%= escape_javascript message('metric.packages.name') -%>',
+ 'metric.public_api.name': '<%= escape_javascript message('metric.public_api.name') -%>',
+ 'metric.public_documented_api_density.name': '<%= escape_javascript message('metric.public_documented_api_density.name') -%>',
+ 'metric.public_undocumented_api.name': '<%= escape_javascript message('metric.public_undocumented_api.name') -%>',
+ 'metric.statements.name': '<%= escape_javascript message('metric.statements.name') -%>',
+ 'metric.class_complexity.name': '<%= escape_javascript message('metric.class_complexity.name') -%>',
+ 'metric.function_complexity.name': '<%= escape_javascript message('metric.function_complexity.name') -%>',
+ 'metric.file_complexity.name': '<%= escape_javascript message('metric.file_complexity.name') -%>',
+ 'metric.class_complexity_distribution.name': '<%= escape_javascript message('metric.class_complexity_distribution.name') -%>',
+ 'metric.function_complexity_distribution.name': '<%= escape_javascript message('metric.function_complexity_distribution.name') -%>',
+ 'metric.file_complexity_distribution.name': '<%= escape_javascript message('metric.file_complexity_distribution.name') -%>',
+ 'metric.coverage.name': '<%= escape_javascript message('metric.coverage.name') -%>',
+ 'metric.line_coverage.name': '<%= escape_javascript message('metric.line_coverage.name') -%>',
+ 'metric.branch_coverage.name': '<%= escape_javascript message('metric.branch_coverage.name') -%>'
};
</script>