]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5851 show exporters
authorStas Vilchik <vilchiks@gmail.com>
Mon, 20 Apr 2015 07:27:49 +0000 (09:27 +0200)
committerStas Vilchik <vilchiks@gmail.com>
Mon, 20 Apr 2015 08:11:33 +0000 (10:11 +0200)
server/sonar-web/src/main/hbs/quality-profiles/quality-profiles-profile-details.hbs
server/sonar-web/src/main/js/quality-profiles/app.js
server/sonar-web/src/main/js/quality-profiles/controller.js
server/sonar-web/src/main/js/quality-profiles/helpers.js
server/sonar-web/src/main/js/quality-profiles/profile-details-view.js
server/sonar-web/src/test/js/quality-profiles.js
server/sonar-web/src/test/json/quality-profiles/exporters.json [new file with mode: 0644]

index 31b21d1c8bbd4c247f1d9fe5950fa75d13c52a6f..b1c487315c4d3ee75b2fbb0f57483e1d14543bd3 100644 (file)
   <header class="page-header">
     <h3 class="page-title">{{t 'permalinks'}}</h3>
   </header>
-  <p class="alert alert-warning">Coming soon...</p>
+  <ul class="list-inline">
+    <li>
+      <a href="{{exporterUrl this null}}" target="_blank"><i class="icon-detach"></i>&nbsp;{{t 'quality_profiles.export_all_rules'}}</a>
+    </li>
+    {{#each exporters}}
+      <li>
+        <a href="{{exporterUrl ../this key}}" target="_blank"><i class="icon-detach"></i>&nbsp;{{name}}</a>
+      </li>
+    {{/each}}
+  </ul>
 </div>
 
 <div class="panel panel-vertical" id="quality-profile-inheritance">
index e2650a470ffc883bda04196737896ae44e20811d..81f9aa9d4d3ccafe7ade8c6f3444c4e135bfefc7 100644 (file)
@@ -68,10 +68,13 @@ require([
 
 
   var requestUser = $.get(baseUrl + '/api/users/current').done(function (r) {
-    App.canWrite = r.permissions.global.indexOf('profileadmin') !== -1;
-  });
+        App.canWrite = r.permissions.global.indexOf('profileadmin') !== -1;
+      }),
+      requestExporters = $.get(baseUrl + '/api/qualityprofiles/exporters').done(function (r) {
+        App.exporters = r.exporters;
+      });
 
-  $.when(window.requestMessages(), requestUser).done(function () {
+  $.when(window.requestMessages(), requestUser, requestExporters).done(function () {
     App.start();
   });
 
index f81ff6a0af92da47cb04eec14f013ee352ecd0dc..87c481b443679c33d828493513764994b4c5210e 100644 (file)
@@ -89,6 +89,7 @@ define([
         var profileDetailsView = new ProfileDetailsView({
           model: profile,
           canWrite: that.options.app.canWrite,
+          exporters: that.options.app.exporters,
           anchor: that.anchor
         });
         that.options.app.layout.detailsRegion.show(profileDetailsView);
index fa3858e126c7887cd222ac89b9907519052fbea1..a385e045af6f2235900eb6c967c152a9991474bc 100644 (file)
 (function () {
 
   Handlebars.registerHelper('profileUrl', function (key) {
+    //FIXME change me
     return baseUrl + '/quality_profiles/show?key=' + encodeURIComponent(key);
   });
 
+  Handlebars.registerHelper('exporterUrl', function (profile, exporterKey) {
+    var url = baseUrl + '/api/qualityprofiles/export';
+    url += '?language=' + encodeURIComponent(profile.language);
+    url += '&name=' + encodeURIComponent(profile.name);
+    if (exporterKey != null) {
+      url += '&exporterKey=' + encodeURIComponent(exporterKey);
+    }
+    return url;
+  });
+
   Handlebars.registerHelper('severityChangelog', function (severity) {
     var label = '<i class="icon-severity-' + severity.toLowerCase() + '"></i>&nbsp;' + t('severity', severity),
         message = tp('quality_profiles.severity_set_to_x', label);
index 41455007911e631159d3ab099145805b956c1acf..96146f2915911fa4eafc160c7bdac300d9320815 100644 (file)
@@ -132,12 +132,20 @@ define([
       this.scrollTo('#quality-profile-comparison');
     },
 
+    getExporters: function () {
+      var language = this.model.get('language');
+      return this.options.exporters.filter(function (exporter) {
+        return exporter.languages.indexOf(language) !== -1;
+      });
+    },
+
     serializeData: function () {
       var key = this.model.get('key'),
           rulesSearchUrl = '/coding_rules#qprofile=' + encodeURIComponent(key) + '|activation=true';
       return _.extend(Marionette.ItemView.prototype.serializeData.apply(this, arguments), {
         rulesSearchUrl: rulesSearchUrl,
-        canWrite: this.options.canWrite
+        canWrite: this.options.canWrite,
+        exporters: this.getExporters()
       });
     }
   });
index 19aec79ae04829d768f01d1372c7738b1ecb05bc..63e7a65ea5535e1da0946dde2b8433a4d0645d2b 100644 (file)
@@ -34,6 +34,7 @@ casper.test.begin(testName('Should Show List'), 9, function (test) {
 
         lib.mockRequestFromFile('/api/users/current', 'user.json');
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
       })
 
@@ -78,6 +79,7 @@ casper.test.begin(testName('Should Filter List By Language'), 15, function (test
 
         lib.mockRequestFromFile('/api/users/current', 'user.json');
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
       })
 
@@ -141,6 +143,7 @@ casper.test.begin(testName('Should Show Details'), 10, function (test) {
 
         lib.mockRequestFromFile('/api/users/current', 'user.json');
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json',
             { data: { qprofile: 'java-sonar-way-67887', activation: 'true' }});
@@ -195,6 +198,7 @@ casper.test.begin(testName('Should Show Details', 'Admin'), 10, function (test)
 
         lib.mockRequestFromFile('/api/users/current', 'user-admin.json');
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json',
             { data: { qprofile: 'java-sonar-way-67887', activation: 'true' }});
@@ -249,6 +253,7 @@ casper.test.begin(testName('Should Show Inheritance Details'), 10, function (tes
 
         lib.mockRequestFromFile('/api/users/current', 'user-admin.json');
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search-inheritance.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json');
         lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance-plus.json', {
@@ -303,6 +308,7 @@ casper.test.begin(testName('Should Show Selected Projects'), 2, function (test)
 
         lib.mockRequestFromFile('/api/users/current', 'user-admin.json');
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json');
         lib.mockRequestFromFile('/api/qualityprofiles/projects?key=php-psr-2-46772', 'projects.json');
@@ -350,6 +356,7 @@ casper.test.begin(testName('Should Move Between Profiles'), 1, function (test) {
 
         lib.mockRequestFromFile('/api/users/current', 'user.json');
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search-inheritance.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
         this.rulesMock = lib.mockRequestFromFile('/api/rules/search', 'rules.json',
             { data: { qprofile: 'java-inherited-profile-85155', activation: 'true' }});
@@ -403,6 +410,7 @@ casper.test.begin(testName('Copy Profile'), 5, function (test) {
 
         lib.mockRequestFromFile('/api/users/current', 'user-admin.json');
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json');
         lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json');
@@ -465,6 +473,7 @@ casper.test.begin(testName('Rename Profile'), 2, function (test) {
 
         lib.mockRequestFromFile('/api/users/current', 'user-admin.json');
         this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json');
         lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json');
@@ -527,6 +536,7 @@ casper.test.begin(testName('Make Profile Default'), 4, function (test) {
 
         lib.mockRequestFromFile('/api/users/current', 'user-admin.json');
         this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json');
         lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json');
@@ -583,6 +593,7 @@ casper.test.begin(testName('Delete Profile'), 2, function (test) {
 
         lib.mockRequestFromFile('/api/users/current', 'user-admin.json');
         this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search-with-copy.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json');
         lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json');
@@ -642,6 +653,7 @@ casper.test.begin(testName('Create Profile'), 2, function (test) {
 
         lib.mockRequestFromFile('/api/users/current', 'user-admin.json');
         this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json');
         lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
@@ -698,6 +710,7 @@ casper.test.begin(testName('Restore Profile'), 2, function (test) {
 
         lib.mockRequestFromFile('/api/users/current', 'user-admin.json');
         this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json');
         lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json');
@@ -746,6 +759,7 @@ casper.test.begin(testName('Importers'), 6, function (test) {
 
         lib.mockRequestFromFile('/api/users/current', 'user-admin.json');
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json');
         lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
@@ -808,6 +822,7 @@ casper.test.begin(testName('Restore Built-in Profiles'), 2, function (test) {
 
         lib.mockRequestFromFile('/api/users/current', 'user-admin.json');
         this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search-modified.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json');
         lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json');
         lib.mockRequest('/api/qualityprofiles/restore_built_in', '{}', {
@@ -865,6 +880,7 @@ casper.test.begin(testName('Change Parent'), 1, function (test) {
 
         lib.mockRequestFromFile('/api/users/current', 'user-admin.json');
         this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search-change-parent.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json');
         this.inheritanceMock = lib.mockRequestFromFile('/api/qualityprofiles/inheritance',
@@ -929,6 +945,7 @@ casper.test.begin(testName('Permalink'), 9, function (test) {
 
         lib.mockRequestFromFile('/api/users/current', 'user-admin.json');
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json');
         lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json');
@@ -974,6 +991,7 @@ casper.test.begin(testName('Changelog'), 21, function (test) {
 
         lib.mockRequestFromFile('/api/users/current', 'user.json');
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json');
         lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json');
@@ -1051,6 +1069,7 @@ casper.test.begin(testName('Changelog Permalink'), 2, function (test) {
 
         lib.mockRequestFromFile('/api/users/current', 'user.json');
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json');
         lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json');
@@ -1109,6 +1128,7 @@ casper.test.begin(testName('Comparison'), 12, function (test) {
 
         lib.mockRequestFromFile('/api/users/current', 'user.json');
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search-with-copy.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json');
         lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json');
@@ -1167,6 +1187,7 @@ casper.test.begin(testName('Comparison Permalink'), 4, function (test) {
 
         lib.mockRequestFromFile('/api/users/current', 'user.json');
         lib.mockRequestFromFile('/api/qualityprofiles/search', 'search-with-copy.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/exporters', 'exporters.json');
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json');
         lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json');
diff --git a/server/sonar-web/src/test/json/quality-profiles/exporters.json b/server/sonar-web/src/test/json/quality-profiles/exporters.json
new file mode 100644 (file)
index 0000000..86d3e20
--- /dev/null
@@ -0,0 +1,8 @@
+{
+  "exporters": [
+    {"key": "pmd", "name": "PMD", "languages": ["java"]},
+    {"key": "checkstyle", "name": "Checkstyle", "languages": ["java"]},
+    {"key": "js-lint", "name": "JS Lint", "languages": ["js"]},
+    {"key": "android-lint", "name": "Android Lint", "languages": ["xml", "java"]}
+  ]
+}