]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5209 Handle corner cases
authorStas Vilchik <vilchiks@gmail.com>
Thu, 19 Jun 2014 12:19:45 +0000 (18:19 +0600)
committerStas Vilchik <vilchiks@gmail.com>
Thu, 19 Jun 2014 12:52:26 +0000 (18:52 +0600)
14 files changed:
sonar-server/src/main/coffee/component-viewer/extensions-popup.coffee
sonar-server/src/main/coffee/component-viewer/header.coffee
sonar-server/src/main/coffee/component-viewer/main.coffee
sonar-server/src/main/coffee/component-viewer/mixins/main-duplications.coffee
sonar-server/src/main/coffee/component-viewer/mixins/main-issues.coffee
sonar-server/src/main/coffee/component-viewer/source.coffee
sonar-server/src/main/coffee/component-viewer/utils.coffee
sonar-server/src/main/hbs/component-viewer/header.hbs
sonar-server/src/main/hbs/component-viewer/header/coverage-header.hbs
sonar-server/src/main/hbs/component-viewer/header/duplications-header.hbs
sonar-server/src/main/hbs/component-viewer/header/issues-header.hbs
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

index fbe48909ee271267e6d8bf1958b82b4cc5a4b3f2..01701107e8a49dbe5dde568c0e348e72008d9087 100644 (file)
@@ -20,6 +20,7 @@ define [
 
 
     showExtension: (e) ->
+      e.preventDefault()
       key = $(e.currentTarget).data 'key'
       @trigger 'extension', key
 
index 729ee5086499cbeea8c97e056b5f64c3cdbe5943..13c3a40488fb41e1ae69f9e7b0e70f795905fd96 100644 (file)
@@ -112,10 +112,11 @@ define [
 
 
     showExtension: (key) ->
-      @ui.expandedBar.html('<i class="spinner spinner-margin"></i>').addClass 'active'
+      bar = @ui.expandedBar
+      bar.html('<i class="spinner spinner-margin"></i>').addClass 'active'
       @ui.expandLinks.removeClass 'active'
       $.get API_EXTENSION, id: @options.main.component.get('key'), tab: key, (r) =>
-        @ui.expandedBar.html r
+        bar.html r
 
 
     closeExtension: ->
index 7b38f0fb8a1c5536c39cb779e5d7f5fac0e92e53..891acfbcf0f0b52366b42fe3384339a003fab7c2 100644 (file)
@@ -132,7 +132,8 @@ define [
         # Component
         @component.clear() if clear
         COMPONENT_FIELDS.forEach (f) => @component.set f, data[f]
-        @component.set 'dir', utils.splitLongName(data.path).dir
+        if data.path?
+          @component.set 'dir', utils.splitLongName(data.path).dir
         @component.set 'isUnitTest', data.q == 'UTS'
 
 
@@ -217,15 +218,22 @@ define [
       source = @requestSource key
       component = @requestComponent key
       @currentIssue = null
-      $.when(source, component).done =>
+      component.done =>
         @workspace.where(key: key).forEach (model) =>
           model.set 'component': @component.toJSON()
+        @state.set 'removed', false
+        source.always =>
+          @state.set 'hasSource', (source.status != 404)
+          @render()
+          @showAllLines() if showFullSource
+          if @settings.get('issues') then @showIssues() else @hideIssues()
+          if @settings.get('coverage') then @showCoverage() else @hideCoverage()
+          if @settings.get('duplications') then @showDuplications() else @hideDuplications()
+          if @settings.get('scm') then @showSCM() else @hideSCM()
+      .fail =>
+        @state.set 'removed', true
+        @state.set 'hasSource', false
         @render()
-        @showAllLines() if showFullSource
-        if @settings.get('issues') then @showIssues() else @hideIssues()
-        if @settings.get('coverage') then @showCoverage() else @hideCoverage()
-        if @settings.get('duplications') then @showDuplications() else @hideDuplications()
-        if @settings.get('scm') then @showSCM() else @hideSCM()
 
 
     toggleWorkspace: (store = false) ->
index 15c651fc44d7cfd727109bc7a85b033e01a3ea35..7dbbe896c83dba8827c52c29f2dbcf617d9fc322 100644 (file)
@@ -18,6 +18,7 @@ define [], () ->
 
     augmentWithDuplications: (duplications) ->
       formattedSource = @source.get 'formattedSource'
+      return unless formattedSource
       formattedSource.forEach (line) ->
         lineDuplications = []
         duplications.forEach (d, i) ->
index b60f4ca27be152bbc5ab45f32f19816ec3399e80..eb3fdcd007a415f2b46d7f1dae7bbfb4053ec84f 100644 (file)
@@ -61,7 +61,10 @@ define [
       @sourceView.resetShowBlocks()
       issues.forEach (issue) =>
         line = issue.line || 0
-        @sourceView.addShowBlock line - LINES_AROUND_ISSUE, line + LINES_AROUND_ISSUE, line == 0
+        if issue.resolution == 'FIXED' || issue.resolution == 'REMOVED'
+          @sourceView.addShowBlock 0, 0, true
+        else
+          @sourceView.addShowBlock line - LINES_AROUND_ISSUE, line + LINES_AROUND_ISSUE, line == 0
       @sourceView.render()
 
 
@@ -86,7 +89,10 @@ define [
       issues.forEach (issue) =>
         if predicate issue
           line = issue.line || 0
-          @sourceView.addShowBlock line - LINES_AROUND_ISSUE, line + LINES_AROUND_ISSUE, line == 0
+          if issue.resolution == 'FIXED' || issue.resolution == 'REMOVED'
+            @sourceView.addShowBlock 0, 0, true
+          else
+            @sourceView.addShowBlock line - LINES_AROUND_ISSUE, line + LINES_AROUND_ISSUE, line == 0
           activeIssues.push issue
       @source.set 'activeIssues', activeIssues
       @sourceView.render()
index 2420985c1fc45e331cdc921f3393d8a13e46c051..7eae208323d3d963b60c8d993ec1bea1b8637712 100644 (file)
@@ -37,7 +37,7 @@ define [
     events:
       'click .sym': 'highlightUsages'
 
-      'click .lid': 'highlightLine'
+      'click .js-line-actions': 'highlightLine'
 
       'click .coverage-tests': 'showCoveragePopup'
 
@@ -101,6 +101,7 @@ define [
       issues = @model.get 'activeIssues'
       issues.forEach (issue) =>
         line = issue.line || 0
+        line = 0 if issue.resolution == 'FIXED' || issue.resolution == 'REMOVED'
         row = @$("[data-line-number=#{line}]")
         if row.length > 0
           row.removeClass 'row-hidden'
index d2bdb1f00bf496e7ac62f47dfc9e91d47577f398..46d6379cf078f41fe09511eb79c788911e7b6cde 100644 (file)
@@ -2,6 +2,8 @@ define ->
 
   splitLongName: (longName) ->
     lastSeparator = longName.lastIndexOf '/'
+    if lastSeparator == -1
+      lastSeparator = longName.lastIndexOf '.'
     dir: longName.substr 0, lastSeparator
     name: longName.substr lastSeparator + 1
 
index c1eaf500d2ef88f0eb00fbeb7b410b1cea5567a8..99a36d1fbdfe59f99b917fec00eb2997be64edb7 100644 (file)
 <div class="component-viewer-header-bar">
   <div class="component-viewer-header-component">
-    {{#if component.projectName}}
-      <div class="component-viewer-header-component-project">
-        {{qualifierIcon 'TRK'}}
-        <a class="link-action" href="{{dashboardUrl component.project}}">{{component.projectName}}</a>
-        {{#if component.subProjectName}}
-          / <a class="link-action" href="{{dashboardUrl component.subProject}}">{{component.subProjectName}}</a>
-        {{/if}}
-      </div>
-    {{/if}}
-
-    <div class="component-viewer-header-component-name">
-      {{qualifierIcon component.q}} {{component.path}}
-
-      {{#if state.canMarkAsFavourite}}
-        <a class="js-favorite component-viewer-header-favorite"
-           title="{{#if component.fav}}{{t 'click_to_remove_from_favorites'}}{{else}}{{t 'click_to_add_to_favorites'}}{{/if}}">
-          <i class="{{#if component.fav}}icon-favorite{{else}}icon-not-favorite{{/if}}"></i>
-        </a>
+    {{#unless state.removed}}
+      {{#if component.projectName}}
+        <div class="component-viewer-header-component-project">
+          {{qualifierIcon 'TRK'}}
+          <a class="link-action" href="{{dashboardUrl component.project}}">{{component.projectName}}</a>
+          {{#if component.subProjectName}}
+            / <a class="link-action" href="{{dashboardUrl component.subProject}}">{{component.subProjectName}}</a>
+          {{/if}}
+        </div>
       {{/if}}
-    </div>
-  </div>
 
-  <div class="component-viewer-header-links">
-    <a><i class="icon-link"></i></a>
-    {{#ifNotEmpty state.extensions}}
-      <a class="js-extensions">
-        <i class="icon-extension"></i>
-        <i class="icon-dropdown"></i>
-      </a>
-    {{/ifNotEmpty}}
-  </div>
+      <div class="component-viewer-header-component-name">
+        {{qualifierIcon component.q}} {{default component.path component.name}}
 
-  <div class="component-viewer-header-measures">
-    {{#if component.isUnitTest}}
-      <div class="component-viewer-header-measures-scope">
-        <a data-scope="tests" class="component-viewer-header-measures-expand">
-          <div class="component-viewer-header-measure">
-            <span class="component-viewer-header-measure-value">{{component.measures.fTests}}</span>
-            <span class="component-viewer-header-measure-label">{{t 'metric.tests.name'}}</span>
-          </div>
-          <i class="icon-dropdown"></i>
-        </a>
+        {{#if state.canMarkAsFavourite}}
+          <a class="js-favorite component-viewer-header-favorite"
+             title="{{#if component.fav}}{{t 'click_to_remove_from_favorites'}}{{else}}{{t 'click_to_add_to_favorites'}}{{/if}}">
+            <i class="{{#if component.fav}}icon-favorite{{else}}icon-not-favorite{{/if}}"></i>
+          </a>
+        {{/if}}
       </div>
-    {{/if}}
+    {{else}}
+    <div class="component-viewer-header-component-project removed">Removed</div>
+    {{/unless}}
+  </div>
 
-    {{#unless component.isUnitTest}}
-      <div class="component-viewer-header-measures-scope">
-        <span data-scope="basic" class="js-toggle-coverage component-viewer-header-measures-toggle-scope inactive"></span>
-        <a data-scope="basic" class="component-viewer-header-measures-expand">
-          <div class="component-viewer-header-measure">
-            <span class="component-viewer-header-measure-value">{{default component.measures.fNcloc '–'}}</span>
-            <span class="component-viewer-header-measure-label">{{t 'metric.ncloc.name'}}</span>
-          </div>
+  {{#unless state.removed}}
+    <div class="component-viewer-header-links">
+      <a><i class="icon-link"></i></a>
+      {{#ifNotEmpty state.extensions}}
+        <a class="js-extensions">
+          <i class="icon-extension"></i>
           <i class="icon-dropdown"></i>
         </a>
-      </div>
-    {{/unless}}
+      {{/ifNotEmpty}}
+    </div>
 
-    <div class="component-viewer-header-measures-scope">
-      <a data-scope="issues" class="component-viewer-header-measures-expand">
-          <div class="component-viewer-header-measure">
-            <span class="component-viewer-header-measure-value">{{default component.measures.fDebt '–'}}</span>
-            <span class="component-viewer-header-measure-label">{{t 'component_viewer.header.debt'}}</span>
-          </div>
-        {{#if component.measures.fIssues}}
-          <div class="component-viewer-header-measure">
-            <span class="component-viewer-header-measure-value">{{component.measures.fIssues}}</span>
-            <span class="component-viewer-header-measure-label">{{t 'metric.violations.name'}}</span>
-          </div>
-        {{/if}}
-        {{#if component.measures.fIssues}}
-          <div class="component-viewer-header-measure">
-            <div class="component-viewer-header-measure-issues">
-              <div class="component-viewer-header-measure-issue s-blocker"
-                   style="width: {{percent component.measures.fBlockerIssues component.measures.maxIssues}};"></div>
-              <div class="component-viewer-header-measure-issue s-critical"
-                   style="width: {{percent component.measures.fCriticalIssues component.measures.maxIssues}};"></div>
-              <div class="component-viewer-header-measure-issue s-major"
-                   style="width: {{percent component.measures.fMajorIssues component.measures.maxIssues}};"></div>
-              <div class="component-viewer-header-measure-issue s-minor"
-                   style="width: {{percent component.measures.fMinorIssues component.measures.maxIssues}};"></div>
-              <div class="component-viewer-header-measure-issue s-info"
-                   style="width: {{percent component.measures.fInfoIssues component.measures.maxIssues}};"></div>
+    <div class="component-viewer-header-measures">
+      {{#if component.isUnitTest}}
+        <div class="component-viewer-header-measures-scope">
+          <a data-scope="tests" class="component-viewer-header-measures-expand">
+            <div class="component-viewer-header-measure">
+              <span class="component-viewer-header-measure-value">{{component.measures.fTests}}</span>
+              <span class="component-viewer-header-measure-label">{{t 'metric.tests.name'}}</span>
             </div>
-          </div>
-        {{/if}}
-        <i class="icon-dropdown"></i>
-      </a>
-      <a data-scope="issues" title="{{t 'component_viewer.header.toggle_issues'}}"
-         class="js-toggle-issues component-viewer-header-measures-toggle-scope {{#if settings.issues}}active{{/if}}"></a>
-    </div>
+            <i class="icon-dropdown"></i>
+          </a>
+        </div>
+      {{/if}}
 
-    {{#inArray state.tabs 'coverage'}}
-      <div class="component-viewer-header-measures-scope">
-        <a data-scope="coverage" class="component-viewer-header-measures-expand">
+      {{#unless component.isUnitTest}}
+        <div class="component-viewer-header-measures-scope">
+          <span data-scope="basic" class="js-toggle-coverage component-viewer-header-measures-toggle-scope inactive"></span>
+          <a data-scope="basic" class="component-viewer-header-measures-expand">
             <div class="component-viewer-header-measure">
-              <span class="component-viewer-header-measure-value">{{default component.measures.fCoverage '–'}}</span>
-              <span class="component-viewer-header-measure-label">{{t 'metric.coverage.name'}}</span>
+              <span class="component-viewer-header-measure-value">{{default component.measures.fNcloc '–'}}</span>
+              <span class="component-viewer-header-measure-label">{{t 'metric.ncloc.name'}}</span>
             </div>
-          <i class="icon-dropdown"></i>
-        </a>
-        <a data-scope="coverage" title="{{t 'component_viewer.header.toggle_coverage'}}"
-           class="js-toggle-coverage component-viewer-header-measures-toggle-scope {{#if settings.coverage}}active{{/if}}"></a>
-      </div>
-    {{/inArray}}
+            <i class="icon-dropdown"></i>
+          </a>
+        </div>
+      {{/unless}}
 
-    {{#inArray state.tabs 'duplications'}}
       <div class="component-viewer-header-measures-scope">
-        <a data-scope="duplications" class="component-viewer-header-measures-expand">
+        <a data-scope="issues" class="component-viewer-header-measures-expand">
+            <div class="component-viewer-header-measure">
+              <span class="component-viewer-header-measure-value">{{default component.measures.fDebt '–'}}</span>
+              <span class="component-viewer-header-measure-label">{{t 'component_viewer.header.debt'}}</span>
+            </div>
+          {{#if component.measures.fIssues}}
+            <div class="component-viewer-header-measure">
+              <span class="component-viewer-header-measure-value">{{component.measures.fIssues}}</span>
+              <span class="component-viewer-header-measure-label">{{t 'metric.violations.name'}}</span>
+            </div>
+          {{/if}}
+          {{#if component.measures.fIssues}}
             <div class="component-viewer-header-measure">
-              <span class="component-viewer-header-measure-value">{{default component.measures.fDuplicationDensity '–'}}</span>
-              <span class="component-viewer-header-measure-label">{{t 'metric.duplicated_lines_density.name'}}</span>
+              <div class="component-viewer-header-measure-issues">
+                <div class="component-viewer-header-measure-issue s-blocker"
+                     style="width: {{percent component.measures.fBlockerIssues component.measures.maxIssues}};"></div>
+                <div class="component-viewer-header-measure-issue s-critical"
+                     style="width: {{percent component.measures.fCriticalIssues component.measures.maxIssues}};"></div>
+                <div class="component-viewer-header-measure-issue s-major"
+                     style="width: {{percent component.measures.fMajorIssues component.measures.maxIssues}};"></div>
+                <div class="component-viewer-header-measure-issue s-minor"
+                     style="width: {{percent component.measures.fMinorIssues component.measures.maxIssues}};"></div>
+                <div class="component-viewer-header-measure-issue s-info"
+                     style="width: {{percent component.measures.fInfoIssues component.measures.maxIssues}};"></div>
+              </div>
             </div>
+          {{/if}}
           <i class="icon-dropdown"></i>
         </a>
-        <a data-scope="duplications" title="{{t 'component_viewer.header.toggle_duplications'}}"
-           class="js-toggle-duplications component-viewer-header-measures-toggle-scope {{#if settings.duplications}}active{{/if}}"></a>
+        <a data-scope="issues" title="{{t 'component_viewer.header.toggle_issues'}}"
+           class="js-toggle-issues component-viewer-header-measures-toggle-scope {{#if settings.issues}}active{{/if}}"></a>
       </div>
-    {{/inArray}}
 
-    {{#inArray state.tabs 'scm'}}
-      <div class="component-viewer-header-measures-scope">
-        <a data-scope="scm" class="component-viewer-header-measures-expand">
-          <div class="component-viewer-header-measure">
-            <span class="component-viewer-header-measure-value"><i class="icon-calendar"></i></span>
-            <span class="component-viewer-header-measure-label">SCM</span>
-          </div>
-          <i class="icon-dropdown"></i>
-        </a>
-        <a data-scope="scm" title="{{t 'component_viewer.header.toggle_scm'}}"
-           class="js-toggle-scm component-viewer-header-measures-toggle-scope {{#if settings.scm}}active{{/if}}"></a>
-      </div>
-    {{/inArray}}
-  </div>
+      {{#inArray state.tabs 'coverage'}}
+        <div class="component-viewer-header-measures-scope">
+          <a data-scope="coverage" class="component-viewer-header-measures-expand">
+              <div class="component-viewer-header-measure">
+                <span class="component-viewer-header-measure-value">{{default component.measures.fCoverage '–'}}</span>
+                <span class="component-viewer-header-measure-label">{{t 'metric.coverage.name'}}</span>
+              </div>
+            <i class="icon-dropdown"></i>
+          </a>
+          <a data-scope="coverage" title="{{t 'component_viewer.header.toggle_coverage'}}"
+             class="js-toggle-coverage component-viewer-header-measures-toggle-scope {{#if settings.coverage}}active{{/if}}"></a>
+        </div>
+      {{/inArray}}
+
+      {{#inArray state.tabs 'duplications'}}
+        <div class="component-viewer-header-measures-scope">
+          <a data-scope="duplications" class="component-viewer-header-measures-expand">
+              <div class="component-viewer-header-measure">
+                <span class="component-viewer-header-measure-value">{{default component.measures.fDuplicationDensity '–'}}</span>
+                <span class="component-viewer-header-measure-label">{{t 'metric.duplicated_lines_density.name'}}</span>
+              </div>
+            <i class="icon-dropdown"></i>
+          </a>
+          <a data-scope="duplications" title="{{t 'component_viewer.header.toggle_duplications'}}"
+             class="js-toggle-duplications component-viewer-header-measures-toggle-scope {{#if settings.duplications}}active{{/if}}"></a>
+        </div>
+      {{/inArray}}
+
+      {{#inArray state.tabs 'scm'}}
+        <div class="component-viewer-header-measures-scope">
+          <a data-scope="scm" class="component-viewer-header-measures-expand">
+            <div class="component-viewer-header-measure">
+              <span class="component-viewer-header-measure-value"><i class="icon-calendar"></i></span>
+              <span class="component-viewer-header-measure-label">SCM</span>
+            </div>
+            <i class="icon-dropdown"></i>
+          </a>
+          <a data-scope="scm" title="{{t 'component_viewer.header.toggle_scm'}}"
+             class="js-toggle-scm component-viewer-header-measures-toggle-scope {{#if settings.scm}}active{{/if}}"></a>
+        </div>
+      {{/inArray}}
+    </div>
+  {{/unless}}
 </div>
 
 <div class="component-viewer-header-expanded-bar"></div>
\ No newline at end of file
index f2b084d9c2b43f2c7cbdf3048d8c4b200f2a28fe..f43fcf32b12298b8bb43043315d0d32cb70238e7 100644 (file)
@@ -1,8 +1,10 @@
-<div class="component-viewer-header-time-changes">
-  <a class="highlighted-link js-coverage-time-changes">
-    {{#if period}}Δ {{period.label}}{{else}}<i class="icon-period"></i> {{t 'component_viewer.time_changes'}}{{/if}}
-  </a>
-</div>
+{{#if state.hasSource}}
+  <div class="component-viewer-header-time-changes">
+    <a class="highlighted-link js-coverage-time-changes">
+      {{#if period}}Δ {{period.label}}{{else}}<i class="icon-period"></i> {{t 'component_viewer.time_changes'}}{{/if}}
+    </a>
+  </div>
+{{/if}}
 
 {{#with component.measures}}
   {{#any coverage line_coverage lines_to_cover covered_lines uncovered_lines branch_coverage conditions_to_cover covered_conditions uncovered_conditions it_coverage it_line_coverage it_lines_to_cover it_covered_lines it_uncovered_lines it_branch_coverage it_conditions_to_cover it_covered_conditions it_uncovered_conditions}}
         <ul class="component-viewer-header-expanded-bar-section-list">
           {{{componentViewerHeaderItem coverage 'coverage'}}}
           {{{componentViewerHeaderItem line_coverage 'line_coverage'}}}
-          {{{componentViewerHeaderLink lines_to_cover 'lines_to_cover' 'js-filter-lines-to-cover'}}}
-          {{{componentViewerHeaderLink uncovered_lines 'uncovered_lines' 'js-filter-uncovered-lines'}}}
+          {{#if ../../state.hasSource}}
+            {{{componentViewerHeaderLink lines_to_cover 'lines_to_cover' 'js-filter-lines-to-cover'}}}
+            {{{componentViewerHeaderLink uncovered_lines 'uncovered_lines' 'js-filter-uncovered-lines'}}}
+          {{else}}
+            {{{componentViewerHeaderItem lines_to_cover 'lines_to_cover'}}}
+            {{{componentViewerHeaderItem uncovered_lines 'uncovered_lines'}}}
+          {{/if}}
         </ul>
       </div>
     {{/any}}
             <li><span class="item">&nbsp;</span></li>
           {{/any}}
           {{{componentViewerHeaderItem branch_coverage 'branch_coverage'}}}
-          {{{componentViewerHeaderLink conditions_to_cover 'conditions_to_cover' 'js-filter-branches-to-cover'}}}
-          {{{componentViewerHeaderLink uncovered_conditions 'uncovered_conditions' 'js-filter-uncovered-branches'}}}
+          {{#if ../../state.hasSource}}
+            {{{componentViewerHeaderLink conditions_to_cover 'conditions_to_cover' 'js-filter-branches-to-cover'}}}
+            {{{componentViewerHeaderLink uncovered_conditions 'uncovered_conditions' 'js-filter-uncovered-branches'}}}
+          {{else}}
+            {{{componentViewerHeaderItem conditions_to_cover 'conditions_to_cover'}}}
+            {{{componentViewerHeaderItem uncovered_conditions 'uncovered_conditions'}}}
+          {{/if}}
         </ul>
       </div>
     {{/any}}
         <ul class="component-viewer-header-expanded-bar-section-list">
           {{{componentViewerHeaderItem it_coverage 'coverage'}}}
           {{{componentViewerHeaderItem it_line_coverage 'line_coverage'}}}
-          {{{componentViewerHeaderLink it_lines_to_cover 'lines_to_cover' 'js-filter-lines-to-cover-it'}}}
-          {{{componentViewerHeaderLink it_uncovered_lines 'uncovered_lines' 'js-filter-uncovered-lines-it'}}}
+          {{#if ../../state.hasSource}}
+            {{{componentViewerHeaderLink it_lines_to_cover 'lines_to_cover' 'js-filter-lines-to-cover-it'}}}
+            {{{componentViewerHeaderLink it_uncovered_lines 'uncovered_lines' 'js-filter-uncovered-lines-it'}}}
+          {{else}}
+            {{{componentViewerHeaderItem it_lines_to_cover 'lines_to_cover'}}}
+            {{{componentViewerHeaderItem it_uncovered_lines 'uncovered_lines'}}}
+          {{/if}}
         </ul>
       </div>
     {{/any}}
               <li><span class="item">&nbsp;</span></li>
           {{/any}}
           {{{componentViewerHeaderItem it_branch_coverage 'branch_coverage'}}}
-          {{{componentViewerHeaderLink it_conditions_to_cover 'conditions_to_cover' 'js-filter-branches-to-cover-it'}}}
-          {{{componentViewerHeaderLink it_uncovered_conditions 'uncovered_conditions' 'js-filter-uncovered-branches-it'}}}
+          {{#if ../../state.hasSource}}
+            {{{componentViewerHeaderLink it_conditions_to_cover 'conditions_to_cover' 'js-filter-branches-to-cover-it'}}}
+            {{{componentViewerHeaderLink it_uncovered_conditions 'uncovered_conditions' 'js-filter-uncovered-branches-it'}}}
+          {{else}}
+            {{{componentViewerHeaderItem it_conditions_to_cover 'conditions_to_cover'}}}
+            {{{componentViewerHeaderItem it_uncovered_conditions 'uncovered_conditions'}}}
+          {{/if}}
         </ul>
       </div>
     {{/any}}
index b0ffccc3a570c7b37a59d50eb13314db37b22950..f6f599f97fef90f553a206413d0f33d9715d98e3 100644 (file)
@@ -2,7 +2,11 @@
   <div class="component-viewer-header-expanded-bar-section">
     <div class="component-viewer-header-expanded-bar-section-title">{{t 'duplications'}}</div>
     <ul class="component-viewer-header-expanded-bar-section-list">
-      {{{componentViewerHeaderLink duplicated_blocks 'duplicated_blocks' 'js-filter-duplications'}}}
+      {{#if ../state.hasSource}}
+        {{{componentViewerHeaderLink duplicated_blocks 'duplicated_blocks' 'js-filter-duplications'}}}
+      {{else}}
+        {{{componentViewerHeaderItem duplicated_blocks 'duplicated_blocks'}}}
+      {{/if}}
       {{{componentViewerHeaderItem duplicated_lines 'duplicated_lines'}}}
     </ul>
   </div>
index 3a6236b677944dfe3e679e74e02eac2650277824..adf29fcb868e7ed4550bfd7cc4e67a7a4cd178e2 100644 (file)
@@ -1,8 +1,10 @@
-<div class="component-viewer-header-time-changes">
-  <a class="highlighted-link js-issues-time-changes">
-    {{#if period}}{{t 'component_viewer.added'}} {{period.label}}{{else}}<i class="icon-period"></i> {{t 'component_viewer.time_changes'}}{{/if}}
-  </a>
-</div>
+{{#if state.hasSource}}
+  <div class="component-viewer-header-time-changes">
+    <a class="highlighted-link js-issues-time-changes">
+      {{#if period}}{{t 'component_viewer.added'}} {{period.label}}{{else}}<i class="icon-period"></i> {{t 'component_viewer.time_changes'}}{{/if}}
+    </a>
+  </div>
+{{/if}}
 
 {{#ifNotEmpty state.severities}}
   <div class="component-viewer-header-expanded-bar-section">
     </div>
     <ul class="component-viewer-header-expanded-bar-section-list">
       {{#each state.severities}}
-        <li><a class="item js-filter-{{key}}-issues">
-          <span>{{severityIcon key}} {{name}}</span>
-          <span class="number">{{count}}</span>
-          <i class="icon-chevron-right"></i>
-        </a></li>
+        {{#if ../../state.hasSource}}
+          <li><a class="item js-filter-{{key}}-issues">
+            <span>{{severityIcon key}} {{name}}</span>
+            <span class="number">{{count}}</span>
+            <i class="icon-chevron-right"></i>
+          </a></li>
+        {{else}}
+          <li><span class="item">
+            <span>{{severityIcon key}} {{name}}</span>
+            <span class="number">{{count}}</span>
+          </span></li>
+        {{/if}}
       {{/each}}
     </ul>
   </div>
     </div>
     <ul class="component-viewer-header-expanded-bar-section-list">
       {{#each state.rules}}
-        <li><a class="item js-filter-rule" data-rule="{{key}}" title="{{name}}">
-          <span>{{name}}</span>
-          <span class="number">{{count}}</span>
-          <i class="icon-chevron-right"></i>
-        </a></li>
+        {{#if ../../state.hasSource}}
+          <li><a class="item js-filter-rule" data-rule="{{key}}" title="{{name}}">
+            <span>{{name}}</span>
+            <span class="number">{{count}}</span>
+            <i class="icon-chevron-right"></i>
+          </a></li>
+        {{else}}
+          <li><span class="item">
+            <span>{{name}}</span>
+            <span class="number">{{count}}</span>
+          </span></li>
+        {{/if}}
       {{/each}}
     </ul>
   </div>
         <i class="icon-chevron-right"></i>
       </a></li>
     {{/if}}
-    <li><a class="item js-filter-unresolved-issues">
-      <span>{{t 'component_viewer.issues.unresolved_issues'}}</span>
-      <i class="icon-chevron-right"></i>
-    </a></li>
-    <li><a class="item js-filter-fixed-issues">
-      <span>{{t 'component_viewer.issues.fixed_issues'}}</span>
-      <i class="icon-chevron-right"></i>
-    </a></li>
-    <li><a class="item js-filter-false-positive-issues">
-      <span>{{t 'component_viewer.issues.false_positive_issues'}}</span>
-      <span class="number">{{component.measures.false_positive_issues}}</span>
-      <i class="icon-chevron-right"></i>
-    </a></li>
+    {{#if state.hasSource}}
+      <li><a class="item js-filter-unresolved-issues">
+        <span>{{t 'component_viewer.issues.unresolved_issues'}}</span>
+        <i class="icon-chevron-right"></i>
+      </a></li>
+    {{/if}}
+    {{#if state.hasSource}}
+      <li><a class="item js-filter-fixed-issues">
+        <span>{{t 'component_viewer.issues.fixed_issues'}}</span>
+        <i class="icon-chevron-right"></i>
+      </a></li>
+    {{/if}}
+    {{#if state.hasSource}}
+      <li><a class="item js-filter-false-positive-issues">
+        <span>{{t 'component_viewer.issues.false_positive_issues'}}</span>
+        <span class="number">{{component.measures.false_positive_issues}}</span>
+        <i class="icon-chevron-right"></i>
+      </a></li>
+    {{else}}
+      {{#if component.measures.false_positive_issues}}
+        <li><span class="item">
+          <span>{{t 'component_viewer.issues.false_positive_issues'}}</span>
+          <span class="number">{{component.measures.false_positive_issues}}</span>
+        </span></li>
+      {{/if}}
+    {{/if}}
   </ul>
 </div>
 
index 25d0a4e3e3daee0ca3dbdf9b42d8c6f13e70cbfb..ba9fc1444ec75b682730a59d12faa563a2739d6b 100644 (file)
@@ -60,7 +60,7 @@
           </td>
         {{/if}}
 
-        <td class="stat lid">{{lineNumber}}</td>
+        <td class="stat lid js-line-actions">{{lineNumber}}</td>
 
         <td class="line"><pre>{{{code}}}</pre></td>
       </tr>
index bd1be25048a22bb402f750f0f1d765ef6b483fcc..073a8122876e5bf7f00bb98852a177c1f8b9f5bd 100644 (file)
@@ -156,7 +156,7 @@ define(
                 jQuery('.navigator-details').removeClass('navigator-fetching');
                 app.detailsRegion.show(componentViewer);
                 componentViewer.settings.set('issues', false);
-                componentViewer.open(that.model.get('component')).done(function() {
+                componentViewer.open(that.model.get('component')).always(function() {
                   componentViewer.showIssues(false, that.model.toJSON());
                 });
               };
index b90034eba1b4ad37c248531d9aca9252bba9fc5f..0a6c4d8fcc34e29626bba471849e0f302a3148e2 100644 (file)
 .component-viewer-header-component-project {
   color: #777;
   font-size: @smallFontSize;
+
+  &.removed { text-decoration: line-through; }
 }
 
 .component-viewer-header-component-name {