COVERAGE_METRIC_LIST = 'coverage,line_coverage,branch_coverage,' +
'coverage_line_hits_data,covered_conditions_by_line,conditions_by_line'
- ISSUES_METRIC_LIST = 'blocker_violations,critical_violations,major_violations,minor_violations,info_violations'
+ ISSUES_METRIC_LIST = 'violations,sqale_index,blocker_violations,critical_violations,major_violations,minor_violations,info_violations'
DUPLICATIONS_METRIC_LIST = 'duplicated_lines_density,duplicated_blocks,duplicated_files,duplicated_lines'
@sourceRegion.show @sourceView
- requestComponent: (key, metrics) ->
- $.get API_RESOURCES, resource: key, metrics: metrics, (data) =>
+ requestComponent: (key) ->
+ metricList = [SOURCE_METRIC_LIST, COVERAGE_METRIC_LIST, ISSUES_METRIC_LIST, DUPLICATIONS_METRIC_LIST].join ','
+ $.get API_RESOURCES, resource: key, metrics: metricList, (data) =>
@component.set data[0]
-
-
- requestComponentCoverage: (key) ->
- $.get API_RESOURCES, resource: key, metrics: COVERAGE_METRIC_LIST
-
-
- requestComponentIssues: (key) ->
- $.get API_RESOURCES, resource: key, metrics: ISSUES_METRIC_LIST
-
-
- requestComponentDuplications: (key) ->
- $.get API_RESOURCES, resource: key, metrics: DUPLICATIONS_METRIC_LIST
+ @component.set 'measures', _.indexBy(data[0].msr, 'key')
requestSource: (key) ->
$.get API_SOURCES, key: key, (data) =>
- @source.set source: data.source
+ @source.set source: data.sources
extractCoverage: (data) ->
showCoverage: ->
@settings.set 'coverage', true
unless @source.has 'coverage'
- @requestComponentCoverage(@key).done (data) =>
+ @requestComponent(@key).done (data) =>
@extractCoverage data
@sourceView.render()
else
@settings.set 'issues', true
unless @source.has 'issues'
- @requestComponentIssues(@key).done (data) =>
+ @requestComponent(@key).done (data) =>
@extractIssues data
@sourceView.render()
showDuplications: ->
@settings.set 'duplications', true
unless @source.has 'duplications'
- @requestComponentDuplications(@key).done (data) =>
+ @requestComponent(@key).done (data) =>
@extractDuplications data
@sourceView.render()
else
prepareSource: ->
source = @model.get 'source'
- _.map source, (code, line) =>
- base = lineNumber: line, code: code
+ _.map source, (item) =>
+ line = item[0]
+ base = lineNumber: line, code: item[1]
if @options.main.settings.get('coverage')
_.extend base, @getLineCoverage(line), @getLineCoverageConditions(line)
if @options.main.settings.get('duplications')
--- /dev/null
+<tr class="component-viewer-header">
+ {{#if settings.coverage}}
+ <th class="stat"></th>
+ <th class="stat"></th>
+ {{/if}}
+ {{#if settings.duplications}}
+ <th class="stat"></th>
+ {{/if}}
+ <th>
+ <button class="button-clean button-full-size"><i class="icon-list"></i></button>
+ </th>
+ <th class="component-viewer-header-main">
+ <div class="component-viewer-header-measure component-viewer-header-measure-main">
+ <span class="component-viewer-header-measure-value">{{component.measures.ncloc.frmt_val}}</span>
+ <span class="component-viewer-header-measure-label">{{t 'metric.ncloc.name'}}</span>
+ </div>
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value">{{component.measures.lines.frmt_val}}</span>
+ <span class="component-viewer-header-measure-label">{{t 'metric.lines.name'}}</span>
+ </div>
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value">{{component.measures.functions.frmt_val}}</span>
+ <span class="component-viewer-header-measure-label">{{t 'metric.functions.name'}}</span>
+ </div>
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value">{{component.measures.accessors.frmt_val}}</span>
+ <span class="component-viewer-header-measure-label">{{t 'metric.accessors.name'}}</span>
+ </div>
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value">{{component.measures.classes.frmt_val}}</span>
+ <span class="component-viewer-header-measure-label">{{t 'metric.classes.name'}}</span>
+ </div>
+ <div class="component-viewer-header-filter">
+ <button class="button-clean">
+ <i class="icon-period"></i>
+ <i class="icon-dropdown"></i>
+ </button>
+ <span class="component-viewer-header-measure-label">Time changes</span>
+ </div>
+ </th>
+</tr>
\ No newline at end of file
--- /dev/null
+<tr class="component-viewer-header">
+ {{#if settings.coverage}}
+ <th class="stat"></th>
+ <th class="stat"></th>
+ {{/if}}
+ {{#if settings.duplications}}
+ <th class="stat"></th>
+ {{/if}}
+ <th>
+ <button class="button-clean button-full-size"><i class="icon-list"></i></button>
+ </th>
+ <th class="component-viewer-header-main">
+ <div class="component-viewer-header-measure component-viewer-header-measure-main">
+ <span class="component-viewer-header-measure-value">{{component.measures.coverage.frmt_val}}</span>
+ <span class="component-viewer-header-measure-label">{{t 'metric.coverage.name'}}</span>
+ </div>
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value">{{component.measures.line_coverage.frmt_val}}</span>
+ <span class="component-viewer-header-measure-label">{{t 'metric.line_coverage.name'}}</span>
+ </div>
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value">{{component.measures.branch_coverage.frmt_val}}</span>
+ <span class="component-viewer-header-measure-label">{{t 'metric.branch_coverage.name'}}</span>
+ </div>
+
+ <div class="component-viewer-header-filter">
+ <button class="button-clean">
+ <i class="icon-period"></i>
+ <i class="icon-dropdown"></i>
+ </button>
+ <span class="component-viewer-header-measure-label">Time changes</span>
+ </div>
+ </th>
+</tr>
\ No newline at end of file
--- /dev/null
+<tr class="component-viewer-header">
+ {{#if settings.coverage}}
+ <th class="stat"></th>
+ <th class="stat"></th>
+ {{/if}}
+ {{#if settings.duplications}}
+ <th class="stat"></th>
+ {{/if}}
+ <th>
+ <button class="button-clean button-full-size"><i class="icon-list"></i></button>
+ </th>
+ <th class="component-viewer-header-main">
+ <div class="component-viewer-header-measure component-viewer-header-measure-main">
+ <span class="component-viewer-header-measure-value">{{component.measures.violations.frmt_val}}</span>
+ <span class="component-viewer-header-measure-label">{{t 'metric.violations.name'}}</span>
+ </div>
+ <div class="component-viewer-header-measure component-viewer-header-measure-main">
+ <span class="component-viewer-header-measure-value">{{component.measures.sqale_index.frmt_val}}</span>
+ <span class="component-viewer-header-measure-label">{{t 'metric.sqale_index.name'}}</span>
+ </div>
+ {{#if component.measures.blocker_violations.frmt_val}}
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value">
+ <i class="icon-severity-blocker"></i>
+ {{component.measures.blocker_violations.frmt_val}}
+ </span>
+ <span class="component-viewer-header-measure-label">{{t 'severity.BLOCKER'}}</span>
+ </div>
+ {{/if}}
+ {{#if component.measures.critical_violations.frmt_val}}
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value">
+ <i class="icon-severity-critical"></i>
+ {{component.measures.critical_violations.frmt_val}}
+ </span>
+ <span class="component-viewer-header-measure-label">{{t 'severity.CRITICAL'}}</span>
+ </div>
+ {{/if}}
+ {{#if component.measures.major_violations.frmt_val}}
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value">
+ <i class="icon-severity-major"></i>
+ {{component.measures.major_violations.frmt_val}}
+ </span>
+ <span class="component-viewer-header-measure-label">{{t 'severity.MAJOR'}}</span>
+ </div>
+ {{/if}}
+ {{#if component.measures.minor_violations.frmt_val}}
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value">
+ <i class="icon-severity-minor"></i>
+ {{component.measures.minor_violations.frmt_val}}
+ </span>
+ <span class="component-viewer-header-measure-label">{{t 'severity.MINOR'}}</span>
+ </div>
+ {{/if}}
+ {{#if component.measures.info_violations.frmt_val}}
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value">
+ <i class="icon-severity-info"></i>
+ {{component.measures.info_violations.frmt_val}}
+ </span>
+ <span class="component-viewer-header-measure-label">{{t 'severity.INFO'}}</span>
+ </div>
+ {{/if}}
+
+ <div class="component-viewer-header-filter">
+ <button class="button-clean">
+ <i class="icon-period"></i>
+ <i class="icon-dropdown"></i>
+ </button>
+ <span class="component-viewer-header-measure-label">Time changes</span>
+ </div>
+
+ <div class="component-viewer-header-filter">
+ <button class="button-clean">
+ <i class="icon-filter"></i>
+ <i class="icon-dropdown"></i>
+ </button>
+ <span class="component-viewer-header-measure-label">All issues</span>
+ </div>
+
+ </th>
+</tr>
\ No newline at end of file
</li>
</ul>
- {{qualifierIcon component.qualifier}} <span class="component-viewer-title">{{component.lname}}</span>
{{#if component.projectLongName}}
- <span class="component-viewer-title-separator">—</span>
{{qualifierIcon 'TRK'}} <span class="component-viewer-title">{{component.projectLongName}}</span>
+ <span class="component-viewer-title-separator">—</span>
{{/if}}
+ {{qualifierIcon component.qualifier}} <span class="component-viewer-title">{{component.lname}}</span>
<a class="icon-not-favorite" href="#" onclick="toggleFav({{component.id}}, this); return false;"
title="Click to add to favourites"></a>
</th>
</tr>
- <tr>
- {{#if settings.coverage}}
- <th class="stat"></th>
- <th class="stat"></th>
- {{/if}}
- {{#if settings.duplications}}
- <th class="stat"></th>
- {{/if}}
- <th class="stat settings-toggle">
- <button class="button-clean js-toggle-measures"><i class="icon-list"></i></button>
- </th>
- <th class="measures">
- <ul class="component-viewer-measures">
- <li class="component-viewer-measures-section brief">
- <dl>
- {{#each component.msr}}
- <dt>{{t 'metric' key 'name'}}</dt><dd>{{frmt_val}}</dd>
- {{/each}}
- </dl>
- </li>
- {{#if settings.issues}}
- <li class="component-viewer-measures-section brief">
- {{#if component.issuesMeasures}}
- {{#with component.issuesMeasures}}
- <dl>
- <dt>Issues</dt>
- <dd>
- {{#if blocker_violations}}
- <i class="icon-severity-blocker"></i>{{blocker_violations}}
- {{/if}}
- {{#if critical_violations}}
- <i class="icon-severity-critical"></i>{{critical_violations}}
- {{/if}}
- {{#if major_violations}}
- <i class="icon-severity-major"></i>{{major_violations}}
- {{/if}}
- {{#if minor_violations}}
- <i class="icon-severity-minor"></i>{{minor_violations}}
- {{/if}}
- {{#if info_violations}}
- <i class="icon-severity-info"></i>{{info_violations}}
- {{/if}}
- </dd>
- </dl>
- {{/with}}
- {{/if}}
- </li>
- {{/if}}
- {{#if settings.coverage}}
- <li class="component-viewer-measures-section brief">
- {{#if component.coverageMeasures}}
- <dl>
- {{#each component.coverageMeasures}}
- <dt>{{t 'metric' key 'name'}}</dt><dd>{{frmt_val}}</dd>
- {{/each}}
- </dl>
- {{/if}}
- </li>
- {{/if}}
- {{#if settings.duplications}}
- <li class="component-viewer-measures-section brief">
- {{component.duplicationsMeasures}}
- {{#if component.duplicationsMeasures}}
- <dl>
- {{#each component.duplicationsMeasures}}
- <dt>{{t 'metric' key 'name'}}</dt><dd>{{frmt_val}}</dd>
- {{/each}}
- </dl>
- {{/if}}
- </li>
- {{/if}}
- </ul>
- </th>
- </tr>
+
+ {{! headers }}
+ {{> '_basic-header'}}
+ {{#if settings.issues}}{{> '_issues-header'}}{{/if}}
+ {{#if settings.coverage}}{{> '_coverage-header'}}{{/if}}
+
</thead>
<tbody>
<tr class="row row-hidden" data-line-number="0">
.code th {
height: 30px;
.box-sizing(border-box);
+ background-color: @barBackgroundColor;
&.stat {
padding-top: 4px;
}
-.component-viewer-measures {
+.component-viewer-header {
+
+ & > th {
+ background-color: @barBackgroundColor;
+ border-top: 1px solid @barBorderColor;
+ border-bottom: 1px solid @barBorderColor;
+ }
+
+ .button-full-size {
+ .size(100%, 100%);
+ margin: 0;
+ }
+}
+
+.component-viewer-header-main {
font-size: 0;
+ padding: 4px 0 4px 5px;
}
-.component-viewer-measures-section {
+.component-viewer-header-measure {
display: inline-block;
- vertical-align: top;
- width: 25%;
- max-width: 260px;
- padding-right: 40px;
- .box-sizing(border-box);
+ vertical-align: bottom;
+ margin-right: 20px;
font-size: @baseFontSize;
+}
- &.brief {
- dt { display: none; }
- dt:first-of-type { display: block; }
- dd { display: none; }
- dd:first-of-type { display: block; }
- }
+.component-viewer-header-measure-label {
+ display: block;
+ margin-top: 2px;
+ color: #777;
+ font-size: @smallFontSize;
- &:not(.brief) {
- padding-top: 3px;
- padding-bottom: 3px;
- }
+ &:after { content: ""; }
+}
- dt {
- float: left;
- clear: left;
- }
+.component-viewer-header-measure-value {
+ display: block;
+ color: @baseFontColor;
+ font-size: 14px;
+}
- dd {
- float: right;
- font-weight: bold;
+.component-viewer-header-measure-main {
+
+ .component-viewer-header-measure-value {
+ font-size: 24px;
}
}
+.component-viewer-header-filter {
+ display: inline-block;
+ vertical-align: bottom;
+ margin-right: 20px;
+ padding-left: 20px;
+ border-left: 1px solid @barBorderColor;
+ font-size: @baseFontSize;
+ color: @darkBlue;
+
+ .button-clean { height: auto; }
+}
+
@popupArrowSize: 8px;
content: "\e60b";
font-size: @iconFontSize;
}
+.icon-period:before {
+ content: "\f018";
+ font-size: @iconFontSize;
+}
+.icon-filter:before {
+ content: "\f03a";
+ font-size: @iconFontSize;
+}
/*
'metric.duplicated_blocks.name': '<%= escape_javascript message('metric.duplicated_blocks.name') -%>',
'metric.duplicated_files.name': '<%= escape_javascript message('metric.duplicated_files.name') -%>',
'metric.duplicated_lines.name': '<%= escape_javascript message('metric.duplicated_lines.name') -%>',
- 'metric.duplicated_lines_density.name': '<%= escape_javascript message('metric.duplicated_lines_density.name') -%>'
+ 'metric.duplicated_lines_density.name': '<%= escape_javascript message('metric.duplicated_lines_density.name') -%>',
+ 'metric.violations.name': '<%= escape_javascript message('metric.violations.name') -%>',
+ 'metric.sqale_index.name': '<%= escape_javascript message('metric.sqale_index.name') -%>',
+ 'metric.blocker_violations.name': '<%= escape_javascript message('metric.blocker_violations.name') -%>',
+ 'metric.critical_violations.name': '<%= escape_javascript message('metric.critical_violations.name') -%>',
+ 'metric.major_violations.name': '<%= escape_javascript message('metric.major_violations.name') -%>',
+ 'metric.minor_violations.name': '<%= escape_javascript message('metric.minor_violations.name') -%>',
+ 'metric.info_violations.name': '<%= escape_javascript message('metric.info_violations.name') -%>'
};
</script>