summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--server/sonar-web/src/main/coffee/issue/issue-view.coffee39
-rw-r--r--server/sonar-web/src/main/coffee/issue/views/assign-form-view.coffee6
-rw-r--r--server/sonar-web/src/main/coffee/issue/views/set-severity-form-view.coffee6
-rw-r--r--server/sonar-web/src/main/coffee/issue/views/tags-form-view.coffee145
-rw-r--r--server/sonar-web/src/main/coffee/issue/views/transitions-form-view.coffee36
-rw-r--r--server/sonar-web/src/main/coffee/issues/component-viewer/main.coffee12
-rw-r--r--server/sonar-web/src/main/coffee/issues/workspace-list-view.coffee13
-rw-r--r--server/sonar-web/src/main/hbs/issue/issue-tags-form-option.hbs15
-rw-r--r--server/sonar-web/src/main/hbs/issue/issue-tags-form.hbs6
-rw-r--r--server/sonar-web/src/main/hbs/issue/issue-transitions-form.hbs9
-rw-r--r--server/sonar-web/src/main/hbs/issue/issue.hbs48
-rw-r--r--server/sonar-web/src/main/hbs/issues/issues-help.hbs5
-rw-r--r--server/sonar-web/src/main/js/tests/e2e/tests/issues-page-spec.js93
-rw-r--r--server/sonar-web/src/main/less/components/issues.less28
14 files changed, 302 insertions, 159 deletions
diff --git a/server/sonar-web/src/main/coffee/issue/issue-view.coffee b/server/sonar-web/src/main/coffee/issue/issue-view.coffee
index 669179a6648..a8e09a3ca4d 100644
--- a/server/sonar-web/src/main/coffee/issue/issue-view.coffee
+++ b/server/sonar-web/src/main/coffee/issue/issue-view.coffee
@@ -6,12 +6,14 @@ define [
'issue/views/issue-popup'
+ 'issue/views/transitions-form-view'
'issue/views/assign-form-view'
'issue/views/comment-form-view'
'issue/views/plan-form-view'
'issue/views/set-severity-form-view'
'issue/views/more-actions-view'
'issue/views/rule-overlay'
+ 'issue/views/tags-form-view'
'templates/issue'
@@ -23,12 +25,14 @@ define [
IssuePopup
+ TransitionsFormView
AssignFormView
CommentFormView
PlanFormView
SetSeverityFormView
MoreActionsView
RuleOverlay
+ TagsFormView
) ->
@@ -66,9 +70,7 @@ define [
'click .js-issue-show-changelog': 'showChangeLog'
'click .js-issue-more': 'showMoreActions'
'click .js-issue-rule': 'showRule'
- 'click @ui.tagsChange': 'changeTags'
- 'click @ui.tagsEditDone': 'editDone'
- 'click @ui.tagsEditCancel': 'cancelEdit'
+ 'click .js-issue-edit-tags': 'editTags'
onRender: ->
@@ -172,22 +174,19 @@ define [
.done =>
@updateAfterAction true
window.process.finishBackgroundProcess p
- .fail (r) =>
+ .fail =>
window.process.failBackgroundProcess p
transition: (e) ->
- p = window.process.addBackgroundProcess()
- $.ajax
- type: 'POST',
- url: baseUrl + '/api/issues/do_transition',
- data:
- issue: @model.get('key')
- transition: $(e.currentTarget).data 'transition'
- .done =>
- @resetIssue {}, p
- .fail =>
- window.process.failBackgroundProcess p
+ e.stopPropagation()
+ $('body').click()
+ @popup = new TransitionsFormView
+ triggerEl: $(e.currentTarget)
+ bottom: true
+ model: @model
+ view: @
+ @popup.render()
setSeverity: (e) ->
@@ -267,6 +266,16 @@ define [
ruleOverlay.render()
+ editTags: (e)->
+ e.stopPropagation()
+ $('body').click()
+ @popup = new TagsFormView
+ triggerEl: $(e.currentTarget)
+ bottomRight: true
+ model: @model
+ @popup.render()
+
+
changeTags: ->
p = window.process.addBackgroundProcess()
jQuery.ajax
diff --git a/server/sonar-web/src/main/coffee/issue/views/assign-form-view.coffee b/server/sonar-web/src/main/coffee/issue/views/assign-form-view.coffee
index ebff3de408a..bca4eb2d641 100644
--- a/server/sonar-web/src/main/coffee/issue/views/assign-form-view.coffee
+++ b/server/sonar-web/src/main/coffee/issue/views/assign-form-view.coffee
@@ -36,11 +36,11 @@ define [
onRender: ->
super
- @renderAssignees()
+ @renderTags()
setTimeout (=> @$('input').focus()), 100
- renderAssignees: ->
+ renderTags: ->
@$('.issue-action-option').remove()
@getAssignees().forEach @renderAssignee, @
@selectInitialOption()
@@ -118,7 +118,7 @@ define [
@assignees = users.map (user) ->
id: user.login
text: user.name
- @renderAssignees()
+ @renderTags()
getAssignees: ->
diff --git a/server/sonar-web/src/main/coffee/issue/views/set-severity-form-view.coffee b/server/sonar-web/src/main/coffee/issue/views/set-severity-form-view.coffee
index b8110244861..836ef3babaa 100644
--- a/server/sonar-web/src/main/coffee/issue/views/set-severity-form-view.coffee
+++ b/server/sonar-web/src/main/coffee/issue/views/set-severity-form-view.coffee
@@ -12,12 +12,12 @@ define [
template: Templates['issue-set-severity-form']
- getSeverity: ->
+ getTransition: ->
@model.get 'severity'
selectInitialOption: ->
- @makeActive @getOptions().filter("[data-value=#{@getSeverity()}]")
+ @makeActive @getOptions().filter("[data-value=#{@getTransition()}]")
selectOption: (e) ->
@@ -27,7 +27,7 @@ define [
submit: (severity) ->
- _severity = @getSeverity()
+ _severity = @getTransition()
return if severity == _severity
p = window.process.addBackgroundProcess()
@model.set severity: severity
diff --git a/server/sonar-web/src/main/coffee/issue/views/tags-form-view.coffee b/server/sonar-web/src/main/coffee/issue/views/tags-form-view.coffee
new file mode 100644
index 00000000000..6b32590a270
--- /dev/null
+++ b/server/sonar-web/src/main/coffee/issue/views/tags-form-view.coffee
@@ -0,0 +1,145 @@
+define [
+ 'issue/views/action-options-view'
+ 'templates/issue'
+], (
+ ActionOptionsView
+) ->
+
+ $ = jQuery
+
+
+ class extends ActionOptionsView
+ template: Templates['issue-tags-form']
+ optionTemplate: Templates['issue-tags-form-option']
+
+
+ modelEvents:
+ 'change:tags': 'renderTags'
+
+
+ events: ->
+ _.extend super,
+ 'click input': 'onInputClick'
+ 'keydown input': 'onInputKeydown'
+ 'keyup input': 'onInputKeyup'
+
+
+ initialize: ->
+ super
+ @query = ''
+ @tags = []
+ @selected = 0
+ @debouncedSearch = _.debounce @search, 250
+ @requestTags()
+
+
+ requestTags: ->
+ $.get "#{baseUrl}/api/issues/tags", ps: 0
+ .done (data) =>
+ @tags = data.tags
+ @renderTags()
+
+
+ onRender: ->
+ super
+ @renderTags()
+ setTimeout (=> @$('input').focus()), 100
+
+
+ selectInitialOption: ->
+ @selected = Math.max Math.min(@selected, @getOptions().length - 1), 0
+ @makeActive @getOptions().eq @selected
+
+
+ filterTags: (tags) ->
+ _.filter tags, (tag) => tag.indexOf(@query) != -1
+
+
+ renderTags: ->
+ @$('.issue-action-option').remove()
+ @filterTags(@getTags()).forEach @renderSelectedTag, @
+ @filterTags(_.difference(@tags, @getTags())).forEach @renderTag, @
+ if @query.length > 0 && @tags.indexOf(@query) == -1 && @getTags().indexOf(@query) == -1
+ @renderCustomTag @query
+ @selectInitialOption()
+
+
+ renderSelectedTag: (tag) ->
+ html = @optionTemplate { tag: tag, selected: true, custom: false }
+ @$('.issue-action-options').append html
+
+
+ renderTag: (tag) ->
+ html = @optionTemplate { tag: tag, selected: false, custom: false }
+ @$('.issue-action-options').append html
+
+
+ renderCustomTag: (tag) ->
+ html = @optionTemplate { tag: tag, selected: false, custom: true }
+ @$('.issue-action-options').append html
+
+
+ selectOption: (e) ->
+ e.preventDefault()
+ e.stopPropagation()
+ tags = @getTags().slice()
+ tag = $(e.currentTarget).data 'value'
+ if $(e.currentTarget).data('selected')?
+ tags = _.without tags, tag
+ else
+ tags.push tag
+ @selected = @getOptions().index $(e.currentTarget)
+ @submit tags
+
+
+ submit: (tags) ->
+ _tags = @getTags()
+ @model.set tags: tags
+ p = window.process.addBackgroundProcess()
+ $.ajax
+ type: 'POST'
+ url: "#{baseUrl}/api/issues/set_tags"
+ data:
+ key: @model.id
+ tags: tags.join()
+ .done =>
+ window.process.finishBackgroundProcess p
+ .fail =>
+ @model.set tags: _tags
+ window.process.failBackgroundProcess p
+
+
+ onInputClick: (e) ->
+ e.stopPropagation()
+
+
+ onInputKeydown: (e) ->
+ @query = @$('input').val()
+ return @selectPreviousOption() if e.keyCode == 38 # up
+ return @selectNextOption() if e.keyCode == 40 # down
+ return @selectActiveOption() if e.keyCode == 13 # return
+ return false if e.keyCode == 9 # tab
+ @close() if e.keyCode == 27 # escape
+
+
+ onInputKeyup: ->
+ query = @$('input').val()
+ if query != @query
+ @query = query
+ @debouncedSearch query
+
+
+ search: (query) ->
+ @query = query
+ @renderTags()
+
+
+ resetAssignees: (users) ->
+ @assignees = users.map (user) ->
+ id: user.login
+ text: user.name
+ @renderTags()
+
+
+ getTags: ->
+ @model.get('tags') || []
diff --git a/server/sonar-web/src/main/coffee/issue/views/transitions-form-view.coffee b/server/sonar-web/src/main/coffee/issue/views/transitions-form-view.coffee
new file mode 100644
index 00000000000..f389cbf3c6d
--- /dev/null
+++ b/server/sonar-web/src/main/coffee/issue/views/transitions-form-view.coffee
@@ -0,0 +1,36 @@
+define [
+ 'issue/views/action-options-view'
+ 'templates/issue'
+], (
+ ActionOptionsView
+) ->
+
+ $ = jQuery
+
+
+ class extends ActionOptionsView
+ template: Templates['issue-transitions-form']
+
+
+ selectInitialOption: ->
+ @makeActive @getOptions().first()
+
+
+ selectOption: (e) ->
+ transition = $(e.currentTarget).data 'value'
+ @submit transition
+ super
+
+
+ submit: (transition) ->
+ p = window.process.addBackgroundProcess()
+ $.ajax
+ type: 'POST',
+ url: baseUrl + '/api/issues/do_transition',
+ data:
+ issue: @model.get('key')
+ transition: transition
+ .done =>
+ @options.view.resetIssue {}, p
+ .fail =>
+ window.process.failBackgroundProcess p
diff --git a/server/sonar-web/src/main/coffee/issues/component-viewer/main.coffee b/server/sonar-web/src/main/coffee/issues/component-viewer/main.coffee
index 9979b1ad5ba..09b1dc11b18 100644
--- a/server/sonar-web/src/main/coffee/issues/component-viewer/main.coffee
+++ b/server/sonar-web/src/main/coffee/issues/component-viewer/main.coffee
@@ -36,11 +36,6 @@ define [
bindShortcuts: ->
- doTransition = (transition) =>
- selectedIssueView = @getSelectedIssueEl()
- return unless selectedIssueView
- selectedIssueView.find("[data-transition=#{transition}]").click()
-
doAction = (action) =>
selectedIssueView = @getSelectedIssueEl()
return unless selectedIssueView
@@ -58,12 +53,7 @@ define [
@options.app.controller.closeComponentViewer()
false
- key 'c', 'componentViewer', -> doTransition 'confirm'
- key 'c', 'componentViewer', -> doTransition 'unconfirm'
- key 'u', 'componentViewer', -> doTransition 'mute'
- key 'r', 'componentViewer', -> doTransition 'resolve'
- key 'r', 'componentViewer', -> doTransition 'reopen'
- key 'f', 'componentViewer', -> doTransition 'falsepositive'
+ key 'f', 'componentViewer', -> doAction 'transition'
key 'a', 'componentViewer', -> doAction 'assign'
key 'm', 'componentViewer', -> doAction 'assign-to-me'
key 'p', 'componentViewer', -> doAction 'plan'
diff --git a/server/sonar-web/src/main/coffee/issues/workspace-list-view.coffee b/server/sonar-web/src/main/coffee/issues/workspace-list-view.coffee
index b659fcf1b6f..ebe82875367 100644
--- a/server/sonar-web/src/main/coffee/issues/workspace-list-view.coffee
+++ b/server/sonar-web/src/main/coffee/issues/workspace-list-view.coffee
@@ -25,12 +25,6 @@ define [
bindShortcuts: ->
- doTransition = (transition) =>
- selectedIssue = @collection.at @options.app.state.get 'selectedIndex'
- return unless selectedIssue?
- selectedIssueView = @children.findByModel selectedIssue
- selectedIssueView.$("[data-transition=#{transition}]").click()
-
doAction = (action) =>
selectedIssue = @collection.at @options.app.state.get 'selectedIndex'
return unless selectedIssue?
@@ -44,12 +38,7 @@ define [
@options.app.controller.showComponentViewer selectedIssue
return false
- key 'c', 'list', -> doTransition 'confirm'
- key 'c', 'list', -> doTransition 'unconfirm'
- key 'u', 'list', -> doTransition 'mute'
- key 'r', 'list', -> doTransition 'resolve'
- key 'r', 'list', -> doTransition 'reopen'
- key 'f', 'list', -> doTransition 'falsepositive'
+ key 'f', 'list', -> doAction 'transition'
key 'a', 'list', -> doAction 'assign'
key 'm', 'list', -> doAction 'assign-to-me'
key 'p', 'list', -> doAction 'plan'
diff --git a/server/sonar-web/src/main/hbs/issue/issue-tags-form-option.hbs b/server/sonar-web/src/main/hbs/issue/issue-tags-form-option.hbs
new file mode 100644
index 00000000000..df054fe2466
--- /dev/null
+++ b/server/sonar-web/src/main/hbs/issue/issue-tags-form-option.hbs
@@ -0,0 +1,15 @@
+<a href="#" class="issue-action-option" data-value="{{tag}}" data-text="{{tag}}"
+ {{#if selected}}data-selected{{/if}}>
+
+ {{#if selected}}
+ <i class="icon-checkbox icon-checkbox-checked"></i>
+ {{else}}
+ <i class="icon-checkbox"></i>
+ {{/if}}
+
+ {{#if custom}}
+ + {{tag}}
+ {{else}}
+ {{tag}}
+ {{/if}}
+</a>
diff --git a/server/sonar-web/src/main/hbs/issue/issue-tags-form.hbs b/server/sonar-web/src/main/hbs/issue/issue-tags-form.hbs
new file mode 100644
index 00000000000..9d20be8d079
--- /dev/null
+++ b/server/sonar-web/src/main/hbs/issue/issue-tags-form.hbs
@@ -0,0 +1,6 @@
+<div class="issue-action-options">
+ <i class="icon-search issue-action-options-search-icon"></i>
+ <input class="issue-action-options-search" type="text" placeholder="Search..." value="{{query}}">
+</div>
+
+<div class="bubble-popup-arrow"></div>
diff --git a/server/sonar-web/src/main/hbs/issue/issue-transitions-form.hbs b/server/sonar-web/src/main/hbs/issue/issue-transitions-form.hbs
new file mode 100644
index 00000000000..ab64424207e
--- /dev/null
+++ b/server/sonar-web/src/main/hbs/issue/issue-transitions-form.hbs
@@ -0,0 +1,9 @@
+<div class="issue-action-options">
+ {{#each transitions}}
+ <a href="#" class="issue-action-option js-issue-transition" data-value="{{this}}">
+ {{t 'issue.transition' this}}
+ </a>
+ {{/each}}
+</div>
+
+<div class="bubble-popup-arrow"></div>
diff --git a/server/sonar-web/src/main/hbs/issue/issue.hbs b/server/sonar-web/src/main/hbs/issue/issue.hbs
index bf36dc75dc8..0c23a0576c4 100644
--- a/server/sonar-web/src/main/hbs/issue/issue.hbs
+++ b/server/sonar-web/src/main/hbs/issue/issue.hbs
@@ -2,14 +2,13 @@
<tr>
<td>
<div class="issue-message">{{message}}</div>
+ <div class="issue-message">
+ <a class="issue-rule js-issue-rule">{{ruleName}}</a>
+ </div>
</td>
<td class="issue-table-meta-cell">
<div class="issue-meta-list">
- <div class="issue-meta">
- <a class="issue-action js-issue-rule">Rule</a>
- </div>
-
{{#if debt}}
<div class="issue-meta">
<span class="issue-meta-label">{{t 'issue.debt'}} {{debt}}</span>
@@ -51,19 +50,16 @@
</div>
<div class="issue-meta">
- {{statusHelper status resolution}}
+ {{#notEmpty transitions}}
+ <a class="issue-action issue-action-with-options js-issue-transition">
+ <span class="issue-meta-label">{{statusHelper status resolution}}</span>&nbsp;<i
+ class="icon-dropdown"></i>
+ </a>
+ {{else}}
+ {{statusHelper status resolution}}
+ {{/notEmpty}}
</div>
- {{#notEmpty transitions}}
- <div class="issue-meta">
- {{#each transitions}}
- <a class="issue-action js-issue-transition" data-transition="{{this}}">
- <span class="issue-meta-label">{{t 'issue.transition' this}}</span>
- </a>
- {{/each}}
- </div>
- {{/notEmpty}}
-
<div class="issue-meta">
{{#inArray actions "assign"}}
<a class="issue-action issue-action-with-options js-issue-assign">
@@ -97,7 +93,7 @@
{{#inArray actions "comment"}}
<div class="issue-meta">
<a class="issue-action js-issue-comment"><span
- class="issue-meta-label">{{t 'issue.comment.formlink' }}</span></a>
+ class="issue-meta-label"><i class="icon-comment"></i></span></a>
</div>
{{/inArray}}
@@ -112,18 +108,16 @@
</td>
<td class="issue-table-meta-cell">
- <div class="issue-tags">
- <span class="issue-tag-list {{#inArray actions "set_tags"}}js-issue-edit-tags{{/inArray}}">
- <i class="icon-tags"></i>
- <span class="issue-meta">{{#if tags}}{{join tags ', '}}{{else}}{{t 'issue.no_tag'}}{{/if}}</span>
- </span>
+ <div class="issue-meta js-issue-tags">
{{#inArray actions "set_tags"}}
- <span class="issue-meta issue-tag-edit">
- <input class="issue-tag-input" type="text" value="{{#if tags}}{{join tags ','}}{{/if}}">
- <span class="button-group">
- <button class="issue-tag-edit-done">{{t 'Done'}}</button>
- </span>
- <a class="issue-tag-edit-cancel">{{t 'cancel'}}</a>
+ <a class="issue-action issue-action-with-options js-issue-edit-tags">
+ <span>
+ <i class="icon-tags"></i>&nbsp;<span>{{#if tags}}{{join tags ', '}}{{else}}{{t 'issue.no_tag'}}{{/if}}</span>
+ </span>&nbsp;<i class="icon-dropdown"></i>
+ </a>
+ {{else}}
+ <span>
+ <i class="icon-tags"></i>&nbsp;<span>{{#if tags}}{{join tags ', '}}{{else}}{{t 'issue.no_tag'}}{{/if}}</span>
</span>
{{/inArray}}
</div>
diff --git a/server/sonar-web/src/main/hbs/issues/issues-help.hbs b/server/sonar-web/src/main/hbs/issues/issues-help.hbs
index fe36051338e..1fc3cdcc65c 100644
--- a/server/sonar-web/src/main/hbs/issues/issues-help.hbs
+++ b/server/sonar-web/src/main/hbs/issues/issues-help.hbs
@@ -12,10 +12,7 @@
</ul>
<p>To control selected issue</p>
<ul>
- <li><span class="shortcut-button">c</span> &nbsp;&nbsp; to confirm/unconfirm</li>
- <li><span class="shortcut-button">r</span> &nbsp;&nbsp; to resolve/reopen</li>
- <li><span class="shortcut-button">f</span> &nbsp;&nbsp; to mark as false positive</li>
- <li><span class="shortcut-button">u</span> &nbsp;&nbsp; to mute</li>
+ <li><span class="shortcut-button">f</span> &nbsp;&nbsp; to do a transition</li>
<li><span class="shortcut-button">a</span> &nbsp;&nbsp; to assign</li>
<li><span class="shortcut-button">m</span> &nbsp;&nbsp; to assign to the current user</li>
<li><span class="shortcut-button">p</span> &nbsp;&nbsp; to plan</li>
diff --git a/server/sonar-web/src/main/js/tests/e2e/tests/issues-page-spec.js b/server/sonar-web/src/main/js/tests/e2e/tests/issues-page-spec.js
index 710a3068462..1fc62c032d6 100644
--- a/server/sonar-web/src/main/js/tests/e2e/tests/issues-page-spec.js
+++ b/server/sonar-web/src/main/js/tests/e2e/tests/issues-page-spec.js
@@ -79,15 +79,13 @@ casper.test.begin(testName('Issue Box', 'Check Elements'), function (test) {
.then(function () {
test.assertSelectorContains('.issue.selected', "Add a 'package-info.java' file to document the");
- test.assertExists('.issue.selected .issue-tags');
- test.assertSelectorContains('.issue.selected .issue-tags', 'issue.no_tag');
+ test.assertExists('.issue.selected .js-issue-tags');
+ test.assertSelectorContains('.issue.selected .js-issue-tags', 'issue.no_tag');
test.assertExists('.issue.selected .js-issue-set-severity');
test.assertSelectorContains('.issue.selected .js-issue-set-severity', 'MAJOR');
test.assertSelectorContains('.issue.selected', 'CONFIRMED');
- test.assertElementCount('.issue.selected .js-issue-transition', 3);
- test.assertExists('.issue.selected [data-transition=unconfirm]');
- test.assertExists('.issue.selected [data-transition=resolve]');
- test.assertExists('.issue.selected [data-transition=falsepositive]');
+ test.assertElementCount('.issue.selected .js-issue-transition', 1);
+ test.assertExists('.issue.selected .js-issue-transition');
test.assertExists('.issue.selected .js-issue-assign');
test.assertSelectorContains('.issue.selected .js-issue-assign', 'unassigned');
test.assertExists('.issue.selected .js-issue-plan');
@@ -111,25 +109,31 @@ casper.test.begin(testName('Issue Box', 'Tags'), function (test) {
lib.mockRequest('/api/l10n/index', '{}');
lib.mockRequestFromFile('/api/issue_filters/app', 'app.json');
lib.mockRequestFromFile('/api/issues/search', 'search-with-tags.json');
- this.showMock = lib.mockRequestFromFile('/api/issues/show*', 'show-with-tags.json');
+ lib.mockRequestFromFile('/api/issues/tags', 'tags.json');
+ lib.mockRequestFromFile('/api/issues/set_tags', 'tags-modified.json');
})
.then(function () {
- casper.waitForSelector('.issue.selected .issue-tags', function () {
- test.assertSelectorContains('.issue.selected .issue-tags', 'security, cwe');
- lib.mockRequestFromFile('/api/issues/tags*', 'tags.json');
- casper.click('.issue.selected .issue-tag-list');
-
- casper.waitForSelector('.issue.selected .select2-input', function () {
- lib.mockRequestFromFile('/api/issues/set_tags', 'tags-modified.json');
- casper.click('.issue.selected .issue-tag-edit-done');
- casper.waitWhileVisible('.issue.selected .issue-tag-edit');
- casper.waitUntilVisible('.issue.selected .issue-tag-list', function () {
- // TODO Find a way to have this assertion work
- // test.assertSelectorContains('.issue.selected .issue-tags .issue-tag-list', 'security, cwe, cert');
- });
- });
- });
+ casper.waitForSelector('.issue.selected .js-issue-tags');
+ })
+
+ .then(function () {
+ test.assertSelectorContains('.issue.selected .js-issue-tags', 'security, cwe');
+ casper.click('.issue.selected .js-issue-edit-tags');
+ })
+
+ .then(function () {
+ casper.waitForSelector('.issue-action-option[data-value=design]');
+ })
+
+ .then(function () {
+ casper.click('.issue-action-option[data-value=design]');
+ test.assertSelectorContains('.issue.selected .js-issue-tags', 'security, cwe, design');
+ })
+
+ .then(function () {
+ casper.click('.issue-action-option[data-value=cwe]');
+ test.assertSelectorContains('.issue.selected .js-issue-tags', 'security, design');
})
.run(function () {
@@ -146,54 +150,23 @@ casper.test.begin(testName('Issue Box', 'Transitions'), function (test) {
lib.mockRequest('/api/l10n/index', '{}');
lib.mockRequestFromFile('/api/issue_filters/app', 'app.json');
lib.mockRequestFromFile('/api/issues/search', 'search.json');
- this.showMock = lib.mockRequestFromFile('/api/issues/show*', 'show.json');
+ lib.mockRequestFromFile('/api/issues/show*', 'show.json');
lib.mockRequest('/api/issues/do_transition', '{}');
})
.then(function () {
- casper.waitForSelector('.issue.selected [data-transition=unconfirm]', function () {
- test.assertExists('.issue.selected [data-transition=unconfirm]');
- test.assertExists('.issue.selected [data-transition=resolve]');
- test.assertExists('.issue.selected [data-transition=falsepositive]');
- lib.clearRequestMock(this.showMock);
- this.showMock = lib.mockRequestFromFile('/api/issues/show*', 'show-open.json');
- casper.click('.issue.selected [data-transition=unconfirm]');
- });
- })
-
- .then(function () {
- casper.waitForSelector('.issue.selected [data-transition=confirm]', function () {
- test.assertExists('.issue.selected [data-transition=resolve]');
- test.assertExists('.issue.selected [data-transition=falsepositive]');
- lib.clearRequestMock(this.showMock);
- this.showMock = lib.mockRequestFromFile('/api/issues/show*', 'show-resolved.json');
- casper.click('.issue.selected [data-transition=resolve]');
- });
- })
-
- .then(function () {
- casper.waitForSelector('.issue.selected [data-transition=reopen]', function () {
- lib.clearRequestMock(this.showMock);
- this.showMock = lib.mockRequestFromFile('/api/issues/show*', 'show-open.json');
- casper.click('.issue.selected [data-transition=reopen]');
- });
+ casper.waitForSelector('.issue.selected .js-issue-transition');
})
.then(function () {
- casper.waitForSelector('.issue.selected [data-transition=confirm]', function () {
- test.assertExists('.issue.selected [data-transition=confirm]');
- test.assertExists('.issue.selected [data-transition=resolve]');
- test.assertExists('.issue.selected [data-transition=falsepositive]');
- lib.clearRequestMock(this.showMock);
- this.showMock = lib.mockRequestFromFile('/api/issues/show*', 'show-resolved.json');
- casper.click('.issue.selected [data-transition=falsepositive]');
- });
+ casper.click('.issue.selected .js-issue-transition');
+ casper.waitForSelector('.issue-action-option');
})
.then(function () {
- casper.waitForSelector('.issue.selected [data-transition=reopen]', function () {
- test.assertExists('.issue.selected [data-transition=reopen]');
- });
+ test.assertExists('.issue-action-option[data-value=unconfirm]');
+ test.assertExists('.issue-action-option[data-value=resolve]');
+ test.assertExists('.issue-action-option[data-value=falsepositive]');
})
.run(function () {
diff --git a/server/sonar-web/src/main/less/components/issues.less b/server/sonar-web/src/main/less/components/issues.less
index e4029858dde..6db3500bfb8 100644
--- a/server/sonar-web/src/main/less/components/issues.less
+++ b/server/sonar-web/src/main/less/components/issues.less
@@ -64,30 +64,10 @@
font-weight: 500;
}
-.issue-tags {
- padding-left: @leftPadding;
- line-height: 1.5;
- font-size: @baseFontSize;
-}
-
-.issue-tag-list {
- display: inline-block;
-
- .icon-tags {
- color: @secondFontColor;
- }
-}
-
-.issue-tags-change {
- cursor: pointer;
-}
-
-.issue-tag-edit {
- display: none;
-}
-
-.issue-tag-edit-cancel {
- vertical-align: middle;
+.issue-rule {
+ font-size: 11px;
+ font-weight: 400;
+ .link-no-underline;
}
.issue-component {