], 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({
--- /dev/null
+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);
+ }
+ });
+
+});
define([
- 'components/issue/models/issue'
+ './issue'
], function (Issue) {
return Backbone.Collection.extend({
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, {
ruleName: rule.name
});
}
- if (assignee) {
- _.extend(issue, {
- assigneeEmail: assignee.email
- });
- }
return issue;
});
},
</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">
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,
if (rule) {
_.extend(issue, { ruleName: rule.name });
}
- if (assignee) {
- _.extend(issue, { assigneeEmail: assignee.email });
- }
return issue;
});
}
});
}
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)) {
}
}
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);
}
});
<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> <i class="icon-dropdown"></i>
+ <span class="issue-meta-label">{{#if assignee.login}}{{assignee.name}}{{else}}{{t 'unassigned'}}{{/if}}</span> <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>
},
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 () {
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) {
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 () {
},
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 () {
},
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);
}
});
options = {
data: {
componentUuids: this.model.id,
- extra_fields: 'actions,transitions,assigneeName,actionPlanName',
+ extra_fields: 'actions,transitions,actionPlanName',
resolved: false,
s: 'FILE_LINE',
asc: true,
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' } });
})
casper.evaluate(function () {
window.file = { uuid: 'uuid', key: 'key' };
require(['apps/source-viewer/app']);
+ jQuery.ajaxSetup({ dataType: 'json' });
});
})
--- /dev/null
+{
+ "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"
+ ]
+ }
+}