]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6215 apply feedback
authorStas Vilchik <vilchiks@gmail.com>
Fri, 20 Mar 2015 15:28:49 +0000 (16:28 +0100)
committerStas Vilchik <vilchiks@gmail.com>
Fri, 20 Mar 2015 16:43:21 +0000 (17:43 +0100)
server/sonar-web/src/main/hbs/workspace/workspace-viewer-header.hbs
server/sonar-web/src/main/js/workspace/main.js
server/sonar-web/src/main/js/workspace/models/items.js
server/sonar-web/src/main/js/workspace/views/viewer-header-view.js
server/sonar-web/src/main/js/workspace/views/viewer-view.js
server/sonar-web/src/test/js/workspace.js
server/sonar-web/src/test/json/workspace/app.json [new file with mode: 0644]
server/sonar-web/src/test/json/workspace/issues.json [new file with mode: 0644]
server/sonar-web/src/test/json/workspace/lines.json [new file with mode: 0644]
sonar-core/src/main/resources/org/sonar/l10n/core.properties

index 9e3984a8bfec7b89b98e01afbf9c34c0b21e08b5..e601ad668373bb176c665a20b0918b3f97116c0e 100644 (file)
@@ -1,8 +1,15 @@
 <h6 class="workspace-viewer-name">{{qualifierIcon q}}&nbsp;{{name}}</h6>
 
 <div class="workspace-viewer-actions">
-  <a href="#" class="js-minimize icon-minimize spacer-right"></a>
-  <a href="#" class="js-full-screen icon-bigger-size workspace-for-normal-size spacer-right"></a>
-  <a href="#" class="js-normal-size icon-smaller-size workspace-for-full-screen spacer-right"></a>
-  <a href="#" class="js-close icon-close"></a>
+  <a href="#" class="js-minimize icon-minimize spacer-right"
+     title="{{t 'workspace.minimize'}}" data-placement="bottom" data-toggle="tooltip"></a>
+
+  <a href="#" class="js-full-screen icon-bigger-size workspace-for-normal-size spacer-right"
+     title="{{t 'workspace.full_window'}}" data-placement="bottom" data-toggle="tooltip"></a>
+
+  <a href="#" class="js-normal-size icon-smaller-size workspace-for-full-screen spacer-right"
+     title="{{t 'workspace.normal_size'}}" data-placement="bottom" data-toggle="tooltip"></a>
+
+  <a href="#" class="js-close icon-close"
+     title="{{t 'workspace.close'}}" data-placement="bottom" data-toggle="tooltip"></a>
 </div>
index 6a717fed39d346fd80e61dd69a55bd1a25c6cc09..158089571b43eb943ebc318382c052c74ef65b56 100644 (file)
@@ -61,7 +61,9 @@ define([
     },
 
     addComponent: function (model) {
-      this.items.add(model);
+      if (!this.items.has(model)) {
+        this.items.add(model);
+      }
       this.save();
     },
 
index f582af5709d896baa3bb5b7d68d4b31920382f49..7a4bde3bd0271410c5bcc85c8093221550551817 100644 (file)
@@ -41,6 +41,12 @@ define(['workspace/models/item'], function (Item) {
           this.reset(parsed);
         } catch (err) { }
       }
+    },
+
+    has: function (model) {
+      var forComponent = model.isComponent() && this.findWhere({ uuid: model.get('uuid') }) != null,
+          forRule = model.isRule() && this.findWhere({ key: model.get('key') }) != null;
+      return forComponent || forRule;
     }
   });
 
index 4b15a5bdbfcc7ec5f100d5c100cd309481d1b32c..1afebbdbc8307a38382dfb63a28e8164810bc2af 100644 (file)
@@ -21,6 +21,8 @@ define([
   'templates/workspace'
 ], function () {
 
+  var $ = jQuery;
+
   return Marionette.ItemView.extend({
     template: Templates['workspace-viewer-header'],
 
@@ -35,6 +37,15 @@ define([
       'click .js-close': 'onCloseClick'
     },
 
+    onRender: function () {
+      this.$('[data-toggle="tooltip"]').tooltip({ container: 'body' });
+    },
+
+    onClose: function () {
+      this.$('[data-toggle="tooltip"]').tooltip('destroy');
+      $('.tooltip').remove();
+    },
+
     onMinimizeClick: function (e) {
       e.preventDefault();
       this.trigger('viewerMinimize');
index 923b147e23f4bf2528dedb6cfc7f030c55b730cf..d294a56a83c700da3c584190b47e3cd38f477632 100644 (file)
@@ -27,6 +27,10 @@ define([
     className: 'workspace-viewer',
     template: Templates['workspace-viewer'],
 
+    modelEvents: {
+      'destroy': 'close'
+    },
+
     regions: {
       headerRegion: '.workspace-viewer-header',
       viewerRegion: '.workspace-viewer-container'
index 873d6701b81888a983ee4a86f8a2e5016fccb19b..b27862533a8408e97bc067e3e8fd257a1c441c36 100644 (file)
@@ -24,21 +24,260 @@ var lib = require('../lib'),
 
 
 lib.initMessages();
+lib.changeWorkingDirectory('workspace');
 lib.configureCasper();
 
 
-casper.test.begin(testName('API'), function (test) {
+casper.test.begin(testName('Open From Component Viewer'), 8, function (test) {
+  casper
+      .start(lib.buildUrl('source-viewer'), function () {
+        lib.setDefaultViewport();
+
+        lib.mockRequestFromFile('/api/components/app', 'app.json');
+        lib.mockRequestFromFile('/api/sources/lines', 'lines.json');
+        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
+      })
+
+      .then(function () {
+        casper.evaluate(function () {
+          window.localStorage.removeItem('sonarqube-workspace');
+          require(['/js/source-viewer/app.js']);
+        });
+      })
+
+      .then(function () {
+        casper.waitForSelector('.source-line');
+      })
+
+      .then(function () {
+        casper.click('.js-actions');
+        casper.waitForSelector('.js-workspace', function () {
+          casper.click('.js-workspace');
+        });
+      })
+
+      .then(function () {
+        casper.waitForSelector('.workspace-viewer .source-line');
+      })
+
+      .then(function () {
+        test.assertElementCount('.workspace-nav-item', 1);
+        test.assertSelectorContains('.workspace-nav-item', 'Cache.java');
+        test.assertExists('.workspace-nav-item .icon-qualifier-fil');
+
+        test.assertSelectorContains('.workspace-viewer-name', 'Cache.java');
+        test.assertExists('.workspace-viewer-name .icon-qualifier-fil');
+
+        test.assertExists('.workspace-viewer .source-viewer');
+        test.assertElementCount('.workspace-viewer .source-line', 11);
+      })
+
+      .then(function () {
+        casper.click('.workspace-viewer .js-close');
+        test.assertDoesntExist('.workspace-viewer');
+      })
+
+      .then(function () {
+        lib.sendCoverage();
+      })
+
+      .run(function () {
+        test.done();
+      });
+});
+
+
+casper.test.begin(testName('Load From Local Storage'), 7, function (test) {
   casper
       .start(lib.buildUrl('nav'), function () {
         lib.setDefaultViewport();
+
+        lib.mockRequestFromFile('/api/components/app', 'app.json');
+        lib.mockRequestFromFile('/api/sources/lines', 'lines.json');
+        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
+      })
+
+      .then(function () {
+        casper.evaluate(function () {
+          window.localStorage.setItem('sonarqube-workspace',
+              '[{"uuid":"12345","type":"component","name":"Cache.java","q":"FIL"}]');
+          window.SS.isUserAdmin = false;
+          window.navbarOptions = new Backbone.Model();
+          require(['/js/nav/app.js']);
+        });
+      })
+
+      .then(function () {
+        casper.waitForSelector('.workspace-nav-item');
+      })
+
+      .then(function () {
+        test.assertElementCount('.workspace-nav-item', 1);
+        test.assertSelectorContains('.workspace-nav-item', 'Cache.java');
+        test.assertExists('.workspace-nav-item .icon-qualifier-fil');
       })
 
       .then(function () {
-        test.assertNotEquals(casper.evaluate(function () {
-          window.workspace = require(['/js/workspace/main.js'])();
-          console.log(window.workspace);
-          return window.workspace;
-        }), null);
+        casper.click('.workspace-nav-item');
+        casper.waitForSelector('.workspace-viewer .source-line');
+      })
+
+      .then(function () {
+        test.assertSelectorContains('.workspace-viewer-name', 'Cache.java');
+        test.assertExists('.workspace-viewer-name .icon-qualifier-fil');
+
+        test.assertExists('.workspace-viewer .source-viewer');
+        test.assertElementCount('.workspace-viewer .source-line', 11);
+      })
+
+      .then(function () {
+        lib.sendCoverage();
+      })
+
+      .run(function () {
+        test.done();
+      });
+});
+
+
+casper.test.begin(testName('Close From Nav'), 2, function (test) {
+  casper
+      .start(lib.buildUrl('nav'), function () {
+        lib.setDefaultViewport();
+
+        lib.mockRequestFromFile('/api/components/app', 'app.json');
+        lib.mockRequestFromFile('/api/sources/lines', 'lines.json');
+        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
+      })
+
+      .then(function () {
+        casper.evaluate(function () {
+          window.localStorage.setItem('sonarqube-workspace',
+              '[{"uuid":"12345","type":"component","name":"Cache.java","q":"FIL"}]');
+          window.SS.isUserAdmin = false;
+          window.navbarOptions = new Backbone.Model();
+          require(['/js/nav/app.js']);
+        });
+      })
+
+      .then(function () {
+        casper.waitForSelector('.workspace-nav-item');
+      })
+
+      .then(function () {
+        casper.click('.workspace-nav-item');
+        casper.waitForSelector('.workspace-viewer .source-line');
+      })
+
+      .then(function () {
+        casper.click('.workspace-nav-item .js-close');
+        test.assertDoesntExist('.workspace-nav-item');
+        test.assertDoesntExist('.workspace-viewer');
+      })
+
+      .then(function () {
+        lib.sendCoverage();
+      })
+
+      .run(function () {
+        test.done();
+      });
+});
+
+
+casper.test.begin(testName('Minimize'), 2, function (test) {
+  casper
+      .start(lib.buildUrl('source-viewer'), function () {
+        lib.setDefaultViewport();
+
+        lib.mockRequestFromFile('/api/components/app', 'app.json');
+        lib.mockRequestFromFile('/api/sources/lines', 'lines.json');
+        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
+      })
+
+      .then(function () {
+        casper.evaluate(function () {
+          window.localStorage.removeItem('sonarqube-workspace');
+          require(['/js/source-viewer/app.js']);
+        });
+      })
+
+      .then(function () {
+        casper.waitForSelector('.source-line');
+      })
+
+      .then(function () {
+        casper.click('.js-actions');
+        casper.waitForSelector('.js-workspace', function () {
+          casper.click('.js-workspace');
+        });
+      })
+
+      .then(function () {
+        casper.waitForSelector('.workspace-viewer .source-line');
+      })
+
+      .then(function () {
+        casper.click('.workspace-viewer .js-minimize');
+        test.assertDoesntExist('.workspace-viewer');
+        test.assertElementCount('.workspace-nav-item', 1);
+      })
+
+      .then(function () {
+        lib.sendCoverage();
+      })
+
+      .run(function () {
+        test.done();
+      });
+});
+
+
+casper.test.begin(testName('Full Screen'), 8, function (test) {
+  casper
+      .start(lib.buildUrl('source-viewer'), function () {
+        lib.setDefaultViewport();
+
+        lib.mockRequestFromFile('/api/components/app', 'app.json');
+        lib.mockRequestFromFile('/api/sources/lines', 'lines.json');
+        lib.mockRequestFromFile('/api/issues/search', 'issues.json');
+      })
+
+      .then(function () {
+        casper.evaluate(function () {
+          window.localStorage.removeItem('sonarqube-workspace');
+          require(['/js/source-viewer/app.js']);
+        });
+      })
+
+      .then(function () {
+        casper.waitForSelector('.source-line');
+      })
+
+      .then(function () {
+        casper.click('.js-actions');
+        casper.waitForSelector('.js-workspace', function () {
+          casper.click('.js-workspace');
+        });
+      })
+
+      .then(function () {
+        casper.waitForSelector('.workspace-viewer .source-line');
+      })
+
+      .then(function () {
+        test.assertVisible('.workspace-viewer .js-full-screen');
+        test.assertNotVisible('.workspace-viewer .js-normal-size');
+
+        casper.click('.workspace-viewer .js-full-screen');
+        test.assertExists('.workspace-viewer.workspace-viewer-full-screen');
+        test.assertNotVisible('.workspace-viewer .js-full-screen');
+        test.assertVisible('.workspace-viewer .js-normal-size');
+
+        casper.click('.workspace-viewer .js-normal-size');
+        test.assertDoesntExist('.workspace-viewer.workspace-viewer-full-screen');
+        test.assertVisible('.workspace-viewer .js-full-screen');
+        test.assertNotVisible('.workspace-viewer .js-normal-size');
       })
 
       .then(function () {
diff --git a/server/sonar-web/src/test/json/workspace/app.json b/server/sonar-web/src/test/json/workspace/app.json
new file mode 100644 (file)
index 0000000..e8b7516
--- /dev/null
@@ -0,0 +1,24 @@
+{
+  "uuid": "12345",
+  "key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
+  "path": "src/main/java/org/sonar/batch/index/Cache.java",
+  "name": "Cache.java",
+  "longName": "src/main/java/org/sonar/batch/index/Cache.java",
+  "q": "FIL",
+  "subProject": "org.codehaus.sonar:sonar-batch",
+  "subProjectName": "SonarQube :: Batch",
+  "project": "org.codehaus.sonar:sonar",
+  "projectName": "SonarQube",
+  "fav": false,
+  "canMarkAsFavourite": false,
+  "canCreateManualIssue": false,
+  "measures": {
+    "lines": "378",
+    "coverage": "74.3%",
+    "duplicationDensity": "5.8%",
+    "debt": "2h 10min",
+    "sqaleRating": "A",
+    "debtRatio": "1.1%",
+    "issues": "6"
+  }
+}
diff --git a/server/sonar-web/src/test/json/workspace/issues.json b/server/sonar-web/src/test/json/workspace/issues.json
new file mode 100644 (file)
index 0000000..bc18adc
--- /dev/null
@@ -0,0 +1,9 @@
+{
+  "total": 0,
+  "p": 1,
+  "ps": 100,
+  "issues": [],
+  "rules": [],
+  "users": [],
+  "languages": []
+}
diff --git a/server/sonar-web/src/test/json/workspace/lines.json b/server/sonar-web/src/test/json/workspace/lines.json
new file mode 100644 (file)
index 0000000..ff06641
--- /dev/null
@@ -0,0 +1,72 @@
+{"sources": [
+  {
+    "line": 1,
+    "code": "<span class=\"cppd\">/*</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 2,
+    "code": "<span class=\"cppd\"> * SonarQube, open source software quality management tool.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b1436788cfc71b23cc3e3c15400a6c630c914bec",
+    "scmDate": "2013-04-21T11:58:14+0200"
+  },
+  {
+    "line": 3,
+    "code": "<span class=\"cppd\"> * Copyright (C) 2008-2014 SonarSource</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "57ae3026c36ae3b0b71756d6161124b1ae594c53",
+    "scmDate": "2014-03-11T17:52:41+0100"
+  },
+  {
+    "line": 4,
+    "code": "<span class=\"cppd\"> * mailto:contact AT sonarsource DOT com</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 5,
+    "code": "<span class=\"cppd\"> *</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 6,
+    "code": "<span class=\"cppd\"> * SonarQube is free software; you can redistribute it and/or</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "b1436788cfc71b23cc3e3c15400a6c630c914bec",
+    "scmDate": "2013-04-21T11:58:14+0200"
+  },
+  {
+    "line": 7,
+    "code": "<span class=\"cppd\"> * modify it under the terms of the GNU Lesser General Public</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 8,
+    "code": "<span class=\"cppd\"> * License as published by the Free Software Foundation; either</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 9,
+    "code": "<span class=\"cppd\"> * version 3 of the License, or (at your option) any later version.</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  },
+  {
+    "line": 10,
+    "code": "<span class=\"cppd\"> *</span>",
+    "scmAuthor": "simon.brandhof@gmail.com",
+    "scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
+    "scmDate": "2013-04-16T17:26:34+0200"
+  }
+]}
index b8a8104addc1871050834a0e194da90206290609..ae9f609567aac28e8e97022ca7856d11de50475e 100644 (file)
@@ -2971,3 +2971,16 @@ analysis_reports.show_past_reports=Show Past Reports
 analysis_reports.current_activity=Current Activity
 analysis_reports.show_current_activity=Show Current Activity
 analysis_reports.x_reports={0} reports
+
+
+
+
+#------------------------------------------------------------------------------
+#
+# WORKSPACE
+#
+#------------------------------------------------------------------------------
+workspace.minimize=Minimize
+workspace.full_window=Expand to full window
+workspace.normal_size=Collapse to normal size
+workspace.close=Remove from the list of pinned files