]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3548 Allow to filter widget by their title/description content
authorFabrice Bellingard <bellingard@gmail.com>
Mon, 18 Jun 2012 12:28:14 +0000 (14:28 +0200)
committerFabrice Bellingard <bellingard@gmail.com>
Mon, 18 Jun 2012 12:29:57 +0000 (14:29 +0200)
=> Add a field to dynamically filter widgets when editing a dashboard

Tested on FF 12, Chrome 19, Safari 5 && IE 7->9

sonar-server/src/main/webapp/WEB-INF/app/views/dashboard/_widget_definition.html.erb
sonar-server/src/main/webapp/WEB-INF/app/views/dashboard/_widget_definitions.html.erb
sonar-server/src/main/webapp/WEB-INF/app/views/dashboard/configure.html.erb
sonar-server/src/main/webapp/stylesheets/dashboard.css

index dd6b59963daf3a6dc5e49caf27304d4298982799..c0ab98601ffde79bd8af835dade627eabd423adc 100644 (file)
@@ -1,4 +1,3 @@
-<td>
   <div class="widget_def" id="def_<%= definition.id.tr('_', '') -%>">
     <p><b><%= h message("widget.#{definition.id}.name", :default => definition.title) -%></b></p>
 
@@ -8,5 +7,4 @@
       <input type="hidden" name="category" value="<%= category -%>">
       <input type="submit" value="<%= message('dashboard.add_widget') -%>" id="add-widget-<%= u(definition.id) -%>">
     <% end -%>
-  </div>
-</td>
+  </div>
\ No newline at end of file
index 1cf2deba4f5bb41a44e038c76e9426bc371be9c5..4a66f567ac1250ad6be7f5b50e485910f1d44c7a 100644 (file)
@@ -1,24 +1,26 @@
-<p>
-<ul class="horizontal widget_categs" id="widget-filters">
-  <li><%= message('filter_verb') -%>:</li>
-  <li class="<%= 'selected' if category.blank? -%>">
-    <a href="#" onClick="return filterWidgets('')" id="widget-filter-none"><%= message('none') -%></a>
-  </li>
-  <% @widget_categories.each do |c| %>
-    <li class="<%= 'selected' if category==c -%>">
-      <a href="#" onClick="return filterWidgets('<%= escape_javascript(c) -%>')" id="widget-filter-<%= u(c) -%>"><%= h(c) -%></a>
+<div style="line-height: 20px; vertical-align: middle; padding: 0px 3px; margin-right: 10px">
+  <ul class="horizontal widget_categs" id="widget-filters">
+    <li>Filter by category:</li>
+    <li class="<%= 'selected' if category.blank? -%>">
+      <a href="#" onClick="return filterWidgets('')" id="widget-filter-none"><%= message('none') -%></a>
     </li>
-  <% end %>
-</ul>
-<%= image_tag 'loading.gif', :style => 'vertical-align: top;display: none', :id => 'filter-widgets-loading' -%>
-</p>
+    <% @widget_categories.each do |c| %>
+      <li class="<%= 'selected' if category==c -%>">
+        <a href="#" onClick="return filterWidgets('<%= escape_javascript(c) -%>')" id="widget-filter-<%= u(c) -%>"><%= h(c) -%></a>
+      </li>
+    <% end %>
+  </ul>
+</div>
+<div style="float: left; padding: 0px 3px">
+  Filter by content: 
+  <input id="filter-widget-box" name="filter-widget-box" size="20" onKeyUp="findWidgetsByContent(this.value);"/>
+</div>
+<div style="float: left; padding: 0px 3px;">
+  <%= image_tag 'loading.gif', :style => 'vertical-align: top; display: none', :id => 'filter-widgets-loading' -%>
+</div>
+<div style="clear: both"></div>
+
+<% @widget_definitions.each do |definition| %>
+  <%= render :partial => 'widget_definition', :locals => {:definition => definition, :dashboard => @dashboard, :resource => @resource, :category => category} %>
+<% end %>
 
-<table width="100%">
-  <% @widget_definitions.each_slice(4) do |row_definitions| %>
-    <tr>
-      <% row_definitions.each do |definition| %>
-        <%= render :partial => 'widget_definition', :locals => {:definition => definition, :dashboard => @dashboard, :resource => @resource, :category => category} %>
-      <% end %>
-    </tr>
-  <% end %>
-</table>
index cb87224a5404f52f9e36885ed371d91a181ca3bc..087489d98627d5f94817e6321f7dc7f61dd85bdb 100644 (file)
     $('filter-widgets-loading').show();
     return false;
   }
+  
+  var widgetContents = [
+  <% 
+    number_of_widgets = @widget_definitions.size()
+    @widget_definitions.each_with_index do |definition, index|
+      widget_id = "def_#{definition.id.tr('_', '')}"
+      widget_title = message("widget.#{definition.id}.name", :default => definition.title).downcase
+      widget_description = message("widget.#{definition.id}.description", :default => definition.description).downcase 
+  %>
+    { id:"<%= widget_id -%>", c:"<%= widget_title.gsub(/\r\n?/, " ") -%> <%= widget_description.gsub(/\r\n?/, " ") -%>" } <%= "," unless index==number_of_widgets-1 -%>
+  <% end %>
+  ]
+  
+  function findWidgetsByContent(text) {
+    var userInput = text.toLowerCase();
+    widgetContents.each(function (widget) {
+      var element = $(widget.id);
+      if (element != null) {
+        if (widget.c.indexOf(userInput) != -1) {
+          element.show();
+        } else {
+          element.hide();
+        }
+      }
+    });
+    return false;
+  }
   //-->
+  
+  $('filter-widget-box').focus();
 </script>
index 9b34c96f0c51dc5053f1696c758c128ab90551e9..4c3d4187add1d912cdb1a213611e7050d4e39635 100644 (file)
   margin-bottom: 5px;
 }
 
-#dashboard #widget_defs td {
-  white-space: normal;
-  vertical-align: top;
-  width: 25%;
-}
-
 #dashboard .widget_def {
   border: 1px solid #FFD324;
   padding: 5px;
   margin: 3px;
   white-space: normal;
   vertical-align: top;
-  height: 80px;
+  width: 250px;
+  float: left;
+  min-height: 100px;
 }
 
 #dashboard ul.widget_categs li {