]> source.dussan.org Git - sonarqube.git/commitdiff
update web 368/head
authorStas Vilchik <vilchiks@gmail.com>
Tue, 9 Jun 2015 11:06:16 +0000 (13:06 +0200)
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Thu, 18 Jun 2015 07:34:53 +0000 (09:34 +0200)
14 files changed:
server/sonar-web/src/main/js/apps/issues/controller.js
server/sonar-web/src/main/js/apps/issues/models/issue.js [new file with mode: 0644]
server/sonar-web/src/main/js/apps/issues/models/issues.js
server/sonar-web/src/main/js/apps/issues/templates/issues-issue-filter-form.hbs
server/sonar-web/src/main/js/components/issue/collections/issues.js
server/sonar-web/src/main/js/components/issue/models/issue.js
server/sonar-web/src/main/js/components/issue/templates/issue.hbs
server/sonar-web/src/main/js/components/issue/views/assign-form-view.js
server/sonar-web/src/main/js/components/issue/views/plan-form-view.js
server/sonar-web/src/main/js/components/issue/views/set-severity-form-view.js
server/sonar-web/src/main/js/components/issue/views/transitions-form-view.js
server/sonar-web/src/main/js/components/source-viewer/main.js
server/sonar-web/src/test/js/source-viewer-issues.js
server/sonar-web/src/test/json/source-viewer-issues/set-severity.json [new file with mode: 0644]

index 4f1ab55a2d0ad644fc991f7a9976a2c8cde9b73c..41fcd6433bea88a7cbe8cc948483a21e0dc09669 100644 (file)
@@ -5,7 +5,7 @@ define([
 ], function (Controller, ComponentViewer, HomeView) {
 
   var $ = jQuery,
-      EXTRA_FIELDS = 'actions,transitions,assigneeName,reporterName,actionPlanName',
+      EXTRA_FIELDS = 'actions,transitions,reporterName,actionPlanName',
       FACET_DATA_FIELDS = ['components', 'projects', 'users', 'rules', 'actionPlans', 'languages'];
 
   return Controller.extend({
diff --git a/server/sonar-web/src/main/js/apps/issues/models/issue.js b/server/sonar-web/src/main/js/apps/issues/models/issue.js
new file mode 100644 (file)
index 0000000..35e49c8
--- /dev/null
@@ -0,0 +1,17 @@
+define([
+  'components/issue/models/issue'
+], function (Issue) {
+
+  return Issue.extend({
+    reset: function (attrs, options) {
+      // TODO remove me soon
+      var keepFields = ['index', 'selected', 'componentUuid', 'componentLongName', 'componentQualifier',
+                        'projectLongName', 'projectUuid', 'ruleName', 'comments'];
+      keepFields.forEach(function (field) {
+        attrs[field] = this.get(field);
+      }.bind(this));
+      return this._super(attrs, options);
+    }
+  });
+
+});
index 2292dba2c8b1f268bde4a428e0a2ffb461b99c0e..5c340c9ef2a54acf848d6d22fcccfd8670c0dca8 100644 (file)
@@ -1,5 +1,5 @@
 define([
-  'components/issue/models/issue'
+  './issue'
 ], function (Issue) {
 
   return Backbone.Collection.extend({
@@ -19,8 +19,7 @@ define([
         var component = find(r.components, issue.component),
             project = find(r.projects, issue.project),
             subProject = find(r.components, issue.subProject),
-            rule = find(r.rules, issue.rule),
-            assignee = find(r.users, issue.assignee, 'login');
+            rule = find(r.rules, issue.rule);
         _.extend(issue, { index: index });
         if (component) {
           _.extend(issue, {
@@ -46,11 +45,6 @@ define([
             ruleName: rule.name
           });
         }
-        if (assignee) {
-          _.extend(issue, {
-            assigneeEmail: assignee.email
-          });
-        }
         return issue;
       });
     },
index e9e1d0621b06e47d2d29ac3acbca78d3be3abf62..c0c360619693190bcaa31d94cc0ecbcca1149bce 100644 (file)
@@ -28,9 +28,9 @@
   </li>
 
   <li>
-    {{#if assignee}}
-      <a href="#" data-property="assignees" data-value="{{assignee}}">
-        {{t "assigned_to"}} {{assigneeName}}
+    {{#if assignee.login}}
+      <a href="#" class="issue-action-option" data-property="assignees" data-value="{{assignee.login}}">
+      {{t "assigned_to"}} {{assignee.name}}
       </a>
     {{else}}
       <a href="#" data-property="assigned" data-value="false">
index 5925fc0a16618d40722a9c3727ba008cdcb537b0..990adadd2b75c11fe8f993163cce2f7306509aa4 100644 (file)
@@ -26,8 +26,7 @@ define([
       return r.issues.map(function (issue) {
         var component = find(r.components, issue.component),
             project = find(r.projects, issue.project),
-            rule = find(r.rules, issue.rule),
-            assignee = find(r.users, issue.assignee, 'login');
+            rule = find(r.rules, issue.rule)
         if (component) {
           _.extend(issue, {
             componentLongName: component.longName,
@@ -43,9 +42,6 @@ define([
         if (rule) {
           _.extend(issue, { ruleName: rule.name });
         }
-        if (assignee) {
-          _.extend(issue, { assigneeEmail: assignee.email });
-        }
         return issue;
       });
     }
index 74ca2f3ad1934a9da98c7246971b8e1773be6054..6f4d9cfe0c7ebbd66c7d4abd3556e608b922b1f2 100644 (file)
@@ -39,10 +39,16 @@ define(function () {
         });
       }
       var xhr = options.xhr = Backbone.ajax(opts);
-      model.trigger('request', model, xhr, options);
+      model.trigger('request', model, xhr, opts);
       return xhr;
     },
 
+    /**
+     * Reset issue attributes (delete old, replace with new)
+     * @param attrs
+     * @param options
+     * @returns {Object}
+     */
     reset: function (attrs, options) {
       for (var key in this.attributes) {
         if (this.attributes.hasOwnProperty(key) && !(key in attrs)) {
@@ -50,6 +56,83 @@ define(function () {
         }
       }
       return this.set(attrs, options);
+    },
+
+    /**
+     * Do an action over an issue
+     * @param {Object|null} options Options for jQuery ajax
+     * @returns {jqXHR}
+     * @private
+     */
+    _action: function (options) {
+      var model = this;
+      var success = function (r) {
+        var attrs = model.parse(r);
+        model.reset(attrs);
+        if (options.success) {
+          options.success(model, r, options);
+        }
+      };
+      var opts = _.extend({ type: 'POST' }, options, { success: success });
+      var xhr = options.xhr = Backbone.ajax(opts);
+      model.trigger('request', model, xhr, opts);
+      return xhr;
+    },
+
+    /**
+     * Assign issue
+     * @param {String|null} assignee Assignee, can be null to unassign issue
+     * @param {Object|null} options Options for jQuery ajax
+     * @returns {jqXHR}
+     */
+    assign: function (assignee, options) {
+      var opts = _.extend({
+        url: this.urlRoot() + '/assign',
+        data: { issue: this.id, assignee: assignee }
+      }, options);
+      return this._action(opts);
+    },
+
+    /**
+     * Plan issue
+     * @param {String|null} plan Action Plan, can be null to unplan issue
+     * @param {Object|null} options Options for jQuery ajax
+     * @returns {jqXHR}
+     */
+    plan: function (plan, options) {
+      var opts = _.extend({
+        url: this.urlRoot() + '/plan',
+        data: { issue: this.id, plan: plan }
+      }, options);
+      return this._action(opts);
+    },
+
+    /**
+     * Set severity of issue
+     * @param {String|null} severity Severity
+     * @param {Object|null} options Options for jQuery ajax
+     * @returns {jqXHR}
+     */
+    setSeverity: function (severity, options) {
+      var opts = _.extend({
+        url: this.urlRoot() + '/set_severity',
+        data: { issue: this.id, severity: severity }
+      }, options);
+      return this._action(opts);
+    },
+
+    /**
+     * Do transition on issue
+     * @param {String|null} transition Transition
+     * @param {Object|null} options Options for jQuery ajax
+     * @returns {jqXHR}
+     */
+    transition: function (transition, options) {
+      var opts = _.extend({
+        url: this.urlRoot() + '/do_transition',
+        data: { issue: this.id, transition: transition }
+      }, options);
+      return this._action(opts);
     }
   });
 
index ba8e21bcc442f1a4b36928057443e90307bc836f..5f79fd7671ee2fb8341e8ea3e2d4c509e1765005 100644 (file)
           <li class="issue-meta">
             {{#inArray actions "assign"}}
               <button class="button-link issue-action issue-action-with-options js-issue-assign">
-                {{#if assignee}}
+                {{#if assignee.login}}
                   {{#ifShowAvatars}}
-                    <span class="text-top">{{avatarHelper assigneeEmail 16}}</span>
+                    <span class="text-top">{{avatarHelper assignee.email 16}}</span>
                   {{/ifShowAvatars}}
                 {{/if}}
-                <span class="issue-meta-label">{{#if assignee}}{{default assigneeName assignee}}{{else}}{{t 'unassigned'}}{{/if}}</span>&nbsp;<i class="icon-dropdown"></i>
+                <span class="issue-meta-label">{{#if assignee.login}}{{assignee.name}}{{else}}{{t 'unassigned'}}{{/if}}</span>&nbsp;<i class="icon-dropdown"></i>
               </button>
             {{else}}
-              {{#if assignee}}
+              {{#if assignee.login}}
                 {{#ifShowAvatars}}
-                  <span class="text-top">{{avatarHelper assigneeEmail 16}}</span>
+                  <span class="text-top">{{avatarHelper assignee.email 16}}</span>
                 {{/ifShowAvatars}}
               {{/if}}
-              <span class="issue-meta-label">{{#if assignee}}{{default assigneeName assignee}}{{else}}{{t 'unassigned'}}{{/if}}</span>
+              <span class="issue-meta-label">{{#if assignee.login}}{{assignee.name}}{{else}}{{t 'unassigned'}}{{/if}}</span>
             {{/inArray}}
           </li>
 
index 34123ec1d6ecfa045567594dbe504ccc34f1b2e6..72392d51559ce4f47b5339507ac021dbafb0ef4b 100644 (file)
@@ -24,11 +24,11 @@ define([
     },
 
     getAssignee: function () {
-      return this.model.get('assignee');
+      return this.model.get('assignee').login;
     },
 
     getAssigneeName: function () {
-      return this.model.get('assigneeName');
+      return this.model.get('assignee').name;
     },
 
     onRender: function () {
@@ -59,28 +59,8 @@ define([
       return this._super(e);
     },
 
-    submit: function (assignee, assigneeName) {
-      var that = this;
-      var _assignee = this.getAssignee(),
-          _assigneeName = this.getAssigneeName();
-      if (assignee === _assignee) {
-        return;
-      }
-      if (assignee === '') {
-        this.model.set({ assignee: null, assigneeName: null });
-      } else {
-        this.model.set({ assignee: assignee, assigneeName: assigneeName });
-      }
-      return $.ajax({
-        type: 'POST',
-        url: baseUrl + '/api/issues/assign',
-        data: {
-          issue: this.model.id,
-          assignee: assignee
-        }
-      }).fail(function () {
-        that.model.set({ assignee: _assignee, assigneeName: _assigneeName });
-      });
+    submit: function (assignee) {
+      return this.model.assign(assignee);
     },
 
     onInputClick: function (e) {
index 72741a6501bba80834ab457602f92eb62fae3fbc..4c459a0a60d648c543f54655e8fc3bcf23aadd6f 100644 (file)
@@ -27,37 +27,8 @@ define([
       return ActionOptionsView.prototype.selectOption.apply(this, arguments);
     },
 
-    submit: function (actionPlan, actionPlanName) {
-      var that = this;
-      var _actionPlan = this.getActionPlan(),
-          _actionPlanName = this.getActionPlanName();
-      if (actionPlan === _actionPlan) {
-        return;
-      }
-      if (actionPlan === '') {
-        this.model.set({
-          actionPlan: null,
-          actionPlanName: null
-        });
-      } else {
-        this.model.set({
-          actionPlan: actionPlan,
-          actionPlanName: actionPlanName
-        });
-      }
-      return $.ajax({
-        type: 'POST',
-        url: baseUrl + '/api/issues/plan',
-        data: {
-          issue: this.model.id,
-          plan: actionPlan
-        }
-      }).fail(function () {
-        return that.model.set({
-          assignee: _actionPlan,
-          assigneeName: _actionPlanName
-        });
-      });
+    submit: function (actionPlan) {
+      return this.model.plan(actionPlan);
     },
 
     getActionPlans: function () {
index 5595660ef036f0ba67ed774f2be6f667b8e6a342..eef98aa9d7004ee973789af471d859bcf45fd18f 100644 (file)
@@ -23,22 +23,7 @@ define([
     },
 
     submit: function (severity) {
-      var that = this;
-      var _severity = this.getTransition();
-      if (severity === _severity) {
-        return;
-      }
-      this.model.set({ severity: severity });
-      return $.ajax({
-        type: 'POST',
-        url: baseUrl + '/api/issues/set_severity',
-        data: {
-          issue: this.model.id,
-          severity: severity
-        }
-      }).fail(function () {
-        that.model.set({ severity: _severity });
-      });
+      return this.model.setSeverity(severity);
     },
 
     serializeData: function () {
index 3fb80bbe479956388031c698e2e38fb5d8f693b4..773db9fe2d0d497a981cddce05707722aa2e51e8 100644 (file)
@@ -19,18 +19,7 @@ define([
     },
 
     submit: function (transition) {
-      var that = this;
-      this.options.view.disableControls();
-      return $.ajax({
-        type: 'POST',
-        url: baseUrl + '/api/issues/do_transition',
-        data: {
-          issue: this.model.get('key'),
-          transition: transition
-        }
-      }).done(function () {
-        return that.options.view.resetIssue({});
-      });
+      return this.model.transition(transition);
     }
   });
 
index 0b4e94ab9080089ca24244b9476be7f627f68504..67ad617c9d2628f708e80aa45c987fdb58e8ad97 100644 (file)
@@ -274,7 +274,7 @@ define([
               options = {
                 data: {
                   componentUuids: this.model.id,
-                  extra_fields: 'actions,transitions,assigneeName,actionPlanName',
+                  extra_fields: 'actions,transitions,actionPlanName',
                   resolved: false,
                   s: 'FILE_LINE',
                   asc: true,
index 29808d1741cb33833b25aa53541d828d49de58f1..7fca895a9babe11286d99e14c3627a51d05f7b5a 100644 (file)
@@ -37,7 +37,7 @@ casper.test.begin(testName(), 16, function (test) {
         lib.mockRequestFromFile('/api/components/app', 'app.json', { data: { uuid: 'uuid' } });
         lib.mockRequestFromFile('/api/sources/lines', 'lines.json', { data: { uuid: 'uuid' } });
         lib.mockRequestFromFile('/api/issues/search', 'issues.json', { data: { componentUuids: 'uuid' } });
-        lib.mockRequest('/api/issues/set_severity', '{}',
+        lib.mockRequestFromFile('/api/issues/set_severity', 'set-severity.json',
             { data: { issue: '59fc17f7-c977-4cb6-8f04-fbe88e4b9186', severity: 'CRITICAL' } });
       })
 
@@ -45,6 +45,7 @@ casper.test.begin(testName(), 16, function (test) {
         casper.evaluate(function () {
           window.file = { uuid: 'uuid', key: 'key' };
           require(['apps/source-viewer/app']);
+          jQuery.ajaxSetup({ dataType: 'json' });
         });
       })
 
diff --git a/server/sonar-web/src/test/json/source-viewer-issues/set-severity.json b/server/sonar-web/src/test/json/source-viewer-issues/set-severity.json
new file mode 100644 (file)
index 0000000..878d21d
--- /dev/null
@@ -0,0 +1,31 @@
+{
+  "issue": {
+    "key": "59fc17f7-c977-4cb6-8f04-fbe88e4b9186",
+    "component": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
+    "componentId": 19983,
+    "project": "org.codehaus.sonar:sonar",
+    "subProject": "org.codehaus.sonar:sonar-batch",
+    "rule": "squid:S1192",
+    "status": "CONFIRMED",
+    "severity": "CRITICAL",
+    "message": "Define a constant instead of duplicating this literal \"Fail to get keys from cache \" 3 times.",
+    "line": 2,
+    "debt": "10min",
+    "author": "simon.brandhof@gmail.com",
+    "creationDate": "2014-02-20T07:48:16+0100",
+    "updateDate": "2014-02-24T16:57:34+0100",
+    "fUpdateAge": "9 months",
+    "actions": [
+      "comment",
+      "assign",
+      "assign_to_me",
+      "plan",
+      "set_severity"
+    ],
+    "transitions": [
+      "unconfirm",
+      "resolve",
+      "falsepositive"
+    ]
+  }
+}