quality_gates.conditions=Conditions
quality_gates.projects=Projects
quality_gates.add_condition=Add Condition
+quality_gates.no_conditions=No Conditions
quality_gates.introduction=Only project measures are checked against thresholds. Modules, packages and classes are ignored.
quality_gates.health_icons=Project health icons represent:
quality_gates.projects_for_default=You must not select specific projects for the default quality gate
<script id="issues-header-template" type="text/x-handlebars-template">
<h1 class="navigator-header-title">{{#if name}}{{name}}{{else}}<%= message ('issues') -%>{{/if}}</h1>
- <div class="navigator-header-actions">
+ <div class="navigator-header-actions button-group">
<button id="issues-new-search"><%= message ('issue_filter.new_search') -%></button>
{{#if appState.canManageFilters}}
<%= render :partial => '/quality_gates/templates/quality_gate_sidebar_list_item_template.hbs' -%>
<%= render :partial => '/quality_gates/templates/quality_gate_actions_template.hbs' -%>
-<%= render :partial => '/quality_gates/templates/quality_gate_new_template.hbs' -%>
<%= render :partial => '/quality_gates/templates/quality_gate_edit_template.hbs' -%>
<%= render :partial => '/quality_gates/templates/quality_gate_detail_template.hbs' -%>
<%= render :partial => '/quality_gates/templates/quality_gate_detail_header_template.hbs' -%>
<%= render :partial => '/quality_gates/templates/quality_gate_detail_conditions_template.hbs' -%>
+<%= render :partial => '/quality_gates/templates/quality_gate_detail_conditions_empty_template.hbs' -%>
<%= render :partial => '/quality_gates/templates/quality_gate_detail_condition_template.hbs' -%>
<%= render :partial => '/quality_gates/templates/quality_gate_detail_projects_template.hbs' -%>
<script id="quality-gate-actions-template" type="text/x-handlebars-template">
<h1 class="navigator-header-title"><%= message('quality_gates.page') -%></h1>
- <div class="navigator-header-actions">
+ <div class="navigator-header-actions button-group">
<button id="quality-gate-add"><%= message('add_verb') -%></button>
</div>
</script>
</td>
<td class="quality-gate-condition-actions" width="120px" nowrap>
{{#if id}}
- <button class="update-condition" disabled><%= message('update_verb') -%></button>
- <a class="action link-red delete-condition"><%= message('delete') -%></a>
+ <div class="button-group">
+ <button class="update-condition" disabled><%= message('update_verb') -%></button>
+ <button class="button-red delete-condition"><%= message('delete') -%></button>
+ </div>
{{else}}
- <button class="add-condition"><%= message('add_verb') -%></button>
- <a class="action cancel-add-condition"><%= message('cancel') -%></a>
+ <div class="button-group">
+ <button class="add-condition"><%= message('add_verb') -%></button>
+ <a class="action cancel-add-condition"><%= message('cancel') -%></a>
+ </div>
{{/if}}
</td>
</script>
--- /dev/null
+<script id="quality-gate-detail-conditions-empty-template" type="text/x-handlebars-template">
+ <td colspan="6">
+ <%= message('quality_gates.no_conditions') -%>
+ </td>
+</script>
<script id="quality-gate-detail-header-template" type="text/x-handlebars-template">
<h1 class="navigator-header-title">{{name}}</h1>
- <div class="navigator-header-actions">
+ <div class="navigator-header-actions button-group">
<button id="quality-gate-rename"><%= message('rename') -%></button>
{{#if default}}
<button id="quality-gate-unset-as-default"><%= message('unset_as_default') -%></button>
{{else}}
<button id="quality-gate-set-as-default"><%= message('set_as_default') -%></button>
{{/if}}
- <a id="quality-gate-delete" class="link-action link-red"><%= message('delete') -%></a>
+ <button id="quality-gate-delete" class="button-red"><%= message('delete') -%></button>
</div>
</script>
<script id="quality-gate-edit-template" type="text/x-handlebars-template">
- <div class="modal-head">
- <h2><%= message('quality_gates.add') -%></h2>
- </div>
+ <form>
+ <div class="modal-head">
+ <h2><%= message('quality_gates.add') -%></h2>
+ </div>
- <div class="modal-body">
- <div class="modal-error"></div>
- <div class="modal-field">
- <label for="quality-gate-edit-name"><%= message('name') -%> <em class="mandatory">*</em></label>
- <input id="quality-gate-edit-name" value="{{name}}" type="text" size="50" maxlength="100">
+ <div class="modal-body">
+ <div class="modal-error"></div>
+ <div class="modal-field">
+ <label for="quality-gate-edit-name"><%= message('name') -%> <em class="mandatory">*</em></label>
+ <input id="quality-gate-edit-name" value="{{name}}" type="text" size="50" maxlength="100">
+ </div>
</div>
- </div>
- <div class="modal-foot">
- {{#if id}}
- <button id="quality-gate-save"><%= message('save') -%></button>
- {{else}}
- <button id="quality-gate-create"><%= message('create') -%></button>
- {{/if}}
- <a id="quality-gate-cancel-create" class="action"><%= message('cancel') -%></a>
- </div>
+ <div class="modal-foot">
+ {{#if id}}
+ <button id="quality-gate-save"><%= message('save') -%></button>
+ {{else}}
+ <button id="quality-gate-create"><%= message('create') -%></button>
+ {{/if}}
+ <a id="quality-gate-cancel-create" class="action"><%= message('cancel') -%></a>
+ </div>
+ </form>
</script>
+++ /dev/null
-<script id="quality-gate-new-template" type="text/x-handlebars-template">
- <div class="quality-gate-header">
- <div class="quality-gate-header-rename">
- <input id="quality-gate-renaming-input" type="text" value="">
-
- <div class="navigator-header-actions">
- <button id="quality-gate-save"><%= message('save') -%></button>
- <button id="quality-gate-cancel-save"><%= message('cancel') -%></button>
- </div>
- </div>
- </div>
-</script>
<script id="quality-gate-sidebar-list-item-template" type="text/x-handlebars-template">
- <div class="line">{{name}} {{#if default}}<span class="subtitle"><%= message('default') -%></span>{{/if}}</div>
+ <div class="line">{{name}} {{#if default}}<span class="subtitle">(<%= message('default') -%>)</span>{{/if}}</div>
</script>
'quality-gate/models/quality-gate',
'quality-gate/views/quality-gate-detail-view',
'quality-gate/views/quality-gate-detail-header-view',
- 'quality-gate/views/quality-gate-new-view'
], (
Backbone,
QualityGate,
QualityGateDetailView,
- QualityGateDetailHeaderView,
- QualityGateNewView
+ QualityGateDetailHeaderView
) ->
class QualityGateRouter extends Backbone.Router
var __hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
- define(['backbone', 'quality-gate/models/quality-gate', 'quality-gate/views/quality-gate-detail-view', 'quality-gate/views/quality-gate-detail-header-view', 'quality-gate/views/quality-gate-new-view'], function(Backbone, QualityGate, QualityGateDetailView, QualityGateDetailHeaderView, QualityGateNewView) {
+ define(['backbone', 'quality-gate/models/quality-gate', 'quality-gate/views/quality-gate-detail-view', 'quality-gate/views/quality-gate-detail-header-view'], function(Backbone, QualityGate, QualityGateDetailView, QualityGateDetailHeaderView) {
var QualityGateRouter, _ref;
return QualityGateRouter = (function(_super) {
__extends(QualityGateRouter, _super);
'click .delete-condition': 'deleteCondition'
'click .add-condition': 'saveCondition'
'click .cancel-add-condition': 'cancelAddCondition'
+ 'keyup :input': 'enableUpdate'
'change :input': 'enableUpdate'
'click .delete-condition': 'deleteCondition',
'click .add-condition': 'saveCondition',
'click .cancel-add-condition': 'cancelAddCondition',
+ 'keyup :input': 'enableUpdate',
'change :input': 'enableUpdate'
};
--- /dev/null
+define [
+ 'backbone.marionette',
+ 'handlebars',
+], (
+ Marionette,
+ Handlebars,
+) ->
+
+ class QualityGateDetailConditionsView extends Marionette.ItemView
+ tagName: 'tr'
+ template: Handlebars.compile jQuery('#quality-gate-detail-conditions-empty-template').html()
'backbone.marionette',
'handlebars',
'quality-gate/models/condition',
- 'quality-gate/views/quality-gate-detail-condition-view'
+ 'quality-gate/views/quality-gate-detail-condition-view',
+ 'quality-gate/views/quality-gate-detail-conditions-empty-view'
], (
Marionette,
Handlebars,
Condition,
- QualityGateDetailConditionView
+ QualityGateDetailConditionView,
+ QualityGateDetailConditionsEmptyView
) ->
class QualityGateDetailConditionsView extends Marionette.CompositeView
template: Handlebars.compile jQuery('#quality-gate-detail-conditions-template').html()
itemView: QualityGateDetailConditionView
+ emptyView: QualityGateDetailConditionsEmptyView
itemViewContainer: '.quality-gate-conditions tbody'
var __hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
- define(['backbone.marionette', 'handlebars', 'quality-gate/models/condition', 'quality-gate/views/quality-gate-detail-condition-view'], function(Marionette, Handlebars, Condition, QualityGateDetailConditionView) {
+ define(['backbone.marionette', 'handlebars', 'quality-gate/models/condition', 'quality-gate/views/quality-gate-detail-condition-view', 'quality-gate/views/quality-gate-detail-conditions-empty-view'], function(Marionette, Handlebars, Condition, QualityGateDetailConditionView, QualityGateDetailConditionsEmptyView) {
var QualityGateDetailConditionsView, _ref;
return QualityGateDetailConditionsView = (function(_super) {
__extends(QualityGateDetailConditionsView, _super);
QualityGateDetailConditionsView.prototype.itemView = QualityGateDetailConditionView;
+ QualityGateDetailConditionsView.prototype.emptyView = QualityGateDetailConditionsEmptyView;
+
QualityGateDetailConditionsView.prototype.itemViewContainer = '.quality-gate-conditions tbody';
QualityGateDetailConditionsView.prototype.ui = {
onRender: ->
unless @model.get('default')
- @$el.css 'max-width', 600
new SelectList
el: @$('#select-list-projects')
width: '100%'
QualityGateDetailProjectsView.prototype.onRender = function() {
if (!this.model.get('default')) {
- this.$el.css('max-width', 600);
return new SelectList({
el: this.$('#select-list-projects'),
width: '100%',
events:
- 'click #quality-gate-create': 'createQualityGate'
- 'click #quality-gate-save': 'saveQualityGate'
+ 'submit form': 'onSubmit'
'click #quality-gate-cancel-create': 'hide'
.done => @hide()
+ onSubmit: (e) ->
+ e.preventDefault()
+ if @model.isNew()
+ @createQualityGate()
+ else
+ @saveQualityGate()
+
createQualityGate: ->
data = name: @ui.nameInput.val()
@saveRequest('create', data).done (r) =>
};
QualityGateEditView.prototype.events = {
- 'click #quality-gate-create': 'createQualityGate',
- 'click #quality-gate-save': 'saveQualityGate',
+ 'submit form': 'onSubmit',
'click #quality-gate-cancel-create': 'hide'
};
});
};
+ QualityGateEditView.prototype.onSubmit = function(e) {
+ e.preventDefault();
+ if (this.model.isNew()) {
+ return this.createQualityGate();
+ } else {
+ return this.saveQualityGate();
+ }
+ };
+
QualityGateEditView.prototype.createQualityGate = function() {
var data,
_this = this;
+++ /dev/null
-define [
- 'backbone.marionette',
- 'handlebars',
-], (
- Marionette,
- Handlebars,
-) ->
-
- class QualityGateNewView extends Marionette.ItemView
- className: 'quality-gate'
- template: Handlebars.compile jQuery('#quality-gate-new-template').html()
-
-
- ui:
- input: '#quality-gate-renaming-input'
- header: '.quality-gate-header'
-
-
- events:
- 'click #quality-gate-save': 'save'
- 'click #quality-gate-cancel-save': 'cancel'
-
-
- onDomRefresh: ->
- @ui.input.focus()
-
-
- save: ->
- @showHeaderSpinner()
- name = @ui.input.val()
- jQuery.ajax
- url: "#{baseUrl}/api/qualitygates/create"
- type: 'POST'
- data: name: name
- .done (r) =>
- @model.set r
- @options.app.qualityGates.add @model
- @options.app.router.navigate "show/#{@model.id}", trigger: true
-
-
- cancel: ->
- @options.app.openFirstQualityGate()
-
-
- showHeaderSpinner: ->
- @ui.header.addClass 'navigator-fetching'
-
-
- hideHeaderSpinner: ->
- @ui.header.removeClass 'navigator-fetching'
+++ /dev/null
-// Generated by CoffeeScript 1.6.3
-(function() {
- var __hasProp = {}.hasOwnProperty,
- __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
-
- define(['backbone.marionette', 'handlebars'], function(Marionette, Handlebars) {
- var QualityGateNewView, _ref;
- return QualityGateNewView = (function(_super) {
- __extends(QualityGateNewView, _super);
-
- function QualityGateNewView() {
- _ref = QualityGateNewView.__super__.constructor.apply(this, arguments);
- return _ref;
- }
-
- QualityGateNewView.prototype.className = 'quality-gate';
-
- QualityGateNewView.prototype.template = Handlebars.compile(jQuery('#quality-gate-new-template').html());
-
- QualityGateNewView.prototype.ui = {
- input: '#quality-gate-renaming-input',
- header: '.quality-gate-header'
- };
-
- QualityGateNewView.prototype.events = {
- 'click #quality-gate-save': 'save',
- 'click #quality-gate-cancel-save': 'cancel'
- };
-
- QualityGateNewView.prototype.onDomRefresh = function() {
- return this.ui.input.focus();
- };
-
- QualityGateNewView.prototype.save = function() {
- var name,
- _this = this;
- this.showHeaderSpinner();
- name = this.ui.input.val();
- return jQuery.ajax({
- url: "" + baseUrl + "/api/qualitygates/create",
- type: 'POST',
- data: {
- name: name
- }
- }).done(function(r) {
- _this.model.set(r);
- _this.options.app.qualityGates.add(_this.model);
- return _this.options.app.router.navigate("show/" + _this.model.id, {
- trigger: true
- });
- });
- };
-
- QualityGateNewView.prototype.cancel = function() {
- return this.options.app.openFirstQualityGate();
- };
-
- QualityGateNewView.prototype.showHeaderSpinner = function() {
- return this.ui.header.addClass('navigator-fetching');
- };
-
- QualityGateNewView.prototype.hideHeaderSpinner = function() {
- return this.ui.header.removeClass('navigator-fetching');
- };
-
- return QualityGateNewView;
-
- })(Marionette.ItemView);
- });
-
-}).call(this);
font-style: italic;
}
.navigator-header-actions {
- display: inline-block;
- vertical-align: middle;
margin-left: 16px;
}
-.navigator-header-actions > button {
- position: relative;
- z-index: 2;
- display: inline-block;
- vertical-align: middle;
- margin: 0;
- padding: 2px 8px;
- font-size: 11px;
- font-weight: normal;
- cursor: pointer;
-}
-.navigator-header-actions > button:hover,
-.navigator-header-actions > button:focus {
- z-index: 3;
-}
-.navigator-header-actions > button + button {
- margin-left: -1px;
-}
.navigator-header-actions > a {
vertical-align: middle;
margin: 0 8px;
font-style: italic;
}
.navigator-header-actions {
- display: inline-block;
- vertical-align: middle;
margin-left: 16px;
}
-.navigator-header-actions > button {
- position: relative;
- z-index: 2;
- display: inline-block;
- vertical-align: middle;
- margin: 0;
- padding: 2px 8px;
- font-size: 11px;
- font-weight: normal;
- cursor: pointer;
-}
-.navigator-header-actions > button:hover,
-.navigator-header-actions > button:focus {
- z-index: 3;
-}
-.navigator-header-actions > button + button {
- margin-left: -1px;
-}
.navigator-header-actions > a {
vertical-align: middle;
margin: 0 8px;
}
.navigator-header-actions {
- display: inline-block;
- vertical-align: middle;
margin-left: 16px;
- & > button {
- position: relative;
- z-index: 2;
- display: inline-block;
- vertical-align: middle;
- margin: 0;
- padding: 2px 8px;
- font-size: @smallFontSize;
- font-weight: normal;
- cursor: pointer;
-
- &:hover, &:focus {
- z-index: 3;
- }
- }
-
- & > button + button {
- margin-left: -1px;
- }
-
& > a {
vertical-align: middle;
margin: 0 8px;
font-style: italic;
}
.navigator-header-actions {
- display: inline-block;
- vertical-align: middle;
margin-left: 16px;
}
-.navigator-header-actions > button {
- position: relative;
- z-index: 2;
- display: inline-block;
- vertical-align: middle;
- margin: 0;
- padding: 2px 8px;
- font-size: 11px;
- font-weight: normal;
- cursor: pointer;
-}
-.navigator-header-actions > button:hover,
-.navigator-header-actions > button:focus {
- z-index: 3;
-}
-.navigator-header-actions > button + button {
- margin-left: -1px;
-}
.navigator-header-actions > a {
vertical-align: middle;
margin: 0 8px;
padding: 0 10px;
border-right-color: #cdcdcd;
}
+.quality-gates-navigator .navigator-actions .navigator-header-title {
+ font-size: 13px;
+ font-weight: bold;
+ text-transform: uppercase;
+}
.quality-gates-navigator .navigator-results {
top: 67px;
}
+.quality-gates-navigator .navigator-results .subtitle {
+ text-transform: lowercase;
+}
.quality-gates-navigator .navigator-details {
top: 67px;
padding: 10px;
.quality-gate-section-name {
margin-bottom: 10px;
font-weight: bold;
+ text-transform: uppercase;
}
.quality-gate-introduction {
margin-bottom: 20px;
height: @navigatorHeaderHeight;
padding: 0 @navigatorPadding;
border-right-color: @navigatorBorderColor;
+
+ .navigator-header-title {
+ font-size: 13px;
+ font-weight: bold;
+ text-transform: uppercase;
+ }
}
.navigator-results {
top: @navigatorTopOffset + @navigatorHeaderHeight;
+
+ .subtitle {
+ text-transform: lowercase;
+ }
}
.navigator-details {
.quality-gate-section-name {
margin-bottom: @navigatorPadding;
font-weight: bold;
+ text-transform: uppercase;
}
background: #ebebeb;
cursor: default;
}
+.button-red:hover,
+.button-red:focus {
+ border-color: #900;
+ background: #cc0000;
+ color: #fff;
+}
+.button-red:active {
+ border-color: #900;
+ background: #ff0000;
+}
+.button-group {
+ display: inline-block;
+ vertical-align: middle;
+ font-size: 0;
+ white-space: nowrap;
+}
+.button-group > button {
+ position: relative;
+ z-index: 2;
+ display: inline-block;
+ vertical-align: middle;
+ margin: 0;
+ padding: 2px 8px;
+ font-size: 11px;
+ font-weight: normal;
+ cursor: pointer;
+}
+.button-group > button:hover,
+.button-group > button:focus {
+ z-index: 3;
+}
+.button-group > button + button {
+ margin-left: -1px;
+}
+.button-group > a {
+ vertical-align: middle;
+ margin: 0 8px;
+ font-size: 11px;
+}
cursor: default;
}
}
+
+.button-red {
+ &:hover, &:focus {
+ border-color: #900;
+ background: lighten(#900, 10%);
+ color: #fff;
+ }
+
+ &:active {
+ border-color: #900;
+ background: lighten(#900, 20%);
+ }
+}
+
+.button-group {
+ display: inline-block;
+ vertical-align: middle;
+ font-size: 0;
+ white-space: nowrap;
+
+ & > button {
+ position: relative;
+ z-index: 2;
+ display: inline-block;
+ vertical-align: middle;
+ margin: 0;
+ padding: 2px 8px;
+ font-size: @smallFontSize;
+ font-weight: normal;
+ cursor: pointer;
+
+ &:hover, &:focus {
+ z-index: 3;
+ }
+ }
+
+ & > button + button {
+ margin-left: -1px;
+ }
+
+ & > a {
+ vertical-align: middle;
+ margin: 0 8px;
+ font-size: @smallFontSize;
+ }
+}