-<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>
<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>
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();
});
},
},
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 () {
*/
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 () {
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);
});
},
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
});
}
});
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 () {
})
.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 () {
--- /dev/null
+{
+ "importers": []
+}
--- /dev/null
+{
+ "importers": [
+ {
+ "key": "pmd",
+ "name": "PMD",
+ "languages": [
+ "java"
+ ]
+ },
+ {
+ "key": "random",
+ "name": "Random",
+ "languages": [
+ "java",
+ "js"
+ ]
+ }
+ ]
+}