diff options
author | Julien Lancelot <julien.lancelot@gmail.com> | 2013-06-20 15:17:26 +0200 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@gmail.com> | 2013-06-20 15:17:41 +0200 |
commit | 9e36445a8255b827e4664f135b2e05359b79da42 (patch) | |
tree | 10b91c3e709d69f4b8c571ddb4c18682a1a924cf /plugins/sonar-core-plugin | |
parent | 28ffc4ec6d2b9cbd2e7e24913f07bd38979dfdd2 (diff) | |
download | sonarqube-9e36445a8255b827e4664f135b2e05359b79da42.tar.gz sonarqube-9e36445a8255b827e4664f135b2e05359b79da42.zip |
SONAR-3557 Ability to configure/display some issue widgets based on Issues Filters
Diffstat (limited to 'plugins/sonar-core-plugin')
5 files changed, 82 insertions, 2 deletions
diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java index ee121f9f706..97122719cca 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java @@ -402,6 +402,7 @@ public final class CorePlugin extends SonarPlugin { ActionPlansWidget.class, UnresolvedIssuesPerAssigneeWidget.class, UnresolvedIssuesStatusesWidget.class, + IssueFilterWidget.class, org.sonar.api.issue.NoSonarFilter.class, // issue notifications diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/widgets/issues/IssueFilterWidget.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/widgets/issues/IssueFilterWidget.java new file mode 100644 index 00000000000..fdac731ab66 --- /dev/null +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/widgets/issues/IssueFilterWidget.java @@ -0,0 +1,44 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2013 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.issues; + +import org.sonar.api.web.*; +import org.sonar.plugins.core.widgets.CoreWidget; + +import static org.sonar.api.web.WidgetScope.GLOBAL; + +@WidgetCategory({"Filters", "Global", "Issues"}) +@WidgetScope(GLOBAL) +@WidgetProperties({ + @WidgetProperty(key = IssueFilterWidget.FILTER_PROPERTY, type = WidgetPropertyType.ISSUE_FILTER, optional = false), + @WidgetProperty(key = IssueFilterWidget.PAGE_SIZE_PROPERTY, type = WidgetPropertyType.INTEGER, defaultValue = "30"), + @WidgetProperty(key = IssueFilterWidget.DISPLAY_FILTER_DESCRIPTION, type = WidgetPropertyType.BOOLEAN, defaultValue = "false") +}) +public class IssueFilterWidget extends CoreWidget { + + public static final String FILTER_PROPERTY = "filter"; + public static final String PAGE_SIZE_PROPERTY = "numberOfLines"; + public static final String DISPLAY_FILTER_DESCRIPTION = "displayFilterDescription"; + public static final String ID = "issue_filter"; + + public IssueFilterWidget() { + super(ID, "Issue Filter", "/org/sonar/plugins/core/widgets/issues/issue_filter.html.erb"); + } +} diff --git a/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties b/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties index 377c43aba48..d802c2e2259 100644 --- a/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties +++ b/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties @@ -529,6 +529,7 @@ issue_filter.criteria.resolution=Resolution issue_filter.criteria.severity=Severity issue_filter.criteria.status=Status issue_filter.max_results_reached=Only the first {0} issues matching the search criteria have been retrieved. Add some additional criteria to get fewer results to be able to sort this list. +issue_filter.widget.max_results_reached=Only the first {0} issues matching the search criteria have been retrieved. issue_filter.no_result=No matching issues found. issue_filter.save_filter=Save Filter issue_filter.edit_filter=Edit Filter @@ -1026,6 +1027,13 @@ widget.action_plans.title=Open action plans widget.action_plans.no_action_plan=No action plan widget.action_plans.x_unresolved_issues={0} unresolved issues +widget.issue_filter.name=Issue Filter +widget.issue_filter.description=Displays the result of a pre-configured issue filter. +widget.issue_filter.property.filter.name=Filter +widget.issue_filter.property.numberOfLines.name=Page size +widget.issue_filter.property.displayFilterDescription.name=Display filter description +widget.issue_filter.unknown_filter_warning=This widget is configured to display an issue filter that doesn't exist anymore. + widget.treemap-widget.name=Treemap of Components widget.treemap-widget.description=Displays a treemap of all direct components of the selected resource. widget.treemap-widget.property.sizeMetric.name=Size metric diff --git a/plugins/sonar-core-plugin/src/main/resources/org/sonar/plugins/core/widgets/issues/issue_filter.html.erb b/plugins/sonar-core-plugin/src/main/resources/org/sonar/plugins/core/widgets/issues/issue_filter.html.erb new file mode 100644 index 00000000000..9f0dfa07851 --- /dev/null +++ b/plugins/sonar-core-plugin/src/main/resources/org/sonar/plugins/core/widgets/issues/issue_filter.html.erb @@ -0,0 +1,25 @@ +<% + filter_id = widget_properties['filter'] + filter = Internal.issues.findIssueFilterById(filter_id.to_i) + if filter + if Internal.issues.isUserAuthorized(filter) + search_options = {} + search_options['filter'] = filter_id + @widget_title = link_to h(filter.name), {:controller => 'issues', :action => 'filter', :id => filter.id} +%> + <% if widget_properties['displayFilterDescription'] && !filter.description.blank? %> + <div style="padding-bottom: 5px"> + <span class="note"><%= h filter.description -%></span> + </div> + <% end %> + + <%= render :partial => 'project/widgets/issues/issues_list_widget', + :locals => {:search_options => search_options, :widget_id => widget.id.to_s, :widget_properties => widget_properties} %> + <% + end + else + %> + <p><%= image_tag 'warning.png' %> <%= message 'widget.issue_filter.unknown_filter_warning' -%></p> +<% + end +%> diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/widgets/CoreWidgetsTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/widgets/CoreWidgetsTest.java index c46edc25389..583a4d24ebc 100644 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/widgets/CoreWidgetsTest.java +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/widgets/CoreWidgetsTest.java @@ -22,6 +22,7 @@ package org.sonar.plugins.core.widgets; import com.google.common.base.Function; import com.google.common.base.Throwables; import com.google.common.collect.Collections2; +import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import org.junit.Test; import org.reflections.Reflections; @@ -32,6 +33,7 @@ import javax.annotation.Nullable; import java.util.Collection; import java.util.Set; +import static com.google.common.collect.Lists.newArrayList; import static org.fest.assertions.Assertions.assertThat; public class CoreWidgetsTest { @@ -96,7 +98,7 @@ public class CoreWidgetsTest { } private Collection<CoreWidget> widgets() { - return Collections2.transform(widgetClasses(), new Function<Class<? extends CoreWidget>, CoreWidget>() { + return newArrayList(Iterables.transform(widgetClasses(), new Function<Class<? extends CoreWidget>, CoreWidget>() { public CoreWidget apply(@Nullable Class<? extends CoreWidget> aClass) { try { return aClass.newInstance(); @@ -104,6 +106,6 @@ public class CoreWidgetsTest { throw Throwables.propagate(e); } } - }); + })); } } |