mirror of
https://github.com/SonarSource/sonarqube.git
synced 2024-07-29 08:17:28 +02:00
SONAR-5718 Apply feedback
This commit is contained in:
parent
f535ffe5c5
commit
c0ea0f9938
@ -252,3 +252,10 @@ define [
|
||||
ruleOverlay = new RuleOverlay
|
||||
model: new Backbone.Model r.rule
|
||||
ruleOverlay.render()
|
||||
|
||||
|
||||
serializeData: ->
|
||||
componentKey = encodeURIComponent @model.get 'component'
|
||||
issueKey = encodeURIComponent @model.get 'key'
|
||||
_.extend super,
|
||||
permalink: "#{baseUrl}/component/index#component=#{componentKey}¤tIssue=#{issueKey}"
|
||||
|
@ -6,8 +6,6 @@ define [
|
||||
PopupView
|
||||
) ->
|
||||
|
||||
$ = jQuery
|
||||
|
||||
|
||||
class extends PopupView
|
||||
template: Templates['issue-more-actions']
|
||||
@ -20,10 +18,3 @@ define [
|
||||
action: (e) ->
|
||||
actionKey = $(e.currentTarget).data 'action'
|
||||
@options.detailView.action actionKey
|
||||
|
||||
|
||||
serializeData: ->
|
||||
componentKey = encodeURIComponent @model.get 'component'
|
||||
issueKey = encodeURIComponent @model.get 'key'
|
||||
_.extend super,
|
||||
permalink: "#{baseUrl}/component/index#component=#{componentKey}¤tIssue=#{issueKey}"
|
||||
|
@ -157,7 +157,6 @@ define [
|
||||
|
||||
|
||||
requestIssues: ->
|
||||
console.log 'Request issues'
|
||||
if @options.app.issues.last().get('component') == @model.get('key')
|
||||
r = @options.app.controller.fetchNextPage()
|
||||
else r = $.Deferred().resolve().promise()
|
||||
@ -165,7 +164,6 @@ define [
|
||||
@issues.reset @options.app.issues.filter (issue) => issue.get('component') == @model.key()
|
||||
@issues.reset @limitIssues @issues
|
||||
@addIssuesPerLineMeta @issues
|
||||
console.log 'Issues loaded'
|
||||
|
||||
|
||||
renderIssue: (issue) ->
|
||||
|
@ -210,6 +210,8 @@ define [
|
||||
|
||||
closeComponentViewer: ->
|
||||
key.setScope 'list'
|
||||
# close all popups
|
||||
$('body').click()
|
||||
@options.app.state.unset 'component'
|
||||
@options.app.layout.workspaceComponentViewerRegion.reset()
|
||||
@options.app.layout.hideComponentViewer()
|
||||
|
@ -1,7 +1,4 @@
|
||||
<ul class="issue-more-actions">
|
||||
<li>
|
||||
<a class="issue-action" target="_blank" href="{{permalink}}">Get Permalink</a>
|
||||
</li>
|
||||
{{#pluginActions actions}}
|
||||
<li>
|
||||
<a class="issue-action js-issue-action" data-action="{{this}}">{{t "issue.action" this "formlink"}}</a>
|
||||
|
@ -28,10 +28,13 @@
|
||||
<div class="issue-meta">
|
||||
{{#inArray actions "assign"}}
|
||||
<a class="issue-action issue-action-with-options js-issue-assign">
|
||||
<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}}{{default assigneeName assignee}}{{else}}{{t 'unassigned'}}{{/if}}</span> <i
|
||||
class="icon-dropdown"></i>
|
||||
</a>
|
||||
{{else}}
|
||||
<span class="issue-meta-label">{{#if assignee}}{{default assigneeName assignee}}{{else}}{{t 'unassigned'}}{{/if}}</span>
|
||||
<span
|
||||
class="issue-meta-label">{{#if assignee}}{{default assigneeName assignee}}{{else}}{{t 'unassigned'}}{{/if}}</span>
|
||||
{{/inArray}}
|
||||
</div>
|
||||
|
||||
@ -42,10 +45,13 @@
|
||||
<div class="issue-meta">
|
||||
{{#inArray actions "plan"}}
|
||||
<a class="issue-action issue-action-with-options js-issue-plan">
|
||||
<span class="issue-meta-label">{{#if actionPlan}}{{default actionPlanName actionPlan}}{{else}}{{t 'issue.unplanned'}}{{/if}}</span> <i class="icon-dropdown"></i>
|
||||
<span
|
||||
class="issue-meta-label">{{#if actionPlan}}{{default actionPlanName actionPlan}}{{else}}{{t 'issue.unplanned'}}{{/if}}</span> <i
|
||||
class="icon-dropdown"></i>
|
||||
</a>
|
||||
{{else}}
|
||||
<span class="issue-meta-label">{{#if actionPlan}}{{default actionPlanName actionPlan}}{{else}}{{t 'issue.unplanned'}}{{/if}}</span>
|
||||
<span
|
||||
class="issue-meta-label">{{#if actionPlan}}{{default actionPlanName actionPlan}}{{else}}{{t 'issue.unplanned'}}{{/if}}</span>
|
||||
{{/inArray}}
|
||||
</div>
|
||||
|
||||
@ -55,11 +61,13 @@
|
||||
</div>
|
||||
{{/inArray}}
|
||||
|
||||
<div class="issue-meta">
|
||||
<a class="issue-action issue-action-with-options js-issue-more">
|
||||
<span class="issue-meta-label">{{t 'more'}}</span> <i class="icon-dropdown"></i>
|
||||
</a>
|
||||
</div>
|
||||
{{#ifHasExtraActions actions}}
|
||||
<div class="issue-meta">
|
||||
<a class="issue-action issue-action-with-options js-issue-more">
|
||||
<span class="issue-meta-label">{{t 'more'}}</span> <i class="icon-dropdown"></i>
|
||||
</a>
|
||||
</div>
|
||||
{{/ifHasExtraActions}}
|
||||
|
||||
<div class="issue-meta issue-meta-on-right">
|
||||
<a class="issue-action issue-action-with-options js-issue-show-changelog" title="{{dt creationDate}}">
|
||||
@ -77,11 +85,15 @@
|
||||
<a class="issue-action js-issue-rule">Rule</a>
|
||||
</div>
|
||||
|
||||
{{#if line}}
|
||||
<div class="issue-meta issue-meta-in-corner">
|
||||
|
||||
<div class="issue-meta issue-meta-in-corner">
|
||||
{{#if line}}
|
||||
<span class="issue-meta-label">L{{line}}</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{/if}}
|
||||
<a class="issue-action js-issue-permalink icon-link" href="{{permalink}}" target="_blank"></a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
{{#notEmpty comments}}
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
{{#with state.component}}
|
||||
{{qualifierIcon 'TRK'}} <a href="{{dashboardUrl project}}" title="{{projectName}}">{{projectName}}</a>
|
||||
/
|
||||
|
||||
{{qualifierIcon qualifier}} <a href="{{dashboardUrl key}}" title="{{name}}">{{name}}</a>
|
||||
{{/with}}
|
||||
{{else}}
|
||||
|
@ -1,5 +1,17 @@
|
||||
<div class="bubble-popup-container">
|
||||
<div class="bubble-popup-title">{{t 'component_viewer.transition.coverage'}}</div>
|
||||
<div class="bubble-popup-title">
|
||||
{{#if row.lineHits}}
|
||||
{{t 'source_viewer.covered'}}
|
||||
{{#if row.conditions}}
|
||||
({{default row.coveredConditions 0}} of {{row.conditions}} {{t 'source_viewer.conditions'}})
|
||||
{{/if}}
|
||||
{{else}}
|
||||
{{t 'source_viewer.not_covered'}}
|
||||
{{#if row.conditions}}
|
||||
({{row.conditions}} {{t 'source_viewer.conditions'}})
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
{{#each testFiles}}
|
||||
<div class="bubble-popup-section">
|
||||
|
@ -0,0 +1,13 @@
|
||||
<div class="bubble-popup-container">
|
||||
<div class="bubble-popup-section">
|
||||
{{scmAuthor}}
|
||||
</div>
|
||||
<div class="bubble-popup-section">
|
||||
{{dt scmDate}}
|
||||
</div>
|
||||
<div class="bubble-popup-section">
|
||||
{{scmRevision}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bubble-popup-arrow"></div>
|
@ -7,23 +7,24 @@
|
||||
<tr class="source-line {{#eq line 0}}{{#empty issues}}hidden{{/empty}}{{/eq}}">
|
||||
<td class="source-meta source-line-number" {{#if line}}data-line-number="{{line}}"{{/if}}></td>
|
||||
|
||||
<td class="source-meta source-line-scm">
|
||||
<td class="source-meta source-line-scm" {{#if line}}data-line-number="{{line}}"{{/if}}>
|
||||
{{#ifSCMChanged2 ../source line}}
|
||||
<div class="source-line-scm-inner" title="{{scmAuthor}} {{scmDate}}" data-author="{{scmAuthor}}"></div>
|
||||
{{/ifSCMChanged2}}
|
||||
</td>
|
||||
|
||||
<td class="source-meta source-line-coverage {{#notNull covered}}source-line-{{covered}}{{/notNull}}"
|
||||
<td class="source-meta source-line-coverage {{#notNull coverageStatus}}source-line-{{coverageStatus}}{{/notNull}}"
|
||||
data-line-number="{{line}}">
|
||||
<div class="source-line-bar"></div>
|
||||
</td>
|
||||
|
||||
<td class="source-meta source-line-duplications {{#if duplicated}}source-line-duplicated{{/if}}">
|
||||
<td class="source-meta source-line-duplications {{#if duplicated}}source-line-duplicated{{/if}}"
|
||||
title="{{t 'source_viewer.expand_duplications'}}">
|
||||
<div class="source-line-bar"></div>
|
||||
</td>
|
||||
|
||||
{{#each duplications}}
|
||||
<td class="source-meta source-line-duplications-extra hidden {{#if this}}source-line-duplicated{{/if}}"
|
||||
<td class="source-meta source-line-duplications-extra {{#if this}}source-line-duplicated{{/if}}"
|
||||
data-index="{{this}}" data-line-number="{{line}}">
|
||||
<div class="source-line-bar"></div>
|
||||
</td>
|
||||
|
@ -2,8 +2,7 @@ define([
|
||||
'backbone.marionette',
|
||||
'templates/source-viewer',
|
||||
'common/popup',
|
||||
'component-viewer/utils'
|
||||
], function (Marionette, Templates, Popup, utils) {
|
||||
], function (Marionette, Templates, Popup) {
|
||||
|
||||
var $ = jQuery;
|
||||
|
||||
@ -36,7 +35,10 @@ define([
|
||||
tests: testSet
|
||||
};
|
||||
});
|
||||
return { testFiles: testFiles };
|
||||
return {
|
||||
testFiles: testFiles,
|
||||
row: this.options.row
|
||||
};
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@ -1,7 +1,7 @@
|
||||
define([
|
||||
'backbone.marionette',
|
||||
'templates/component-viewer',
|
||||
'common/popup',
|
||||
'common/popup'
|
||||
], function (Marionette, Templates, Popup) {
|
||||
|
||||
var $ = jQuery;
|
||||
|
@ -0,0 +1,23 @@
|
||||
define([
|
||||
'backbone.marionette',
|
||||
'templates/source-viewer',
|
||||
'common/popup',
|
||||
], function (Marionette, Templates, Popup) {
|
||||
|
||||
return Popup.extend({
|
||||
template: Templates['source-viewer-scm-popup'],
|
||||
|
||||
events: {
|
||||
'click': 'onClick'
|
||||
},
|
||||
|
||||
onRender: function () {
|
||||
Popup.prototype.onRender.apply(this, arguments);
|
||||
this.$('.bubble-popup-container').isolatedScroll();
|
||||
},
|
||||
|
||||
onClick: function (e) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
});
|
||||
});
|
@ -6,6 +6,7 @@ define([
|
||||
'issue/models/issue',
|
||||
'issue/collections/issues',
|
||||
'issue/issue-view',
|
||||
'source-viewer/popups/scm-popup',
|
||||
'source-viewer/popups/coverage-popup',
|
||||
'source-viewer/popups/duplication-popup',
|
||||
'source-viewer/popups/line-actions-popup'
|
||||
@ -17,15 +18,13 @@ define([
|
||||
Issue,
|
||||
Issues,
|
||||
IssueView,
|
||||
SCMPopupView,
|
||||
CoveragePopupView,
|
||||
DuplicationPopupView,
|
||||
LineActionsPopupView) {
|
||||
|
||||
var $ = jQuery,
|
||||
HIGHLIGHTED_ROW_CLASS = 'source-line-highlighted',
|
||||
log = function (message) {
|
||||
return console.log('Source Viewer:', message);
|
||||
};
|
||||
HIGHLIGHTED_ROW_CLASS = 'source-line-highlighted';
|
||||
|
||||
return Marionette.ItemView.extend({
|
||||
className: 'source',
|
||||
@ -42,8 +41,10 @@ define([
|
||||
|
||||
events: function () {
|
||||
return {
|
||||
'click .source-line-scm': 'showSCMPopup',
|
||||
'click .source-line-covered': 'showCoveragePopup',
|
||||
'click .source-line-partially-covered': 'showCoveragePopup',
|
||||
'click .source-line-uncovered': 'showCoveragePopup',
|
||||
'click .source-line-duplications': 'showDuplications',
|
||||
'click .source-line-duplications-extra': 'showDuplicationPopup',
|
||||
'click .source-line-number[data-line-number]': 'highlightLine'
|
||||
@ -62,7 +63,6 @@ define([
|
||||
},
|
||||
|
||||
onRender: function () {
|
||||
log('Render');
|
||||
this.renderIssues();
|
||||
},
|
||||
|
||||
@ -83,12 +83,10 @@ define([
|
||||
this.requestComponent().done(function () {
|
||||
that.requestSource()
|
||||
.done(function () {
|
||||
that.requestCoverage().done(function () {
|
||||
that.requestDuplications().done(function () {
|
||||
that.requestIssues().done(function () {
|
||||
that.render();
|
||||
that.trigger('loaded');
|
||||
});
|
||||
that.requestDuplications().done(function () {
|
||||
that.requestIssues().done(function () {
|
||||
that.render();
|
||||
that.trigger('loaded');
|
||||
});
|
||||
});
|
||||
})
|
||||
@ -108,7 +106,6 @@ define([
|
||||
},
|
||||
|
||||
requestComponent: function () {
|
||||
log('Request component details...');
|
||||
var that = this,
|
||||
url = baseUrl + '/api/components/app',
|
||||
options = { key: this.model.key() };
|
||||
@ -124,57 +121,43 @@ define([
|
||||
};
|
||||
},
|
||||
|
||||
getCoverageStatus: function (row) {
|
||||
var status = null;
|
||||
if (row.lineHits > 0) {
|
||||
status = 'partially-covered';
|
||||
}
|
||||
if (row.lineHits > 0 && row.conditions === row.coveredConditions) {
|
||||
status = 'covered';
|
||||
}
|
||||
if (row.lineHits === 0 || row.coveredConditions === 0) {
|
||||
status = 'uncovered';
|
||||
}
|
||||
return status;
|
||||
},
|
||||
|
||||
requestSource: function () {
|
||||
log('Request source...');
|
||||
var that = this,
|
||||
url = baseUrl + '/api/sources/lines',
|
||||
options = _.extend({ uuid: this.model.id }, this.linesLimit());
|
||||
return $.get(url, options, function (data) {
|
||||
var source = data.sources || [];
|
||||
var source = (data.sources || []).slice(0);
|
||||
if (source.length === 0 || (source.length > 0 && _.first(source).line === 1)) {
|
||||
source.unshift({ line: 0 });
|
||||
}
|
||||
var firstLine = _.first(source).line;
|
||||
source = source.map(function (row) {
|
||||
return _.extend(row, { coverageStatus: that.getCoverageStatus(row) });
|
||||
});
|
||||
var firstLine = _.first(source).line,
|
||||
linesRequested = options.to - options.from + 1;
|
||||
that.model.set({
|
||||
source: source,
|
||||
hasSourceBefore: firstLine > 1,
|
||||
hasSourceAfter: true
|
||||
hasSourceAfter: data.sources.length === linesRequested
|
||||
});
|
||||
log('Source loaded');
|
||||
});
|
||||
},
|
||||
|
||||
requestCoverage: function () {
|
||||
log('Request coverage');
|
||||
var that = this,
|
||||
url = baseUrl + '/api/coverage/show',
|
||||
options = { key: this.model.key() };
|
||||
return $.get(url, options, function (data) {
|
||||
var hasCoverage = (data != null) && (data.coverage != null),
|
||||
coverage = [];
|
||||
that.model.set({ hasCoverage: hasCoverage });
|
||||
if (hasCoverage) {
|
||||
coverage = data.coverage.map(function (c) {
|
||||
var status = 'partially-covered';
|
||||
if (c[1] && c[3] === c[4]) {
|
||||
status = 'covered';
|
||||
}
|
||||
if (!c[1] || c[4] === 0) {
|
||||
status = 'uncovered';
|
||||
}
|
||||
return {
|
||||
line: +c[0],
|
||||
covered: status
|
||||
};
|
||||
});
|
||||
}
|
||||
that.model.addMeta(coverage);
|
||||
log('Coverage loaded');
|
||||
});
|
||||
},
|
||||
|
||||
requestDuplications: function () {
|
||||
log('Request duplications');
|
||||
var that = this,
|
||||
url = baseUrl + '/api/duplications/show',
|
||||
options = { key: this.model.key() };
|
||||
@ -207,12 +190,10 @@ define([
|
||||
duplications: data.duplications,
|
||||
duplicationFiles: data.files
|
||||
});
|
||||
log('Duplications loaded');
|
||||
});
|
||||
},
|
||||
|
||||
requestIssues: function () {
|
||||
log('Request issues');
|
||||
var that = this,
|
||||
options = {
|
||||
data: {
|
||||
@ -226,7 +207,6 @@ define([
|
||||
return this.issues.fetch(options).done(function () {
|
||||
that.issues.reset(that.limitIssues(that.issues));
|
||||
that.addIssuesPerLineMeta(that.issues);
|
||||
log('Issues loaded');
|
||||
});
|
||||
},
|
||||
|
||||
@ -253,9 +233,7 @@ define([
|
||||
},
|
||||
|
||||
renderIssues: function () {
|
||||
log('Render issues');
|
||||
this.issues.forEach(this.renderIssue, this);
|
||||
log('Issues rendered');
|
||||
},
|
||||
|
||||
renderIssue: function (issue) {
|
||||
@ -279,11 +257,24 @@ define([
|
||||
this.renderIssue(issue);
|
||||
},
|
||||
|
||||
showSCMPopup: function (e) {
|
||||
e.stopPropagation();
|
||||
$('body').click();
|
||||
var line = +$(e.currentTarget).data('line-number'),
|
||||
row = _.findWhere(this.model.get('source'), { line: line }),
|
||||
popup = new SCMPopupView({
|
||||
triggerEl: $(e.currentTarget),
|
||||
model: new Backbone.Model(row)
|
||||
});
|
||||
popup.render();
|
||||
},
|
||||
|
||||
showCoveragePopup: function (e) {
|
||||
e.stopPropagation();
|
||||
$('body').click();
|
||||
var r = window.process.addBackgroundProcess(),
|
||||
line = $(e.currentTarget).data('line-number'),
|
||||
row = _.findWhere(this.model.get('source'), { line: line }),
|
||||
url = baseUrl + '/api/tests/test_cases',
|
||||
options = {
|
||||
key: this.model.key(),
|
||||
@ -292,6 +283,7 @@ define([
|
||||
return $.get(url, options).done(function (data) {
|
||||
var popup = new CoveragePopupView({
|
||||
model: new Backbone.Model(data),
|
||||
row: row,
|
||||
triggerEl: $(e.currentTarget)
|
||||
});
|
||||
popup.render();
|
||||
@ -302,8 +294,7 @@ define([
|
||||
},
|
||||
|
||||
showDuplications: function () {
|
||||
this.$('.source-line-duplications').addClass('hidden');
|
||||
this.$('.source-line-duplications-extra').removeClass('hidden');
|
||||
this.$el.addClass('source-duplications-expanded');
|
||||
},
|
||||
|
||||
showDuplicationPopup: function (e) {
|
||||
|
@ -105,9 +105,27 @@
|
||||
background-color: @barBackgroundColor;
|
||||
}
|
||||
|
||||
.source-line-duplications-extra {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.source-duplications-expanded {
|
||||
.source-line-duplications {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.source-line-duplications-extra {
|
||||
display: table-cell;
|
||||
}
|
||||
}
|
||||
|
||||
.source-line-scm {
|
||||
padding: 0 5px;
|
||||
background-color: @barBackgroundColor;
|
||||
|
||||
&[data-line-number] {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.source-line-scm-inner {
|
||||
@ -133,6 +151,7 @@
|
||||
|
||||
.source-line-uncovered {
|
||||
background-color: @red !important;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.source-line-partially-covered {
|
||||
|
@ -301,8 +301,6 @@
|
||||
.issues-workspace-list-more {
|
||||
margin-top: 10px;
|
||||
padding: 5px 10px;
|
||||
border: 1px solid @barBorderColor;
|
||||
background: @barBackgroundColor;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
@ -2765,6 +2765,11 @@ component_viewer.workspace.tooltip=Keeps track of history of navigation
|
||||
component_viewer.workspace.show_workspace=Show workspace
|
||||
component_viewer.workspace.hide_workspace=Hide workspace
|
||||
|
||||
source_viewer.covered=Covered
|
||||
source_viewer.not_covered=Not covered
|
||||
source_viewer.conditions=conditions
|
||||
source_viewer.expand_duplications=Click to display more in details all the duplicated blocks of this file
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
#
|
||||
|
Loading…
Reference in New Issue
Block a user