build:
files:
+ '<%= pkg.assets %>js/templates/navigator.js': [
+ '<%= pkg.sources %>hbs/navigator/**/*.hbs'
+ ]
'<%= pkg.assets %>js/templates/coding-rules.js': [
'<%= pkg.sources %>hbs/common/**/*.hbs'
'<%= pkg.sources %>hbs/coding-rules/**/*.hbs'
'<%= pkg.assets %>js/templates/component-viewer.js': [
'<%= pkg.sources %>hbs/component-viewer/**/*.hbs'
]
- '<%= pkg.assets %>js/templates/issues.js': [
+ '<%= pkg.assets %>js/templates/issue.js': [
'<%= pkg.sources %>hbs/common/**/*.hbs'
+ '<%= pkg.sources %>hbs/issue/**/*.hbs'
+ ]
+ '<%= pkg.assets %>js/templates/issues.js': [
'<%= pkg.sources %>hbs/issues/**/*.hbs'
]
'<%= pkg.assets %>js/templates/api-documentation.js': [
class CoveragePopupView extends Popup
- template: Templates['coveragePopup']
+ template: Templates['cw-coverage-popup']
events:
class CoveredFilesPopupView extends Popup
- template: Templates['covered-files-popup']
+ template: Templates['cw-covered-files-popup']
events:
class DuplicationPopupView extends Popup
- template: Templates['duplicationPopup']
+ template: Templates['cw-duplication-popup']
events:
class extends Marionette.Layout
- template: Templates['header']
+ template: Templates['cw-header']
regions:
class extends BaseHeaderView
- template: Templates['basic-header']
\ No newline at end of file
+ template: Templates['cw-basic-header']
class extends BaseHeaderView
- template: Templates['coverage-header']
+ template: Templates['cw-coverage-header']
events:
serializeData: ->
- _.extend super, period: @state.get('period')?.toJSON()
\ No newline at end of file
+ _.extend super, period: @state.get('period')?.toJSON()
class extends BaseHeaderView
- template: Templates['duplications-header']
+ template: Templates['cw-duplications-header']
events:
class extends BaseHeaderView
- template: Templates['issues-header']
+ template: Templates['cw-issues-header']
events:
class extends Marionette.ItemView
className: 'component-viewer-header-more-actions'
- template: Templates['more-actions']
+ template: Templates['cw-more-actions']
events:
serializeData: ->
_.extend super,
- state: @options.main.state.toJSON()
\ No newline at end of file
+ state: @options.main.state.toJSON()
class extends BaseHeaderView
- template: Templates['scm-header']
+ template: Templates['cw-scm-header']
events:
class extends BaseHeaderView
- template: Templates['tests-header']
+ template: Templates['cw-tests-header']
ui:
'backbone.marionette'
'templates/component-viewer'
'common/popup'
- 'issues/manual-issue-view'
+ 'issue/manual-issue-view'
], (
Marionette
Templates
class extends Popup
- template: Templates['line-options-popup']
+ template: Templates['cw-line-options-popup']
events:
class ComponentViewer extends utils.mixOf Marionette.Layout, IssuesMixin, CoverageMixin, DuplicationsMixin, SCMMixin
className: 'component-viewer'
- template: Templates['layout']
+ template: Templates['cw-layout']
regions:
'component-viewer/duplication-popup'
'component-viewer/time-changes-popup'
'component-viewer/line-actions-popup'
- 'issues/issue-view'
- 'issues/models/issue'
+ 'issue/issue-view'
+ 'issue/models/issue'
'common/handlebars-extensions'
], (
Marionette
class SourceView extends Marionette.ItemView
- template: Templates['source']
- expandTemplate: Templates['code-expand']
+ template: Templates['cw-source']
+ expandTemplate: Templates['cw-code-expand']
LINES_AROUND_ISSUE = 4
LINES_AROUND_COVERED_LINE = 1
class TimeChangesPopupView extends Popup
- template: Templates['time-changes-popup']
+ template: Templates['cw-time-changes-popup']
events:
class WorkspaceView extends Marionette.ItemView
- template: Templates['workspace']
+ template: Templates['cw-workspace']
events:
--- /dev/null
+define [
+ 'backbone'
+], (
+ Backbone
+) ->
+
+ class ActionPlans extends Backbone.Collection
+
+ url: ->
+ "#{baseUrl}/api/action_plans/search"
+
+
+ parse: (r) ->
+ r.actionPlans
\ No newline at end of file
--- /dev/null
+define [
+ 'backbone.marionette'
+ 'templates/issue'
+
+ 'issue/models/rule'
+ 'issue/views/rule-view'
+
+ 'issue/models/change-log'
+ 'issue/views/change-log-view'
+
+ 'issue/collections/action-plans'
+
+ 'issue/views/assign-form-view'
+ 'issue/views/comment-form-view'
+ 'issue/views/plan-form-view'
+ 'issue/views/set-severity-form-view'
+
+], (
+ Marionette
+ Templates
+
+ Rule
+ RuleView
+
+ ChangeLog
+ ChangeLogView
+
+ ActionPlans
+
+ AssignFormView
+ CommentFormView
+ PlanFormView
+ SetSeverityFormView
+
+) ->
+
+ $ = jQuery
+
+
+ class IssueView extends Marionette.Layout
+ className: 'code-issues'
+ template: Templates['issue']
+
+
+ regions:
+ formRegion: '.code-issue-form'
+ ruleRegion: '#tab-issue-rule'
+ changeLogRegion: '#tab-issue-changelog'
+
+
+ modelEvents:
+ 'change': 'render'
+
+
+ events:
+ 'click': 'setDetailScope',
+
+ 'click .code-issue-toggle': 'toggleCollapsed',
+
+ 'click [href=#tab-issue-rule]': 'showRuleTab',
+ 'click [href=#tab-issue-changelog]': 'showChangeLogTab',
+
+ 'click #issue-comment': 'comment',
+ 'click .issue-comment-edit': 'editComment',
+ 'click .issue-comment-delete': 'deleteComment',
+ 'click .issue-transition': 'transition',
+ 'click #issue-set-severity': 'setSeverity',
+ 'click #issue-assign': 'assign',
+ 'click #issue-assign-to-me': 'assignToMe',
+ 'click #issue-plan': 'plan',
+ 'click .issue-action': 'action'
+
+
+ onRender: ->
+ @rule = new Rule key: this.model.get('rule')
+ @ruleRegion.show new RuleView model: @rule, issue: @model
+ @changeLog = new ChangeLog()
+ @changeLogRegion.show new ChangeLogView collection: @changeLog, issue: @model
+
+
+ setDetailScope: ->
+ key.setScope 'detail'
+
+
+ setListScope: ->
+ key.setScope 'list'
+
+
+ onClose: ->
+ @ruleRegion.reset() if @ruleRegion
+
+
+ resetIssue: (options) ->
+ @setListScope()
+ key = @model.get 'key'
+ @model.clear silent: true
+ @model.set { key: key }, { silent: true }
+ @model.fetch(options).done => @trigger 'reset'
+
+
+ toggleCollapsed: ->
+ @$('.code-issue').toggleClass 'code-issue-collapsed'
+ unless @$('.code-issue').is '.code-issue-collapsed'
+ @showRuleTab()
+
+
+ hideTabs: ->
+ @$('.js-tab-link').removeClass 'active-link'
+ @$('.js-tab').hide()
+
+
+ showTab: (tab) ->
+ @hideTabs()
+ s = "#tab-issue-#{tab}"
+ @$(s).show()
+ @$("[href=#{s}]").addClass 'active-link'
+
+
+ showRuleTab: (e) ->
+ e?.preventDefault()
+ @showTab 'rule'
+ unless @rule.has 'name'
+ @$('#tab-issue-rule').addClass 'navigator-fetching'
+ @rule.fetch
+ success: => @$('#tab-issue-rule').removeClass 'navigator-fetching'
+
+
+ showChangeLogTab: (e) ->
+ e?.preventDefault()
+ @showTab 'changelog'
+ unless @changeLog.length > 0
+ @$('#tab-issue-changeLog').addClass 'navigator-fetching'
+ @changeLog.fetch
+ data: issue: @model.get 'key'
+ success: => @$('#tab-issue-changelog').removeClass 'navigator-fetching'
+
+
+ showActionView: (view) ->
+ @$('.code-issue-actions').hide()
+ @$('.code-issue-form').show()
+ @formRegion.show view
+
+
+ showActionSpinner: ->
+ @$('.code-issue-actions').addClass 'navigator-fetching'
+
+
+ hideActionSpinner: ->
+ @$('.code-issue-actions').removeClass 'navigator-fetching'
+
+
+ updateAfterAction: (fetch) ->
+ @formRegion.reset()
+ @$('.code-issue-actions').show()
+ @$('.code-issue-form').hide()
+ @$('[data-comment-key]').show()
+
+ if fetch
+ $.when(@resetIssue()).done => @hideActionSpinner()
+
+
+ comment: ->
+ commentFormView = new CommentFormView
+ issue: @model
+ detailView: @
+ @showActionView commentFormView
+
+
+ editComment: (e) ->
+ commentEl = $(e.target).closest '[data-comment-key]'
+ commentKey = commentEl.data 'comment-key'
+ comment = _.findWhere this.model.get('comments'), { key: commentKey }
+
+ commentEl.hide();
+
+ commentFormView = new CommentFormView
+ model: new Backbone.Model comment
+ issue: @model
+ detailView: @
+ @showActionView commentFormView
+
+
+ deleteComment: (e) ->
+ commentKey = $(e.target).closest('[data-comment-key]').data 'comment-key'
+ confirmMsg = $(e.target).data 'confirm-msg'
+
+ if confirm(confirmMsg)
+ @showActionSpinner()
+ $.ajax
+ type: "POST"
+ url: baseUrl + "/issue/delete_comment?id=" + commentKey
+ .done => @updateAfterAction true
+ .fail (r) =>
+ alert _.pluck(r.responseJSON.errors, 'msg').join(' ')
+ @hideActionSpinner()
+
+
+ transition: (e) ->
+ @showActionSpinner();
+ $.ajax
+ type: 'POST',
+ url: baseUrl + '/api/issues/do_transition',
+ data:
+ issue: @model.get('key')
+ transition: $(e.target).data('transition')
+ .done => @resetIssue()
+ .fail (r) =>
+ alert _.pluck(r.responseJSON.errors, 'msg').join(' ')
+ @hideActionSpinner()
+
+
+ setSeverity: ->
+ setSeverityFormView = new SetSeverityFormView
+ issue: @model
+ detailView: @
+ @showActionView setSeverityFormView
+
+
+ assign: ->
+ assignFormView = new AssignFormView
+ issue: @model
+ detailView: this
+ @showActionView assignFormView
+
+
+ assignToMe: ->
+ @showActionSpinner()
+ $.ajax
+ type: 'POST'
+ url: baseUrl + '/api/issues/assign'
+ data:
+ issue: @model.get('key')
+ me: true
+ .done => @resetIssue()
+ .fail (r) =>
+ alert _.pluck(r.responseJSON.errors, 'msg').join(' ')
+ @hideActionSpinner()
+
+
+ plan: ->
+ actionPlans = new ActionPlans()
+ planFormView = new PlanFormView
+ collection: actionPlans
+ issue: @model
+ detailView: @
+ @showActionSpinner()
+ actionPlans.fetch
+ reset: true
+ data: project: @model.get('project')
+ success: =>
+ @hideActionSpinner()
+ @showActionView planFormView
+
+
+ action: (e) ->
+ actionKey = $(e.target).data 'action'
+ @showActionSpinner()
+ $.ajax
+ type: 'POST'
+ url: baseUrl + '/api/issues/do_action'
+ data:
+ issue: @model.get('key')
+ actionKey: actionKey
+ .done => @resetIssue()
+ .fail (r) =>
+ alert _.pluck(r.responseJSON.errors, 'msg').join(' ')
+ @hideActionSpinner()
+
+
+ serializeData: ->
+ componentKey = encodeURIComponent @model.get 'component'
+ issueKey = encodeURIComponent @model.get 'key'
+ _.extend super,
+ permalink: "#{baseUrl}/component/index#component=#{componentKey}¤tIssue=#{issueKey}"
--- /dev/null
+define [
+ 'backbone.marionette'
+ 'templates/issue'
+], (
+ Marionette
+ Templates
+) ->
+
+ $ = jQuery
+ API_ISSUE = "#{baseUrl}/api/issues/show"
+ API_ADD_MANUAL_ISSUE = "#{baseUrl}/api/issues/create"
+
+
+ class extends Marionette.ItemView
+ template: Templates['manual-issue']
+
+
+ events:
+ 'submit .js-manual-issue-form': 'formSubmit'
+ 'click .js-cancel': 'cancel'
+
+
+ onRender: ->
+ @delegateEvents()
+ @$('[name=rule]').select2
+ width: '250px'
+ minimumResultsForSearch: 10
+ @$('[name=rule]').select2 'open'
+ if key?
+ @key = key.getScope()
+ key.setScope ''
+
+
+ onClose: ->
+ key.setScope @key if key? && @key?
+
+
+ showSpinner: ->
+ @$('.js-submit').hide()
+ @$('.js-spinner').show()
+
+
+ hideSpinner: ->
+ @$('.js-submit').show()
+ @$('.js-spinner').hide()
+
+
+ validateFields: ->
+ message = @$('[name=message]')
+ unless message.val()
+ message.addClass('invalid').focus()
+ return false
+ return true
+
+
+ formSubmit: (e) ->
+ e.preventDefault()
+ return unless @validateFields()
+ @showSpinner()
+ data = $(e.currentTarget).serialize()
+ $.post API_ADD_MANUAL_ISSUE, data
+ .done (r) =>
+ @addIssue r.issue.key
+ .fail (r) =>
+ @hideSpinner()
+ if r.responseJSON?.errors?
+ @showError _.pluck(r.responseJSON.errors, 'msg').join '. '
+
+
+ addIssue: (key) ->
+ $.get API_ISSUE, key: key, (r) =>
+ @trigger 'add', r.issue
+ @close()
+
+
+ showError: (msg) ->
+ @$('.code-issue-errors').removeClass('hidden').text msg
+
+
+ cancel: (e) ->
+ e.preventDefault()
+ @close()
+
+
+ serializeData: ->
+ _.extend super,
+ line: @options.line
+ component: @options.component
+ rules: _.sortBy @options.rules, 'name'
--- /dev/null
+define [
+ 'backbone'
+], (
+ Backbone
+) ->
+
+ class ChangeLog extends Backbone.Collection
+
+ url: ->
+ "#{baseUrl}/api/issues/changelog"
+
+
+ parse: (r) ->
+ return r.changelog
\ No newline at end of file
--- /dev/null
+define [
+ 'backbone'
+], (
+ Backbone
+) ->
+
+ class Issue extends Backbone.Model
+
+ url: ->
+ "#{baseUrl}/api/issues/show?key=#{@get('key')}"
+
+
+ parse: (r) ->
+ if r.issue then r.issue else r
\ No newline at end of file
--- /dev/null
+define [
+ 'backbone'
+], (
+ Backbone
+) ->
+
+ class Rule extends Backbone.Model
+
+ url: ->
+ "#{baseUrl}/api/rules/show/?key=#{@get('key')}"
+
+
+ parse: (r) ->
+ if r.rule then r.rule else r
\ No newline at end of file
--- /dev/null
+define [
+ 'backbone.marionette'
+ 'templates/issue'
+], (
+ Marionette
+ Templates
+) ->
+
+ $ = jQuery
+ ME = '#me#'
+
+
+ class AssignFormView extends Marionette.ItemView
+ template: Templates['assign-form']
+
+
+ ui:
+ select: '#issue-assignee-select'
+
+
+ events:
+ 'click #issue-assign-cancel': 'cancel'
+ 'click #issue-assign-submit': 'submit'
+
+
+ onRender: ->
+ currentUser = window.SS.currentUser
+ assignee = @options.issue.get('assignee')
+ additionalChoices = []
+
+ if !assignee || currentUser != assignee
+ additionalChoices.push id: ME, text: t('assigned_to_me')
+
+ if !!assignee
+ additionalChoices.push id: '', text: t('unassigned')
+
+ select2Options =
+ allowClear: false
+ width: '250px'
+ formatNoMatches: -> t('select2.noMatches')
+ formatSearching: -> t('select2.searching')
+ formatInputTooShort: -> t('select2.tooShort')
+
+ if additionalChoices.length > 0
+ select2Options.minimumInputLength = 0
+ select2Options.query = (query) ->
+ if query.term.length == 0
+ query.callback results: additionalChoices
+ else if query.term.length >= 2
+ $.ajax
+ url: baseUrl + '/api/users/search?f=s2'
+ data: s: query.term
+ dataType: 'jsonp'
+ .done (data) -> query.callback data
+ else
+ select2Options.minimumInputLength = 2
+ select2Options.ajax =
+ quietMillis: 300
+ url: baseUrl + '/api/users/search?f=s2'
+ data: (term, page) -> s: term, p: page
+ results: (data) -> more: data.more, results: data.results
+
+ @ui.select.select2(select2Options).select2 'open'
+
+
+ cancel: ->
+ @options.detailView.updateAfterAction false
+
+
+ submit: ->
+ @options.detailView.showActionSpinner()
+ data = issue: @options.issue.get('key')
+ if @ui.select.val() == ME then data.me = true else data.assignee = @ui.select.val()
+ $.ajax
+ type: 'POST'
+ url: baseUrl + '/api/issues/assign'
+ data: data
+ .done => @options.detailView.updateAfterAction true
+ .fail (r) =>
+ alert _.pluck(r.responseJSON.errors, 'msg').join(' ')
+ @options.detailView.hideActionSpinner()
--- /dev/null
+define [
+ 'backbone.marionette'
+ 'templates/issue'
+], (
+ Marionette
+ Templates
+) ->
+
+ class IssueDetailChangeLogView extends Marionette.ItemView
+ template: Templates['change-log']
+
+
+ collectionEvents:
+ 'sync': 'render'
+
+
+ serializeData: ->
+ _.extend super,
+ issue: @options.issue.toJSON()
--- /dev/null
+define [
+ 'backbone.marionette'
+ 'templates/issue'
+], (
+ Marionette
+ Templates
+) ->
+
+ $ = jQuery
+
+
+ class IssueDetailCommentFormView extends Marionette.ItemView
+ template: Templates['comment-form']
+
+
+ ui:
+ textarea: '#issue-comment-text'
+ cancelButton: '#issue-comment-cancel'
+ submitButton: '#issue-comment-submit'
+
+
+ events:
+ 'keyup #issue-comment-text': 'toggleSubmit'
+ 'click #issue-comment-cancel': 'cancel'
+ 'click #issue-comment-submit': 'submit'
+
+
+ onDomRefresh: ->
+ @ui.textarea.focus()
+
+
+ toggleSubmit: ->
+ @ui.submitButton.prop 'disabled', @ui.textarea.val().length == 0
+
+
+ cancel: ->
+ @options.detailView.updateAfterAction false
+
+
+ submit: ->
+ text = @ui.textarea.val()
+ update = @model && @model.has('key')
+ url = baseUrl + '/api/issues/' + (if update then 'edit_comment' else 'add_comment')
+ data = text: text
+
+ if update
+ data.key = @model.get('key')
+ else
+ data.issue = @options.issue.get('key')
+
+ @options.detailView.showActionSpinner()
+
+ $.ajax
+ type: 'POST'
+ url: url
+ data: data
+ .done => @options.detailView.updateAfterAction true
+ .fail (r) =>
+ alert _.pluck(r.responseJSON.errors 'msg').join(' ')
+ @options.detailView.hideActionSpinner()
--- /dev/null
+define [
+ 'backbone.marionette'
+ 'templates/issue'
+], (
+ Marionette
+ Templates
+) ->
+
+ $ = jQuery
+
+
+ class PlanFormView extends Marionette.ItemView
+ template: Templates['plan-form']
+
+
+ collectionEvents:
+ 'reset': 'render'
+
+
+ ui:
+ select: '#issue-detail-plan-select'
+
+
+ events:
+ 'click #issue-plan-cancel': 'cancel'
+ 'click #issue-plan-submit': 'submit'
+
+
+ onRender: ->
+ @ui.select.select2
+ width: '250px'
+ minimumResultsForSearch: 100
+
+ @$('.error a').prop('href', baseUrl + '/action_plans/index/' + this.options.issue.get('project'))
+
+
+ cancel: ->
+ @options.detailView.updateAfterAction(false);
+
+
+ submit: ->
+ plan = @ui.select.val()
+ @options.detailView.showActionSpinner()
+
+ $.ajax
+ type: 'POST'
+ url: baseUrl + '/api/issues/plan'
+ data:
+ issue: this.options.issue.get('key'),
+ plan: if plan == '#unplan' then '' else plan
+ .done => @options.detailView.updateAfterAction true
+ .fail (r) =>
+ alert _.pluck(r.responseJSON.errors, 'msg').join(' ')
+ @options.detailView.hideActionSpinner()
+
+
+ serializeData: ->
+ items: @collection.toJSON()
+ issue: @options.issue.toJSON()
--- /dev/null
+define [
+ 'backbone.marionette'
+ 'templates/issue'
+], (
+ Marionette
+ Templates
+) ->
+
+ class IssueDetailRuleView extends Marionette.ItemView
+ template: Templates['rule']
+
+ modelEvents:
+ 'change': 'render'
+
+
+ serializeData: ->
+ _.extend super,
+ characteristic: this.options.issue.get 'characteristic'
+ subCharacteristic: this.options.issue.get 'subCharacteristic'
--- /dev/null
+define [
+ 'backbone.marionette'
+ 'templates/issue'
+], (
+ Marionette
+ Templates
+) ->
+
+ $ = jQuery
+
+
+ class SetSeverityFormView extends Marionette.ItemView
+ template: Templates['set-severity-form']
+
+
+ ui:
+ select: '#issue-set-severity-select'
+
+
+ events:
+ 'click #issue-set-severity-cancel': 'cancel'
+ 'click #issue-set-severity-submit': 'submit'
+
+
+ onRender: ->
+ format = (state) ->
+ return state.text unless state.id
+ '<i class="icon-severity-' + state.id.toLowerCase() + '"></i> ' + state.text
+
+ @ui.select.select2
+ minimumResultsForSearch: 100
+ formatResult: format
+ formatSelection: format
+ escapeMarkup: (m) -> m
+
+
+ cancel: ->
+ @options.detailView.updateAfterAction false
+
+
+ submit: ->
+ @options.detailView.showActionSpinner()
+ $.ajax
+ type: 'POST'
+ url: baseUrl + '/api/issues/set_severity'
+ data:
+ issue: @options.issue.get('key')
+ severity: @ui.select.val()
+ .done => @options.detailView.updateAfterAction true
+ .fail (r) =>
+ alert _.pluck(r.responseJSON.errors, 'msg').join(' ')
+ @options.detailView.hideActionSpinner()
+++ /dev/null
-define [
- 'backbone'
-], (
- Backbone
-) ->
-
- class ActionPlans extends Backbone.Collection
-
- url: ->
- "#{baseUrl}/api/action_plans/search"
-
-
- parse: (r) ->
- r.actionPlans
\ No newline at end of file
+++ /dev/null
-define [
- 'backbone.marionette'
- 'templates/issues'
-
- 'issues/models/rule'
- 'issues/views/rule-view'
-
- 'issues/models/change-log'
- 'issues/views/change-log-view'
-
- 'issues/collections/action-plans'
-
- 'issues/views/assign-form-view'
- 'issues/views/comment-form-view'
- 'issues/views/plan-form-view'
- 'issues/views/set-severity-form-view'
-
-], (
- Marionette
- Templates
-
- Rule
- RuleView
-
- ChangeLog
- ChangeLogView
-
- ActionPlans
-
- AssignFormView
- CommentFormView
- PlanFormView
- SetSeverityFormView
-
-) ->
-
- $ = jQuery
-
-
- class IssueView extends Marionette.Layout
- className: 'code-issues'
- template: Templates['issue']
-
-
- regions:
- formRegion: '.code-issue-form'
- ruleRegion: '#tab-issue-rule'
- changeLogRegion: '#tab-issue-changelog'
-
-
- modelEvents:
- 'change': 'render'
-
-
- events:
- 'click': 'setDetailScope',
-
- 'click .code-issue-toggle': 'toggleCollapsed',
-
- 'click [href=#tab-issue-rule]': 'showRuleTab',
- 'click [href=#tab-issue-changelog]': 'showChangeLogTab',
-
- 'click #issue-comment': 'comment',
- 'click .issue-comment-edit': 'editComment',
- 'click .issue-comment-delete': 'deleteComment',
- 'click .issue-transition': 'transition',
- 'click #issue-set-severity': 'setSeverity',
- 'click #issue-assign': 'assign',
- 'click #issue-assign-to-me': 'assignToMe',
- 'click #issue-plan': 'plan',
- 'click .issue-action': 'action'
-
-
- onRender: ->
- @rule = new Rule key: this.model.get('rule')
- @ruleRegion.show new RuleView model: @rule, issue: @model
- @changeLog = new ChangeLog()
- @changeLogRegion.show new ChangeLogView collection: @changeLog, issue: @model
-
-
- setDetailScope: ->
- key.setScope 'detail'
-
-
- setListScope: ->
- key.setScope 'list'
-
-
- onClose: ->
- @ruleRegion.reset() if @ruleRegion
-
-
- resetIssue: (options) ->
- @setListScope()
- key = @model.get 'key'
- @model.clear silent: true
- @model.set { key: key }, { silent: true }
- @model.fetch(options).done => @trigger 'reset'
-
-
- toggleCollapsed: ->
- @$('.code-issue').toggleClass 'code-issue-collapsed'
- unless @$('.code-issue').is '.code-issue-collapsed'
- @showRuleTab()
-
-
- hideTabs: ->
- @$('.js-tab-link').removeClass 'active-link'
- @$('.js-tab').hide()
-
-
- showTab: (tab) ->
- @hideTabs()
- s = "#tab-issue-#{tab}"
- @$(s).show()
- @$("[href=#{s}]").addClass 'active-link'
-
-
- showRuleTab: (e) ->
- e?.preventDefault()
- @showTab 'rule'
- unless @rule.has 'name'
- @$('#tab-issue-rule').addClass 'navigator-fetching'
- @rule.fetch
- success: => @$('#tab-issue-rule').removeClass 'navigator-fetching'
-
-
- showChangeLogTab: (e) ->
- e?.preventDefault()
- @showTab 'changelog'
- unless @changeLog.length > 0
- @$('#tab-issue-changeLog').addClass 'navigator-fetching'
- @changeLog.fetch
- data: issue: @model.get 'key'
- success: => @$('#tab-issue-changelog').removeClass 'navigator-fetching'
-
-
- showActionView: (view) ->
- @$('.code-issue-actions').hide()
- @$('.code-issue-form').show()
- @formRegion.show view
-
-
- showActionSpinner: ->
- @$('.code-issue-actions').addClass 'navigator-fetching'
-
-
- hideActionSpinner: ->
- @$('.code-issue-actions').removeClass 'navigator-fetching'
-
-
- updateAfterAction: (fetch) ->
- @formRegion.reset()
- @$('.code-issue-actions').show()
- @$('.code-issue-form').hide()
- @$('[data-comment-key]').show()
-
- if fetch
- $.when(@resetIssue()).done => @hideActionSpinner()
-
-
- comment: ->
- commentFormView = new CommentFormView
- issue: @model
- detailView: @
- @showActionView commentFormView
-
-
- editComment: (e) ->
- commentEl = $(e.target).closest '[data-comment-key]'
- commentKey = commentEl.data 'comment-key'
- comment = _.findWhere this.model.get('comments'), { key: commentKey }
-
- commentEl.hide();
-
- commentFormView = new CommentFormView
- model: new Backbone.Model comment
- issue: @model
- detailView: @
- @showActionView commentFormView
-
-
- deleteComment: (e) ->
- commentKey = $(e.target).closest('[data-comment-key]').data 'comment-key'
- confirmMsg = $(e.target).data 'confirm-msg'
-
- if confirm(confirmMsg)
- @showActionSpinner()
- $.ajax
- type: "POST"
- url: baseUrl + "/issue/delete_comment?id=" + commentKey
- .done => @updateAfterAction true
- .fail (r) =>
- alert _.pluck(r.responseJSON.errors, 'msg').join(' ')
- @hideActionSpinner()
-
-
- transition: (e) ->
- @showActionSpinner();
- $.ajax
- type: 'POST',
- url: baseUrl + '/api/issues/do_transition',
- data:
- issue: @model.get('key')
- transition: $(e.target).data('transition')
- .done => @resetIssue()
- .fail (r) =>
- alert _.pluck(r.responseJSON.errors, 'msg').join(' ')
- @hideActionSpinner()
-
-
- setSeverity: ->
- setSeverityFormView = new SetSeverityFormView
- issue: @model
- detailView: @
- @showActionView setSeverityFormView
-
-
- assign: ->
- assignFormView = new AssignFormView
- issue: @model
- detailView: this
- @showActionView assignFormView
-
-
- assignToMe: ->
- @showActionSpinner()
- $.ajax
- type: 'POST'
- url: baseUrl + '/api/issues/assign'
- data:
- issue: @model.get('key')
- me: true
- .done => @resetIssue()
- .fail (r) =>
- alert _.pluck(r.responseJSON.errors, 'msg').join(' ')
- @hideActionSpinner()
-
-
- plan: ->
- actionPlans = new ActionPlans()
- planFormView = new PlanFormView
- collection: actionPlans
- issue: @model
- detailView: @
- @showActionSpinner()
- actionPlans.fetch
- reset: true
- data: project: @model.get('project')
- success: =>
- @hideActionSpinner()
- @showActionView planFormView
-
-
- action: (e) ->
- actionKey = $(e.target).data 'action'
- @showActionSpinner()
- $.ajax
- type: 'POST'
- url: baseUrl + '/api/issues/do_action'
- data:
- issue: @model.get('key')
- actionKey: actionKey
- .done => @resetIssue()
- .fail (r) =>
- alert _.pluck(r.responseJSON.errors, 'msg').join(' ')
- @hideActionSpinner()
-
-
- serializeData: ->
- componentKey = encodeURIComponent @model.get 'component'
- issueKey = encodeURIComponent @model.get 'key'
- _.extend super,
- permalink: "#{baseUrl}/component/index#component=#{componentKey}¤tIssue=#{issueKey}"
+++ /dev/null
-define [
- 'backbone.marionette'
- 'templates/issues'
-], (
- Marionette
- Templates
-) ->
-
- $ = jQuery
- API_ISSUE = "#{baseUrl}/api/issues/show"
- API_ADD_MANUAL_ISSUE = "#{baseUrl}/api/issues/create"
-
-
- class extends Marionette.ItemView
- template: Templates['manual-issue']
-
-
- events:
- 'submit .js-manual-issue-form': 'formSubmit'
- 'click .js-cancel': 'cancel'
-
-
- onRender: ->
- @delegateEvents()
- @$('[name=rule]').select2
- width: '250px'
- minimumResultsForSearch: 10
- @$('[name=rule]').select2 'open'
- if key?
- @key = key.getScope()
- key.setScope ''
-
-
- onClose: ->
- key.setScope @key if key? && @key?
-
-
- showSpinner: ->
- @$('.js-submit').hide()
- @$('.js-spinner').show()
-
-
- hideSpinner: ->
- @$('.js-submit').show()
- @$('.js-spinner').hide()
-
-
- validateFields: ->
- message = @$('[name=message]')
- unless message.val()
- message.addClass('invalid').focus()
- return false
- return true
-
-
- formSubmit: (e) ->
- e.preventDefault()
- return unless @validateFields()
- @showSpinner()
- data = $(e.currentTarget).serialize()
- $.post API_ADD_MANUAL_ISSUE, data
- .done (r) =>
- @addIssue r.issue.key
- .fail (r) =>
- @hideSpinner()
- if r.responseJSON?.errors?
- @showError _.pluck(r.responseJSON.errors, 'msg').join '. '
-
-
- addIssue: (key) ->
- $.get API_ISSUE, key: key, (r) =>
- @trigger 'add', r.issue
- @close()
-
-
- showError: (msg) ->
- @$('.code-issue-errors').removeClass('hidden').text msg
-
-
- cancel: (e) ->
- e.preventDefault()
- @close()
-
-
- serializeData: ->
- _.extend super,
- line: @options.line
- component: @options.component
- rules: _.sortBy @options.rules, 'name'
+++ /dev/null
-define [
- 'backbone'
-], (
- Backbone
-) ->
-
- class ChangeLog extends Backbone.Collection
-
- url: ->
- "#{baseUrl}/api/issues/changelog"
-
-
- parse: (r) ->
- return r.changelog
\ No newline at end of file
+++ /dev/null
-define [
- 'backbone'
-], (
- Backbone
-) ->
-
- class Issue extends Backbone.Model
-
- url: ->
- "#{baseUrl}/api/issues/show?key=#{@get('key')}"
-
-
- parse: (r) ->
- if r.issue then r.issue else r
\ No newline at end of file
+++ /dev/null
-define [
- 'backbone'
-], (
- Backbone
-) ->
-
- class Rule extends Backbone.Model
-
- url: ->
- "#{baseUrl}/api/rules/show/?key=#{@get('key')}"
-
-
- parse: (r) ->
- if r.rule then r.rule else r
\ No newline at end of file
+++ /dev/null
-define [
- 'backbone.marionette'
- 'templates/issues'
-], (
- Marionette
- Templates
-) ->
-
- $ = jQuery
- ME = '#me#'
-
-
- class AssignFormView extends Marionette.ItemView
- template: Templates['assign-form']
-
-
- ui:
- select: '#issue-assignee-select'
-
-
- events:
- 'click #issue-assign-cancel': 'cancel'
- 'click #issue-assign-submit': 'submit'
-
-
- onRender: ->
- currentUser = window.SS.currentUser
- assignee = @options.issue.get('assignee')
- additionalChoices = []
-
- if !assignee || currentUser != assignee
- additionalChoices.push id: ME, text: t('assigned_to_me')
-
- if !!assignee
- additionalChoices.push id: '', text: t('unassigned')
-
- select2Options =
- allowClear: false
- width: '250px'
- formatNoMatches: -> t('select2.noMatches')
- formatSearching: -> t('select2.searching')
- formatInputTooShort: -> t('select2.tooShort')
-
- if additionalChoices.length > 0
- select2Options.minimumInputLength = 0
- select2Options.query = (query) ->
- if query.term.length == 0
- query.callback results: additionalChoices
- else if query.term.length >= 2
- $.ajax
- url: baseUrl + '/api/users/search?f=s2'
- data: s: query.term
- dataType: 'jsonp'
- .done (data) -> query.callback data
- else
- select2Options.minimumInputLength = 2
- select2Options.ajax =
- quietMillis: 300
- url: baseUrl + '/api/users/search?f=s2'
- data: (term, page) -> s: term, p: page
- results: (data) -> more: data.more, results: data.results
-
- @ui.select.select2(select2Options).select2 'open'
-
-
- cancel: ->
- @options.detailView.updateAfterAction false
-
-
- submit: ->
- @options.detailView.showActionSpinner()
- data = issue: @options.issue.get('key')
- if @ui.select.val() == ME then data.me = true else data.assignee = @ui.select.val()
- $.ajax
- type: 'POST'
- url: baseUrl + '/api/issues/assign'
- data: data
- .done => @options.detailView.updateAfterAction true
- .fail (r) =>
- alert _.pluck(r.responseJSON.errors, 'msg').join(' ')
- @options.detailView.hideActionSpinner()
+++ /dev/null
-define [
- 'backbone.marionette'
- 'templates/issues'
-], (
- Marionette
- Templates
-) ->
-
- class IssueDetailChangeLogView extends Marionette.ItemView
- template: Templates['change-log']
-
-
- collectionEvents:
- 'sync': 'render'
-
-
- serializeData: ->
- _.extend super,
- issue: @options.issue.toJSON()
\ No newline at end of file
+++ /dev/null
-define [
- 'backbone.marionette'
- 'templates/issues'
-], (
- Marionette
- Templates
-) ->
-
- $ = jQuery
-
-
- class IssueDetailCommentFormView extends Marionette.ItemView
- template: Templates['comment-form']
-
-
- ui:
- textarea: '#issue-comment-text'
- cancelButton: '#issue-comment-cancel'
- submitButton: '#issue-comment-submit'
-
-
- events:
- 'keyup #issue-comment-text': 'toggleSubmit'
- 'click #issue-comment-cancel': 'cancel'
- 'click #issue-comment-submit': 'submit'
-
-
- onDomRefresh: ->
- @ui.textarea.focus()
-
-
- toggleSubmit: ->
- @ui.submitButton.prop 'disabled', @ui.textarea.val().length == 0
-
-
- cancel: ->
- @options.detailView.updateAfterAction false
-
-
- submit: ->
- text = @ui.textarea.val()
- update = @model && @model.has('key')
- url = baseUrl + '/api/issues/' + (if update then 'edit_comment' else 'add_comment')
- data = text: text
-
- if update
- data.key = @model.get('key')
- else
- data.issue = @options.issue.get('key')
-
- @options.detailView.showActionSpinner()
-
- $.ajax
- type: 'POST'
- url: url
- data: data
- .done => @options.detailView.updateAfterAction true
- .fail (r) =>
- alert _.pluck(r.responseJSON.errors 'msg').join(' ')
- @options.detailView.hideActionSpinner()
\ No newline at end of file
+++ /dev/null
-define [
- 'backbone.marionette'
- 'templates/issues'
-], (
- Marionette
- Templates
-) ->
-
- $ = jQuery
-
-
- class PlanFormView extends Marionette.ItemView
- template: Templates['plan-form']
-
-
- collectionEvents:
- 'reset': 'render'
-
-
- ui:
- select: '#issue-detail-plan-select'
-
-
- events:
- 'click #issue-plan-cancel': 'cancel'
- 'click #issue-plan-submit': 'submit'
-
-
- onRender: ->
- @ui.select.select2
- width: '250px'
- minimumResultsForSearch: 100
-
- @$('.error a').prop('href', baseUrl + '/action_plans/index/' + this.options.issue.get('project'))
-
-
- cancel: ->
- @options.detailView.updateAfterAction(false);
-
-
- submit: ->
- plan = @ui.select.val()
- @options.detailView.showActionSpinner()
-
- $.ajax
- type: 'POST'
- url: baseUrl + '/api/issues/plan'
- data:
- issue: this.options.issue.get('key'),
- plan: if plan == '#unplan' then '' else plan
- .done => @options.detailView.updateAfterAction true
- .fail (r) =>
- alert _.pluck(r.responseJSON.errors, 'msg').join(' ')
- @options.detailView.hideActionSpinner()
-
-
- serializeData: ->
- items: @collection.toJSON()
- issue: @options.issue.toJSON()
\ No newline at end of file
+++ /dev/null
-define [
- 'backbone.marionette'
- 'templates/issues'
-], (
- Marionette
- Templates
-) ->
-
- class IssueDetailRuleView extends Marionette.ItemView
- template: Templates['rule']
-
- modelEvents:
- 'change': 'render'
-
-
- serializeData: ->
- _.extend super,
- characteristic: this.options.issue.get 'characteristic'
- subCharacteristic: this.options.issue.get 'subCharacteristic'
\ No newline at end of file
+++ /dev/null
-define [
- 'backbone.marionette'
- 'templates/issues'
-], (
- Marionette
- Templates
-) ->
-
- $ = jQuery
-
-
- class SetSeverityFormView extends Marionette.ItemView
- template: Templates['set-severity-form']
-
-
- ui:
- select: '#issue-set-severity-select'
-
-
- events:
- 'click #issue-set-severity-cancel': 'cancel'
- 'click #issue-set-severity-submit': 'submit'
-
-
- onRender: ->
- format = (state) ->
- return state.text unless state.id
- '<i class="icon-severity-' + state.id.toLowerCase() + '"></i> ' + state.text
-
- @ui.select.select2
- minimumResultsForSearch: 100
- formatResult: format
- formatSelection: format
- escapeMarkup: (m) -> m
-
-
- cancel: ->
- @options.detailView.updateAfterAction false
-
-
- submit: ->
- @options.detailView.showActionSpinner()
- $.ajax
- type: 'POST'
- url: baseUrl + '/api/issues/set_severity'
- data:
- issue: @options.issue.get('key')
- severity: @ui.select.val()
- .done => @options.detailView.updateAfterAction true
- .fail (r) =>
- alert _.pluck(r.responseJSON.errors, 'msg').join(' ')
- @options.detailView.hideActionSpinner()
\ No newline at end of file
+++ /dev/null
-<tr class="row row-expand">
- {{#if settings.coverage}}
- <td class="stat coverage-tests"></td>
- <td class="stat coverage-conditions"></td>
- {{/if}}
- {{#if settings.duplications}}
- <td class="stat"></td>
- {{/if}}
- {{#if settings.scm}}
- <td class="stat"></td>
- {{/if}}
- <td class="stat lid">
- <button class="button-clean js-expand" data-from="{{from}}" data-to="{{to}}"><i class="icon-expand"></i></button>
- </td>
- <td class="line"></td>
-</tr>
+++ /dev/null
-<div class="bubble-popup-container">
- <div class="bubble-popup-title">{{t 'component_viewer.transition.coverage'}}</div>
-
- {{#each testFiles}}
- <div class="bubble-popup-section">
- <a class="component-viewer-popup-test-file link-action" data-key="{{file.key}}" title="{{file.longName}}">
- {{file.longName}}
- </a>
- <ul class="bubble-popup-list">
- {{#each tests}}
- <li class="component-viewer-popup-test" title="{{name}}">
- <i class="component-viewer-popup-test-status {{testStatusIconClass status}}"></i>
- <span class="component-viewer-popup-test-name">
- <a class="component-viewer-popup-test-file link-action" title="{{name}}"
- data-key="{{../file.key}}" data-method="{{name}}">
- {{name}}
- </a>
- </span>
- <span class="component-viewer-popup-test-duration">{{durationInMs}}ms</span>
- </li>
- {{/each}}
- </ul>
- </div>
- {{/each}}
-</div>
-
-<div class="bubble-popup-arrow"></div>
--- /dev/null
+<tr class="row row-expand">
+ {{#if settings.coverage}}
+ <td class="stat coverage-tests"></td>
+ <td class="stat coverage-conditions"></td>
+ {{/if}}
+ {{#if settings.duplications}}
+ <td class="stat"></td>
+ {{/if}}
+ {{#if settings.scm}}
+ <td class="stat"></td>
+ {{/if}}
+ <td class="stat lid">
+ <button class="button-clean js-expand" data-from="{{from}}" data-to="{{to}}"><i class="icon-expand"></i></button>
+ </td>
+ <td class="line"></td>
+</tr>
--- /dev/null
+<div class="bubble-popup-container">
+ <div class="bubble-popup-title">{{t 'component_viewer.transition.coverage'}}</div>
+
+ {{#each testFiles}}
+ <div class="bubble-popup-section">
+ <a class="component-viewer-popup-test-file link-action" data-key="{{file.key}}" title="{{file.longName}}">
+ {{file.longName}}
+ </a>
+ <ul class="bubble-popup-list">
+ {{#each tests}}
+ <li class="component-viewer-popup-test" title="{{name}}">
+ <i class="component-viewer-popup-test-status {{testStatusIconClass status}}"></i>
+ <span class="component-viewer-popup-test-name">
+ <a class="component-viewer-popup-test-file link-action" title="{{name}}"
+ data-key="{{../file.key}}" data-method="{{name}}">
+ {{name}}
+ </a>
+ </span>
+ <span class="component-viewer-popup-test-duration">{{durationInMs}}ms</span>
+ </li>
+ {{/each}}
+ </ul>
+ </div>
+ {{/each}}
+</div>
+
+<div class="bubble-popup-arrow"></div>
--- /dev/null
+<div class="bubble-popup-container">
+ <div class="bubble-popup-title">{{t 'component_viewer.transition.duplication'}}</div>
+ {{#each duplications}}
+ <div class="bubble-popup-section">
+ {{#notEq file.projectName ../component.projectName}}
+ <span class="component-viewer-popup-label">{{file.projectName}}</span>
+ {{/notEq}}
+ <a class="link-action" data-key="{{file.key}}" title="{{file.name}}">
+ {{file.name}}
+ </a>
+
+ <div class="component-viewer-popup-duplications">
+ Lines:
+ {{#joinEach blocks ','}}
+ <a class="link-action" data-key="{{../file.key}}" data-line="{{from}}">
+ {{from}} – {{sum from size}}
+ </a>
+ {{/joinEach}}
+ </div>
+ </div>
+ {{else}}
+ {{t 'duplications.block_was_duplicated_by_a_deleted_resource'}}
+ {{/each}}
+</div>
+
+<div class="bubble-popup-arrow"></div>
--- /dev/null
+<div class="component-viewer-header-bar">
+ <div class="component-viewer-header-component">
+ {{#unless state.removed}}
+ {{#if component.projectName}}
+ <div class="component-viewer-header-component-project">
+ {{qualifierIcon 'TRK'}}
+ <a class="link-action" href="{{dashboardUrl component.project}}">{{component.projectName}}</a>
+ {{#if component.subProjectName}}
+ / <a class="link-action" href="{{dashboardUrl component.subProject}}">{{component.subProjectName}}</a>
+ {{/if}}
+ </div>
+ {{/if}}
+
+ <div class="component-viewer-header-component-name">
+ {{qualifierIcon component.q}} {{default component.path component.longName}}
+
+ {{#if state.canMarkAsFavourite}}
+ <a class="js-favorite component-viewer-header-favorite"
+ title="{{#if component.fav}}{{t 'click_to_remove_from_favorites'}}{{else}}{{t 'click_to_add_to_favorites'}}{{/if}}">
+ <i class="{{#if component.fav}}icon-favorite{{else}}icon-not-favorite{{/if}}"></i>
+ </a>
+ {{/if}}
+ </div>
+ {{else}}
+ <div class="component-viewer-header-component-project removed">{{state.removedMessage}}</div>
+ {{/unless}}
+ </div>
+
+ {{#unless state.removed}}
+ <a class="js-actions component-viewer-header-actions" title="{{t 'component_viewer.more_actions'}}">
+ <i class="icon-list"></i>
+ </a>
+
+ <div class="component-viewer-header-measures">
+ {{#if component.isUnitTest}}
+ <div class="component-viewer-header-measures-scope">
+ <a data-scope="tests" class="component-viewer-header-measures-expand js-header-tab-tests">
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value">{{component.measures.fTests}}</span>
+ <span class="component-viewer-header-measure-label">{{t 'metric.tests.name'}}</span>
+ </div>
+ <i class="icon-dropdown"></i>
+ </a>
+ </div>
+ {{/if}}
+
+ {{#unless component.isUnitTest}}
+ <div class="component-viewer-header-measures-scope">
+ <span data-scope="basic" class="js-toggle-coverage component-viewer-header-measures-toggle-scope inactive"></span>
+ <a data-scope="basic" class="component-viewer-header-measures-expand js-header-tab-basic">
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value">{{default component.measures.fNcloc '–'}}</span>
+ <span class="component-viewer-header-measure-label">{{t 'metric.ncloc.name'}}</span>
+ </div>
+ <i class="icon-dropdown"></i>
+ </a>
+ </div>
+ {{/unless}}
+
+ <div class="component-viewer-header-measures-scope">
+ <a data-scope="issues" class="component-viewer-header-measures-expand js-header-tab-issues">
+ {{#if component.measures.fSqaleRating}}
+ <div class="component-viewer-header-measure">
+ <span class="rating rating-{{component.measures.fSqaleRating}}"
+ {{#if component.measures.fSqaleDebtRatio}}title="{{t 'metric.sqale_debt_ratio.name'}}: {{component.measures.fSqaleDebtRatio}}"{{/if}}>
+ {{component.measures.fSqaleRating}}
+ </span>
+ </div>
+ {{/if}}
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value">{{default component.measures.fDebt '0'}}</span>
+ <span class="component-viewer-header-measure-label">{{t 'component_viewer.header.debt'}}</span>
+ </div>
+ {{#if component.measures.fIssues}}
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value">{{component.measures.fIssues}}</span>
+ <span class="component-viewer-header-measure-label">{{t 'metric.violations.name'}}</span>
+ </div>
+ {{/if}}
+ {{#if component.measures.fIssues}}
+ <div class="component-viewer-header-measure">
+ <div class="component-viewer-header-measure-issues">
+ <div class="component-viewer-header-measure-issue s-blocker"
+ style="width: {{percent component.measures.fBlockerIssues component.measures.maxIssues}};"></div>
+ <div class="component-viewer-header-measure-issue s-critical"
+ style="width: {{percent component.measures.fCriticalIssues component.measures.maxIssues}};"></div>
+ <div class="component-viewer-header-measure-issue s-major"
+ style="width: {{percent component.measures.fMajorIssues component.measures.maxIssues}};"></div>
+ <div class="component-viewer-header-measure-issue s-minor"
+ style="width: {{percent component.measures.fMinorIssues component.measures.maxIssues}};"></div>
+ <div class="component-viewer-header-measure-issue s-info"
+ style="width: {{percent component.measures.fInfoIssues component.measures.maxIssues}};"></div>
+ </div>
+ </div>
+ {{/if}}
+ <i class="icon-dropdown"></i>
+ </a>
+ <a data-scope="issues" title="{{t 'component_viewer.header.toggle_issues'}}"
+ class="js-toggle-issues component-viewer-header-measures-toggle-scope {{#if settings.issues}}active{{/if}}"></a>
+ </div>
+
+ {{#inArray state.tabs 'coverage'}}
+ <div class="component-viewer-header-measures-scope">
+ <a data-scope="coverage" class="component-viewer-header-measures-expand js-header-tab-coverage">
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value">{{default component.measures.fCoverage '–'}}</span>
+ <span class="component-viewer-header-measure-label">{{t 'metric.coverage.name'}}</span>
+ </div>
+ <i class="icon-dropdown"></i>
+ </a>
+ <a data-scope="coverage" title="{{t 'component_viewer.header.toggle_coverage'}}"
+ class="js-toggle-coverage component-viewer-header-measures-toggle-scope {{#if settings.coverage}}active{{/if}}"></a>
+ </div>
+ {{/inArray}}
+
+ {{#inArray state.tabs 'duplications'}}
+ <div class="component-viewer-header-measures-scope">
+ <a data-scope="duplications" class="component-viewer-header-measures-expand js-header-tab-duplications">
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value">{{default component.measures.fDuplicationDensity '–'}}</span>
+ <span class="component-viewer-header-measure-label">{{t 'metric.duplicated_lines_density.name'}}</span>
+ </div>
+ <i class="icon-dropdown"></i>
+ </a>
+ <a data-scope="duplications" title="{{t 'component_viewer.header.toggle_duplications'}}"
+ class="js-toggle-duplications component-viewer-header-measures-toggle-scope {{#if settings.duplications}}active{{/if}}"></a>
+ </div>
+ {{/inArray}}
+
+ {{#inArray state.tabs 'scm'}}
+ <div class="component-viewer-header-measures-scope">
+ <a data-scope="scm" class="component-viewer-header-measures-expand js-header-tab-scm">
+ <div class="component-viewer-header-measure">
+ <span class="component-viewer-header-measure-value"><i class="icon-calendar"></i></span>
+ <span class="component-viewer-header-measure-label">SCM</span>
+ </div>
+ <i class="icon-dropdown"></i>
+ </a>
+ <a data-scope="scm" title="{{t 'component_viewer.header.toggle_scm'}}"
+ class="js-toggle-scm component-viewer-header-measures-toggle-scope {{#if settings.scm}}active{{/if}}"></a>
+ </div>
+ {{/inArray}}
+ </div>
+ {{/unless}}
+</div>
+
+<div class="component-viewer-header-expanded-bar"></div>
--- /dev/null
+<div class="component-viewer-header"></div>
+<div class="component-viewer-workspace"></div>
+<div class="component-viewer-source"></div>
\ No newline at end of file
--- /dev/null
+<div class="bubble-popup-container">
+ <div class="bubble-popup-title">{{t 'component_viewer.line_actions'}}</div>
+
+ <div class="bubble-popup-section">
+ <a href="#" class="js-get-permalink link-action">{{t 'component_viewer.get_permalink'}}</a>
+ </div>
+
+ {{#if state.canCreateManualIssue}}
+ <div class="bubble-popup-section">
+ <a href="#" class="js-add-manual-issue link-action">{{t 'component_viewer.add_manual_issue'}}</a>
+ </div>
+ {{/if}}
+</div>
+
+<div class="bubble-popup-arrow"></div>
--- /dev/null
+<a class="js-new-window underlined-link">{{t 'component_viewer.new_window'}}</a>
+<br>
+<a class="js-full-source underlined-link">{{t 'component_viewer.show_full_source'}}</a>
+<br>
+<a class="js-raw-source underlined-link">{{t 'component_viewer.show_raw_source'}}</a>
+
+{{#each state.extensions}}
+ <br>
+ <a class="js-extension underlined-link" data-key="{{this.[0]}}">{{this.[1]}}</a>
+{{/each}}
\ No newline at end of file
--- /dev/null
+{{#if state.sourceSecurity}}
+
+ <p>{{t 'code_viewer.no_source_code_displayed_due_to_security'}}</p>
+
+{{else}}
+
+ {{#if state.duplicationsInDeletedFiles}}
+ <p class="marginbottom10">{{t 'duplications.dups_found_on_deleted_resource'}}</p>
+ {{/if}}
+
+ {{#if issuesLimitReached}}
+ <p class="message-alert marginbottom10">{{tp 'component_viewer.issues_limit_reached' issuesLimit}}</p>
+ {{/if}}
+
+ <table class="code">
+ {{#if showZeroLine}}
+ <tr class="row row-hidden" data-line-number="0" id="{{uid}}-0">
+ {{#if settings.coverage}}
+ <td class="stat coverage-tests"></td>
+ <td class="stat coverage-conditions"></td>
+ {{/if}}
+ {{#if settings.duplications}}
+ <td class="stat"></td>
+ {{/if}}
+ {{#if settings.scm}}
+ <td class="stat"></td>
+ {{/if}}
+ <td class="stat lid"></td>
+ <td class="line"></td>
+ </tr>
+ {{/if}}
+
+ {{#each source}}
+ {{#if show}}
+ <tr class="row" data-line-number="{{lineNumber}}" id="{{../../uid}}-{{lineNumber}}">
+
+ {{#if ../../settings.scm}}
+ <td class="stat {{#if scm}}scm{{/if}}">
+ {{#if scm}}
+ {{#ifSCMChanged ../../../../source ../../../lineNumber}}
+ <span class="scm-date">{{scm.date}}</span>
+ <span class="scm-author" title="{{scm.author}}">{{scm.author}}</span>
+ {{/ifSCMChanged}}
+ {{/if}}
+ </td>
+ {{/if}}
+
+ {{#if ../../settings.duplications}}
+ <td class="stat duplications">
+ {{#each duplications}}
+ <span class="duplication {{#if this}}duplication-exists{{/if}}" data-index="{{this}}"></span>
+ {{/each}}
+ </td>
+ {{/if}}
+
+ {{#if ../../settings.coverage}}
+ <td class="stat {{#if coverage}}coverage-{{#if coverage.covered}}green{{else}}red{{/if}}{{/if}}">
+ {{#if coverage}}
+ <span class="coverage-tests" title="{{tp 'coverage_viewer.line_covered_by_x_tests' coverage.testCases}}">
+ {{coverage.testCases}}
+ </span>
+ {{/if}}
+ </td>
+
+ <td class="stat {{#if coverage}}{{#if coverage.branchCoverageStatus}}coverage-{{coverage.branchCoverageStatus}}{{/if}}{{/if}}">
+ {{#if coverage}}
+ {{#if coverage.branches}}
+ <span class="coverage-branches" title="{{tp 'coverage_viewer.x_covered_branches' coverage.coveredBranches}}">
+ {{coverage.coveredBranches}}/{{coverage.branches}}
+ </span>
+ {{/if}}
+ {{/if}}
+ </td>
+ {{/if}}
+
+ <td class="stat lid js-line-actions" title="{{t 'component_viewer.line_actions'}}">{{lineNumber}}</td>
+
+ <td class="line"><pre>{{{code}}}</pre></td>
+ </tr>
+ {{/if}}
+ {{/each}}
+ </table>
+
+{{/if}}
--- /dev/null
+<div class="bubble-popup-title">Time Changes</div>
+
+<ul class="bubble-popup-list">
+ {{#each periods}}
+ <li><a class="link-action" data-period="{{key}}">{{#if key}}{{../../prefix}}{{/if}} {{label}}</a></li>
+ {{/each}}
+</ul>
+
+<div class="bubble-popup-arrow"></div>
--- /dev/null
+<div class="component-viewer-workspace-header">
+ <div class="component-viewer-workspace-title"
+ title="{{t 'component_viewer.workspace.tooltip'}}">{{t 'component_viewer.workspace'}}</div>
+ <button class="button-clean component-viewer-workspace-toggle js-toggle-workspace"
+ title="{{#if settings.workspace}}{{t 'component_viewer.workspace.hide_workspace'}}{{else}}{{t 'component_viewer.workspace.show_workspace'}}{{/if}}">
+ {{#if settings.workspace}}
+ <i class="icon-double-chevron-left"></i>
+ {{else}}
+ <i class="icon-double-chevron-right"></i>
+ {{/if}}
+ </button>
+</div>
+
+<ul class="component-viewer-workspace-list">
+ {{#eachReverse workspace}}
+ <li class="component-viewer-workspace-item {{#if active}}active{{/if}}">
+ {{qualifierIcon component.q}}
+ <a class="link-action" data-key="{{component.key}}">{{component.name}}</a>
+ {{#if component.dir}}
+ <div class="text-ellipsis subtitle">{{component.dir}}</div>
+ {{/if}}
+ {{#if options}}
+ <div class="component-viewer-workspace-transition">{{t 'component_viewer.transition' ../transition}}</div>
+ <ul class="component-viewer-workspace-options">
+ {{#each options}}
+ <li class="component-viewer-workspace-option text-ellipsis {{#if active}}active{{/if}}" title="{{name}}">
+ <a class="link-action" data-workspace-key="{{../component.key}}" data-key="{{key}}">{{name}}</a>
+ {{#if subname}}<div class="text-ellipsis subtitle" title="{{subname}}">{{subname}}</div>{{/if}}
+ </li>
+ {{/each}}
+ </ul>
+ {{/if}}
+ </li>
+ {{/eachReverse}}
+</ul>
\ No newline at end of file
+++ /dev/null
-<div class="bubble-popup-container">
- <div class="bubble-popup-title">{{t 'component_viewer.transition.duplication'}}</div>
- {{#each duplications}}
- <div class="bubble-popup-section">
- {{#notEq file.projectName ../component.projectName}}
- <span class="component-viewer-popup-label">{{file.projectName}}</span>
- {{/notEq}}
- <a class="link-action" data-key="{{file.key}}" title="{{file.name}}">
- {{file.name}}
- </a>
-
- <div class="component-viewer-popup-duplications">
- Lines:
- {{#joinEach blocks ','}}
- <a class="link-action" data-key="{{../file.key}}" data-line="{{from}}">
- {{from}} – {{sum from size}}
- </a>
- {{/joinEach}}
- </div>
- </div>
- {{else}}
- {{t 'duplications.block_was_duplicated_by_a_deleted_resource'}}
- {{/each}}
-</div>
-
-<div class="bubble-popup-arrow"></div>
+++ /dev/null
-<div class="component-viewer-header-bar">
- <div class="component-viewer-header-component">
- {{#unless state.removed}}
- {{#if component.projectName}}
- <div class="component-viewer-header-component-project">
- {{qualifierIcon 'TRK'}}
- <a class="link-action" href="{{dashboardUrl component.project}}">{{component.projectName}}</a>
- {{#if component.subProjectName}}
- / <a class="link-action" href="{{dashboardUrl component.subProject}}">{{component.subProjectName}}</a>
- {{/if}}
- </div>
- {{/if}}
-
- <div class="component-viewer-header-component-name">
- {{qualifierIcon component.q}} {{default component.path component.longName}}
-
- {{#if state.canMarkAsFavourite}}
- <a class="js-favorite component-viewer-header-favorite"
- title="{{#if component.fav}}{{t 'click_to_remove_from_favorites'}}{{else}}{{t 'click_to_add_to_favorites'}}{{/if}}">
- <i class="{{#if component.fav}}icon-favorite{{else}}icon-not-favorite{{/if}}"></i>
- </a>
- {{/if}}
- </div>
- {{else}}
- <div class="component-viewer-header-component-project removed">{{state.removedMessage}}</div>
- {{/unless}}
- </div>
-
- {{#unless state.removed}}
- <a class="js-actions component-viewer-header-actions" title="{{t 'component_viewer.more_actions'}}">
- <i class="icon-list"></i>
- </a>
-
- <div class="component-viewer-header-measures">
- {{#if component.isUnitTest}}
- <div class="component-viewer-header-measures-scope">
- <a data-scope="tests" class="component-viewer-header-measures-expand js-header-tab-tests">
- <div class="component-viewer-header-measure">
- <span class="component-viewer-header-measure-value">{{component.measures.fTests}}</span>
- <span class="component-viewer-header-measure-label">{{t 'metric.tests.name'}}</span>
- </div>
- <i class="icon-dropdown"></i>
- </a>
- </div>
- {{/if}}
-
- {{#unless component.isUnitTest}}
- <div class="component-viewer-header-measures-scope">
- <span data-scope="basic" class="js-toggle-coverage component-viewer-header-measures-toggle-scope inactive"></span>
- <a data-scope="basic" class="component-viewer-header-measures-expand js-header-tab-basic">
- <div class="component-viewer-header-measure">
- <span class="component-viewer-header-measure-value">{{default component.measures.fNcloc '–'}}</span>
- <span class="component-viewer-header-measure-label">{{t 'metric.ncloc.name'}}</span>
- </div>
- <i class="icon-dropdown"></i>
- </a>
- </div>
- {{/unless}}
-
- <div class="component-viewer-header-measures-scope">
- <a data-scope="issues" class="component-viewer-header-measures-expand js-header-tab-issues">
- {{#if component.measures.fSqaleRating}}
- <div class="component-viewer-header-measure">
- <span class="rating rating-{{component.measures.fSqaleRating}}"
- {{#if component.measures.fSqaleDebtRatio}}title="{{t 'metric.sqale_debt_ratio.name'}}: {{component.measures.fSqaleDebtRatio}}"{{/if}}>
- {{component.measures.fSqaleRating}}
- </span>
- </div>
- {{/if}}
- <div class="component-viewer-header-measure">
- <span class="component-viewer-header-measure-value">{{default component.measures.fDebt '0'}}</span>
- <span class="component-viewer-header-measure-label">{{t 'component_viewer.header.debt'}}</span>
- </div>
- {{#if component.measures.fIssues}}
- <div class="component-viewer-header-measure">
- <span class="component-viewer-header-measure-value">{{component.measures.fIssues}}</span>
- <span class="component-viewer-header-measure-label">{{t 'metric.violations.name'}}</span>
- </div>
- {{/if}}
- {{#if component.measures.fIssues}}
- <div class="component-viewer-header-measure">
- <div class="component-viewer-header-measure-issues">
- <div class="component-viewer-header-measure-issue s-blocker"
- style="width: {{percent component.measures.fBlockerIssues component.measures.maxIssues}};"></div>
- <div class="component-viewer-header-measure-issue s-critical"
- style="width: {{percent component.measures.fCriticalIssues component.measures.maxIssues}};"></div>
- <div class="component-viewer-header-measure-issue s-major"
- style="width: {{percent component.measures.fMajorIssues component.measures.maxIssues}};"></div>
- <div class="component-viewer-header-measure-issue s-minor"
- style="width: {{percent component.measures.fMinorIssues component.measures.maxIssues}};"></div>
- <div class="component-viewer-header-measure-issue s-info"
- style="width: {{percent component.measures.fInfoIssues component.measures.maxIssues}};"></div>
- </div>
- </div>
- {{/if}}
- <i class="icon-dropdown"></i>
- </a>
- <a data-scope="issues" title="{{t 'component_viewer.header.toggle_issues'}}"
- class="js-toggle-issues component-viewer-header-measures-toggle-scope {{#if settings.issues}}active{{/if}}"></a>
- </div>
-
- {{#inArray state.tabs 'coverage'}}
- <div class="component-viewer-header-measures-scope">
- <a data-scope="coverage" class="component-viewer-header-measures-expand js-header-tab-coverage">
- <div class="component-viewer-header-measure">
- <span class="component-viewer-header-measure-value">{{default component.measures.fCoverage '–'}}</span>
- <span class="component-viewer-header-measure-label">{{t 'metric.coverage.name'}}</span>
- </div>
- <i class="icon-dropdown"></i>
- </a>
- <a data-scope="coverage" title="{{t 'component_viewer.header.toggle_coverage'}}"
- class="js-toggle-coverage component-viewer-header-measures-toggle-scope {{#if settings.coverage}}active{{/if}}"></a>
- </div>
- {{/inArray}}
-
- {{#inArray state.tabs 'duplications'}}
- <div class="component-viewer-header-measures-scope">
- <a data-scope="duplications" class="component-viewer-header-measures-expand js-header-tab-duplications">
- <div class="component-viewer-header-measure">
- <span class="component-viewer-header-measure-value">{{default component.measures.fDuplicationDensity '–'}}</span>
- <span class="component-viewer-header-measure-label">{{t 'metric.duplicated_lines_density.name'}}</span>
- </div>
- <i class="icon-dropdown"></i>
- </a>
- <a data-scope="duplications" title="{{t 'component_viewer.header.toggle_duplications'}}"
- class="js-toggle-duplications component-viewer-header-measures-toggle-scope {{#if settings.duplications}}active{{/if}}"></a>
- </div>
- {{/inArray}}
-
- {{#inArray state.tabs 'scm'}}
- <div class="component-viewer-header-measures-scope">
- <a data-scope="scm" class="component-viewer-header-measures-expand js-header-tab-scm">
- <div class="component-viewer-header-measure">
- <span class="component-viewer-header-measure-value"><i class="icon-calendar"></i></span>
- <span class="component-viewer-header-measure-label">SCM</span>
- </div>
- <i class="icon-dropdown"></i>
- </a>
- <a data-scope="scm" title="{{t 'component_viewer.header.toggle_scm'}}"
- class="js-toggle-scm component-viewer-header-measures-toggle-scope {{#if settings.scm}}active{{/if}}"></a>
- </div>
- {{/inArray}}
- </div>
- {{/unless}}
-</div>
-
-<div class="component-viewer-header-expanded-bar"></div>
--- /dev/null
+<li><span class="item" data-metric="{{label}}">
+ <span class="label">{{t 'metric' label 'name'}}</span>
+ <span class="number">{{value}}</span>
+</span></li>
\ No newline at end of file
--- /dev/null
+<li><a class="item {{cl}}" data-metric="{{label}}">
+ <span class="label">{{t 'metric' label 'name'}}</span>
+ <span class="number">{{value}}</span>
+ <i class="icon-chevron-right"></i>
+</a></li>
\ No newline at end of file
+++ /dev/null
-<li><span class="item" data-metric="{{label}}">
- <span class="label">{{t 'metric' label 'name'}}</span>
- <span class="number">{{value}}</span>
-</span></li>
\ No newline at end of file
+++ /dev/null
-<li><a class="item {{cl}}" data-metric="{{label}}">
- <span class="label">{{t 'metric' label 'name'}}</span>
- <span class="number">{{value}}</span>
- <i class="icon-chevron-right"></i>
-</a></li>
\ No newline at end of file
+++ /dev/null
-{{#with component.measures}}
- <div class="component-viewer-header-expanded-bar-section">
- <div class="component-viewer-header-expanded-bar-section-title">
- {{t 'component_viewer.measure_section.size'}}
- </div>
- <ul class="component-viewer-header-expanded-bar-section-list">
- {{{componentViewerHeaderItem lines 'lines'}}}
- {{{componentViewerHeaderItem ncloc 'ncloc'}}}
- {{{componentViewerHeaderItem generated_lines 'generated_lines'}}}
- {{{componentViewerHeaderItem generated_ncloc 'generated_ncloc'}}}
- </ul>
- </div>
-
- <div class="component-viewer-header-expanded-bar-section">
- <div class="component-viewer-header-expanded-bar-section-title">
- {{t 'component_viewer.measure_section.complexity'}}
- </div>
- <ul class="component-viewer-header-expanded-bar-section-list">
- {{{componentViewerHeaderItem complexity 'complexity'}}}
- {{{componentViewerHeaderItem function_complexity 'function_complexity'}}}
- </ul>
- </div>
-
- <div class="component-viewer-header-expanded-bar-section">
- <div class="component-viewer-header-expanded-bar-section-title">
- {{t 'component_viewer.measure_section.structure'}}
- </div>
- <ul class="component-viewer-header-expanded-bar-section-list">
- {{{componentViewerHeaderItem classes 'classes'}}}
- {{{componentViewerHeaderItem functions 'functions'}}}
- {{{componentViewerHeaderItem accessors 'accessors'}}}
- {{{componentViewerHeaderItem statements 'statements'}}}
- </ul>
- </div>
-
- <div class="component-viewer-header-expanded-bar-section">
- <div class="component-viewer-header-expanded-bar-section-title">
- {{t 'component_viewer.measure_section.documentation'}}
- </div>
- <ul class="component-viewer-header-expanded-bar-section-list">
- {{{componentViewerHeaderItem comment_lines 'comment_lines'}}}
- {{{componentViewerHeaderItem comment_lines_density 'comment_lines_density'}}}
- {{{componentViewerHeaderItem public_api 'public_api'}}}
- {{{componentViewerHeaderItem public_undocumented_api 'public_undocumented_api'}}}
- {{{componentViewerHeaderItem public_documented_api_density 'public_documented_api_density'}}}
- </ul>
- </div>
-{{/with}}
\ No newline at end of file
+++ /dev/null
-{{#if state.hasSource}}
- <div class="component-viewer-header-time-changes">
- <a class="highlighted-link js-coverage-time-changes">
- {{#if period}}Δ {{period.label}}{{else}}<i class="icon-period"></i> {{t 'component_viewer.time_changes'}}{{/if}}
- </a>
- </div>
-{{/if}}
-
-{{#with component.measures}}
- {{#any coverage line_coverage lines_to_cover covered_lines uncovered_lines branch_coverage conditions_to_cover covered_conditions uncovered_conditions it_coverage it_line_coverage it_lines_to_cover it_covered_lines it_uncovered_lines it_branch_coverage it_conditions_to_cover it_covered_conditions it_uncovered_conditions}}
- {{else}}
- <div class="component-viewer-header-expanded-bar-section">
- <div class="component-viewer-header-expanded-bar-section-title">
- {{t 'component_viewer.no_coverage'}}
- </div>
- {{/any}}
-
- <span class="nowrap">
- {{#any coverage line_coverage lines_to_cover covered_lines uncovered_lines}}
- <div class="component-viewer-header-expanded-bar-section">
- <div class="component-viewer-header-expanded-bar-section-title">
- {{t 'component_viewer.measure_section.unit_tests'}}
- </div>
- <ul class="component-viewer-header-expanded-bar-section-list">
- {{{componentViewerHeaderItem coverage 'coverage'}}}
- {{{componentViewerHeaderItem line_coverage 'line_coverage'}}}
- {{#if ../../state.hasSource}}
- {{{componentViewerHeaderLink lines_to_cover 'lines_to_cover' 'js-filter-lines-to-cover'}}}
- {{{componentViewerHeaderLink uncovered_lines 'uncovered_lines' 'js-filter-uncovered-lines'}}}
- {{else}}
- {{{componentViewerHeaderItem lines_to_cover 'lines_to_cover'}}}
- {{{componentViewerHeaderItem uncovered_lines 'uncovered_lines'}}}
- {{/if}}
- </ul>
- </div>
- {{/any}}
-
- {{#any branch_coverage conditions_to_cover covered_conditions uncovered_conditions}}
- <div class="component-viewer-header-expanded-bar-section">
- <div class="component-viewer-header-expanded-bar-section-title">
- {{#any coverage line_coverage lines_to_cover covered_lines uncovered_lines}}
-
- {{else}}
- {{t 'component_viewer.measure_section.unit_tests'}}
- {{/any}}
- </div>
- <ul class="component-viewer-header-expanded-bar-section-list">
- {{#any coverage line_coverage lines_to_cover covered_lines uncovered_lines}}
- <li><span class="item"> </span></li>
- {{/any}}
- {{{componentViewerHeaderItem branch_coverage 'branch_coverage'}}}
- {{#if ../../state.hasSource}}
- {{{componentViewerHeaderLink conditions_to_cover 'conditions_to_cover' 'js-filter-branches-to-cover'}}}
- {{{componentViewerHeaderLink uncovered_conditions 'uncovered_conditions' 'js-filter-uncovered-branches'}}}
- {{else}}
- {{{componentViewerHeaderItem conditions_to_cover 'conditions_to_cover'}}}
- {{{componentViewerHeaderItem uncovered_conditions 'uncovered_conditions'}}}
- {{/if}}
- </ul>
- </div>
- {{/any}}
- </span>
-
- <span class="nowrap">
- {{#any it_coverage it_line_coverage it_lines_to_cover it_covered_lines it_uncovered_lines}}
- <div class="component-viewer-header-expanded-bar-section">
- <div class="component-viewer-header-expanded-bar-section-title">
- {{t 'component_viewer.measure_section.integration_tests'}}
- </div>
- <ul class="component-viewer-header-expanded-bar-section-list">
- {{{componentViewerHeaderItem it_coverage 'coverage'}}}
- {{{componentViewerHeaderItem it_line_coverage 'line_coverage'}}}
- {{#if ../../state.hasSource}}
- {{{componentViewerHeaderLink it_lines_to_cover 'lines_to_cover' 'js-filter-lines-to-cover-it'}}}
- {{{componentViewerHeaderLink it_uncovered_lines 'uncovered_lines' 'js-filter-uncovered-lines-it'}}}
- {{else}}
- {{{componentViewerHeaderItem it_lines_to_cover 'lines_to_cover'}}}
- {{{componentViewerHeaderItem it_uncovered_lines 'uncovered_lines'}}}
- {{/if}}
- </ul>
- </div>
- {{/any}}
-
- {{#any it_branch_coverage it_conditions_to_cover it_covered_conditions it_uncovered_conditions}}
- <div class="component-viewer-header-expanded-bar-section">
- <div class="component-viewer-header-expanded-bar-section-title">
- {{#any it_coverage it_line_coverage it_lines_to_cover it_covered_lines it_uncovered_lines}}
-
- {{else}}
- {{t 'component_viewer.measure_section.integration_tests'}}
- {{/any}}
- </div>
- <ul class="component-viewer-header-expanded-bar-section-list">
- {{#any it_coverage it_line_coverage it_lines_to_cover it_covered_lines it_uncovered_lines}}
- <li><span class="item"> </span></li>
- {{/any}}
- {{{componentViewerHeaderItem it_branch_coverage 'branch_coverage'}}}
- {{#if ../../state.hasSource}}
- {{{componentViewerHeaderLink it_conditions_to_cover 'conditions_to_cover' 'js-filter-branches-to-cover-it'}}}
- {{{componentViewerHeaderLink it_uncovered_conditions 'uncovered_conditions' 'js-filter-uncovered-branches-it'}}}
- {{else}}
- {{{componentViewerHeaderItem it_conditions_to_cover 'conditions_to_cover'}}}
- {{{componentViewerHeaderItem it_uncovered_conditions 'uncovered_conditions'}}}
- {{/if}}
- </ul>
- </div>
- {{/any}}
- </span>
-{{/with}}
+++ /dev/null
-<div class="bubble-popup-container">
- {{#notEq test.status 'ERROR'}}
- {{#notEq test.status 'FAILURE'}}
- <div class="bubble-popup-title">{{t 'component_viewer.transition.covers'}}</div>
- {{#each items}}
- <div class="bubble-popup-section">
- <a class="component-viewer-popup-test-file link-action" data-key="{{key}}" title="{{name}}">{{name}}</a>
- <span class="subtitle">{{tp 'component_viewer.x_lines_are_covered' coveredLines}}</span>
- <br><span class="subtitle" title="{{dir}}">{{dir}}</span>
- </div>
- {{else}}
- {{t 'none'}}
- {{/each}}
- {{/notEq}}
- {{/notEq}}
-
- {{#notEq test.status 'OK'}}
- <div class="bubble-popup-title">{{t 'component_viewer.details'}}</div>
- {{#if test.message}}
- <pre>{{test.message}}</pre>
- {{/if}}
- <pre>{{test.stackTrace}}</pre>
- {{/notEq}}
-
-</div>
-
-<div class="bubble-popup-arrow"></div>
--- /dev/null
+{{#with component.measures}}
+ <div class="component-viewer-header-expanded-bar-section">
+ <div class="component-viewer-header-expanded-bar-section-title">
+ {{t 'component_viewer.measure_section.size'}}
+ </div>
+ <ul class="component-viewer-header-expanded-bar-section-list">
+ {{{componentViewerHeaderItem lines 'lines'}}}
+ {{{componentViewerHeaderItem ncloc 'ncloc'}}}
+ {{{componentViewerHeaderItem generated_lines 'generated_lines'}}}
+ {{{componentViewerHeaderItem generated_ncloc 'generated_ncloc'}}}
+ </ul>
+ </div>
+
+ <div class="component-viewer-header-expanded-bar-section">
+ <div class="component-viewer-header-expanded-bar-section-title">
+ {{t 'component_viewer.measure_section.complexity'}}
+ </div>
+ <ul class="component-viewer-header-expanded-bar-section-list">
+ {{{componentViewerHeaderItem complexity 'complexity'}}}
+ {{{componentViewerHeaderItem function_complexity 'function_complexity'}}}
+ </ul>
+ </div>
+
+ <div class="component-viewer-header-expanded-bar-section">
+ <div class="component-viewer-header-expanded-bar-section-title">
+ {{t 'component_viewer.measure_section.structure'}}
+ </div>
+ <ul class="component-viewer-header-expanded-bar-section-list">
+ {{{componentViewerHeaderItem classes 'classes'}}}
+ {{{componentViewerHeaderItem functions 'functions'}}}
+ {{{componentViewerHeaderItem accessors 'accessors'}}}
+ {{{componentViewerHeaderItem statements 'statements'}}}
+ </ul>
+ </div>
+
+ <div class="component-viewer-header-expanded-bar-section">
+ <div class="component-viewer-header-expanded-bar-section-title">
+ {{t 'component_viewer.measure_section.documentation'}}
+ </div>
+ <ul class="component-viewer-header-expanded-bar-section-list">
+ {{{componentViewerHeaderItem comment_lines 'comment_lines'}}}
+ {{{componentViewerHeaderItem comment_lines_density 'comment_lines_density'}}}
+ {{{componentViewerHeaderItem public_api 'public_api'}}}
+ {{{componentViewerHeaderItem public_undocumented_api 'public_undocumented_api'}}}
+ {{{componentViewerHeaderItem public_documented_api_density 'public_documented_api_density'}}}
+ </ul>
+ </div>
+{{/with}}
\ No newline at end of file
--- /dev/null
+{{#if state.hasSource}}
+ <div class="component-viewer-header-time-changes">
+ <a class="highlighted-link js-coverage-time-changes">
+ {{#if period}}Δ {{period.label}}{{else}}<i class="icon-period"></i> {{t 'component_viewer.time_changes'}}{{/if}}
+ </a>
+ </div>
+{{/if}}
+
+{{#with component.measures}}
+ {{#any coverage line_coverage lines_to_cover covered_lines uncovered_lines branch_coverage conditions_to_cover covered_conditions uncovered_conditions it_coverage it_line_coverage it_lines_to_cover it_covered_lines it_uncovered_lines it_branch_coverage it_conditions_to_cover it_covered_conditions it_uncovered_conditions}}
+ {{else}}
+ <div class="component-viewer-header-expanded-bar-section">
+ <div class="component-viewer-header-expanded-bar-section-title">
+ {{t 'component_viewer.no_coverage'}}
+ </div>
+ {{/any}}
+
+ <span class="nowrap">
+ {{#any coverage line_coverage lines_to_cover covered_lines uncovered_lines}}
+ <div class="component-viewer-header-expanded-bar-section">
+ <div class="component-viewer-header-expanded-bar-section-title">
+ {{t 'component_viewer.measure_section.unit_tests'}}
+ </div>
+ <ul class="component-viewer-header-expanded-bar-section-list">
+ {{{componentViewerHeaderItem coverage 'coverage'}}}
+ {{{componentViewerHeaderItem line_coverage 'line_coverage'}}}
+ {{#if ../../state.hasSource}}
+ {{{componentViewerHeaderLink lines_to_cover 'lines_to_cover' 'js-filter-lines-to-cover'}}}
+ {{{componentViewerHeaderLink uncovered_lines 'uncovered_lines' 'js-filter-uncovered-lines'}}}
+ {{else}}
+ {{{componentViewerHeaderItem lines_to_cover 'lines_to_cover'}}}
+ {{{componentViewerHeaderItem uncovered_lines 'uncovered_lines'}}}
+ {{/if}}
+ </ul>
+ </div>
+ {{/any}}
+
+ {{#any branch_coverage conditions_to_cover covered_conditions uncovered_conditions}}
+ <div class="component-viewer-header-expanded-bar-section">
+ <div class="component-viewer-header-expanded-bar-section-title">
+ {{#any coverage line_coverage lines_to_cover covered_lines uncovered_lines}}
+
+ {{else}}
+ {{t 'component_viewer.measure_section.unit_tests'}}
+ {{/any}}
+ </div>
+ <ul class="component-viewer-header-expanded-bar-section-list">
+ {{#any coverage line_coverage lines_to_cover covered_lines uncovered_lines}}
+ <li><span class="item"> </span></li>
+ {{/any}}
+ {{{componentViewerHeaderItem branch_coverage 'branch_coverage'}}}
+ {{#if ../../state.hasSource}}
+ {{{componentViewerHeaderLink conditions_to_cover 'conditions_to_cover' 'js-filter-branches-to-cover'}}}
+ {{{componentViewerHeaderLink uncovered_conditions 'uncovered_conditions' 'js-filter-uncovered-branches'}}}
+ {{else}}
+ {{{componentViewerHeaderItem conditions_to_cover 'conditions_to_cover'}}}
+ {{{componentViewerHeaderItem uncovered_conditions 'uncovered_conditions'}}}
+ {{/if}}
+ </ul>
+ </div>
+ {{/any}}
+ </span>
+
+ <span class="nowrap">
+ {{#any it_coverage it_line_coverage it_lines_to_cover it_covered_lines it_uncovered_lines}}
+ <div class="component-viewer-header-expanded-bar-section">
+ <div class="component-viewer-header-expanded-bar-section-title">
+ {{t 'component_viewer.measure_section.integration_tests'}}
+ </div>
+ <ul class="component-viewer-header-expanded-bar-section-list">
+ {{{componentViewerHeaderItem it_coverage 'coverage'}}}
+ {{{componentViewerHeaderItem it_line_coverage 'line_coverage'}}}
+ {{#if ../../state.hasSource}}
+ {{{componentViewerHeaderLink it_lines_to_cover 'lines_to_cover' 'js-filter-lines-to-cover-it'}}}
+ {{{componentViewerHeaderLink it_uncovered_lines 'uncovered_lines' 'js-filter-uncovered-lines-it'}}}
+ {{else}}
+ {{{componentViewerHeaderItem it_lines_to_cover 'lines_to_cover'}}}
+ {{{componentViewerHeaderItem it_uncovered_lines 'uncovered_lines'}}}
+ {{/if}}
+ </ul>
+ </div>
+ {{/any}}
+
+ {{#any it_branch_coverage it_conditions_to_cover it_covered_conditions it_uncovered_conditions}}
+ <div class="component-viewer-header-expanded-bar-section">
+ <div class="component-viewer-header-expanded-bar-section-title">
+ {{#any it_coverage it_line_coverage it_lines_to_cover it_covered_lines it_uncovered_lines}}
+
+ {{else}}
+ {{t 'component_viewer.measure_section.integration_tests'}}
+ {{/any}}
+ </div>
+ <ul class="component-viewer-header-expanded-bar-section-list">
+ {{#any it_coverage it_line_coverage it_lines_to_cover it_covered_lines it_uncovered_lines}}
+ <li><span class="item"> </span></li>
+ {{/any}}
+ {{{componentViewerHeaderItem it_branch_coverage 'branch_coverage'}}}
+ {{#if ../../state.hasSource}}
+ {{{componentViewerHeaderLink it_conditions_to_cover 'conditions_to_cover' 'js-filter-branches-to-cover-it'}}}
+ {{{componentViewerHeaderLink it_uncovered_conditions 'uncovered_conditions' 'js-filter-uncovered-branches-it'}}}
+ {{else}}
+ {{{componentViewerHeaderItem it_conditions_to_cover 'conditions_to_cover'}}}
+ {{{componentViewerHeaderItem it_uncovered_conditions 'uncovered_conditions'}}}
+ {{/if}}
+ </ul>
+ </div>
+ {{/any}}
+ </span>
+{{/with}}
--- /dev/null
+<div class="bubble-popup-container">
+ {{#notEq test.status 'ERROR'}}
+ {{#notEq test.status 'FAILURE'}}
+ <div class="bubble-popup-title">{{t 'component_viewer.transition.covers'}}</div>
+ {{#each items}}
+ <div class="bubble-popup-section">
+ <a class="component-viewer-popup-test-file link-action" data-key="{{key}}" title="{{name}}">{{name}}</a>
+ <span class="subtitle">{{tp 'component_viewer.x_lines_are_covered' coveredLines}}</span>
+ <br><span class="subtitle" title="{{dir}}">{{dir}}</span>
+ </div>
+ {{else}}
+ {{t 'none'}}
+ {{/each}}
+ {{/notEq}}
+ {{/notEq}}
+
+ {{#notEq test.status 'OK'}}
+ <div class="bubble-popup-title">{{t 'component_viewer.details'}}</div>
+ {{#if test.message}}
+ <pre>{{test.message}}</pre>
+ {{/if}}
+ <pre>{{test.stackTrace}}</pre>
+ {{/notEq}}
+
+</div>
+
+<div class="bubble-popup-arrow"></div>
--- /dev/null
+{{#with component.measures}}
+ <div class="component-viewer-header-expanded-bar-section">
+ <div class="component-viewer-header-expanded-bar-section-title">{{t 'duplications'}}</div>
+ <ul class="component-viewer-header-expanded-bar-section-list">
+ {{#if ../state.hasSource}}
+ {{{componentViewerHeaderLink duplicated_blocks 'duplicated_blocks' 'js-filter-duplications'}}}
+ {{else}}
+ {{{componentViewerHeaderItem duplicated_blocks 'duplicated_blocks'}}}
+ {{/if}}
+ {{{componentViewerHeaderItem duplicated_lines 'duplicated_lines'}}}
+ </ul>
+ </div>
+{{/with}}
\ No newline at end of file
--- /dev/null
+{{#if state.hasSource}}
+ <div class="component-viewer-header-time-changes">
+ <a class="link-action js-issues-time-changes">
+ {{#if period}}{{t 'component_viewer.added'}} {{period.label}}{{else}}<i class="icon-period"></i> {{t 'component_viewer.time_changes'}}{{/if}}
+ </a>
+ </div>
+{{/if}}
+
+<div class="component-viewer-header-expanded-bar-section">
+ <div class="component-viewer-header-expanded-bar-section-title">
+ {{#if hasIssues}}{{t 'component_viewer.measure_section.filters'}}{{else}}{{t 'component_viewer.no_issues'}}{{/if}}
+ </div>
+ <ul class="component-viewer-header-expanded-bar-section-list">
+ {{#if currentIssue}}
+ <li><a class="item js-filter-current-issue">
+ <span>{{t 'component_viewer.issues.current_issue'}}</span>
+ <i class="icon-chevron-right"></i>
+ </a></li>
+ {{/if}}
+ {{#unless state.removed}}
+ <li><a class="item js-filter-unresolved-issues">
+ <span>{{t 'component_viewer.issues.unresolved_issues'}}</span>
+ <i class="icon-chevron-right"></i>
+ </a></li>
+ {{/unless}}
+ {{#unless state.removed}}
+ <li><a class="item js-filter-open-issues">
+ <span>{{t 'component_viewer.issues.open_issues'}}</span>
+ <i class="icon-chevron-right"></i>
+ </a></li>
+ {{/unless}}
+ {{#unless state.removed}}
+ <li><a class="item js-filter-fixed-issues">
+ <span>{{t 'component_viewer.issues.fixed_issues'}}</span>
+ <i class="icon-chevron-right"></i>
+ </a></li>
+ {{/unless}}
+ {{#unless state.removed}}
+ <li><a class="item js-filter-false-positive-issues">
+ <span>{{t 'component_viewer.issues.false_positive_issues'}}</span>
+ <i class="icon-chevron-right"></i>
+ </a></li>
+ {{/unless}}
+ </ul>
+</div>
+
+{{#ifNotEmpty state.severities}}
+ <div class="component-viewer-header-expanded-bar-section">
+ <div class="component-viewer-header-expanded-bar-section-title">
+ {{t 'component_viewer.measure_section.severities'}}
+ </div>
+ <ul class="component-viewer-header-expanded-bar-section-list">
+ {{#each state.severities}}
+ {{#unless ../../state.removed}}
+ <li><a class="item js-filter-{{key}}-issues">
+ <span>{{severityIcon key}} {{name}}</span>
+ <span class="number">{{count}}</span>
+ <i class="icon-chevron-right"></i>
+ </a></li>
+ {{else}}
+ <li><span class="item">
+ <span>{{severityIcon key}} {{name}}</span>
+ <span class="number">{{count}}</span>
+ </span></li>
+ {{/unless}}
+ {{/each}}
+ </ul>
+ </div>
+{{/ifNotEmpty}}
+
+{{#ifNotEmpty state.rules}}
+ <div class="component-viewer-header-expanded-bar-section">
+ <div class="component-viewer-header-expanded-bar-section-title">
+ {{t 'component_viewer.measure_section.rules'}}
+ </div>
+ <ul class="component-viewer-header-expanded-bar-section-list">
+ {{#each state.rules}}
+ {{#unless ../../state.removed}}
+ <li><a class="item js-filter-rule" data-rule="{{key}}" title="{{name}}">
+ <span>{{name}}</span>
+ <span class="number">{{count}}</span>
+ <i class="icon-chevron-right"></i>
+ </a></li>
+ {{else}}
+ <li><span class="item">
+ <span>{{name}}</span>
+ <span class="number">{{count}}</span>
+ </span></li>
+ {{/unless}}
+ {{/each}}
+ </ul>
+ </div>
+{{/ifNotEmpty}}
+
+{{#if hasIssues}}
+ <div class="component-viewer-header-expanded-bar-section component-viewer-header-expanded-bar-section-actions">
+ <div class="component-viewer-header-expanded-bar-section-title"> </div>
+ <ul class="component-viewer-header-expanded-bar-section-list">
+ {{#if state.canBulkChange}}
+ <li><a class="link-action js-issues-bulk-change">
+ <span><i class="icon-bulk-change"></i> {{t 'bulk_change'}}</span>
+ </a></li>
+ {{/if}}
+ </ul>
+ </div>
+{{/if}}
--- /dev/null
+<div class="component-viewer-header-time-changes">
+ <a class="highlighted-link js-scm-time-changes">
+ {{#if period}}Δ {{period.label}}{{else}}<i class="icon-period"></i> {{t 'component_viewer.time_changes'}}{{/if}}
+ </a>
+</div>
\ No newline at end of file
--- /dev/null
+{{#with component.measures}}
+ <span class="nowrap">
+ {{#any test_success_density test_failures test_errors test_execution_time}}
+ <div class="component-viewer-header-expanded-bar-section">
+ <div class="component-viewer-header-expanded-bar-section-title">
+ {{t 'component_viewer.measure_section.tests'}}
+ </div>
+ <ul class="component-viewer-header-expanded-bar-section-list">
+ {{#if test_success_density}}
+ <li><span class="item" data-metric="test_success_density">
+ <span class="label">{{t 'metric.test_success_density.short_name'}}</span>
+ <span class="number">{{test_success_density}}</span>
+ </span></li>
+ {{/if}}
+ {{#if skipped_tests}}
+ <li><span class="item" data-metric="skipped_tests">
+ <span class="label">{{t 'metric.skipped_tests.short_name'}}</span>
+ <span class="number">{{skipped_tests}}</span>
+ </span></li>
+ {{/if}}
+ {{#if test_failures}}
+ <li><span class="item" data-metric="test_failures">
+ <span class="label">{{t 'metric.test_failures.short_name'}}</span>
+ <span class="number">{{test_failures}}</span>
+ </span></li>
+ {{/if}}
+ {{#if test_errors}}
+ <li><span class="item" data-metric="test_errors">
+ <span class="label">{{t 'metric.test_errors.short_name'}}</span>
+ <span class="number">{{test_errors}}</span>
+ </span></li>
+ {{/if}}
+ {{#if test_execution_time}}
+ <li><span class="item" data-metric="test_execution_time">
+ <span class="label">{{t 'metric.test_execution_time.short_name'}}</span>
+ <span class="number">{{test_execution_time}}</span>
+ </span></li>
+ {{/if}}
+ </ul>
+ </div>
+ {{/any}}
+ </span>
+{{/with}}
+
+<div class="component-viewer-header-expanded-bar-section large">
+ <div class="component-viewer-header-expanded-bar-section-title justify">
+ <span class="ib">{{t 'component_viewer.measure_section.test_names'}}</span>
+ {{#if hasCoveragePerTestData}}
+ <span class="ib">{{t 'component_viewer.covered_lines'}}</span>
+ {{/if}}
+ </div>
+ <ul class="component-viewer-header-expanded-bar-section-list">
+ {{#each tests}}
+ {{#eq status 'SKIPPED'}}
+ <li><span class="item" title="{{name}}" data-status="{{status}}">
+ <span class="label">{{testStatusIcon status}}
+ <span class="duration subtitle"></span>
+ {{name}}</span>
+ </span></li>
+ {{else}}
+ {{#ifTestData this}}
+ <li><a class="item js-unit-test" data-name="{{name}}" data-status="{{status}}" title="{{name}}">
+ <span class="label">{{testStatusIcon status}}
+ <span class="duration subtitle">{{durationInMs}}ms</span>
+ {{name}}</span>
+ {{#if coveredLines}}
+ <span class="number">{{coveredLines}}</span>
+ {{/if}}
+ <i class="icon-chevron-right"></i>
+ </a></li>
+ {{else}}
+ <li><span class="item" data-name="{{name}}" data-status="{{status}}" title="{{name}}">
+ <span class="label">{{testStatusIcon status}}
+ <span class="duration subtitle">{{durationInMs}}ms</span> {{name}}</span>
+ </span></li>
+ {{/ifTestData}}
+ {{/eq}}
+ {{/each}}
+ </ul>
+ <div class="component-viewer-header-expanded-bar-section-title">
+ <span>{{t 'component_viewer.tests.sort_by'}}</span>
+ <a class="js-sort-tests-name underlined-link">{{t 'component_viewer.tests.test_name'}}</a>
+ <a class="js-sort-tests-duration underlined-link">{{t 'component_viewer.tests.duration'}}</a>
+ </div>
+</div>
+++ /dev/null
-{{#with component.measures}}
- <div class="component-viewer-header-expanded-bar-section">
- <div class="component-viewer-header-expanded-bar-section-title">{{t 'duplications'}}</div>
- <ul class="component-viewer-header-expanded-bar-section-list">
- {{#if ../state.hasSource}}
- {{{componentViewerHeaderLink duplicated_blocks 'duplicated_blocks' 'js-filter-duplications'}}}
- {{else}}
- {{{componentViewerHeaderItem duplicated_blocks 'duplicated_blocks'}}}
- {{/if}}
- {{{componentViewerHeaderItem duplicated_lines 'duplicated_lines'}}}
- </ul>
- </div>
-{{/with}}
\ No newline at end of file
+++ /dev/null
-{{#if state.hasSource}}
- <div class="component-viewer-header-time-changes">
- <a class="link-action js-issues-time-changes">
- {{#if period}}{{t 'component_viewer.added'}} {{period.label}}{{else}}<i class="icon-period"></i> {{t 'component_viewer.time_changes'}}{{/if}}
- </a>
- </div>
-{{/if}}
-
-<div class="component-viewer-header-expanded-bar-section">
- <div class="component-viewer-header-expanded-bar-section-title">
- {{#if hasIssues}}{{t 'component_viewer.measure_section.filters'}}{{else}}{{t 'component_viewer.no_issues'}}{{/if}}
- </div>
- <ul class="component-viewer-header-expanded-bar-section-list">
- {{#if currentIssue}}
- <li><a class="item js-filter-current-issue">
- <span>{{t 'component_viewer.issues.current_issue'}}</span>
- <i class="icon-chevron-right"></i>
- </a></li>
- {{/if}}
- {{#unless state.removed}}
- <li><a class="item js-filter-unresolved-issues">
- <span>{{t 'component_viewer.issues.unresolved_issues'}}</span>
- <i class="icon-chevron-right"></i>
- </a></li>
- {{/unless}}
- {{#unless state.removed}}
- <li><a class="item js-filter-open-issues">
- <span>{{t 'component_viewer.issues.open_issues'}}</span>
- <i class="icon-chevron-right"></i>
- </a></li>
- {{/unless}}
- {{#unless state.removed}}
- <li><a class="item js-filter-fixed-issues">
- <span>{{t 'component_viewer.issues.fixed_issues'}}</span>
- <i class="icon-chevron-right"></i>
- </a></li>
- {{/unless}}
- {{#unless state.removed}}
- <li><a class="item js-filter-false-positive-issues">
- <span>{{t 'component_viewer.issues.false_positive_issues'}}</span>
- <i class="icon-chevron-right"></i>
- </a></li>
- {{/unless}}
- </ul>
-</div>
-
-{{#ifNotEmpty state.severities}}
- <div class="component-viewer-header-expanded-bar-section">
- <div class="component-viewer-header-expanded-bar-section-title">
- {{t 'component_viewer.measure_section.severities'}}
- </div>
- <ul class="component-viewer-header-expanded-bar-section-list">
- {{#each state.severities}}
- {{#unless ../../state.removed}}
- <li><a class="item js-filter-{{key}}-issues">
- <span>{{severityIcon key}} {{name}}</span>
- <span class="number">{{count}}</span>
- <i class="icon-chevron-right"></i>
- </a></li>
- {{else}}
- <li><span class="item">
- <span>{{severityIcon key}} {{name}}</span>
- <span class="number">{{count}}</span>
- </span></li>
- {{/unless}}
- {{/each}}
- </ul>
- </div>
-{{/ifNotEmpty}}
-
-{{#ifNotEmpty state.rules}}
- <div class="component-viewer-header-expanded-bar-section">
- <div class="component-viewer-header-expanded-bar-section-title">
- {{t 'component_viewer.measure_section.rules'}}
- </div>
- <ul class="component-viewer-header-expanded-bar-section-list">
- {{#each state.rules}}
- {{#unless ../../state.removed}}
- <li><a class="item js-filter-rule" data-rule="{{key}}" title="{{name}}">
- <span>{{name}}</span>
- <span class="number">{{count}}</span>
- <i class="icon-chevron-right"></i>
- </a></li>
- {{else}}
- <li><span class="item">
- <span>{{name}}</span>
- <span class="number">{{count}}</span>
- </span></li>
- {{/unless}}
- {{/each}}
- </ul>
- </div>
-{{/ifNotEmpty}}
-
-{{#if hasIssues}}
- <div class="component-viewer-header-expanded-bar-section component-viewer-header-expanded-bar-section-actions">
- <div class="component-viewer-header-expanded-bar-section-title"> </div>
- <ul class="component-viewer-header-expanded-bar-section-list">
- {{#if state.canBulkChange}}
- <li><a class="link-action js-issues-bulk-change">
- <span><i class="icon-bulk-change"></i> {{t 'bulk_change'}}</span>
- </a></li>
- {{/if}}
- </ul>
- </div>
-{{/if}}
+++ /dev/null
-<div class="component-viewer-header-time-changes">
- <a class="highlighted-link js-scm-time-changes">
- {{#if period}}Δ {{period.label}}{{else}}<i class="icon-period"></i> {{t 'component_viewer.time_changes'}}{{/if}}
- </a>
-</div>
\ No newline at end of file
+++ /dev/null
-{{#with component.measures}}
- <span class="nowrap">
- {{#any test_success_density test_failures test_errors test_execution_time}}
- <div class="component-viewer-header-expanded-bar-section">
- <div class="component-viewer-header-expanded-bar-section-title">
- {{t 'component_viewer.measure_section.tests'}}
- </div>
- <ul class="component-viewer-header-expanded-bar-section-list">
- {{#if test_success_density}}
- <li><span class="item" data-metric="test_success_density">
- <span class="label">{{t 'metric.test_success_density.short_name'}}</span>
- <span class="number">{{test_success_density}}</span>
- </span></li>
- {{/if}}
- {{#if skipped_tests}}
- <li><span class="item" data-metric="skipped_tests">
- <span class="label">{{t 'metric.skipped_tests.short_name'}}</span>
- <span class="number">{{skipped_tests}}</span>
- </span></li>
- {{/if}}
- {{#if test_failures}}
- <li><span class="item" data-metric="test_failures">
- <span class="label">{{t 'metric.test_failures.short_name'}}</span>
- <span class="number">{{test_failures}}</span>
- </span></li>
- {{/if}}
- {{#if test_errors}}
- <li><span class="item" data-metric="test_errors">
- <span class="label">{{t 'metric.test_errors.short_name'}}</span>
- <span class="number">{{test_errors}}</span>
- </span></li>
- {{/if}}
- {{#if test_execution_time}}
- <li><span class="item" data-metric="test_execution_time">
- <span class="label">{{t 'metric.test_execution_time.short_name'}}</span>
- <span class="number">{{test_execution_time}}</span>
- </span></li>
- {{/if}}
- </ul>
- </div>
- {{/any}}
- </span>
-{{/with}}
-
-<div class="component-viewer-header-expanded-bar-section large">
- <div class="component-viewer-header-expanded-bar-section-title justify">
- <span class="ib">{{t 'component_viewer.measure_section.test_names'}}</span>
- {{#if hasCoveragePerTestData}}
- <span class="ib">{{t 'component_viewer.covered_lines'}}</span>
- {{/if}}
- </div>
- <ul class="component-viewer-header-expanded-bar-section-list">
- {{#each tests}}
- {{#eq status 'SKIPPED'}}
- <li><span class="item" title="{{name}}" data-status="{{status}}">
- <span class="label">{{testStatusIcon status}}
- <span class="duration subtitle"></span>
- {{name}}</span>
- </span></li>
- {{else}}
- {{#ifTestData this}}
- <li><a class="item js-unit-test" data-name="{{name}}" data-status="{{status}}" title="{{name}}">
- <span class="label">{{testStatusIcon status}}
- <span class="duration subtitle">{{durationInMs}}ms</span>
- {{name}}</span>
- {{#if coveredLines}}
- <span class="number">{{coveredLines}}</span>
- {{/if}}
- <i class="icon-chevron-right"></i>
- </a></li>
- {{else}}
- <li><span class="item" data-name="{{name}}" data-status="{{status}}" title="{{name}}">
- <span class="label">{{testStatusIcon status}}
- <span class="duration subtitle">{{durationInMs}}ms</span> {{name}}</span>
- </span></li>
- {{/ifTestData}}
- {{/eq}}
- {{/each}}
- </ul>
- <div class="component-viewer-header-expanded-bar-section-title">
- <span>{{t 'component_viewer.tests.sort_by'}}</span>
- <a class="js-sort-tests-name underlined-link">{{t 'component_viewer.tests.test_name'}}</a>
- <a class="js-sort-tests-duration underlined-link">{{t 'component_viewer.tests.duration'}}</a>
- </div>
-</div>
+++ /dev/null
-<div class="component-viewer-header"></div>
-<div class="component-viewer-workspace"></div>
-<div class="component-viewer-source"></div>
\ No newline at end of file
+++ /dev/null
-<div class="bubble-popup-container">
- <div class="bubble-popup-title">{{t 'component_viewer.line_actions'}}</div>
-
- <div class="bubble-popup-section">
- <a href="#" class="js-get-permalink link-action">{{t 'component_viewer.get_permalink'}}</a>
- </div>
-
- {{#if state.canCreateManualIssue}}
- <div class="bubble-popup-section">
- <a href="#" class="js-add-manual-issue link-action">{{t 'component_viewer.add_manual_issue'}}</a>
- </div>
- {{/if}}
-</div>
-
-<div class="bubble-popup-arrow"></div>
+++ /dev/null
-<a class="js-new-window underlined-link">{{t 'component_viewer.new_window'}}</a>
-<br>
-<a class="js-full-source underlined-link">{{t 'component_viewer.show_full_source'}}</a>
-<br>
-<a class="js-raw-source underlined-link">{{t 'component_viewer.show_raw_source'}}</a>
-
-{{#each state.extensions}}
- <br>
- <a class="js-extension underlined-link" data-key="{{this.[0]}}">{{this.[1]}}</a>
-{{/each}}
\ No newline at end of file
+++ /dev/null
-{{#if state.sourceSecurity}}
-
- <p>{{t 'code_viewer.no_source_code_displayed_due_to_security'}}</p>
-
-{{else}}
-
- {{#if state.duplicationsInDeletedFiles}}
- <p class="marginbottom10">{{t 'duplications.dups_found_on_deleted_resource'}}</p>
- {{/if}}
-
- {{#if issuesLimitReached}}
- <p class="message-alert marginbottom10">{{tp 'component_viewer.issues_limit_reached' issuesLimit}}</p>
- {{/if}}
-
- <table class="code">
- {{#if showZeroLine}}
- <tr class="row row-hidden" data-line-number="0" id="{{uid}}-0">
- {{#if settings.coverage}}
- <td class="stat coverage-tests"></td>
- <td class="stat coverage-conditions"></td>
- {{/if}}
- {{#if settings.duplications}}
- <td class="stat"></td>
- {{/if}}
- {{#if settings.scm}}
- <td class="stat"></td>
- {{/if}}
- <td class="stat lid"></td>
- <td class="line"></td>
- </tr>
- {{/if}}
-
- {{#each source}}
- {{#if show}}
- <tr class="row" data-line-number="{{lineNumber}}" id="{{../../uid}}-{{lineNumber}}">
-
- {{#if ../../settings.scm}}
- <td class="stat {{#if scm}}scm{{/if}}">
- {{#if scm}}
- {{#ifSCMChanged ../../../../source ../../../lineNumber}}
- <span class="scm-date">{{scm.date}}</span>
- <span class="scm-author" title="{{scm.author}}">{{scm.author}}</span>
- {{/ifSCMChanged}}
- {{/if}}
- </td>
- {{/if}}
-
- {{#if ../../settings.duplications}}
- <td class="stat duplications">
- {{#each duplications}}
- <span class="duplication {{#if this}}duplication-exists{{/if}}" data-index="{{this}}"></span>
- {{/each}}
- </td>
- {{/if}}
-
- {{#if ../../settings.coverage}}
- <td class="stat {{#if coverage}}coverage-{{#if coverage.covered}}green{{else}}red{{/if}}{{/if}}">
- {{#if coverage}}
- <span class="coverage-tests" title="{{tp 'coverage_viewer.line_covered_by_x_tests' coverage.testCases}}">
- {{coverage.testCases}}
- </span>
- {{/if}}
- </td>
-
- <td class="stat {{#if coverage}}{{#if coverage.branchCoverageStatus}}coverage-{{coverage.branchCoverageStatus}}{{/if}}{{/if}}">
- {{#if coverage}}
- {{#if coverage.branches}}
- <span class="coverage-branches" title="{{tp 'coverage_viewer.x_covered_branches' coverage.coveredBranches}}">
- {{coverage.coveredBranches}}/{{coverage.branches}}
- </span>
- {{/if}}
- {{/if}}
- </td>
- {{/if}}
-
- <td class="stat lid js-line-actions" title="{{t 'component_viewer.line_actions'}}">{{lineNumber}}</td>
-
- <td class="line"><pre>{{{code}}}</pre></td>
- </tr>
- {{/if}}
- {{/each}}
- </table>
-
-{{/if}}
+++ /dev/null
-<div class="bubble-popup-title">Time Changes</div>
-
-<ul class="bubble-popup-list">
- {{#each periods}}
- <li><a class="link-action" data-period="{{key}}">{{#if key}}{{../../prefix}}{{/if}} {{label}}</a></li>
- {{/each}}
-</ul>
-
-<div class="bubble-popup-arrow"></div>
+++ /dev/null
-<div class="component-viewer-workspace-header">
- <div class="component-viewer-workspace-title"
- title="{{t 'component_viewer.workspace.tooltip'}}">{{t 'component_viewer.workspace'}}</div>
- <button class="button-clean component-viewer-workspace-toggle js-toggle-workspace"
- title="{{#if settings.workspace}}{{t 'component_viewer.workspace.hide_workspace'}}{{else}}{{t 'component_viewer.workspace.show_workspace'}}{{/if}}">
- {{#if settings.workspace}}
- <i class="icon-double-chevron-left"></i>
- {{else}}
- <i class="icon-double-chevron-right"></i>
- {{/if}}
- </button>
-</div>
-
-<ul class="component-viewer-workspace-list">
- {{#eachReverse workspace}}
- <li class="component-viewer-workspace-item {{#if active}}active{{/if}}">
- {{qualifierIcon component.q}}
- <a class="link-action" data-key="{{component.key}}">{{component.name}}</a>
- {{#if component.dir}}
- <div class="text-ellipsis subtitle">{{component.dir}}</div>
- {{/if}}
- {{#if options}}
- <div class="component-viewer-workspace-transition">{{t 'component_viewer.transition' ../transition}}</div>
- <ul class="component-viewer-workspace-options">
- {{#each options}}
- <li class="component-viewer-workspace-option text-ellipsis {{#if active}}active{{/if}}" title="{{name}}">
- <a class="link-action" data-workspace-key="{{../component.key}}" data-key="{{key}}">{{name}}</a>
- {{#if subname}}<div class="text-ellipsis subtitle" title="{{subname}}">{{subname}}</div>{{/if}}
- </li>
- {{/each}}
- </ul>
- {{/if}}
- </li>
- {{/eachReverse}}
-</ul>
\ No newline at end of file
--- /dev/null
+<table class="width100">
+ <tr>
+ <td>
+ <input type="text" id="issue-assignee-select">
+ <input id="issue-assign-submit" type="submit" value="{{t 'issue.assign.submit'}}">
+ <a id="issue-assign-cancel" class="action">{{t 'cancel'}}</a>
+ </td>
+ </tr>
+</table>
\ No newline at end of file
--- /dev/null
+<table class="spaced">
+ <tbody>
+ <tr>
+ <td class="thin left top" nowrap>{{dt issue.creationDate}}</td>
+ <td class="thin left top" nowrap></td>
+ <td class="left top">{{t 'created'}}</td>
+ </tr>
+ {{#each items}}
+ <tr>
+ <td class="thin left top" nowrap>{{dt creationDate}}</td>
+ <td class="thin left top" nowrap>{{userName}}</td>
+ <td class="left top">
+ {{#each diffs}}
+ {{changelog this}}<br>
+ {{/each}}
+ </td>
+ </tr>
+ {{/each}}
+ </tbody>
+</table>
\ No newline at end of file
--- /dev/null
+<table class="width100">
+ <tr>
+ <td style="vertical-align:top" colspan="2">
+ <textarea id="issue-comment-text" rows="4" name="text" style="width: 100%">{{show raw markdown}}</textarea>
+ </td>
+ </tr>
+ <tr>
+ <td style="padding-top: 5px">
+ <input id="issue-comment-submit" type="submit"
+ value="{{#if id}}{{t 'save'}}{{else}}{{t 'issue.comment.submit'}}{{/if}}" disabled>
+ <a id="issue-comment-cancel" class="action">{{t 'cancel'}}</a>
+ </td>
+ <td align="right">
+ {{> '_markdown-tips' }}
+ </td>
+ </tr>
+</table>
\ No newline at end of file
--- /dev/null
+<div class="code-issue code-issue-collapsed" data-issue-key="{{key}}" data-issue-component="{{component}}" data-issue-rule="{{rule}}">
+ <div class="code-issue-name code-issue-toggle">
+ <div class="code-issue-name-rule">
+ {{severityIcon severity}} <span class="rulename">{{message}}</span>
+ </div>
+
+ <div class="code-issue-permalink">
+ <a target="_blank" href="{{permalink}}">
+ <i class="icon-link"></i>
+ </a>
+ </div>
+ </div>
+
+
+ <ul class="code-issue-actions code-issue-list">
+ {{#inArray actions "comment"}}
+ <li>
+ <a id="issue-comment" class="link-action">{{t 'issue.comment.formlink' }}</a>
+ </li>
+ {{/inArray}}
+
+
+ <li>
+ {{statusIcon status}}{{t 'issue.status' status}}
+ {{#if resolution}}({{t 'issue.resolution' resolution}}){{/if}}
+
+ {{#ifNotEmpty transitions}}
+ {{#each transitions}}
+ <a class="link-action issue-transition spacer-left" data-transition="{{this}}">{{t 'issue.transition' this}}</a>
+ {{/each}}
+ {{/ifNotEmpty}}
+ </li>
+
+
+ {{#inArray actions "assign"}}
+ <li>
+ {{#if assigneeName}}
+ <a id="issue-assign" class="link-action">{{t 'assigned_to'}}</a> {{assigneeName}}</li>
+ {{else}}
+ <a id="issue-assign" class="link-action">{{t 'issue.assign.formlink' }}</a>
+ {{#inArray actions "assign_to_me"}}
+ [<a id="issue-assign-to-me" class="link-action">{{t 'issue.assign.to_me' }}</a>]
+ {{/inArray}}
+ {{/if}}
+ </li>
+ {{else}}
+ {{#if assigneeName}}
+ <li>{{t 'assigned_to'}} <strong>{{assigneeName}}</strong></li>
+ {{/if}}
+ {{/inArray}}
+
+
+ {{#inArray actions "plan"}}
+ <li>
+ {{#if actionPlanName}}
+ <a id="issue-plan" class="link-action">{{t 'issue.planned_for'}}</a> {{actionPlanName}}
+ {{else}}
+ <a id="issue-plan" class="link-action">{{t 'issue.do_plan'}}</a>
+ {{/if}}
+ </li>
+ {{else}}
+ {{#if actionPlanName}}
+ <li>{{t 'issue.planned_for'}} <strong>{{actionPlanName}}</strong></li>
+ {{/if}}
+ {{/inArray}}
+
+
+ {{#ifHasExtraActions actions}}
+ <li>
+ <div class="dropdown">
+ <a class="link-action link-more" onclick="showDropdownMenuOnElement($j(this).next('.dropdown-menu')); return false;">{{t 'more_actions'}}</a>
+ <ul style="display: none" class="dropdown-menu">
+ {{#inArray actions "set_severity"}}
+ <li>
+ <a id="issue-set-severity" class="link-action spacer-right">{{t "issue.set_severity"}}</a>
+ </li>
+ {{/inArray}}
+ {{#pluginActions actions}}
+ <li>
+ <a class="link-action spacer-right issue-action" data-action="{{this}}">{{t "issue.action" this "formlink"}}</a>
+ </li>
+ {{/pluginActions}}
+ </ul>
+ </div>
+ </li>
+ {{else}}
+ {{#inArray actions "set_severity"}}
+ <li>
+ <a id="issue-set-severity" class="link-action">{{t "issue.set_severity"}}</a>
+ </li>
+ {{/inArray}}
+ {{/ifHasExtraActions}}
+
+ {{#if debt}}
+ <li>{{t 'issue.technical_debt_short'}}: {{debt}}</li>
+ {{/if}}
+
+ {{#if reporterName}}<li>{{t 'reporter'}}: {{reporterName}}</li>{{/if}}
+ {{#if author}}<li>{{t 'author'}}: {{author}}</li>{{/if}}
+ </ul>
+
+ <div class="code-issue-form" style="display: none;"></div>
+
+
+ <div class="code-issue-details">
+ <ul class="code-issue-tabs">
+ <li>
+ <a class="js-tab-link underlined-link" href="#tab-issue-rule">{{t 'rule'}}</a>
+ </li>
+ <li>
+ <a class="js-tab-link underlined-link" href="#tab-issue-changelog">{{t 'changelog'}}</a>
+ </li>
+ </ul>
+
+ <div id="tab-issue-rule" class="js-tab">
+ <div class="rule-desc"></div>
+ </div>
+
+ <div id="tab-issue-changelog" class="js-tab"></div>
+ </div>
+
+
+ <div class="code-issue-comments">
+ {{#each comments}}
+ <div class="code-issue-comment" data-comment-key="{{key}}">
+ <h4>
+ <i class="icon-comment"></i>
+ <b>{{userName}}</b>
+ ({{fromNow createdAt}})
+
+ {{#if updatable}}
+
+ <a class="link-action issue-comment-edit">{{t 'edit'}}</a>
+ <a class="link-action link-red spacer-right issue-comment-delete"
+ data-confirm-msg="{{t 'issue.comment.delete_confirm_message'}}">{{t 'delete'}}</a>
+ {{/if}}
+ </h4>
+ <div class="markdown">{{{show html htmlText}}}</div>
+ </div>
+ {{/each}}
+ </div>
+</div>
--- /dev/null
+<form action="" class="js-manual-issue-form code-issue-create-form">
+ {{! no manual rules }}
+ {{! <div class="warning" style="margin: 10px"> }}
+ {{! <% if is_admin %> }}
+ {{! <%= message('issue.manual.no_rules.admin') -%> }}
+ {{! <a href="<%= ApplicationController.root_context -%>/manual_rules/index"><%= message('manage') -%></a> }}
+ {{! <% else %> }}
+ {{! <%= message('issue.manual.no_rules.non_admin') -%> }}
+ {{! <% end %> }}
+ {{! <%= link_to_function message('cancel'), 'closeCreateIssueForm(this)' -%> }}
+ {{! </div> }}
+
+ <input type="hidden" name="line" value="{{line}}">
+ <input type="hidden" name="component" value="{{component}}">
+
+ <div class="code-issue-name">
+ <select name="rule">
+ {{#each rules}}
+ <option value="{{key}}">{{name}}</option>
+ {{/each}}
+ </select>
+ </div>
+
+ <div class="code-issue-msg">
+ <table class="width100">
+ <tr>
+ <td>
+ <textarea rows="4" name="message" class="width100 marginbottom5"></textarea>
+ </td>
+ </tr>
+ <tr>
+ <td class="js-submit">
+ <input type="submit" value="{{t 'create'}}">
+ <a class="js-cancel" href="#">{{t 'cancel'}}</a>
+ </td>
+ <td class="js-spinner" style="display: none;">
+ <i class="spinner"></i>
+ </td>
+ </tr>
+ </table>
+ <div class="code-issue-errors error hidden"></div>
+ </div>
+
+</form>
--- /dev/null
+{{#if items}}
+ <select id="issue-detail-plan-select">
+ {{#if issue.actionPlan}}
+ <option value="#unplan">{{t 'issue.unplan.submit'}}</option>
+ {{/if}}
+ {{#each items}}
+ {{#notEq this.status 'CLOSED'}}
+ <option value="{{this.key}}">{{this.name}} {{#if this.fDeadLine}}({{this.fDeadLine}}){{/if}}</option>
+ {{/notEq}}
+ {{/each}}
+ </select>
+ <input id="issue-plan-submit" type="submit" value="{{t 'issue.plan.submit'}}">
+{{else}}
+ <span class="error">{{t 'issue.plan.error.plan_must_be_created_first'}}</span>
+{{/if}}
+<a id="issue-plan-cancel" class="action">{{t 'cancel'}}</a>
--- /dev/null
+<div class="rule-desc">
+ <h1 class="marginbottom10">{{name}}</h1>
+ <div class="marginbottom10">{{{htmlDesc}}}</div>
+ {{#if htmlNote}}<div class="marginbottom10">{{{htmlNote}}}</div>{{/if}}
+</div>
+
+<ul class="note code-issue-bar">
+ <li>{{key}}</li>
+ {{#all debtCharName debtSubCharName}}
+ <li>{{debtCharName}} > {{debtSubCharName}}</li>
+ {{else}}
+ <li>{{t 'issue.technical_debt_deleted'}}</li>
+ {{/all}}
+</ul>
--- /dev/null
+<table class="width100">
+ <tr>
+ <td style="vertical-align:top">
+ <select id="issue-set-severity-select" autofocus>
+ <option class="sev_BLOCKER" value="BLOCKER">{{t 'severity.BLOCKER'}}</option>
+ <option class="sev_CRITICAL" value="CRITICAL">{{t 'severity.CRITICAL'}}</option>
+ <option class="sev_MAJOR" value="MAJOR" selected>{{t 'severity.MAJOR'}}</option>
+ <option class="sev_MINOR" value="MINOR">{{t 'severity.MINOR'}}</option>
+ <option class="sev_INFO" value="INFO">{{t 'severity.INFO'}}</option>
+ </select>
+
+ <input id="issue-set-severity-submit" type="submit" value="{{t 'issue.set_severity.submit'}}">
+ <a id="issue-set-severity-cancel" class="action">{{t 'cancel'}}</a>
+ </td>
+ </tr>
+</table>
\ No newline at end of file
+++ /dev/null
-<table class="width100">
- <tr>
- <td>
- <input type="text" id="issue-assignee-select">
- <input id="issue-assign-submit" type="submit" value="{{t 'issue.assign.submit'}}">
- <a id="issue-assign-cancel" class="action">{{t 'cancel'}}</a>
- </td>
- </tr>
-</table>
\ No newline at end of file
+++ /dev/null
-<table class="spaced">
- <tbody>
- <tr>
- <td class="thin left top" nowrap>{{dt issue.creationDate}}</td>
- <td class="thin left top" nowrap></td>
- <td class="left top">{{t 'created'}}</td>
- </tr>
- {{#each items}}
- <tr>
- <td class="thin left top" nowrap>{{dt creationDate}}</td>
- <td class="thin left top" nowrap>{{userName}}</td>
- <td class="left top">
- {{#each diffs}}
- {{changelog this}}<br>
- {{/each}}
- </td>
- </tr>
- {{/each}}
- </tbody>
-</table>
\ No newline at end of file
+++ /dev/null
-<table class="width100">
- <tr>
- <td style="vertical-align:top" colspan="2">
- <textarea id="issue-comment-text" rows="4" name="text" style="width: 100%">{{show raw markdown}}</textarea>
- </td>
- </tr>
- <tr>
- <td style="padding-top: 5px">
- <input id="issue-comment-submit" type="submit"
- value="{{#if id}}{{t 'save'}}{{else}}{{t 'issue.comment.submit'}}{{/if}}" disabled>
- <a id="issue-comment-cancel" class="action">{{t 'cancel'}}</a>
- </td>
- <td align="right">
- {{> '_markdown-tips' }}
- </td>
- </tr>
-</table>
\ No newline at end of file
--- /dev/null
+<div class="navigator-filters-list"></div>
+<button class="navigator-filter-submit">{{t 'search_verb'}}</button>
--- /dev/null
+<div class="line line-small">
+ {{severityIcon severity}}{{translate "severities" severity}}
+ {{statusIcon status}}{{translate "statuses" status}}
+ {{#if resolution}}({{translate "resolutions" resolution}}){{/if}}
+
+ <div class="line-right">
+ {{fUpdateAge}}
+ </div>
+</div>
+
+<div class="line line-nowrap" title="{{message}}">
+ {{message}}
+</div>
+
+<div class="line">
+ {{#unless singleProject}}
+ <div class="subtitle line-nowrap">{{default projectLongName projectName}}</div>
+ {{/unless}}
+ <div class="subtitle line-nowrap">{{componentLongName}}</div>
+</div>
+++ /dev/null
-<div class="code-issue code-issue-collapsed" data-issue-key="{{key}}" data-issue-component="{{component}}" data-issue-rule="{{rule}}">
- <div class="code-issue-name code-issue-toggle">
- <div class="code-issue-name-rule">
- {{severityIcon severity}} <span class="rulename">{{message}}</span>
- </div>
-
- <div class="code-issue-permalink">
- <a target="_blank" href="{{permalink}}">
- <i class="icon-link"></i>
- </a>
- </div>
- </div>
-
-
- <ul class="code-issue-actions code-issue-list">
- {{#inArray actions "comment"}}
- <li>
- <a id="issue-comment" class="link-action">{{t 'issue.comment.formlink' }}</a>
- </li>
- {{/inArray}}
-
-
- <li>
- {{statusIcon status}}{{t 'issue.status' status}}
- {{#if resolution}}({{t 'issue.resolution' resolution}}){{/if}}
-
- {{#ifNotEmpty transitions}}
- {{#each transitions}}
- <a class="link-action issue-transition spacer-left" data-transition="{{this}}">{{t 'issue.transition' this}}</a>
- {{/each}}
- {{/ifNotEmpty}}
- </li>
-
-
- {{#inArray actions "assign"}}
- <li>
- {{#if assigneeName}}
- <a id="issue-assign" class="link-action">{{t 'assigned_to'}}</a> {{assigneeName}}</li>
- {{else}}
- <a id="issue-assign" class="link-action">{{t 'issue.assign.formlink' }}</a>
- {{#inArray actions "assign_to_me"}}
- [<a id="issue-assign-to-me" class="link-action">{{t 'issue.assign.to_me' }}</a>]
- {{/inArray}}
- {{/if}}
- </li>
- {{else}}
- {{#if assigneeName}}
- <li>{{t 'assigned_to'}} <strong>{{assigneeName}}</strong></li>
- {{/if}}
- {{/inArray}}
-
-
- {{#inArray actions "plan"}}
- <li>
- {{#if actionPlanName}}
- <a id="issue-plan" class="link-action">{{t 'issue.planned_for'}}</a> {{actionPlanName}}
- {{else}}
- <a id="issue-plan" class="link-action">{{t 'issue.do_plan'}}</a>
- {{/if}}
- </li>
- {{else}}
- {{#if actionPlanName}}
- <li>{{t 'issue.planned_for'}} <strong>{{actionPlanName}}</strong></li>
- {{/if}}
- {{/inArray}}
-
-
- {{#ifHasExtraActions actions}}
- <li>
- <div class="dropdown">
- <a class="link-action link-more" onclick="showDropdownMenuOnElement($j(this).next('.dropdown-menu')); return false;">{{t 'more_actions'}}</a>
- <ul style="display: none" class="dropdown-menu">
- {{#inArray actions "set_severity"}}
- <li>
- <a id="issue-set-severity" class="link-action spacer-right">{{t "issue.set_severity"}}</a>
- </li>
- {{/inArray}}
- {{#pluginActions actions}}
- <li>
- <a class="link-action spacer-right issue-action" data-action="{{this}}">{{t "issue.action" this "formlink"}}</a>
- </li>
- {{/pluginActions}}
- </ul>
- </div>
- </li>
- {{else}}
- {{#inArray actions "set_severity"}}
- <li>
- <a id="issue-set-severity" class="link-action">{{t "issue.set_severity"}}</a>
- </li>
- {{/inArray}}
- {{/ifHasExtraActions}}
-
- {{#if debt}}
- <li>{{t 'issue.technical_debt_short'}}: {{debt}}</li>
- {{/if}}
-
- {{#if reporterName}}<li>{{t 'reporter'}}: {{reporterName}}</li>{{/if}}
- {{#if author}}<li>{{t 'author'}}: {{author}}</li>{{/if}}
- </ul>
-
- <div class="code-issue-form" style="display: none;"></div>
-
-
- <div class="code-issue-details">
- <ul class="code-issue-tabs">
- <li>
- <a class="js-tab-link underlined-link" href="#tab-issue-rule">{{t 'rule'}}</a>
- </li>
- <li>
- <a class="js-tab-link underlined-link" href="#tab-issue-changelog">{{t 'changelog'}}</a>
- </li>
- </ul>
-
- <div id="tab-issue-rule" class="js-tab">
- <div class="rule-desc"></div>
- </div>
-
- <div id="tab-issue-changelog" class="js-tab"></div>
- </div>
-
-
- <div class="code-issue-comments">
- {{#each comments}}
- <div class="code-issue-comment" data-comment-key="{{key}}">
- <h4>
- <i class="icon-comment"></i>
- <b>{{userName}}</b>
- ({{fromNow createdAt}})
-
- {{#if updatable}}
-
- <a class="link-action issue-comment-edit">{{t 'edit'}}</a>
- <a class="link-action link-red spacer-right issue-comment-delete"
- data-confirm-msg="{{t 'issue.comment.delete_confirm_message'}}">{{t 'delete'}}</a>
- {{/if}}
- </h4>
- <div class="markdown">{{{show html htmlText}}}</div>
- </div>
- {{/each}}
- </div>
-</div>
--- /dev/null
+{{#unless maxResultsReached}}
+ <div class="navigator-actions-order">
+ {{#if sorting}}
+ {{t 'issues.ordered_by'}} <strong class="navigator-actions-ordered-by">{{sorting.sortText}}</strong> {{#if sorting.asc}}<i class="icon-sort-asc"></i>{{else}}<i class="icon-sort-desc"></i>{{/if}}
+ {{else}}
+ Order
+ {{/if}}
+ </div>
+ <ul class="navigator-actions-order-choices">
+ <li data-sort="UPDATE_DATE" data-asc="true">{{t 'issues.sort.update_date'}} <i class="icon-sort-asc"></i></li>
+ <li data-sort="UPDATE_DATE" data-asc="false">{{t 'issues.sort.update_date'}} <i class="icon-sort-desc"></i></li>
+ <li data-sort="SEVERITY" data-asc="true">{{t 'issues.sort.severity'}} <i class="icon-sort-asc"></i></li>
+ <li data-sort="SEVERITY" data-asc="false">{{t 'issues.sort.severity'}} <i class="icon-sort-desc"></i></li>
+ <li data-sort="STATUS" data-asc="true">{{t 'issues.sort.status'}} <i class="icon-sort-asc"></i></li>
+ <li data-sort="STATUS" data-asc="false">{{t 'issues.sort.status'}} <i class="icon-sort-desc"></i></li>
+ </ul>
+{{/unless}}
+<div class="navigator-actions-total">
+ {{t 'issues.found'}}: <strong>{{paging.fTotal}}</strong>
+ {{#notEq paging.fTotal 0}}
+ {{#if appState.canBulkChange}}
+ <a href="{{bulkChangeUrl}}?{{query}}"
+ class="navigator-actions-bulk"
+ title="{{t 'bulk_change'}}"><i class="icon-bulk-change"></i></a>
+ {{/if}}
+ {{/notEq}}
+</div>
--- /dev/null
+<ul class="navigator-filter-select-list">
+ {{#if items}}
+ {{#each items}}
+ <li>
+ <label data-id="{{id}}">{{{name}}}</label>
+ </li>
+ {{/each}}
+ <li class="line"></li>
+ {{/if}}
+ <li class="manage">
+ <label id="manage-favorites">{{t 'manage'}}</label>
+ </li>
+</ul>
--- /dev/null
+<h1 class="navigator-header-title">
+ {{#if name}}
+ {{name}}
+ <span class="navigator-header-title-note">
+ {{#unless shared}}
+ [{{t 'issue_filter.private'}}]
+ {{else}}
+ {{#eq user currentUser}}
+ [{{t 'issue_filter.shared_with_all_users'}}]
+ {{else}}
+ {{#if user}}
+ [{{t 'issue_filter.shared'}}]
+ {{/if}}
+ {{/eq}}
+ {{/unless}}
+ </span>
+ {{else}}
+ {{t 'issues'}}
+ {{/if}}
+</h1>
+
+ <div class="navigator-header-actions button-group">
+ <button id="issues-new-search">{{t 'issue_filter.new_search'}}</button>
+
+ {{#if appState.canManageFilters}}
+ {{#if canModify}}
+ {{#if canSave}}<button id="issues-filter-save">{{t 'save'}}</button>{{/if}}
+ {{/if}}
+ {{#unless id}}<button id="issues-filter-save-as">{{t 'save_as'}}</button>{{/unless}}
+ {{#if id}}<button id="issues-filter-copy">{{t 'copy'}}</button>{{/if}}
+ {{#if canModify}}
+ {{#if id}}<button id="issues-filter-edit">{{t 'edit'}}</button>{{/if}}
+ {{/if}}
+ {{/if}}
+ </div>
+
+{{#if description}}
+ <div class="navigator-header-description">{{description}}</div>
+{{/if}}
--- /dev/null
+<ol class="navigator-results-list"></ol>
+<div class="navigator-results-loader">
+ <i class="spinner"></i>
+</div>
+++ /dev/null
-<form action="" class="js-manual-issue-form code-issue-create-form">
- {{! no manual rules }}
- {{! <div class="warning" style="margin: 10px"> }}
- {{! <% if is_admin %> }}
- {{! <%= message('issue.manual.no_rules.admin') -%> }}
- {{! <a href="<%= ApplicationController.root_context -%>/manual_rules/index"><%= message('manage') -%></a> }}
- {{! <% else %> }}
- {{! <%= message('issue.manual.no_rules.non_admin') -%> }}
- {{! <% end %> }}
- {{! <%= link_to_function message('cancel'), 'closeCreateIssueForm(this)' -%> }}
- {{! </div> }}
-
- <input type="hidden" name="line" value="{{line}}">
- <input type="hidden" name="component" value="{{component}}">
-
- <div class="code-issue-name">
- <select name="rule">
- {{#each rules}}
- <option value="{{key}}">{{name}}</option>
- {{/each}}
- </select>
- </div>
-
- <div class="code-issue-msg">
- <table class="width100">
- <tr>
- <td>
- <textarea rows="4" name="message" class="width100 marginbottom5"></textarea>
- </td>
- </tr>
- <tr>
- <td class="js-submit">
- <input type="submit" value="{{t 'create'}}">
- <a class="js-cancel" href="#">{{t 'cancel'}}</a>
- </td>
- <td class="js-spinner" style="display: none;">
- <i class="spinner"></i>
- </td>
- </tr>
- </table>
- <div class="code-issue-errors error hidden"></div>
- </div>
-
-</form>
--- /dev/null
+{{t 'issue_filter.no_issues'}}
+++ /dev/null
-{{#if items}}
- <select id="issue-detail-plan-select">
- {{#if issue.actionPlan}}
- <option value="#unplan">{{t 'issue.unplan.submit'}}</option>
- {{/if}}
- {{#each items}}
- {{#notEq this.status 'CLOSED'}}
- <option value="{{this.key}}">{{this.name}} {{#if this.fDeadLine}}({{this.fDeadLine}}){{/if}}</option>
- {{/notEq}}
- {{/each}}
- </select>
- <input id="issue-plan-submit" type="submit" value="{{t 'issue.plan.submit'}}">
-{{else}}
- <span class="error">{{t 'issue.plan.error.plan_must_be_created_first'}}</span>
-{{/if}}
-<a id="issue-plan-cancel" class="action">{{t 'cancel'}}</a>
+++ /dev/null
-<div class="rule-desc">
- <h1 class="marginbottom10">{{name}}</h1>
- <div class="marginbottom10">{{{htmlDesc}}}</div>
- {{#if htmlNote}}<div class="marginbottom10">{{{htmlNote}}}</div>{{/if}}
-</div>
-
-<ul class="note code-issue-bar">
- <li>{{key}}</li>
- {{#all debtCharName debtSubCharName}}
- <li>{{debtCharName}} > {{debtSubCharName}}</li>
- {{else}}
- <li>{{t 'issue.technical_debt_deleted'}}</li>
- {{/all}}
-</ul>
+++ /dev/null
-<table class="width100">
- <tr>
- <td style="vertical-align:top">
- <select id="issue-set-severity-select" autofocus>
- <option class="sev_BLOCKER" value="BLOCKER">{{t 'severity.BLOCKER'}}</option>
- <option class="sev_CRITICAL" value="CRITICAL">{{t 'severity.CRITICAL'}}</option>
- <option class="sev_MAJOR" value="MAJOR" selected>{{t 'severity.MAJOR'}}</option>
- <option class="sev_MINOR" value="MINOR">{{t 'severity.MINOR'}}</option>
- <option class="sev_INFO" value="INFO">{{t 'severity.INFO'}}</option>
- </select>
-
- <input id="issue-set-severity-submit" type="submit" value="{{t 'issue.set_severity.submit'}}">
- <a id="issue-set-severity-cancel" class="action">{{t 'cancel'}}</a>
- </td>
- </tr>
-</table>
\ No newline at end of file
--- /dev/null
+<div class="navigator-filter-search">
+ <input type="text">
+</div>
+<ul class="navigator-filter-select-list choices"></ul>
+<ul class="navigator-filter-select-list opposite"></ul>
--- /dev/null
+<div class="navigator-filter-details-inner"></div>
--- /dev/null
+<div class="navigator-filter-label">{{name}}</div>
+<div class="navigator-filter-value {{#if defaultValue}}default{{/if}}">{{value}}</div>
+{{#if optional}}
+ <div class="navigator-filter-disable">×</div>
+{{/if}}
--- /dev/null
+<div class="navigator-filter-label">{{name}}</div>
+{{#if optional}}
+ <div class="navigator-filter-disable">×</div>
+{{/if}}
--- /dev/null
+<li>
+ <label title="{{text}}" data-id="{{id}}">
+ <i class="icon-checkbox {{#if checked}}icon-checkbox-checked{{/if}} {{#unless multiple}}icon-checkbox-single{{/unless}}"></i>
+ {{#if icon}}<i class="icon-{{icon}}"></i>{{/if}}
+ <span>
+ {{text}}
+ {{#if category}}
+ <br>
+ <span class="subtitle">{{category}}</span>
+ {{/if}}
+ </span>
+ </label>
+</li>
--- /dev/null
+<ul class="navigator-filter-select-list choices"></ul>
+<ul class="navigator-filter-select-list opposite"></ul>
--- /dev/null
+<ul class="navigator-filter-select-list">
+ {{#ifNotEmpty choicesArray}}
+ {{#each choicesArray}}
+ <li>
+ <label data-id="{{k}}">{{v}}</label>
+ </li>
+ {{/each}}
+ <li class="line"></li>
+ {{/ifNotEmpty}}
+ <li class="manage">
+ <label id="manage-favorites">{{translate "manage" }}</label>
+ </li>
+</ul>
--- /dev/null
+<div class="navigator-filter-favorite-toggle" title="{{translate 'filtersList' }}"></div>
--- /dev/null
+<div class="navigator-filter-details-inner">
+ <select name="metric">
+ <option></option>
+ {{#each groupedMetrics}}
+ <optgroup label="{{domain}}">
+ {{#each metrics}}
+ <option value="{{name}}">{{short_name}}</option>
+ {{/each}}
+ </optgroup>
+ {{/each}}
+ </select>
+
+ <select name="period">
+ <option value="0">{{translate "value"}}</option>
+ {{#each periods}}
+ <option value="{{@key}}">{{this}}</option>
+ {{/each}}
+ </select>
+
+ <select name="op">
+ {{#each operations}}
+ <option value="{{@key}}">{{this}}</option>
+ {{/each}}
+ </select>
+
+ <input type="text" name="val">
+</div>
--- /dev/null
+<ul class="navigator-filter-select-list">
+ {{#each filters}}
+ <li>
+ <label data-id="{{id}}" {{#if inactive}}class="inactive"{{/if}} {{#if title}}title="{{title}}"{{/if}}>
+ {{name}}
+ </label>
+ </li>
+ {{/each}}
+</ul>
--- /dev/null
+{{t "moreCriteria"}}
--- /dev/null
+<div class="navigator-filter-details-inner">
+ <input class="navigator-filter-range-input" type="text" name="{{propertyFrom}}" placeholder="{{placeholder}}">
+ <label>{{translate "to"}}</label>
+ <input class="navigator-filter-range-input" type="text" name="{{propertyTo}}" placeholder="{{placeholder}}">
+</div>
--- /dev/null
+<div class="navigator-filter-details-inner">
+ <input type="text" name="{{property}}" value="{{value}}">
+</div>
});
Handlebars.registerHelper('componentViewerHeaderLink', function(value, label, cl, hash) {
- var name = '_header-link';
+ var name = '_cw-header-link';
if (value != null) {
var ps = Handlebars.partials;
if (typeof ps[name] !== 'function') {
});
Handlebars.registerHelper('componentViewerHeaderItem', function(value, label, hash) {
- var name = '_header-item';
+ var name = '_cw-header-item';
if (value != null) {
var ps = Handlebars.partials;
if (typeof ps[name] !== 'function') {
define(
[
- 'backbone', 'backbone.marionette',
- '../navigator/filters/filter-bar',
+ 'backbone',
+ 'backbone.marionette',
+ 'navigator/filters/filter-bar',
'navigator/filters/base-filters',
'navigator/filters/favorite-filters',
'navigator/filters/read-only-filters',
- 'component-viewer/main'
+ 'component-viewer/main',
+ 'templates/issues'
],
function (Backbone, Marionette, FilterBarView, BaseFilters, FavoriteFiltersModule, ReadOnlyFilterView,
- ComponentViewer) {
+ ComponentViewer, Templates) {
var AppState = Backbone.Model.extend({
var IssueView = Marionette.ItemView.extend({
- template: Handlebars.compile(jQuery('#issue-template').html() || ''),
+ template: Templates['issue-detail'],
tagName: 'li',
var NoIssuesView = Marionette.ItemView.extend({
tagName: 'li',
className: 'navigator-results-no-results',
- template: Handlebars.compile(jQuery('#no-issues-template').html() || '')
+ template: Templates['no-issues']
});
var IssuesView = Marionette.CompositeView.extend({
- template: Handlebars.compile(jQuery('#issues-template').html() || ''),
+ template: Templates['issues'],
itemViewContainer: '.navigator-results-list',
itemView: IssueView,
emptyView: NoIssuesView,
var IssuesActionsView = Marionette.ItemView.extend({
- template: Handlebars.compile(jQuery('#issues-actions-template').html() || ''),
+ template: Templates['issues-actions'],
collectionEvents: {
sorting: this.collection.sorting,
maxResultsReached: this.collection.maxResultsReached,
appState: window.SS.appState.toJSON(),
+ bulkChangeUrl: baseUrl + '/issues/bulk_change_form',
query: (Backbone.history.fragment || '').replace(/\|/g, '&')
});
}
var IssuesDetailsFavoriteFilterView = FavoriteFiltersModule.DetailsFavoriteFilterView.extend({
- template: Handlebars.compile(jQuery('#issues-details-favorite-filter-template').html() || ''),
+ template: Templates['issues-details-favorite-filter'],
applyFavorite: function (e) {
var IssuesFilterBarView = FilterBarView.extend({
+ template: Templates['filter-bar'],
collectionEvents: {
'change:enabled': 'changeEnabled'
var IssuesHeaderView = Marionette.ItemView.extend({
- template: Handlebars.compile(jQuery('#issues-header-template').html() || ''),
+ template: Templates['issues-header'],
modelEvents: {
requirejs(
[
'backbone', 'backbone.marionette',
- 'navigator/filters/filter-bar',
+ 'measures/measures-filter-bar',
'navigator/filters/base-filters',
'navigator/filters/checkbox-filters',
'navigator/filters/choice-filters',
--- /dev/null
+define(['navigator/filters/filter-bar', 'common/handlebars-extensions'], function (FilterBarView) {
+
+ return FilterBarView.extend({
+ template: getTemplate('#filter-bar-template')
+ });
+
+});
'backbone',
'navigator/filters/base-filters',
'navigator/filters/choice-filters',
+ 'templates/navigator',
'common/handlebars-extensions'
-], function (Backbone, BaseFilters, ChoiceFilters) {
+], function (Backbone, BaseFilters, ChoiceFilters, Templates) {
var PAGE_SIZE = 100;
var AjaxSelectDetailsFilterView = ChoiceFilters.DetailsChoiceFilterView.extend({
- template: getTemplate('#ajax-select-filter-template'),
+ template: Templates['ajax-select-filter'],
listTemplate: getTemplate('#choice-filter-template'),
searchKey: 's',
-define(['backbone', 'backbone.marionette', 'common/handlebars-extensions'], function (Backbone, Marionette) {
+define([
+ 'backbone',
+ 'backbone.marionette',
+ 'templates/navigator',
+ 'common/handlebars-extensions'
+], function (Backbone, Marionette, Templates) {
var Filter = Backbone.Model.extend({
var DetailsFilterView = Marionette.ItemView.extend({
- template: getTemplate('#base-details-filter-template'),
+ template: Templates['base-details-filter'],
className: 'navigator-filter-details',
var BaseFilterView = Marionette.ItemView.extend({
- template: getTemplate('#base-filter-template'),
+ template: Templates['base-filter'],
className: 'navigator-filter',
'backbone',
'backbone.marionette',
'navigator/filters/base-filters',
+ 'templates/navigator',
'common/handlebars-extensions'
-], function (Backbone, Marionette, BaseFilters) {
+], function (Backbone, Marionette, BaseFilters, Templates) {
return BaseFilters.BaseFilterView.extend({
- template: getTemplate('#checkbox-filter-template'),
+ template: Templates['checkbox-filter'],
className: 'navigator-filter navigator-filter-inline',
define([
'handlebars',
'navigator/filters/base-filters',
+ 'templates/navigator',
'common/handlebars-extensions'
-], function (Handlebars, BaseFilters) {
+], function (Handlebars, BaseFilters, Templates) {
var DetailsChoiceFilterView = BaseFilters.DetailsFilterView.extend({
- template: getTemplate('#choice-filter-template'),
- itemTemplate: getTemplate('#choice-filter-item-template'),
+ template: Templates['choice-filter'],
+ itemTemplate: Templates['choice-filter-item'],
events: function() {
'backbone.marionette',
'navigator/filters/base-filters',
'navigator/filters/choice-filters',
+ 'templates/navigator',
'common/handlebars-extensions'
-], function (Backbone, Marionette, BaseFilters, ChoiceFilters) {
+], function (Backbone, Marionette, BaseFilters, ChoiceFilters, Templates) {
var DetailsFavoriteFilterView = BaseFilters.DetailsFilterView.extend({
- template: getTemplate('#favorite-details-filter-template'),
+ template: Templates['favorite-details-filter'],
events: {
var FavoriteFilterView = ChoiceFilters.ChoiceFilterView.extend({
- template: getTemplate('#favorite-filter-template'),
+ template: Templates['favorite-filter'],
className: 'navigator-filter navigator-filter-favorite',
function (Marionette, BaseFilters) {
return Marionette.CompositeView.extend({
- template: getTemplate('#filter-bar-template'),
itemViewContainer: '.navigator-filters-list',
-define(['navigator/filters/base-filters', 'common/handlebars-extensions'], function (BaseFilters) {
+define([
+ 'navigator/filters/base-filters',
+ 'templates/navigator',
+ 'common/handlebars-extensions'
+], function (BaseFilters, Templates) {
var DetailsMetricFilterView = BaseFilters.DetailsFilterView.extend({
- template: getTemplate('#metric-filter-template'),
+ template: Templates['metric-filter'],
events: {
define([
'navigator/filters/base-filters',
'navigator/filters/choice-filters',
+ 'templates/navigator',
'common/handlebars-extensions'
-], function (BaseFilters, ChoiceFilters) {
+], function (BaseFilters, ChoiceFilters, Templates) {
var DetailsMoreCriteriaFilterView = ChoiceFilters.DetailsChoiceFilterView.extend({
- template: getTemplate('#more-criteria-details-filter-template'),
+ template: Templates['more-criteria-details-filter'],
events: {
var MoreCriteriaFilterView = ChoiceFilters.ChoiceFilterView.extend({
- template: getTemplate('#more-criteria-filter-template'),
+ template: Templates['more-criteria-filter'],
className: 'navigator-filter navigator-filter-more-criteria',
-define(['navigator/filters/base-filters', 'common/handlebars-extensions'], function (BaseFilters) {
+define([
+ 'navigator/filters/base-filters',
+ 'templates/navigator',
+ 'common/handlebars-extensions'
+], function (BaseFilters, Templates) {
var DetailsRangeFilterView = BaseFilters.DetailsFilterView.extend({
- template: getTemplate('#range-filter-template'),
+ template: Templates['range-filter'],
events: {
-define(['navigator/filters/base-filters', 'common/handlebars-extensions'], function (BaseFilters) {
+define([
+ 'navigator/filters/base-filters',
+ 'templates/navigator',
+ 'common/handlebars-extensions'
+], function (BaseFilters, Templates) {
var DetailsStringFilterView = BaseFilters.DetailsFilterView.extend({
- template: getTemplate('#string-filter-template'),
+ template: Templates['string-filter'],
events: {
<div id="coding-rules-page-loader" class="navigator-page-loader">
<i class="spinner"></i>
</div>
-
-
-<%= render :partial => '/navigator/filter_templates' -%>
\ No newline at end of file
</div>
</div>
-<%= render :partial => '/navigator/filter_templates' -%>
-<%= render :partial => '/issues/templates/filter_bar_template.hbs' -%>
-<%= render :partial => '/issues/templates/header.hbs' -%>
-<%= render :partial => '/issues/templates/issue.hbs' -%>
-<%= render :partial => '/issues/templates/issues_actions.hbs' -%>
-<%= render :partial => '/issues/templates/issues.hbs' -%>
-<%= render :partial => '/issues/templates/no_issues.hbs' -%>
-<%= render :partial => '/issues/templates/issues_details_favorite_filter.hbs' -%>
-<%= render :partial => '/issues/templates/issue_detail.hbs' -%>
-<%= render :partial => '/issues/templates/issue_detail_inner.hbs' -%>
-<%= render :partial => '/issues/templates/issue_detail_comment_form.hbs' -%>
-<%= render :partial => '/issues/templates/issue_detail_rule.hbs' -%>
-<%= render :partial => '/issues/templates/issue_detail_set_severity_form.hbs' -%>
-<%= render :partial => '/issues/templates/issue_detail_assign_form.hbs' -%>
-<%= render :partial => '/issues/templates/issue_detail_plan_form.hbs' -%>
<script>
window.SS = {};
+++ /dev/null
-<script id="filter-bar-template" type="text/x-handlebars-template">
- <div class="navigator-filters-list"></div>
- <button class="navigator-filter-submit"><%= message('search_verb') -%></button>
-</script>
+++ /dev/null
-<script id="issues-header-template" type="text/x-handlebars-template">
- <h1 class="navigator-header-title">
- {{#if name}}
- {{name}}
- <span class="navigator-header-title-note">
- {{#unless shared}}
- [<%= message 'issue_filter.private' -%>]
- {{else}}
- {{#eq user currentUser}}
- [<%= message 'issue_filter.shared_with_all_users' -%>]
- {{else}}
- {{#if user}}
- [<%= message 'issue_filter.shared' -%>]
- {{/if}}
- {{/eq}}
- {{/unless}}
- </span>
- {{else}}
- <%= message ('issues') -%>
- {{/if}}
- </h1>
-
- <div class="navigator-header-actions button-group">
- <button id="issues-new-search"><%= message ('issue_filter.new_search') -%></button>
-
- {{#if appState.canManageFilters}}
- {{#if canModify}}
- {{#if canSave}}<button id="issues-filter-save"><%= message('save') -%></button>{{/if}}
- {{/if}}
- {{#unless id}}<button id="issues-filter-save-as"><%= message('save_as') -%></button>{{/unless}}
- {{#if id}}<button id="issues-filter-copy"><%= message('copy') -%></button>{{/if}}
- {{#if canModify}}
- {{#if id}}<button id="issues-filter-edit"><%= message('edit') -%></button>{{/if}}
- {{/if}}
- {{/if}}
- </div>
-
- {{#if description}}
- <div class="navigator-header-description">{{description}}</div>
- {{/if}}
-</script>
+++ /dev/null
-<script id="issue-template" type="text/x-handlebars-template">
- <div class="line line-small">
- {{severityIcon severity}}{{translate "severities" severity}}
- {{statusIcon status}}{{translate "statuses" status}}
- {{#if resolution}}({{translate "resolutions" resolution}}){{/if}}
-
- <div class="line-right">
- {{fUpdateAge}}
- </div>
- </div>
-
- <div class="line line-nowrap" title="{{message}}">
- {{message}}
- </div>
-
- <div class="line">
- {{#unless singleProject}}
- <div class="subtitle line-nowrap">{{default projectLongName projectName}}</div>
- {{/unless}}
- <div class="subtitle line-nowrap">{{componentLongName}}</div>
- </div>
-</script>
+++ /dev/null
-<script id="issue-detail-template" type="text/x-handlebars-template">
- <div class="source_title">
- <div class="subtitle">{{projectName}} {{#if subProjectName}}/ {{subProjectName}}{{/if}}</div>
- <span class="h1">
- {{#if componentQualifier}}
- {{qualifierIcon componentQualifier}}
- {{/if}}
-
- {{#if componentLongName}}
- {{#if componentQualifier}}
- <a target="_blank" href="<%= ApplicationController.root_context -%>{{dashboardUrl component componentQualifier}}">{{componentLongName}}</a>
- {{else}}
- {{componentLongName}}
- {{/if}}
- {{else}}
- {{component}}
- {{/if}}
- </span>
- </div>
-
- {{#if source}}
- {{#unless line}}
- {{> detailInnerTemplate }}
- {{/unless}}
-
- <div class="source">
- <table id="sources_{{key}}" class="sources2 code" cellpadding="0" cellspacing="0">
- {{#sources source scm}}
- <tr class="row">
- <td class="scm {{#if scm}}revision{{/if}}" {{#if first}}style="border-top:none;"{{/if}}>
- <span class="date"><a>{{scm.date}}</a></span>
- <span class="author" title="{{scm.author}}">{{scm.author}}</span>
- </td>
- <td class="lid L{{lineNumber}}"><a>{{lineNumber}}</a></td>
- <td class="line {{#eq ../line lineNumber}}ko{{/eq}}"><pre>{{{code}}}</pre></td>
- </tr>
- {{#eq ../line lineNumber}}
- <tr>
- <td class="scm"></td>
- <td class="lid"></td>
- <td class="code-issues">{{> detailInnerTemplate ../..}}</td>
- </tr>
- {{/eq}}
- {{/sources}}
- </table>
- </div>
- {{else}}
- {{> detailInnerTemplate}}
- {{/if}}
-
-</script>
+++ /dev/null
-<script id="issue-detail-assign-form-template" type="text/x-handlebars-template">
- <table class="width100">
- <tr>
- <td>
- <input type="text" id="issue-assignee-select">
- <input id="issue-assign-submit" type="submit" value="<%= message('issue.assign.submit') -%>">
- <a id="issue-assign-cancel" class="action"><%= message('cancel') -%></a>
- </td>
- </tr>
- </table>
-</script>
+++ /dev/null
-<script id="issue-detail-comment-form-template" type="text/x-handlebars-template">
- <table class="width100">
- <tr>
- <td style="vertical-align:top" colspan="2">
- <textarea id="issue-comment-text" rows="4" name="text"style="width: 100%">{{raw}}</textarea>
- </td>
- </tr>
- <tr>
- <td style="padding-top: 5px">
- <input id="issue-comment-submit" type="submit" value="{{#if id}}<%= message('save') -%>{{else}}<%= message('issue.comment.submit') -%>{{/if}}" disabled>
- <a id="issue-comment-cancel" class="action"><%= message('cancel') -%></a>
- </td>
- <td align="right">
- <%= render :partial => 'markdown/tips' -%>
- </td>
- </tr>
- </table>
-</script>
+++ /dev/null
-<script id="issue-detail-inner-template" type="text/x-handlebars-template">
- <div class="code-issue code-issue-collapsed" data-issue-key="{{key}}" data-issue-component="{{component}}" data-issue-rule="{{rule}}">
- <div class="code-issue-name code-issue-toggle">
- <div class="code-issue-name-rule">
- {{severityIcon severity}} <span class="rulename">{{message}}</span>
- </div>
-
- <div class="code-issue-permalink">
- <a target="_blank" href="<%= ApplicationController.root_context -%>/issue/show/{{key}}?layout=false"><img src="<%= ApplicationController.root_context -%>/images/new-window-16.gif"></a>
- </div>
- </div>
-
-
- <ul class="code-issue-actions code-issue-list">
- {{#inArray actions "comment"}}
- <li>
- <a id="issue-comment" class="link-action">{{translate "actions.comment" }}</a>
- </li>
- {{/inArray}}
-
-
- <li>
- {{statusIcon status}}{{translate "statuses" status}}
- {{#if resolution}}({{translate "resolutions" resolution}}){{/if}}
-
- {{#ifNotEmpty transitions}}
- {{#withFirst transitions}}
- <a class="link-action issue-transition spacer-left" data-transition="{{this}}">{{translate "transitions" this}}</a>
- {{/withFirst}}
-
- {{#ifHasExtraTransitions transitions}}
- <div class="dropdown">
- <a class="link-action link-more" onclick="showDropdownMenuOnElement($j(this).next('.dropdown-menu')); return false;"></a>
- <ul style="display: none" class="dropdown-menu">
- {{#withoutFirst transitions}}
- <li>
- <a class="link-action issue-transition" data-transition="{{this}}">{{translate "transitions" this}}</a>
- </li>
- {{/withoutFirst}}
- </ul>
- </div>
-
- {{/ifHasExtraTransitions}}
- {{/ifNotEmpty}}
- </li>
-
-
- {{#inArray actions "assign"}}
- <li>
- {{#if assigneeName}}
- <a id="issue-assign" class="link-action"><%= message('assigned_to') -%></a> {{assigneeName}}</li>
- {{else}}
- <a id="issue-assign" class="link-action">{{translate "actions.assign" }}</a>
- {{#inArray actions "assign_to_me"}}
- [<a id="issue-assign-to-me" class="link-action">{{translate "actions.assign_to_me" }}</a>]
- {{/inArray}}
- {{/if}}
- </li>
- {{else}}
- {{#if assigneeName}}
- <li><%= message('assigned_to') -%> <strong>{{assigneeName}}</strong></li>
- {{/if}}
- {{/inArray}}
-
-
- {{#inArray actions "plan"}}
- <li>
- {{#if actionPlanName}}
- <a id="issue-plan" class="link-action"><%= message('issue.planned_for') -%></a> {{actionPlanName}}
- {{else}}
- <a id="issue-plan" class="link-action"><%= message('issue.do_plan') -%></a>
- {{/if}}
- </li>
- {{else}}
- {{#if actionPlanName}}
- <li><%= message('issue.planned_for') -%> <strong>{{actionPlanName}}</strong></li>
- {{/if}}
- {{/inArray}}
-
-
- {{#ifHasExtraActions actions}}
- <li>
- <div class="dropdown">
- <a class="link-action link-more" onclick="showDropdownMenuOnElement($j(this).next('.dropdown-menu')); return false;"><%= message('more_actions') -%></a>
- <ul style="display: none" class="dropdown-menu">
- {{#inArray actions "set_severity"}}
- <li>
- <a id="issue-set-severity" class="link-action spacer-right">{{translate "actions.set_severity"}}</a>
- </li>
- {{/inArray}}
- {{#pluginActions actions}}
- <li>
- <a class="link-action spacer-right issue-action" data-action="{{this}}">{{translate "actions" this}}</a>
- </li>
- {{/pluginActions}}
- </ul>
- </div>
- </li>
- {{/ifHasExtraActions}}
-
- {{#if debt}}
- <li><%= message('issue.technical_debt_short') -%>: {{debt}}</li>
- {{/if}}
-
- {{#if reporterName}}<li><%= message('reporter') -%>: {{reporterName}}</li>{{/if}}
- {{#if author}}<li><%= message('author') -%>: {{author}}</li>{{/if}}
- </ul>
-
- <div class="code-issue-form"></div>
-
-
- <div class="code-issue-details">
- <ul class="tabs">
- <li>
- <a href="#tab-issue-rule"><%= message('rule') -%></a>
- </li>
- <li>
- <a href="#tab-issue-changelog"><%= message('changelog') -%></a>
- </li>
- </ul>
-
- <div id="tab-issue-rule">
- <div class="rule-desc"></div>
- </div>
-
- <div id="tab-issue-changelog">
- <table class="spaced">
- <tbody>
- {{#each changelog}}
- <tr>
- <td class="thin left top" nowrap>{{fCreationDate}}</td>
- <td class="thin left top" nowrap>{{userName}}</td>
- <td class="left top">
- {{#each diffs}}
- {{this}}<br>
- {{/each}}
- </td>
- </tr>
- {{/each}}
- </tbody>
- </table>
- </div>
- </div>
-
-
- <div class="code-issue-comments">
- {{#each comments}}
- <div class="code-issue-comment" data-comment-key="{{key}}">
- <h4>
- <%= image_tag('reviews/comment.png') -%>
- <b>{{userName}}</b>
- ({{fCreatedAge}})
-
- {{#if updatable}}
- <%= image_tag 'sep12.png' -%>
- <a class="link-action issue-comment-edit"><%= message('edit') -%></a>
- <a class="link-action link-red spacer-right issue-comment-delete"
- data-confirm-msg="<%= h message('issue.comment.delete_confirm_message') -%>"><%= message('delete') -%></a>
- {{/if}}
- </h4>
- {{{html}}}
- </div>
- {{/each}}
- </div>
- </div>
-</script>
+++ /dev/null
-<script id="issue-detail-plan-form-template" type="text/x-handlebars-template">
- {{#if items}}
- <select id="issue-detail-plan-select">
- {{#if issue.actionPlan}}
- <option value="#unplan"><%= message('issue.unplan.submit') -%></option>
- {{/if}}
- {{#each items}}
- {{#notEq this.status 'CLOSED'}}
- <option value="{{this.key}}">{{this.name}} {{#if this.fDeadLine}}({{this.fDeadLine}}){{/if}}</option>
- {{/notEq}}
- {{/each}}
- </select>
- <input id="issue-plan-submit" type="submit" value="<%= message('issue.plan.submit') -%>">
- {{else}}
- <% if is_admin? %>
- <span class="error"><%= message('issue.plan.error.plan_must_be_created_first_for_admin') -%></span>
- <% else %>
- <span class="error"><%= message('issue.plan.error.plan_must_be_created_first_for_other') -%></span>
- <% end %>
- {{/if}}
- <a id="issue-plan-cancel" class="action"><%= message('cancel') -%></a>
-</script>
+++ /dev/null
-<script id="issue-detail-rule-template" type="text/x-handlebars-template">
- <h1 class="marginbottom10">{{name}}</h1>
- <div class="marginbottom10">{{{description}}}</div>
- <p class="note">
- <span class="spacer-right">{{key}}</span>
- <%= image_tag 'sep12.png', :class => 'spacer-right' -%>
- {{#all characteristic subCharacteristic}}{{characteristic}} > {{subCharacteristic}}{{else}}<%= message('issue.technical_debt_deleted') -%>{{/all}}
- </p>
-</script>
+++ /dev/null
-<script id="issue-detail-set-severity-form-template" type="text/x-handlebars-template">
- <table class="width100">
- <tr>
- <td style="vertical-align:top">
- <select id="issue-set-severity-select" autofocus>
- <% Severity::KEYS.each do |severity| %>
- <option class="sev_<%= severity -%>" value="<%= severity -%>" <%= 'selected' if severity==Severity::MAJOR -%>><%= message("severity.#{severity}") -%></option>
- <% end %>
- </select>
-
- <input id="issue-set-severity-submit" type="submit" value="<%= message('issue.set_severity.submit') -%>">
- <a id="issue-set-severity-cancel" class="action"><%= message('cancel') -%></a>
- </td>
- </tr>
- </table>
-</script>
+++ /dev/null
-<script id="issues-template" type="text/x-handlebars-template">
- <ol class="navigator-results-list"></ol>
- <div class="navigator-results-loader">
- <i class="spinner"></i>
- </div>
-</script>
+++ /dev/null
-<script id="issues-actions-template" type="text/x-handlebars-template">
- {{#unless maxResultsReached}}
- <div class="navigator-actions-order">
- {{#if sorting}}
- <%= message('issues.ordered_by') -%> <strong class="navigator-actions-ordered-by">{{sorting.sortText}}</strong> {{#if sorting.asc}}<i class="icon-sort-asc"></i>{{else}}<i class="icon-sort-desc"></i>{{/if}}
- {{else}}
- Order
- {{/if}}
- </div>
- <ul class="navigator-actions-order-choices">
- <li data-sort="UPDATE_DATE" data-asc="true"><%= message('issues.sort.update_date') -%> <i class="icon-sort-asc"></i></li>
- <li data-sort="UPDATE_DATE" data-asc="false"><%= message('issues.sort.update_date') -%> <i class="icon-sort-desc"></i></li>
- <li data-sort="SEVERITY" data-asc="true"><%= message('issues.sort.severity') -%> <i class="icon-sort-asc"></i></li>
- <li data-sort="SEVERITY" data-asc="false"><%= message('issues.sort.severity') -%> <i class="icon-sort-desc"></i></li>
- <li data-sort="STATUS" data-asc="true"><%= message('issues.sort.status') -%> <i class="icon-sort-asc"></i></li>
- <li data-sort="STATUS" data-asc="false"><%= message('issues.sort.status') -%> <i class="icon-sort-desc"></i></li>
- </ul>
- {{/unless}}
- <div class="navigator-actions-total">
- <%= message('issues.found') -%>: <strong>{{paging.fTotal}}</strong>
- {{#notEq paging.fTotal 0}}
- {{#if appState.canBulkChange}}
- <a href="<%= url_for params.merge({:action => 'bulk_change_form'}) -%>?{{query}}"
- class="navigator-actions-bulk"
- title="<%= message('bulk_change') -%>"><i class="icon-bulk-change"></i></a>
- {{/if}}
- {{/notEq}}
- </div>
-</script>
+++ /dev/null
-<script id="issues-details-favorite-filter-template" type="text/x-handlebars-template">
- <ul class="navigator-filter-select-list">
- {{#if items}}
- {{#each items}}
- <li>
- <label data-id="{{id}}">{{{name}}}</label>
- </li>
- {{/each}}
- <li class="line"></li>
- {{/if}}
- <li class="manage">
- <label id="manage-favorites"><%= message('manage') -%></label>
- </li>
- </ul>
-</script>
+++ /dev/null
-<script id="no-issues-template" type="text/x-handlebars-template">
- <%= message('issue_filter.no_issues') -%>
-</script>
</script>
-<%= render :partial => '/navigator/filter_templates' -%>
-
<script>
jQuery('html').addClass('navigator-page measures-page');
+++ /dev/null
-<%= render :partial => '/navigator/templates/base_filter_template.hbs' -%>
-<%= render :partial => '/navigator/templates/base_details_filter_template.hbs' -%>
-<%= render :partial => '/navigator/templates/choice_filter_template.hbs' -%>
-<%= render :partial => '/navigator/templates/choice_filter_item_template.hbs' -%>
-<%= render :partial => '/navigator/templates/ajax_select_filter_template.hbs' -%>
-<%= render :partial => '/navigator/templates/range_filter_template.hbs' -%>
-<%= render :partial => '/navigator/templates/checkbox_filter_template.hbs' -%>
-<%= render :partial => '/navigator/templates/string_filter_template.hbs' -%>
-<%= render :partial => '/navigator/templates/metric_filter_template.hbs' -%>
-<%= render :partial => '/navigator/templates/favorite_filter_template.hbs' -%>
-<%= render :partial => '/navigator/templates/favorite_details_filter_template.hbs' -%>
-<%= render :partial => '/navigator/templates/more_criteria_filter_template.hbs' -%>
-<%= render :partial => '/navigator/templates/more_criteria_details_filter_template.hbs' -%>
+++ /dev/null
-<script id="ajax-select-filter-template" type="text/x-handlebars-template">
- <div class="navigator-filter-search">
- <input type="text">
- </div>
- <ul class="navigator-filter-select-list choices"></ul>
- <ul class="navigator-filter-select-list opposite"></ul>
-</script>
+++ /dev/null
-<script id="base-details-filter-template" type="text/x-handlebars-template">
- <div class="navigator-filter-details-inner"></div>
-</script>
+++ /dev/null
-<script id="base-filter-template" type="text/x-handlebars-template">
- <div class="navigator-filter-label">{{name}}</div>
- <div class="navigator-filter-value {{#if defaultValue}}default{{/if}}">{{value}}</div>
- {{#if optional}}
- <div class="navigator-filter-disable">×</div>
- {{/if}}
-</script>
+++ /dev/null
-<script id="checkbox-filter-template" type="text/x-handlebars-template">
- <div class="navigator-filter-label">{{name}}</div>
- {{#if optional}}
- <div class="navigator-filter-disable">×</div>
- {{/if}}
-</script>
+++ /dev/null
-<script id="choice-filter-item-template" type="text/x-handlebars-template">
- <li>
- <label title="{{text}}" data-id="{{id}}">
- <i class="icon-checkbox {{#if checked}}icon-checkbox-checked{{/if}} {{#unless multiple}}icon-checkbox-single{{/unless}}"></i>
- {{#if icon}}<i class="icon-{{icon}}"></i>{{/if}}
- <span>
- {{text}}
- {{#if category}}
- <br>
- <span class="subtitle">{{category}}</span>
- {{/if}}
- </span>
- </label>
- </li>
-</script>
+++ /dev/null
-<script id="choice-filter-template" type="text/x-handlebars-template">
- <ul class="navigator-filter-select-list choices"></ul>
- <ul class="navigator-filter-select-list opposite"></ul>
-</script>
+++ /dev/null
-<script id="favorite-details-filter-template" type="text/x-handlebars-template">
- <ul class="navigator-filter-select-list">
- {{#ifNotEmpty choicesArray}}
- {{#each choicesArray}}
- <li>
- <label data-id="{{k}}">{{v}}</label>
- </li>
- {{/each}}
- <li class="line"></li>
- {{/ifNotEmpty}}
- <li class="manage">
- <label id="manage-favorites">{{translate "manage" }}</label>
- </li>
- </ul>
-</script>
+++ /dev/null
-<script id="favorite-filter-template" type="text/x-handlebars-template">
- <div class="navigator-filter-favorite-toggle" title="{{translate 'filtersList' }}"></div>
-</script>
+++ /dev/null
-<script id="metric-filter-template" type="text/x-handlebars-template">
- <div class="navigator-filter-details-inner">
- <select name="metric">
- <option></option>
- {{#each groupedMetrics}}
- <optgroup label="{{domain}}">
- {{#each metrics}}
- <option value="{{name}}">{{short_name}}</option>
- {{/each}}
- </optgroup>
- {{/each}}
- </select>
-
- <select name="period">
- <option value="0">{{translate "value"}}</option>
- {{#each periods}}
- <option value="{{@key}}">{{this}}</option>
- {{/each}}
- </select>
-
- <select name="op">
- {{#each operations}}
- <option value="{{@key}}">{{this}}</option>
- {{/each}}
- </select>
-
- <input type="text" name="val">
- </div>
-</script>
+++ /dev/null
-<script id="more-criteria-details-filter-template" type="text/x-handlebars-template">
- <ul class="navigator-filter-select-list">
- {{#each filters}}
- <li>
- <label data-id="{{id}}" {{#if inactive}}class="inactive"{{/if}} {{#if title}}title="{{title}}"{{/if}}>
- {{name}}
- </label>
- </li>
- {{/each}}
- </ul>
-</script>
+++ /dev/null
-<script id="more-criteria-filter-template" type="text/x-handlebars-template">
- {{t "moreCriteria"}}
-</script>
+++ /dev/null
-<script id="range-filter-template" type="text/x-handlebars-template">
- <div class="navigator-filter-details-inner">
- <input class="navigator-filter-range-input" type="text" name="{{propertyFrom}}" placeholder="{{placeholder}}">
- <label>{{translate "to"}}</label>
- <input class="navigator-filter-range-input" type="text" name="{{propertyTo}}" placeholder="{{placeholder}}">
- </div>
-</script>
+++ /dev/null
-<script id="string-filter-template" type="text/x-handlebars-template">
- <div class="navigator-filter-details-inner">
- <input type="text" name="{{property}}" value="{{value}}">
- </div>
-</script>