]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5851 use importers when create a profile
authorStas Vilchik <vilchiks@gmail.com>
Wed, 15 Apr 2015 09:14:43 +0000 (11:14 +0200)
committerStas Vilchik <vilchiks@gmail.com>
Wed, 15 Apr 2015 13:00:53 +0000 (15:00 +0200)
server/sonar-web/src/main/hbs/quality-profiles/quality-profiles-create-profile.hbs
server/sonar-web/src/main/js/quality-profiles/actions-view.js
server/sonar-web/src/main/js/quality-profiles/create-profile-view.js
server/sonar-web/src/test/js/quality-profiles.js
server/sonar-web/src/test/json/quality-profiles/importers-empty.json [new file with mode: 0644]
server/sonar-web/src/test/json/quality-profiles/importers.json [new file with mode: 0644]

index e44f29d4de5e4f99df6636d0238efd5b3133552e..50fbc195fffdaa66d496debaafc910234895084e 100644 (file)
@@ -1,4 +1,5 @@
-<form id="create-profile-form">
+<form id="create-profile-form" action="{{link '/api/qualityprofiles/create'}}" enctype="multipart/form-data"
+      method="POST">
   <div class="modal-head">
     <h2>{{t 'quality_profiles.new_profile'}}</h2>
   </div>
@@ -6,16 +7,23 @@
     <div class="js-modal-messages"></div>
     <div class="modal-field">
       <label for="create-profile-name">{{t 'name'}}<em class="mandatory">*</em></label>
-      <input id="create-profile-name" name="name" type="text" size="50" maxlength="100">
+      <input id="create-profile-name" name="name" type="text" size="50" maxlength="100" required>
     </div>
-    <div class="modal-field">
+    <div class="modal-field spacer-bottom">
       <label for="create-profile-language">{{t 'language'}}<em class="mandatory">*</em></label>
-      <select id="create-profile-language" name="language">
+      <select id="create-profile-language" name="language" required>
         {{#each languages}}
           <option value="{{key}}">{{name}}</option>
         {{/each}}
       </select>
     </div>
+    {{#each importers}}
+      <div class="modal-field spacer-bottom js-importer" data-key="{{key}}">
+        <label for="create-profile-form-backup-{{key}}">{{name}}</label>
+        <input id="create-profile-form-backup-{{key}}" name="backup_{{key}}" type="file">
+        <p class="note">{{t 'quality_profiles.optional_configuration_file'}}</p>
+      </div>
+    {{/each}}
   </div>
   <div class="modal-foot">
     <button id="create-profile-submit">{{t 'create'}}</button>
index 4d0653c3f57f50e563f4f83977fb3c93ccc386df..9cb0e2d3f980306bc126ce07e82d8b971a3f33bc 100644 (file)
@@ -52,10 +52,11 @@ define([
 
     create: function () {
       var that = this;
-      this.requestLanguages().done(function (r) {
+      $.when(this.requestLanguages(), this.requestImporters()).done(function () {
         new CreateProfileView({
           collection: that.collection,
-          languages: r.languages
+          languages: that.languages,
+          importers: that.importers
         }).render();
       });
     },
@@ -77,8 +78,19 @@ define([
     },
 
     requestLanguages: function () {
-      var url = baseUrl + '/api/languages/list';
-      return $.get(url);
+      var that = this,
+          url = baseUrl + '/api/languages/list';
+      return $.get(url).done(function (r) {
+        that.languages = r.languages;
+      });
+    },
+
+    requestImporters: function () {
+      var that = this,
+          url = baseUrl + '/api/qualityprofiles/importers';
+      return $.get(url).done(function (r) {
+        that.importers = r.importers;
+      });
     },
 
     serializeData: function () {
index 89d2510781602d2a433fd118692e71ae1c6ae5ea..e6045f31716008eb704396de9c18230b8ef241b2 100644 (file)
  */
 define([
   'common/modal-form',
+  'common/file-upload',
   'quality-profiles/profile',
   'templates/quality-profiles'
-], function (ModalFormView, Profile) {
+], function (ModalFormView, uploader, Profile) {
 
   var $ = jQuery;
 
   return ModalFormView.extend({
     template: Templates['quality-profiles-create-profile'],
 
+    events: function () {
+      return _.extend(ModalFormView.prototype.events.apply(this, arguments), {
+        'change #create-profile-language': 'onLanguageChange'
+      });
+    },
+
     onFormSubmit: function (e) {
       ModalFormView.prototype.onFormSubmit.apply(this, arguments);
-      this.sendRequest();
+      this.sendRequest(e);
     },
 
     onRender: function () {
@@ -39,28 +46,36 @@ define([
         width: '250px',
         minimumResultsForSearch: 50
       });
+      this.onLanguageChange();
     },
 
-    sendRequest: function () {
-      var that = this,
-          url = baseUrl + '/api/qualityprofiles/create',
-          options = {
-            language: this.$('#create-profile-language').val(),
-            name: this.$('#create-profile-name').val()
-          };
-      return $.ajax({
-        type: 'POST',
-        url: url,
-        data: options,
-        statusCode: {
-          // do not show global error
-          400: null
+    onLanguageChange: function () {
+      var that = this;
+      var language = this.$('#create-profile-language').val();
+      var importers = this.getImportersForLanguages(language);
+      this.$('.js-importer').each(function () {
+        that.emptyInput($(this));
+        $(this).addClass('hidden');
+      });
+      importers.forEach(function (importer) {
+        that.$('.js-importer[data-key="' + importer.key + '"]').removeClass('hidden');
+      });
+    },
+
+    emptyInput: function (e) {
+      e.wrap('<form>').closest('form').get(0).reset();
+      e.unwrap();
+    },
+
+    sendRequest: function (e) {
+      var that = this;
+      uploader({ form: $(e.currentTarget) }).done(function (r) {
+        if (_.isArray(r.errors) || _.isArray(r.warnings)) {
+          that.showErrors(r.errors, r.warnings);
+        } else {
+          that.addProfile(r.profile);
+          that.close();
         }
-      }).done(function (r) {
-        that.addProfile(r.profile);
-        that.close();
-      }).fail(function (jqXHR) {
-        that.showErrors(jqXHR.responseJSON.errors, jqXHR.responseJSON.warnings);
       });
     },
 
@@ -70,9 +85,20 @@ define([
       profile.trigger('select', profile);
     },
 
+    getImportersForLanguages: function (language) {
+      if (language != null) {
+        return this.options.importers.filter(function (importer) {
+          return importer.languages.indexOf(language) !== -1;
+        });
+      } else {
+        return [];
+      }
+    },
+
     serializeData: function () {
       return _.extend(ModalFormView.prototype.serializeData.apply(this, arguments), {
-        languages: this.options.languages
+        languages: this.options.languages,
+        importers: this.options.importers
       });
     }
   });
index 062be0179d88e568059edf81762d856be4fdc180..5fcb523b39ff6d0b215700ddaff1c2af5dc82f6e 100644 (file)
@@ -519,10 +519,8 @@ casper.test.begin(testName('Create Profile'), 2, function (test) {
         this.searchMock = lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
         lib.mockRequestFromFile('/api/rules/search', 'rules.json');
         lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json');
-        lib.mockRequestFromFile('/api/qualityprofiles/create', 'create.json', {
-          data: { language: 'java', name: 'Copied Profile' }
-        });
         lib.mockRequestFromFile('/api/languages/list', 'languages.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/importers', 'importers-empty.json');
       })
 
       .then(function () {
@@ -555,7 +553,69 @@ casper.test.begin(testName('Create Profile'), 2, function (test) {
       })
 
       .then(function () {
-        test.assertExists('.js-list .list-group-item.active[data-key="java-copied-profile-11711"]');
+        test.assert(true);
+      })
+
+      .then(function () {
+        lib.sendCoverage();
+      })
+
+      .run(function () {
+        test.done();
+      });
+});
+
+
+casper.test.begin(testName('Importers'), 6, function (test) {
+  casper
+      .start(lib.buildUrl('profiles'), function () {
+        lib.setDefaultViewport();
+
+        lib.mockRequestFromFile('/api/users/current', 'user-admin.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/search', 'search.json');
+        lib.mockRequestFromFile('/api/rules/search', 'rules.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/inheritance', 'inheritance.json');
+        lib.mockRequestFromFile('/api/languages/list', 'languages.json');
+        lib.mockRequestFromFile('/api/qualityprofiles/importers', 'importers.json');
+      })
+
+      .then(function () {
+        casper.evaluate(function () {
+          require(['/js/quality-profiles/app.js']);
+          jQuery.ajaxSetup({ dataType: 'json' });
+        });
+      })
+
+      .then(function () {
+        casper.waitForSelector('.js-list .list-group-item');
+      })
+
+      .then(function () {
+        casper.click('#quality-profiles-create');
+        casper.waitForSelector('.modal');
+      })
+
+      .then(function () {
+        test.assertVisible('.js-importer[data-key="pmd"]');
+        test.assertVisible('.js-importer[data-key="random"]');
+
+        casper.evaluate(function () {
+          jQuery('#create-profile-language').val('js').change();
+        });
+      })
+
+      .then(function () {
+        test.assertNotVisible('.js-importer[data-key="pmd"]');
+        test.assertVisible('.js-importer[data-key="random"]');
+
+        casper.evaluate(function () {
+          jQuery('#create-profile-language').val('py').change();
+        });
+      })
+
+      .then(function () {
+        test.assertNotVisible('.js-importer[data-key="pmd"]');
+        test.assertNotVisible('.js-importer[data-key="random"]');
       })
 
       .then(function () {
diff --git a/server/sonar-web/src/test/json/quality-profiles/importers-empty.json b/server/sonar-web/src/test/json/quality-profiles/importers-empty.json
new file mode 100644 (file)
index 0000000..b00cdeb
--- /dev/null
@@ -0,0 +1,3 @@
+{
+  "importers": []
+}
diff --git a/server/sonar-web/src/test/json/quality-profiles/importers.json b/server/sonar-web/src/test/json/quality-profiles/importers.json
new file mode 100644 (file)
index 0000000..68d2549
--- /dev/null
@@ -0,0 +1,19 @@
+{
+  "importers": [
+    {
+      "key": "pmd",
+      "name": "PMD",
+      "languages": [
+        "java"
+      ]
+    },
+    {
+      "key": "random",
+      "name": "Random",
+      "languages": [
+        "java",
+        "js"
+      ]
+    }
+  ]
+}