]> source.dussan.org Git - sonarqube.git/commitdiff
refactor creation of manual issues
authorStas Vilchik <vilchiks@gmail.com>
Tue, 2 Jun 2015 16:32:00 +0000 (18:32 +0200)
committerStas Vilchik <vilchiks@gmail.com>
Tue, 2 Jun 2015 16:32:10 +0000 (18:32 +0200)
server/sonar-web/src/main/js/components/issue/manual-issue-view.js
server/sonar-web/src/main/js/components/issue/models/issue.js
server/sonar-web/src/main/js/components/issue/templates/manual-issue.hbs
server/sonar-web/src/main/js/components/source-viewer/main.js

index c1f60b486e68d5b790ad25b4e95aeb711a185f94..1b043544a4494a1bb24ce2bccd0a0f9ace7bfea0 100644 (file)
@@ -1,10 +1,9 @@
 define([
+  './models/issue',
   './templates'
-], function () {
+], function (Issue) {
 
-  var $ = jQuery,
-      API_ISSUE = baseUrl + '/api/issues/show',
-      API_ADD_MANUAL_ISSUE = baseUrl + '/api/issues/create';
+  var $ = jQuery;
 
   return Marionette.ItemView.extend({
     template: Templates['manual-issue'],
@@ -44,68 +43,35 @@ define([
       }
     },
 
-    showSpinner: function () {
-      this.$('.js-submit').hide();
-      this.$('.js-spinner').show();
-    },
-
-    hideSpinner: function () {
-      this.$('.js-submit').show();
-      this.$('.js-spinner').hide();
-    },
-
-    validateFields: function () {
-      var message = this.$('[name=message]');
-      if (!message.val()) {
-        message.addClass('invalid').focus();
-        return false;
-      }
-      return true;
-    },
-
     formSubmit: function (e) {
       var that = this;
       e.preventDefault();
-      if (!this.validateFields()) {
-        return;
-      }
-      this.showSpinner();
-      var data = $(e.currentTarget).serialize();
-      $.post(API_ADD_MANUAL_ISSUE, data)
-          .done(function (r) {
-            if (typeof r === 'string') {
-              r = JSON.parse(r);
-            }
-            that.addIssue(r.issue.key);
-          }).fail(function (r) {
-            that.hideSpinner();
-            if (r.responseJSON && r.responseJSON.errors) {
-              that.showError(_.pluck(r.responseJSON.errors, 'msg').join('. '));
-            }
-          });
+      var issue = new Issue({
+        component: this.options.component,
+        line: this.options.line,
+        message: this.$('[name="message"]').val(),
+        rule: this.$('[name="rule"]').val()
+      });
+      issue.save().done(function () {
+        that.addIssue(issue);
+      });
     },
 
-    addIssue: function (key) {
+    addIssue: function (issue) {
       var that = this;
-      return $.get(API_ISSUE, { key: key }).done(function (r) {
-        that.trigger('add', r.issue);
+      return issue.fetch().done(function () {
+        that.trigger('add', issue);
         that.close();
       });
     },
 
-    showError: function (msg) {
-      this.$('.code-issue-errors').removeClass('hidden').text(msg);
-    },
-
     cancel: function (e) {
       e.preventDefault();
       this.close();
     },
 
     serializeData: function () {
-      return _.extend(Marionette.ItemView.prototype.serializeData.apply(this, arguments), {
-        line: this.options.line,
-        component: this.options.component,
+      return _.extend(this._super(), {
         rules: _.sortBy(this.rules, 'name')
       });
     }
index 1c5e928818e298f2664f78ab5abd744f4c5251d7..af5dd980c279994fa4eae4265ca9846a0cd365b0 100644 (file)
@@ -1,4 +1,4 @@
-define([], function () {
+define(function () {
 
   return Backbone.Model.extend({
     idAttribute: 'key',
@@ -7,8 +7,40 @@ define([], function () {
       return baseUrl + '/api/issues/show?key=' + this.get('key');
     },
 
+    urlRoot: function () {
+      return baseUrl + '/api/issues';
+    },
+
     parse: function (r) {
       return r.issue ? r.issue : r;
+    },
+
+    sync: function (method, model, options) {
+      var opts = options || {};
+      opts.contentType = 'application/x-www-form-urlencoded';
+      if (method === 'read') {
+        _.extend(opts, {
+          type: 'GET',
+          url: this.urlRoot() + '/show',
+          data: { key: model.id }
+        });
+      }
+      if (method === 'create') {
+        _.extend(opts, {
+          type: 'POST',
+          url: this.urlRoot() + '/create',
+          data: {
+            component: model.get('component'),
+            line: model.get('line'),
+            message: model.get('message'),
+            rule: model.get('rule'),
+            severity: model.get('severity')
+          }
+        });
+      }
+      var xhr = options.xhr = Backbone.ajax(opts);
+      model.trigger('request', model, xhr, options);
+      return xhr;
     }
   });
 
index bbcf333395bdc50d32077120c9da3283a29bc6f5..0a38fa2136fee1dea799e710706b349fc1545ef0 100644 (file)
@@ -1,19 +1,6 @@
-<form action="" class="js-manual-issue-form code-issue-create-form">
-  {{! no manual rules }}
-  {{! <div class="warning" style="margin: 10px"> }}
-  {{!   <% if is_admin %> }}
-  {{!   <%= message('issue.manual.no_rules.admin') -%> }}
-  {{!   &nbsp;<a href="<%= ApplicationController.root_context -%>/manual_rules/index"><%= message('manage') -%></a> }}
-  {{!   <% else %> }}
-  {{!   <%= message('issue.manual.no_rules.non_admin') -%> }}
-  {{!   <% end %> }}
-  {{!   &nbsp;<%= link_to_function message('cancel'), 'closeCreateIssueForm(this)' -%> }}
-  {{! </div> }}
+<form class="js-manual-issue-form spacer-top spacer-bottom">
 
-  <input type="hidden" name="line" value="{{line}}">
-  <input type="hidden" name="component" value="{{component}}">
-
-  <div class="code-issue-name">
+  <div class="spacer-bottom">
     <select name="rule">
       {{#each rules}}
         <option value="{{key}}">{{name}}</option>
     </select>
   </div>
 
-  <div class="code-issue-msg">
-    <table class="width100">
-      <tr>
-        <td>
-          <textarea rows="4" name="message" class="width100 marginbottom5"></textarea>
-        </td>
-      </tr>
-      <tr>
-        <td class="js-submit">
-          <input type="submit" value="{{t 'create'}}">
-          <a class="js-cancel" href="#">{{t 'cancel'}}</a>
-        </td>
-        <td class="js-spinner" style="display: none;">
-          <i class="spinner"></i>
-        </td>
-      </tr>
-    </table>
-    <div class="code-issue-errors alert alert-danger hidden"></div>
+  <div class="spacer-top">
+    <textarea rows="4" name="message" class="width-100" required></textarea>
+  </div>
+
+  <div class="spacer-top">
+    <input type="submit" value="{{t 'create'}}">
+    <a class="js-cancel" href="#">{{t 'cancel'}}</a>
   </div>
 
 </form>
index 07dfc55580d0709efad57e2cc7a1cccf6b6c15c8..a007145f354de9e8541e41b461ea14edab30f13f 100644 (file)
@@ -479,8 +479,8 @@ define([
                 line: line,
                 row: $(e.currentTarget).closest('.source-line')
               });
-          popup.on('onManualIssueAdded', function (data) {
-            that.addIssue(new Issue(data));
+          popup.on('onManualIssueAdded', function (issue) {
+            that.addIssue(issue);
           });
           popup.render();
         },