]> source.dussan.org Git - sonarqube.git/commitdiff
Component Viewer: header
authorStas Vilchik <vilchiks@gmail.com>
Fri, 25 Apr 2014 11:01:21 +0000 (17:01 +0600)
committerStas Vilchik <vilchiks@gmail.com>
Fri, 25 Apr 2014 11:01:35 +0000 (17:01 +0600)
sonar-server/src/main/coffee/component-viewer/main.coffee
sonar-server/src/main/coffee/component-viewer/source.coffee
sonar-server/src/main/hbs/component-viewer/source.hbs
sonar-server/src/main/js/issues/extra.js
sonar-server/src/main/less/component-viewer.less
sonar-server/src/main/webapp/WEB-INF/app/views/issues/search.html.erb

index 4d55a066ebb69596dfca7e657b3d06cb74148cbe..5601a7b88d1942120a13878fd2f39c090ac0710b 100644 (file)
@@ -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()
index 72f7c7e7b14158e80deeb4559c16540e9274811e..74b37753166822e77b6db9fef3c1d778d8dfced1 100644 (file)
@@ -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
index 53c30e18648a7899a039f227c2d4d7c9d2437407..c6372ef5da1c4e448a5893564c64780788af14e5 100644 (file)
@@ -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>
       {{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">
index b2e3c025e791f138e034e3a6c3dc21070db6647e..a9c8069819a8f11f40c06f73cfde29a98396c61f 100644 (file)
@@ -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);
+                  }
                 });
               };
 
index 03d66e988da37b36bce788dbf49d2a5f0d3440b3..6f1d21d59e2c6f25030a6b19d6fd22069a69d6c2 100644 (file)
@@ -95,6 +95,7 @@
     }
 
     &.settings-toggle {
+      vertical-align: top;
       border-right: 1px solid @barBorderColor;
       text-align: center;
       white-space: nowrap;
 
   .sources2 .lid {
     min-width: 18px;
+    padding-left: 10px;
     padding-right: 10px;
   }
 
     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;
   }
 }
 
 
+.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 {
index c30a3ecbef0428680343d9fc28b9bc0fc469c955..d09c9d319c3c0d4364d589639a37ee4e27ed1c09 100644 (file)
     '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>