events:
'click @ui.expandLinks': 'showExpandedBar'
+ 'click .js-toggle-issues': 'toggleIssues'
+ 'click .js-toggle-coverage': 'toggleCoverage'
+ 'click .js-toggle-duplications': 'toggleDuplications'
+ 'click .js-toggle-scm': 'toggleSCM'
+
+
+ initialize: (options) ->
+# @listenTo options.main.settings, 'change', @changeSettings
+ options.main.settings.on 'change', => @changeSettings()
+
onRender: ->
@delegateEvents()
@ui.expandedBars.filter("[data-scope=#{scope}]").show()
+ changeSettings: ->
+ @$('.js-toggle-issues').toggleClass 'active', @options.main.settings.get 'issues'
+ @$('.js-toggle-coverage').toggleClass 'active', @options.main.settings.get 'coverage'
+ @$('.js-toggle-duplications').toggleClass 'active', @options.main.settings.get 'duplications'
+ @$('.js-toggle-scm').toggleClass 'active', @options.main.settings.get 'scm'
+
+
+ toggleSetting: (e, show, hide) ->
+ @showBlocks = []
+ active = $(e.currentTarget).is '.active'
+ if active then hide.call @options.main else show.call @options.main
+
+
+ toggleIssues: (e) ->
+ @toggleSetting e, @options.main.showIssues, @options.main.hideIssues
+
+
+ toggleCoverage: (e) ->
+ @toggleSetting e, @options.main.showCoverage, @options.main.hideCoverage
+
+
+ toggleDuplications: (e) ->
+ @toggleSetting e, @options.main.showDuplications, @options.main.hideDuplications
+
+
+ toggleSCM: (e) ->
+ @toggleSetting e, @options.main.showSCM, @options.main.hideSCM
+
+
+ toggleWorkspace: (e) ->
+ @toggleSetting e, @options.main.showWorkspace, @options.main.hideWorkspace
+
+
serializeData: ->
component = @options.main.component.toJSON()
if component.measures
$ = jQuery
API_COMPONENT = "#{baseUrl}/api/sources/app"
API_SOURCES = "#{baseUrl}/api/sources/show"
+ API_COVERAGE = "#{baseUrl}/api/coverage/show"
API_SCM = "#{baseUrl}/api/sources/scm"
initialize: (options) ->
+ @settings = new Backbone.Model
+ issues: false
+ coverage: false
+ duplications: false
+ scm: false
+ workspace: false
+ @settings.set options.settings
+
@component = new Backbone.Model()
@component.set options.component if options.component?
model: @source
main: @
- @settings = new Backbone.Model
- issues: false
- coverage: false
- duplications: false
- scm: false
- workspace: false
- @settings.set options.settings
-
onRender: ->
if @settings.get 'workspace'
$.get API_SCM, key: key, (data) =>
@source.set scm: data.scm
+ requestCoverage: (key) ->
+ $.get API_COVERAGE, key: key, (data) =>
+ @source.set coverage: data.coverage
+
extractIssues: (data) ->
issuesMeasures = {}
showCoverage: ->
@settings.set 'coverage', true
- @render()
+ unless @source.has 'coverage'
+ @requestCoverage(@key).done => @sourceView.render()
+ else
+ @sourceView.render()
+ @sourceView.render()
hideCoverage: ->
@settings.set 'coverage', false
- @render()
+ @sourceView.render()
showWorkspace: ->
@settings.set 'issues', true
if _.isArray(issues) && issues.length > 0
@source.set 'issues', issues
- @render()
+ @sourceView.render()
hideIssues: ->
@settings.set 'issues', false
- @render()
+ @sourceView.render()
showDuplications: ->
@settings.set 'duplications', true
- @render()
+ @sourceView.render()
hideDuplications: ->
@settings.set 'duplications', false
- @render()
+ @sourceView.render()
showSCM: ->
@settings.set 'scm', true
- unless @source.has 'duplications'
+ unless @source.has 'scm'
@requestSCM(@key).done => @sourceView.render()
else
- @render()
+ @sourceView.render()
hideSCM: ->
@settings.set 'scm', false
- @render()
+ @sourceView.render()
addTransition: (key, transition, optionsForCurrent, options) ->
expandTemplate: Templates['code-expand']
LINES_AROUND_ISSUE = 4
+ LINES_AROUND_COVERED_LINE = 1
EXPAND_LINES = 20
events:
- 'click .js-toggle-settings': 'toggleSettings'
- 'click .js-toggle-measures': 'toggleMeasures'
- 'change #source-issues': 'toggleIssues'
- 'change #source-coverage': 'toggleCoverage'
- 'change #source-duplications': 'toggleDuplications'
- 'change #source-workspace': 'toggleWorkspace'
'click .coverage-tests': 'showCoveragePopup'
'click .duplication-exists': 'showDuplicationPopup'
row.toggleClass 'component-viewer-header-full'
- toggleSetting: (e, show, hide) ->
- @showBlocks = []
- active = $(e.currentTarget).is ':checked'
- @showSettings = true
- if active then show.call @options.main else hide.call @options.main
-
-
- toggleIssues: (e) ->
- @toggleSetting e, @options.main.showIssues, @options.main.hideIssues
-
-
- toggleCoverage: (e) ->
- @toggleSetting e, @options.main.showCoverage, @options.main.hideCoverage
-
-
- toggleDuplications: (e) ->
- @toggleSetting e, @options.main.showDuplications, @options.main.hideDuplications
-
-
- toggleWorkspace: (e) ->
- @toggleSetting e, @options.main.showWorkspace, @options.main.hideWorkspace
-
-
showCoveragePopup: (e) ->
e.stopPropagation()
$('body').click()
popup.render()
- getLineCoverage: (line) ->
+ augmentWithCoverage: (source) ->
coverage = @model.get 'coverage'
-
- lineCoverage = coverage? && coverage[line]? && coverage[line]
- lineCoverage = +lineCoverage if _.isString lineCoverage
-
- lineCoverageStatus = null
- if _.isNumber lineCoverage
- lineCoverageStatus = 'red' if lineCoverage == 0
- lineCoverageStatus = 'green' if lineCoverage > 0
-
- coverage: lineCoverage
- coverageStatus: lineCoverageStatus
-
-
- getLineCoverageConditions: (line) ->
- coverageConditions = @model.get 'coverageConditions'
- conditions = @model.get 'conditions'
-
- lineCoverageConditions = coverageConditions? && coverageConditions[line]? && coverageConditions[line]
- lineCoverageConditions = +lineCoverageConditions if _.isString lineCoverageConditions
- lineConditions = conditions? && conditions[line]? && conditions[line]
- lineConditions = +lineConditions if _.isString lineConditions
-
- lineCoverageConditionsStatus = null
- if _.isNumber(lineCoverageConditions) && _.isNumber(conditions)
- lineCoverageConditionsStatus = 'red' if lineCoverageConditions == 0
- lineCoverageConditionsStatus = 'orange' if lineCoverageConditions > 0 && lineCoverageConditions < lineConditions
- lineCoverageConditionsStatus = 'green' if lineCoverageConditions == lineConditions
-
- coverageConditions: lineCoverageConditions
- conditions: lineConditions
- coverageConditionsStatus: lineCoverageConditionsStatus
-
-
- getLineDuplications: (line) ->
- duplications = @model.get('duplications') || []
- lineDuplications = duplications.map (d) ->
- d.from <= line && (d.from + d.count) > line
-
- duplications: lineDuplications
+ if coverage
+ coverage.forEach (s) ->
+ line = source[s[0] - 1]
+ line.coverage =
+ covered: s[1]
+ testCases: s[2]
+ branches: s[3]
+ coveredBranches: s[4]
+ if line.coverage.branches? && line.coverage.coveredBranches?
+ line.coverage.branchCoverageStatus = 'green' if line.coverage.branches == line.coverage.coveredBranches
+ line.coverage.branchCoverageStatus = 'orange' if line.coverage.branches > line.coverage.coveredBranches
+ line.coverage.branchCoverageStatus = 'red' if line.coverage.coveredBranches == 0
+ source
augmentWithSCM: (source) ->
scm = @model.get('scm') || []
scm.forEach (s) ->
- line = source[s[0]]
+ line = source[s[0] - 1]
line.scm = author: s[1], date: s[2]
source
- augmentWithShow: (sourceLine) ->
- show = false
- line = sourceLine.lineNumber
+ augmentWithShow: (source) ->
+ source.forEach (sourceLine) =>
+ show = false
+ line = sourceLine.lineNumber
- @showBlocks.forEach (block) ->
- if block.from <= line && block.to >= line
- show = true
+ @showBlocks.forEach (block) ->
+ if block.from <= line && block.to >= line
+ show = true
- if @options.main.settings.get('issues') && !show
- @model.get('issues')?.forEach (issue) ->
- if issue.line?
- if (issue.line - LINES_AROUND_ISSUE) <= line && (issue.line + LINES_AROUND_ISSUE) >= line
+ if @options.main.settings.get('issues') && !show
+ @model.get('issues')?.forEach (issue) ->
+ currentLine = issue.line || 0
+ if (currentLine - LINES_AROUND_ISSUE) <= line && (currentLine + LINES_AROUND_ISSUE) >= line
show = true
- if @options.main.settings.get('coverage') && !show
- show = true if sourceLine.coverageStatus
-
- if @options.main.settings.get('duplications') && !show
- sourceLine.duplications.forEach (d) ->
- show = true if d
+ if @options.main.settings.get('coverage') && !show
+ @model.get('coverage')?.forEach (s) ->
+ currentLine = s[0]
+ if (currentLine - LINES_AROUND_COVERED_LINE) <= line && (currentLine + LINES_AROUND_COVERED_LINE) >= line
+ show = true
- _.extend sourceLine, show: show
+ _.extend sourceLine, show: show
+ source
prepareSource: ->
source = @model.get 'source'
source = _.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')
- _.extend base, @getLineDuplications(line)
- @augmentWithShow base
- if @options.main.settings.get('scm')
+ lineNumber: line, code: item[1]
+
+ if @options.main.settings.get 'coverage'
+ source = @augmentWithCoverage source
+ if @options.main.settings.get 'scm'
source = @augmentWithSCM source
- source
+
+ @augmentWithShow source
getStatColumnsCount: ->
<div data-scope="duplications" class="component-viewer-header-expanded-bar">
{{> '_duplications-header'}}
+</div>
+
+
+
+<div class="component-viewer-header-decoration">
+ <div class="button-group">
+ <button class="js-toggle-issues {{#if settings.issues}}active{{/if}}">Issues</button>
+ <button class="js-toggle-coverage {{#if settings.coverage}}active{{/if}}">Coverage</button>
+ <button class="js-toggle-duplications {{#if settings.duplications}}active{{/if}}">Duplications</button>
+ <button class="js-toggle-scm {{#if settings.scm}}active{{/if}}">SCM</button>
+ </div>
</div>
\ No newline at end of file
<table class="code">
- <tr class="row row-hidden" data-line-number="0">
+ <tr class="row" data-line-number="0">
{{#if settings.coverage}}
<td class="stat coverage-tests"></td>
<td class="stat coverage-conditions"></td>
<td class="stat"></td>
{{/if}}
{{#if settings.scm}}
- <th class="stat"></th>
+ <td class="stat"></td>
{{/if}}
<td class="stat lid"></td>
<td class="line"></td>
{{#each source}}
{{#if show}}
- <tr class="row {{#if ../../settings.coverage}}{{#if coverageStatus}}coverage-{{coverageStatus}}{{/if}}{{/if}}"
+ <tr class="row"
data-line-number="{{lineNumber}}">
- {{#if ../../settings.coverage}}
- <td class="stat coverage-tests">
- {{#if coverage}}
- <span title="Line is covered by {{coverage}} tests">{{coverage}}</span>
- {{/if}}
- </td>
-
- <td class="stat coverage-conditions">
- {{#if coverageConditions}}
- {{#if conditions}}
- <span title="{{coverageConditions}} branches are covered by tests">
- {{coverageConditions}}/{{conditions}}
- </span>
- {{/if}}
- {{/if}}
- </td>
- {{/if}}
-
{{#if ../../settings.duplications}}
<td class="stat duplications">
{{#each duplications}}
</td>
{{/if}}
+ {{#if ../../settings.coverage}}
+ <td class="stat coverage-tests {{#if coverage}}coverage-{{#if coverage.covered}}green{{else}}red{{/if}}{{/if}}">
+ {{#if coverage}}
+ <span>{{coverage.testCases}}</span>
+ {{/if}}
+ </td>
+
+ <td class="stat coverage-branches {{#if coverage}}{{#if coverage.branchCoverageStatus}}coverage-{{coverage.branchCoverageStatus}}{{/if}}{{/if}}">
+ {{#if coverage}}
+ {{#if coverage.branches}}
+ <span>{{coverage.coveredBranches}}/{{coverage.branches}}</span>
+ {{/if}}
+ {{/if}}
+ </td>
+ {{/if}}
+
<td class="stat lid">{{lineNumber}}</td>
<td class="line"><pre>{{{code}}}</pre></td>
vertical-align: top;
min-width: 12px;
padding: 1px 5px;
- border-left: 1px solid @barBorderColor;
- border-right: 1px solid @barBorderColor;
background-color: @barBackgroundColor;
color: #888;
font-size: 11px;
}
- .code .row {
+ .code .stat {
- &.coverage-green td.stat {
+ &.coverage-green {
background-color: lighten(@green, 15%);
- border-color: lighten(@green, 7%);
color: @baseFontColor;
+ }
- &.lid { border-right-color: lighten(@green, 15%); }
+ &.coverage-orange {
+ background-color: lighten(@orange, 15%);
+ color: @baseFontColor;
}
- &.coverage-red td.stat {
+ &.coverage-red {
background-color: lighten(@red, 15%);
- border-color: lighten(@red, 10%);
color: @baseFontColor;
-
- &.lid { border-right-color: lighten(@red, 15%); }
}
}
}
}
+.component-viewer-header-decoration {
+ margin-top: 10px;
+}
+
@popupArrowSize: 8px;
outline: none;
.trans(border-color);
- &:hover {
+ &:hover, &.active {
border-color: #5281a0;
background: #4b9fd5;
color: #fff;
}
- &:active, &.active {
+ &:active {
border-color: #2790c0;
background: #78bdea;
color: #fff;
.button-clean,
.button-clean:hover,
.button-clean:focus {
+ margin: 0;
padding: 0;
border: none;
background: transparent;
font-weight: normal;
cursor: pointer;
- &:hover, &:focus {
+ &:hover, &:focus, &:active, &.active {
z-index: 3;
}
}