goToFile: (e) ->
key = $(e.currentTarget).data 'key'
- test = $(e.currentTarget).data 'test'
- @options.main.addTransition key, 'coverage', [
- {
- key: 'org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTreeTest.java'
- name: 'forbidDuplicatedType'
- subname: 'ResourceTypeTreeTest.java'
- active: test == 'forbidDuplicatedType'
- }
- {
- key: 'org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTreeTest.java'
- name: 'forbidNullRelation'
- subname: 'ResourceTypeTreeTest.java'
- active: test == 'forbidNullRelation'
- }
- {
- key: 'org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTest.java'
- name: 'fail_on_duplicated_qualifier'
- subname: 'ResourceTypeTest.java'
- active: test == 'fail_on_duplicated_qualifier'
- }
- ], [
- {
- key: key,
- name: test
- }
- ]
+ @options.main.addTransition key, 'coverage'
+
+
+ serializeData: ->
+ files = @model.get 'files'
+ tests = _.groupBy @model.get('tests'), '_ref'
+ testFiles = _.map tests, (testSet, fileRef) ->
+ file: files[fileRef]
+ tests: testSet
+ testFiles: testFiles
\ No newline at end of file
$ = jQuery
+ API_COVERAGE_TESTS = "#{baseUrl}/api/tests/testable"
+
class SourceView extends Marionette.ItemView
template: Templates['source']
showCoveragePopup: (e) ->
e.stopPropagation()
$('body').click()
- popup = new CoveragePopupView
- triggerEl: $(e.currentTarget)
- main: @options.main
- popup.render()
+ line = $(e.currentTarget).closest('.row').data 'line-number'
+ $.get API_COVERAGE_TESTS, key: @options.main.component.get('key'), line: line, (data) =>
+ popup = new CoveragePopupView
+ model: new Backbone.Model data
+ triggerEl: $(e.currentTarget)
+ main: @options.main
+ popup.render()
showDuplicationPopup: (e) ->
-<div class="component-viewer-popup-section">
- <div class="component-viewer-popup-section-title">
- ResourceTypeTreeTest.java
+{{#each testFiles}}
+ <div class="component-viewer-popup-section">
+ <a class="component-viewer-popup-test-file link-action" data-key="{{file.key}}" title="{{file.longName}}">
+ {{file.longName}}
+ </a>
+ <ul class="component-viewer-popup-list">
+ {{#each tests}}
+ <li class="component-viewer-popup-test" title="{{name}}">
+ <i class="component-viewer-popup-test-status {{alertIconClass status}}"></i>
+ <span class="component-viewer-popup-test-name">{{name}}</span>
+ <span class="component-viewer-popup-test-duration">{{durationInMs}}ms</span>
+ </li>
+ {{/each}}
+ </ul>
</div>
- <ul class="component-viewer-popup-list">
- <li>
- <a class="component-viewer-popup-test"
- data-key="org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTreeTest.java"
- data-test="forbidDuplicatedType">
- <i class="component-viewer-popup-test-status icon-alert-ok"></i>
- <span class="component-viewer-popup-test-name">forbidDuplicatedType</span>
- <span class="component-viewer-popup-test-duration">216ms</span>
- </a>
- </li>
- <li>
- <a class="component-viewer-popup-test"
- data-key="org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTreeTest.java"
- data-test="forbidNullRelation">
- <i class="component-viewer-popup-test-status icon-alert-ok"></i>
- <span class="component-viewer-popup-test-name">forbidNullRelation</span>
- <span class="component-viewer-popup-test-duration">216ms</span>
- </a>
- </li>
- </ul>
-</div>
-
-<div class="component-viewer-popup-section">
- <div class="component-viewer-popup-section-title">
- ResourceTypesTest.java
- </div>
- <ul class="component-viewer-popup-list">
- <li>
- <a class="component-viewer-popup-test"
- data-key="org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTest.java"
- data-test="fail_on_duplicated_qualifier">
- <i class="component-viewer-popup-test-status icon-alert-ok"></i>
- <span class="component-viewer-popup-test-name">fail_on_duplicated_qualifier</span>
- <span class="component-viewer-popup-test-duration">115ms</span>
- </a>
- </li>
- </ul>
-</div>
+{{/each}}
<div class="component-viewer-popup-arrow"></div>
\ No newline at end of file
{{/if}}
{{#if ../../settings.coverage}}
- <td class="stat coverage-tests {{#if coverage}}coverage-{{#if coverage.covered}}green{{else}}red{{/if}}{{/if}}">
+ <td class="stat {{#if coverage}}coverage-{{#if coverage.covered}}green{{else}}red{{/if}}{{/if}}">
{{#if coverage}}
- <span title="{{tp 'coverage_viewer.line_covered_by_x_tests' coverage.testCases}}">{{coverage.testCases}}</span>
+ <span class="coverage-tests" title="{{tp 'coverage_viewer.line_covered_by_x_tests' coverage.testCases}}">
+ {{coverage.testCases}}
+ </span>
{{/if}}
</td>
- <td class="stat coverage-branches {{#if coverage}}{{#if coverage.branchCoverageStatus}}coverage-{{coverage.branchCoverageStatus}}{{/if}}{{/if}}">
+ <td class="stat {{#if coverage}}{{#if coverage.branchCoverageStatus}}coverage-{{coverage.branchCoverageStatus}}{{/if}}{{/if}}">
{{#if coverage}}
{{#if coverage.branches}}
- <span title="{{tp 'coverage_viewer.x_covered_branches' coverage.coveredBranches}}">
+ <span class="coverage-branches" title="{{tp 'coverage_viewer.x_covered_branches' coverage.coveredBranches}}">
{{coverage.coveredBranches}}/{{coverage.branches}}
</span>
{{/if}}
-<button class="button-clean component-viewer-workspace-toggle js-toggle-workspace">
- {{#if settings.workspace}}
- <i class="icon-double-chevron-left"></i>
- {{else}}
- <i class="icon-double-chevron-right"></i>
- {{/if}}
+<div class="component-viewer-workspace-container">
+ <button class="button-clean component-viewer-workspace-toggle js-toggle-workspace">
+ {{#if settings.workspace}}
+ <i class="icon-double-chevron-left"></i>
+ {{else}}
+ <i class="icon-double-chevron-right"></i>
+ {{/if}}
+ </button>
-</button>
-
-<ul class="component-viewer-workspace-list">
- {{#eachReverse workspace}}
- <li class="component-viewer-workspace-item">
- {{qualifierIcon component.qualifier}} <a data-key="{{key}}">{{component.name}}</a>
- {{#if options}}
- <ul class="component-viewer-workspace-options">
- {{#each options}}
- <li class="component-viewer-workspace-option {{#if active}}active{{/if}}">
- <a data-workspace-key="{{../key}}" data-key="{{key}}">{{name}}</a>
- {{#if subname}}<div class="subtitle">{{subname}}</div>{{/if}}
- </li>
- {{/each}}
- </ul>
- {{/if}}
- </li>
- {{/eachReverse}}
-</ul>
\ No newline at end of file
+ <ul class="component-viewer-workspace-list">
+ {{#eachReverse workspace}}
+ <li class="component-viewer-workspace-item">
+ {{qualifierIcon component.q}} <a data-key="{{key}}">{{component.name}}</a>
+ {{#if options}}
+ <ul class="component-viewer-workspace-options">
+ {{#each options}}
+ <li class="component-viewer-workspace-option {{#if active}}active{{/if}}">
+ <a data-workspace-key="{{../key}}" data-key="{{key}}">{{name}}</a>
+ {{#if subname}}<div class="subtitle">{{subname}}</div>{{/if}}
+ </li>
+ {{/each}}
+ </ul>
+ {{/if}}
+ </li>
+ {{/eachReverse}}
+ </ul>
+</div>
\ No newline at end of file
var defaultActions = ['comment', 'assign', 'assign_to_me', 'plan', 'set_severity'];
+ Handlebars.registerHelper('log', function(variable) {
+ console.log(variable);
+ });
+
Handlebars.registerHelper('capitalize', function(string) {
return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
});
);
});
+ Handlebars.registerHelper('alertIconClass', function(alert) {
+ return new Handlebars.SafeString(
+ 'icon-alert-' + alert.toLowerCase()
+ );
+ });
+
Handlebars.registerHelper('qualifierIcon', function(qualifier) {
return new Handlebars.SafeString(
qualifier ? '<i class="icon-qualifier-' + qualifier.toLowerCase() + '"></i>': ''
a:hover { text-decoration: underline; }
}
+.component-viewer-workspace-container { position: relative; }
+
.component-viewer-workspace-list {
display: none;
width: @workspaceWidth;
.component-viewer-workspace-toggle {
position: absolute;
- top: 0; right: 0;
+ top: 0; right: -30px;
.size(30px, 30px);
.trans;
}
}
-.component-viewer-popup-section + .component-viewer-popup-section {
- margin-top: 10px;
+.component-viewer-popup-section {
+ width: 300px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
}
-.component-viewer-popup-section-title {
- color: #777;
- font-size: @smallFontSize;
+.component-viewer-popup-section + .component-viewer-popup-section {
+ margin-top: 10px;
}
.component-viewer-popup-list {
.component-viewer-popup-test {
position: relative;
display: block;
- height: 24px;
- line-height: 24px;
+ height: 16px;
+ line-height: 16px;
+}
- &:hover {
- .component-viewer-popup-test-name { text-decoration: underline; }
- }
+.component-viewer-popup-test-file {
}
.component-viewer-popup-test-name {
display: block;
- width: 240px;
border-left: 20px solid transparent;
border-right: 44px solid transparent;
.box-sizing(border-box);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
}
.component-viewer-popup-test-status {
position: absolute;
- top: 0; left: 0;
- line-height: 24px;
+ top: 0; left: 0
}
.component-viewer-popup-test-duration {