// widgets
AlertsWidget.class,
- QualityGateWidget.class,
CoverageWidget.class,
ItCoverageWidget.class,
DescriptionWidget.class,
*/
package org.sonar.plugins.core.widgets;
-import org.sonar.api.web.WidgetLayout;
-import org.sonar.api.web.WidgetLayoutType;
+import org.sonar.api.web.*;
+@WidgetProperties({
+ @WidgetProperty(key = "show_ok", type = WidgetPropertyType.BOOLEAN, defaultValue = "false"),
+})
@WidgetLayout(WidgetLayoutType.NONE)
public class AlertsWidget extends CoreWidget {
+++ /dev/null
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.plugins.core.widgets;
-
-import org.sonar.api.web.*;
-
-@WidgetProperties({
- @WidgetProperty(key = "show_ok", type = WidgetPropertyType.BOOLEAN, defaultValue = "false"),
-})
-@WidgetLayout(WidgetLayoutType.NONE)
-public class QualityGateWidget extends CoreWidget {
-
- public QualityGateWidget() {
- super("quality_gate", "Quality Gate Details", "/org/sonar/plugins/core/widgets/quality_gate.html.erb");
- }
-}
+<% m=measure(Metric::QUALITY_GATE_DETAILS)
+ if m && !m.data.blank?
+ details = JSON.parse m.data
+ m.alert_status = details['level']
+ conditions = details['conditions']
+ alert_metric = metric(Metric::ALERT_STATUS)
+
+ warn_message = message('measure_filter.criteria.alert.warn')
+ error_message = message('measure_filter.criteria.alert.error')
+
+ css_class = "color_#{m.alert_status}"
+ if m.alert_status==Metric::TYPE_LEVEL_OK
+ label = "#{message('widget.alerts.no_alert')}."
+ elsif m.alert_status==Metric::TYPE_LEVEL_WARN
+ label = "#{message('widget.alerts.warnings')}"
+ else
+ label = "#{message('widget.alerts.errors')}"
+ end
+-%><div class="widget <%= css_class -%>" style="color: black !important" id="quality_gate_widget_<%= widget.id -%>">
+ <div><%= format_measure(measure(Metric::ALERT_STATUS)) -%> <%= label -%></div>
+ <% if conditions.any? {|condition| condition['level'] != 'OK'} || widget_properties['show_ok'] && !conditions.empty? -%>
+ <% details['conditions'].sort_by {|condition| [ -condition['level'].length, metric(condition['metric']).short_name] }.each do |condition|
+
+ level = condition['level']
+ condition_metric = metric(condition['metric'])
+ operator = message("quality_gates.operator.#{condition['op']}.short")
+ period = condition['period']
+ warning_value = condition['warning']
+ error_value = condition['error']
+ actual_value = condition['actual']
+
+ detail_measure = ProjectMeasure.new :metric => alert_metric, :alert_status => level
+
+ drilldown_url = period.blank? ? url_for_drilldown(condition_metric) : url_for_drilldown(condition_metric, :period => period)
+
+ actual_measure = ProjectMeasure.new :metric => condition_metric, :value => actual_value, :alert_status => level
+ warning_measure = ProjectMeasure.new :metric => condition_metric, :value => warning_value
+ error_measure = ProjectMeasure.new :metric => condition_metric, :value => error_value
+
+
+ unless level == 'OK' && !widget_properties['show_ok']
+ -%>
+ <div class="dashbox" style="margin: 10px">
+ <p class="title"><%= condition_metric.short_name -%></p>
+ <span class="big"><%= format_measure(actual_measure, :url => drilldown_url) -%></span>
+ <% if level == 'WARN' -%><%= operator -%> <%= format_measure(warning_measure) -%><% end -%>
+ <% if level == 'ERROR' -%><%= operator -%> <%= format_measure(error_measure) -%><% end -%>
+ <% if level == 'OK' -%>
+ <% unless warning_value.blank? -%><%= warn_message -%> <%= operator -%> <%= format_measure(warning_measure) -%> <%= '|' unless error_value.blank? -%><% end -%>
+ <% unless error_value.blank? -%><%= error_message -%> <%= operator -%> <%= format_measure(error_measure) -%><% end -%>
+ <% end -%>
+ <p><%= period_label(@snapshot, period) unless period.blank? -%></p>
+ </div>
+ <% end
+ end
+ end -%>
+</div>
+<% else -%>
<% m=measure(Metric::ALERT_STATUS)
if m && !m.alert_status.blank?
- css_class = "widget color_#{m.alert_status}"
- if m.alert_status==Metric::TYPE_LEVEL_OK
- label = "<b>#{message('widget.alerts.no_alert')}</b>."
- elsif m.alert_status==Metric::TYPE_LEVEL_WARN
- label = "<b>#{message('widget.alerts.warnings')}</b>#{h(m.alert_text)}."
- else
- label = "<b>#{message('widget.alerts.errors')}</b>#{h(m.alert_text)}."
- end
-%><div class="<%= css_class -%>" id="alerts_widget">
+ css_class = "widget color_#{m.alert_status}"
+ if m.alert_status==Metric::TYPE_LEVEL_OK
+ label = "<b>#{message('widget.alerts.no_alert')}</b>."
+ elsif m.alert_status==Metric::TYPE_LEVEL_WARN
+ label = "<b>#{message('widget.alerts.warnings')}</b>#{h(m.alert_text)}."
+ else
+ label = "<b>#{message('widget.alerts.errors')}</b>#{h(m.alert_text)}."
+ end
+-%><div class="<%= css_class -%>" id="alerts_widget">
<div><%= format_measure(m) -%> <%= label -%></div>
</div>
-<% end %>
+<% end
+end -%>
+++ /dev/null
-<% m=measure(Metric::QUALITY_GATE_DETAILS)
- if m && !m.measure_data.blank?
-
- details = JSON.parse m.measure_data.data
- m.alert_status = details['level']
-
- warn_message = message('measure_filter.criteria.alert.warn')
- error_message = message('measure_filter.criteria.alert.error')
-
- css_class = "color_#{m.alert_status}"
- if m.alert_status==Metric::TYPE_LEVEL_OK
- label = "<b>#{message('widget.alerts.no_alert')}.</b>"
- elsif m.alert_status==Metric::TYPE_LEVEL_WARN
- label = "<b>#{message('widget.alerts.warnings')}</b>"
- else
- label = "<b>#{message('widget.alerts.errors')}</b>"
- end
--%><div class="widget <%= css_class -%>" id="quality_gate_widget_<%= widget.id -%>">
- <div><%= format_measure(m) -%> <%= label -%></div>
- <table class="data" style="color: black; margin-top: 10px">
- <thead>
- <tr></tr>
- </thead>
- <tbody>
- <% details['conditions'].sort_by {|condition| [ -condition['level'].length, metric(condition['metric']).short_name] }.each do |condition|
-
- level = condition['level']
- condition_metric = metric(condition['metric'])
- operator = message("quality_gates.operator.#{condition['op']}.short")
- period = condition['period']
- warning_value = condition['warning']
- error_value = condition['error']
- actual_value = condition['actual']
-
- detail_measure = ProjectMeasure.new :metric => m.metric, :alert_status => level
-
- drilldown_url = period.blank? ? url_for_drilldown(condition_metric) : url_for_drilldown(condition_metric, :period => period)
-
- actual_measure = ProjectMeasure.new :metric => condition_metric, :value => actual_value
- warning_measure = ProjectMeasure.new :metric => condition_metric, :value => warning_value
- error_measure = ProjectMeasure.new :metric => condition_metric, :value => error_value
-
-
- unless level == 'OK' && !widget_properties['show_ok']
- -%>
- <tr>
- <td><%= format_measure(detail_measure) -%></td>
- <td><%= link_to "#{condition_metric.short_name} #{period_label(@snapshot, period) unless period.blank?}", drilldown_url, {:class => 'nolink'} -%></td>
- <td align="right"><%= link_to format_measure(actual_measure), drilldown_url, {:class => 'nolink'} -%></td>
- <td>
- <% if level == 'WARN' -%><%= operator -%> <%= format_measure(warning_measure) -%><% end -%>
- <% if level == 'ERROR' -%><%= operator -%> <%= format_measure(error_measure) -%><% end -%>
- <% if level == 'OK' -%>
- <% unless warning_value.blank? -%><%= warn_message -%> <%= operator -%> <%= format_measure(warning_measure) -%> <%= '|' unless error_value.blank? -%><% end %>
- <% unless error_value.blank? -%><%= error_message -%> <%= operator -%> <%= format_measure(error_measure) -%><% end %>
- <% end -%>
- </tr>
- <% end
- end -%>
- </tbody>
- </table>
-</div>
-<% end %>
widget.error_occurred_please_read_logs=An error occurred while trying to display the widget "{0}". Please contact the administrator.
widget.unsupported_browser_warning=Your browser is out of date and does not support this widget.
-widget.alerts.name=Quality Gate Summary
-widget.alerts.description=Displays a summary of the project's quality gate status.
+widget.alerts.name=Quality Gate
+widget.alerts.description=Displays the project's quality gate status.
widget.alerts.no_alert=The project has passed the quality gate
widget.alerts.warnings=The project has warnings on the following quality gate conditions:\u00a0
widget.alerts.errors=The project failed the quality gate on the following conditions:\u00a0
-
-widget.quality_gate.name=Quality Gate Details
-widget.quality_gate.description=Displays a detailed view of the project's quality gate status.
-widget.quality_gate.property.show_ok.name=Show passed conditions
+widget.alerts.property.show_ok.name=Show passed conditions
widget.code_coverage.name=Unit Tests Coverage
widget.code_coverage.description=Reports on units tests and code coverage by unit tests.
.setDomain(DOMAIN_GENERAL)
.create();
+ /**
+ * @since 4.4
+ */
public static final String QUALITY_GATE_DETAILS_KEY = "quality_gate_details";
- public static final Metric QUALITY_GATE_DETAILS = new Metric.Builder(QUALITY_GATE_DETAILS_KEY, "Quality Gate Details", Metric.ValueType.LEVEL)
+ /**
+ * The project detailed status with regard to its quality gate.
+ * Storing the global quality gate status, along with all evaluated conditions, into a JSON object.
+ * @since 4.4
+ */
+ public static final Metric QUALITY_GATE_DETAILS = new Metric.Builder(QUALITY_GATE_DETAILS_KEY, "Quality Gate Details", Metric.ValueType.DATA)
.setDescription("The project detailed status with regard to its quality gate.")
- .setDirection(Metric.DIRECTION_BETTER)
- .setQualitative(true)
.setDomain(DOMAIN_GENERAL)
.create();