]> source.dussan.org Git - sonarqube.git/commitdiff
Component Viewer: new tooltips, workspace improvements
authorStas Vilchik <vilchiks@gmail.com>
Thu, 24 Apr 2014 07:35:28 +0000 (13:35 +0600)
committerStas Vilchik <vilchiks@gmail.com>
Thu, 24 Apr 2014 07:35:38 +0000 (13:35 +0600)
sonar-server/src/main/coffee/component-viewer/coverage-popup.coffee
sonar-server/src/main/coffee/component-viewer/main.coffee
sonar-server/src/main/coffee/component-viewer/workspace.coffee
sonar-server/src/main/hbs/component-viewer/coveragePopup.hbs
sonar-server/src/main/hbs/component-viewer/source.hbs
sonar-server/src/main/hbs/component-viewer/workspace.hbs
sonar-server/src/main/js/common/handlebars-extensions.js
sonar-server/src/main/less/component-viewer.less

index cc5ba87677cabf2b9e2d803222fafe700a2ee8c0..7623eebcd576360e4791827e8f39cb8ea93d5675 100644 (file)
@@ -20,7 +20,9 @@ define [
 
     onRender: ->
       @$el.detach().appendTo $('body')
-      @$el.css 'top', @options.triggerEl.offset().top
+      @$el.css
+        top: @options.triggerEl.offset().top
+        left: @options.triggerEl.offset().left + @options.triggerEl.outerWidth()
 
       $('body').on 'click.coverage-popup', =>
         $('body').off 'click.coverage-popup'
@@ -29,5 +31,29 @@ define [
 
     goToFile: (e) ->
       key = $(e.currentTarget).data 'key'
-      console.log key
-      @options.main.addTransition key, 'coverage'
+      test = $(e.currentTarget).data 'test'
+      @options.main.addTransition key, 'coverage', [
+        {
+          key: 'org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTreeTest.java'
+          name: 'forbidDuplicatedType'
+          subname: 'ResourceTypeTreeTest.java'
+          active: test == 'forbidDuplicatedType'
+        }
+        {
+          key: 'org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTreeTest.java'
+          name: 'forbidNullRelation'
+          subname: 'ResourceTypeTreeTest.java'
+          active: test == 'forbidNullRelation'
+        }
+        {
+          key: 'org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTest.java'
+          name: 'fail_on_duplicated_qualifier'
+          subname: 'ResourceTypeTest.java'
+          active: test == 'fail_on_duplicated_qualifier'
+        }
+      ], [
+        {
+          key: key,
+          name: test
+        }
+      ]
index 2471f3fa1ea3c083d0ba92cee5641d7aa26b382f..c92b1c74c36db32765a33b85cb52aea288a1f662 100644 (file)
@@ -40,7 +40,7 @@ define [
         model: @source
         main: @
 
-      @settings = new Backbone.Model issues: false, coverage: true, duplications: false
+      @settings = new Backbone.Model issues: false, coverage: true, duplications: false, scm: false
 
 
     onRender: ->
@@ -109,6 +109,16 @@ define [
       @sourceView.render()
 
 
-    addTransition: (key, transition) ->
-      @workspace.add key: key, transition: transition
+    addTransition: (key, transition, optionsForCurrent, options) ->
+      if optionsForCurrent?
+        last = @workspace.at(@workspace.length - 1)
+        last.set 'options', optionsForCurrent if last
+
+#      workspaceItem = @workspace.findWhere key: key
+#      if workspaceItem?
+#        @workspace.remove workspaceItem
+#        @workspace.add workspaceItem
+#      else
+      @workspace.add key: key, transition: transition, options: options
+
       @_open key
\ No newline at end of file
index 4eaf851fa7218baeb9c5330d277dfefb44abf854..ab7662452dff9342afee1c945d704c9d59dc83b7 100644 (file)
@@ -14,7 +14,8 @@ define [
 
 
     events:
-      'click .component-viewer-workspace-item [data-key]': 'goToWorkspaceItem'
+      'click .component-viewer-workspace-item > a[data-key]': 'goToWorkspaceItem'
+      'click .component-viewer-workspace-option > a[data-key]': 'goToWorkspaceOption'
 
 
     onRender: ->
@@ -30,6 +31,21 @@ define [
       @options.main.addTransition workspaceItem.get('key'), workspaceItem.get('transition')
 
 
+    goToWorkspaceOption: (e) ->
+      workspaceKey = $(e.currentTarget).data 'workspace-key'
+      key = $(e.currentTarget).data 'key'
+      name = $(e.currentTarget).text()
+
+      workspace = @options.main.workspace
+      workspaceItem = workspace.findWhere key: workspaceKey
+      workspaceItemOptions = workspaceItem.get 'options'
+      workspaceItemOptions.forEach (option) -> option.active = option.name == name
+
+      @options.main.addTransition workspaceItem.get('key'), workspaceItem.get('transition'), null, [
+        { key: key, name: name }
+      ]
+
+
     serializeData: ->
       _.extend super,
         workspace: @options.main.workspace.toJSON()
index d11d2221090eea46b8b1b38f74b58addc37520c3..e6058cb6abd3d72ea2c509709eca48a729e51a0c 100644 (file)
@@ -1,20 +1,44 @@
 <div class="component-viewer-popup-section">
-  <a data-key="org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTreeTest.java"
-     class="component-viewer-popup-section-title">
+  <div class="component-viewer-popup-section-title">
     ResourceTypeTreeTest.java
-  </a>
+  </div>
   <ul class="component-viewer-popup-list">
-    <li><i class="icon-alert-ok"></i> 216ms forbidDuplicatedType</li>
-    <li><i class="icon-alert-ok"></i> 216ms forbidNullRelation</li>
+    <li>
+      <a class="component-viewer-popup-test"
+         data-key="org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTreeTest.java"
+         data-test="forbidDuplicatedType">
+        <i class="component-viewer-popup-test-status icon-alert-ok"></i>
+        <span class="component-viewer-popup-test-name">forbidDuplicatedType</span>
+        <span class="component-viewer-popup-test-duration">216ms</span>
+      </a>
+    </li>
+    <li>
+      <a class="component-viewer-popup-test"
+         data-key="org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTreeTest.java"
+         data-test="forbidNullRelation">
+        <i class="component-viewer-popup-test-status icon-alert-ok"></i>
+        <span class="component-viewer-popup-test-name">forbidNullRelation</span>
+        <span class="component-viewer-popup-test-duration">216ms</span>
+      </a>
+    </li>
   </ul>
 </div>
 
 <div class="component-viewer-popup-section">
-  <a data-key="org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypesTest.java"
-     class="component-viewer-popup-section-title">
+  <div class="component-viewer-popup-section-title">
     ResourceTypesTest.java
-  </a>
+  </div>
   <ul class="component-viewer-popup-list">
-    <li><i class="icon-alert-ok"></i> 115ms fail_on_duplicated_qualifier</li>
+    <li>
+      <a class="component-viewer-popup-test"
+         data-key="org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTest.java"
+         data-test="fail_on_duplicated_qualifier">
+        <i class="component-viewer-popup-test-status icon-alert-ok"></i>
+        <span class="component-viewer-popup-test-name">fail_on_duplicated_qualifier</span>
+        <span class="component-viewer-popup-test-duration">115ms</span>
+      </a>
+    </li>
   </ul>
-</div>
\ No newline at end of file
+</div>
+
+<div class="component-viewer-popup-arrow"></div>
\ No newline at end of file
index 151109a45b47f8ee50e090178a2828cdc239e81c..66a08b3844ebeb83eed386f6b8511fc40a05647b 100644 (file)
           <input id="source-duplications" type="checkbox" {{#if settings.duplications}}checked{{/if}}>
           <label for="source-duplications">Duplications</label>
         </li>
+        <li>
+          <input id="source-scm" type="checkbox" {{#if settings.scm}}checked{{/if}}>
+          <label for="source-scm">SCM</label>
+        </li>
       </ul>
     </th>
   </tr>
index f25d693d3ac1f2f2a8cadcaa4a00f5e469b34be6..f1a83c5688190ccaa105b735d02bf594e6ba59a5 100644 (file)
@@ -1,12 +1,17 @@
 <ul class="component-viewer-workspace-list">
-  {{#each workspace}}
+  {{#eachReverse workspace}}
     <li class="component-viewer-workspace-item">
-      {{#if transition}}
-        <span>
-            <i class="icon-move-right"></i>
-          </span>
+      {{qualifierIcon component.qualifier}} <a data-key="{{key}}">{{component.name}}</a>
+      {{#if options}}
+        <ul class="component-viewer-workspace-options">
+          {{#each options}}
+            <li class="component-viewer-workspace-option {{#if active}}active{{/if}}">
+              <a data-workspace-key="{{../key}}" data-key="{{key}}">{{name}}</a>
+              {{#if subname}}<div class="subtitle">{{subname}}</div>{{/if}}
+            </li>
+          {{/each}}
+        </ul>
       {{/if}}
-      <a data-key="{{key}}">{{qualifierIcon component.qualifier}} {{component.name}}</a>
     </li>
-  {{/each}}
+  {{/eachReverse}}
 </ul>
\ No newline at end of file
index b1f27e57c592b648f505a5d67865f3f89b2b2c05..3dde8c8ce1dde25b5a3df90e73ec6bb0b29bd9fb 100644 (file)
@@ -78,6 +78,20 @@ define(['handlebars'], function (Handlebars) {
     return array.join(separator);
   });
 
+  Handlebars.registerHelper('eachReverse', function(array, options) {
+    var ret = '';
+
+    if (array && array.length > 0) {
+      for (var i = array.length - 1; i >= 0; i--) {
+        ret += options.fn(array[i]);
+      }
+    } else {
+      ret = options.inverse(this);
+    }
+
+    return ret;
+  });
+
   Handlebars.registerHelper('dashboardUrl', function(componentKey, componentQualifier) {
     var url = '/dashboard/index/' + decodeURIComponent(componentKey);
     if (componentQualifier === 'FIL' || componentQualifier === 'CLA') {
index 03adee5ec97e20f2296f5ff6bf4431efcdcfcca5..2fed3795c7ab63a0afca44b328fad776c6a7fb89 100644 (file)
   float: left;
   width: @workspaceWidth;
   .box-sizing(border-box);
+
+  a:hover { text-decoration: underline; }
+}
+
+.component-viewer-workspace-list {
+  margin: 8px 0;
 }
 
 .component-viewer-workspace-item {
-  height: 30px;
-  line-height: 30px;
   padding: 0 10px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
 
-  &:first-child {
-    border-bottom: 1px solid @barBorderColor;
-  }
+  &:first-child > a { font-weight: bold; }
+}
 
-  &:last-child {
-    font-weight: bold;
-  }
+.component-viewer-workspace-item + .component-viewer-workspace-item {
+  margin-top: 10px;
 }
 
 .component-viewer-workspace-transition {
 
 }
 
+.component-viewer-workspace-options {
+  margin-top: 5px;
+  margin-left: 21px;
+  padding-left: 10px;
+  border-left: 3px solid darken(@barBorderColor, 10%);
+}
+
+.component-viewer-workspace-option {
+  padding: 3px 0;
+
+  &.active > a { font-weight: bold; }
+}
+
 
 .component-viewer-source {
   border-left: @workspaceWidth solid @barBackgroundColor;
 }
 
 
+@popupArrowSize: 8px;
+
 .component-viewer-popup {
   position: absolute;
   z-index: 100;
-  left: 0;
-  width: @workspaceWidth;
+  margin-top: -16px;
+  margin-left: @popupArrowSize;
   padding: 10px;
-  border-top: 1px solid @barBorderColor;
-  border-bottom: 1px solid @barBorderColor;
+  border: 1px solid @barBorderColor;
+  border-radius: 3px;
   .box-sizing(border-box);
   background-color: @white;
+  box-shadow: @defaultShadow;
+}
+
+.component-viewer-popup-arrow,
+.component-viewer-popup-arrow:after {
+  position: absolute;
+  display: block;
+  .size(0, 0);
+  border: @popupArrowSize solid transparent;
+}
+
+.component-viewer-popup-arrow {
+  top: 15px;
+  left: -@popupArrowSize;
+  border-left-width: 0;
+  border-right-color: @barBorderColor;
+
+  &:after {
+    content: " ";
+    left: 1px;
+    bottom: -@popupArrowSize;
+    border-left-width: 0;
+    border-right-color: @white;
+  }
 }
 
 .component-viewer-popup-section + .component-viewer-popup-section {
 }
 
 .component-viewer-popup-section-title {
-
+  color: #777;
+  font-size: @smallFontSize;
 }
 
 .component-viewer-popup-list {
   margin-top: 5px;
+}
+
+.component-viewer-popup-test {
+  position: relative;
+  display: block;
+  height: 24px;
+  line-height: 24px;
+
+  &:hover {
+    .component-viewer-popup-test-name { text-decoration: underline; }
+  }
+}
+
+.component-viewer-popup-test-name {
+  display: block;
+  width: 240px;
+  border-left: 20px solid transparent;
+  border-right: 44px solid transparent;
+  .box-sizing(border-box);
+}
+
+.component-viewer-popup-test-status {
+  position: absolute;
+  top: 0; left: 0;
+  line-height: 24px;
+}
+
+.component-viewer-popup-test-duration {
+  position: absolute;
+  top: 0; right: 0;
+  color: #777;
   font-size: @smallFontSize;
 }