aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/sonar-core-plugin
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@gmail.com>2013-06-20 15:17:26 +0200
committerJulien Lancelot <julien.lancelot@gmail.com>2013-06-20 15:17:41 +0200
commit9e36445a8255b827e4664f135b2e05359b79da42 (patch)
tree10b91c3e709d69f4b8c571ddb4c18682a1a924cf /plugins/sonar-core-plugin
parent28ffc4ec6d2b9cbd2e7e24913f07bd38979dfdd2 (diff)
downloadsonarqube-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')
-rw-r--r--plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java1
-rw-r--r--plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/widgets/issues/IssueFilterWidget.java44
-rw-r--r--plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties8
-rw-r--r--plugins/sonar-core-plugin/src/main/resources/org/sonar/plugins/core/widgets/issues/issue_filter.html.erb25
-rw-r--r--plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/widgets/CoreWidgetsTest.java6
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);
}
}
- });
+ }));
}
}