]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3825 widget should support column sorting and pagination
authorSimon Brandhof <simon.brandhof@gmail.com>
Wed, 12 Dec 2012 06:54:42 +0000 (07:54 +0100)
committerSimon Brandhof <simon.brandhof@gmail.com>
Wed, 12 Dec 2012 06:54:42 +0000 (07:54 +0100)
plugins/sonar-core-plugin/src/main/resources/org/sonar/plugins/core/widgets/measure_filter_list.html.erb
plugins/sonar-core-plugin/src/main/resources/org/sonar/plugins/core/widgets/measure_filter_treemap.html.erb
sonar-server/src/main/webapp/WEB-INF/app/controllers/measures_controller.rb
sonar-server/src/main/webapp/WEB-INF/app/helpers/application_helper.rb
sonar-server/src/main/webapp/WEB-INF/app/helpers/measures_helper.rb
sonar-server/src/main/webapp/WEB-INF/app/views/measures/_display.html.erb [new file with mode: 0644]
sonar-server/src/main/webapp/WEB-INF/app/views/measures/_display_list.html.erb
sonar-server/src/main/webapp/WEB-INF/app/views/measures/search.html.erb
sonar-server/src/main/webapp/WEB-INF/app/views/utils/_tfoot_ajax_pagination.html.erb [new file with mode: 0644]
sonar-server/src/main/webapp/WEB-INF/app/views/utils/_tfoot_pagination.html.erb

index dc3fcc37f0c245df6bafe7ef85f7cdf4c47f7402..7ec7a3bbe7b09283fe05f43f99cfb51f0ca236f6 100644 (file)
@@ -10,7 +10,7 @@
        filter.execute(self, :user => current_user)
        @widget_title = link_to h(filter.name), {:controller => 'measures', :action => 'filter', :id => filter.id, :display => 'list'}
 %>
-    <%= render :partial => "measures/display_#{filter.display.key}", :locals => {:edit_mode => false, :widget => widget, :filter => filter} %>
+    <%= render :partial => "measures/display_#{filter.display.key}", :locals => {:edit_mode => false, :filter => filter, :widget_id => widget.id} -%>
 <%
      end
    else
index 9b8ac706d1e0c23377290ef0eec5c18a84541e52..53c2fae8967fabe6c9d3ee60217440392c5fee19 100644 (file)
@@ -6,14 +6,14 @@
    if filter
      url_options = {:controller => 'measures', :action => 'filter', :id => filter.id, :display => 'treemap'}
      filter.load_criteria_from_data
-     filter.set_criteria_value('display', 'treemap')
+     filter.set_criteria_value(:display, 'treemap')
      if size_metric
-       filter.set_criteria_value('tmSize', size_metric.key)
-       url_options['tmSize']=size_metric.key
+       filter.set_criteria_value(:tmSize, size_metric.key)
+       url_options[:tmSize]=size_metric.key
      end
      if color_metric
-       filter.set_criteria_value('tmColor', color_metric.key)
-       url_options['tmColor']=color_metric.key
+       filter.set_criteria_value(:tmColor, color_metric.key)
+       url_options[:tmColor]=color_metric.key
      end
 
      if !filter.require_authentication? || logged_in?
@@ -21,7 +21,7 @@
 
        @widget_title = link_to h(filter.name), url_options
 %>
-    <%= render :partial => "measures/display_#{filter.display.key}", :locals => {:edit_mode => false, :widget => widget, :filter => filter} %>
+    <%= render :partial => "measures/display_#{filter.display.key}", :locals => {:edit_mode => false, :widget_id => widget.id, :filter => filter} %>
 <%
      end
   else
index 3447146fbffc20bac654c62d937fd6ae0af87c86..a63af45542aea34e4fd64020f3f4284ebe164fca 100644 (file)
@@ -31,9 +31,13 @@ class MeasuresController < ApplicationController
     else
       @filter = MeasureFilter.new
     end
-    @filter.criteria=(params)
+    @filter.criteria=(params.merge({:controller => nil, :action => nil, :search => nil, :widget_id => nil}))
     @filter.enable_default_display
     @filter.execute(self, :user => current_user)
+
+    if request.xhr?
+      render :partial => 'measures/display', :locals => {:filter => @filter, :edit_mode => false, :widget_id => params[:widget_id]}
+    end
   end
 
   # Load existing filter
index 816847428387557fa23b1d0e1d43212da1f43d24..99a440fe75c22296114e2787b2038633966aa7d1 100644 (file)
@@ -688,4 +688,7 @@ module ApplicationHelper
     "<a href='#{url}' modal-width='#{width}' class='open-modal #{clazz}' #{id}>#{h label}</a>"
   end
 
+  def link_to_function_if(condition, name, *args)
+    condition ? link_to_function(name, args) : name
+  end
 end
index 05b3e471d393b8b342f5c4cee2d617ba4c9f1b80..64ccbf731d3000318c8112e9675b013ac67d1a3e 100644 (file)
@@ -19,9 +19,9 @@
 #
 module MeasuresHelper
 
-  def list_column_html(filter, column)
+  def list_column_html(filter, column, widget_id)
     if column.sort?
-      html = link_to_function(h(column.title_label), "reloadParameters({asc:'#{(!filter.sort_asc?).to_s}', sort:'#{column.key}'})", :title => h(column.tooltip))
+      html = link_to_function(h(column.title_label), "sortList#{widget_id}('#{escape_javascript column.key}',#{!filter.sort_asc?})", :title => h(column.tooltip))
     else
       html=h(column.title_label)
     end
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/measures/_display.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/measures/_display.html.erb
new file mode 100644 (file)
index 0000000..09d7858
--- /dev/null
@@ -0,0 +1,11 @@
+<% if filter.security_exclusions %>
+  <p class="notes"><%= message('results_not_display_due_to_security') -%></p>
+<% end %>
+
+<% if !filter.errors.empty? %>
+  <% filter.errors.full_messages.each do |message| %>
+    <div class="warning"><%= h message %></div>
+  <% end %>
+<% elsif filter.rows && filter.display %>
+  <%= render :partial => "measures/display_#{filter.display.class::KEY}", :locals => {:filter => filter, :edit_mode => edit_mode, :widget_id => widget_id} -%>
+<% end %>
index df8ad570af067f2b9ebd35c5dab087609a340d2c..8e9f33549c45b2fc4888f4a290b34a4c934e9eb2 100644 (file)
@@ -1,4 +1,30 @@
+<div id="measure_filter_list<%= widget_id -%>">
+<% content_for :script do %>
+  <script>
+    function refreshUrl<%= widget_id -%>(url) {
+      $j('#measure_filter_foot<%= widget_id -%>_pages').hide();
+      $j('#measure_filter_foot<%= widget_id -%>_loading').show();
+      <% if widget_id %>
+      $j('#measure_filter_list<%= widget_id -%>').load(url);
+      <% else %>
+      window.location = url;
+      <% end %>
+      return false;
+    }
+    function sortList<%= widget_id -%>(sort, asc) {
+      var url = decodeURI('<%= url_for filter.criteria.merge(:controller => 'measures', :action => 'search', :sort => nil, :asc => nil, :search => nil, :widget_id => widget_id, :trailing_slash => true) -%>');
+      url += '&sort=' + sort + '&asc=' + asc;
+      return refreshUrl<%= widget_id -%>(url);
+    }
+    function pageList<%= widget_id -%>(page) {
+      var url = decodeURI('<%= url_for filter.criteria.merge(:controller => 'measures', :action => 'search', :page => nil, :search => nil, :widget_id => widget_id, :trailing_slash => true) -%>');
+      url += '&page=' + page;
+      return refreshUrl<%= widget_id -%>(url);
+    }
+  </script>
 <%
+   end
+
    display_favourites = logged_in?
    colspan = filter.display.columns.size
    colspan += 1 if display_favourites
           td1.remove();
         });
       }
+      $j(document).ready(function () {
+        $j("#select-metric").on("change", function (e) {
+          var selectedKey = $j("#select-metric option:selected").val();
+          if (selectedKey.indexOf('metric:') == 0) {
+            if (selectedKey.indexOf('metric:new_') == 0) {
+              $j('#select-period option :eq(0)').attr('disabled', 'disabled');
+              $j('#select-period ').val('1');
+            } else {
+              $j('#select-period option :eq(0)').removeAttr('disabled');
+              $j('#select-period').val('');
+            }
+            $j('#select-period').show();
+          } else {
+            $j('#select-period').hide();
+          }
+          $j("#add-metric").removeAttr('disabled');
+
+        });
+        $j("#add-metric").on("click", function (e) {
+          var columnKey = $j("#select-metric option:selected").val();
+          var period = $j("#select-period option:selected").val();
+          if (period.length > 0) {
+            columnKey += ':' + period;
+          }
+          cols.push(columnKey);
+          window.location = removeUrlAttr(decodeURI(window.location.href), 'cols\\[\\]') + '&' + $j.map(cols,function (a) {
+            return a ? 'cols[]=' + a : null;
+          }).join('&');
+        });
+        $j("#exit-edit").on("click", function (e) {
+          var url = removeUrlAttr(decodeURI(window.location.href), 'cols\\[\\]');
+          url = removeUrlAttr(url, 'edit');
+          url += '&' + $j.map(cols,function (a) {
+            return a ? 'cols[]=' + a : null;
+          }).join('&');
+          window.location = url;
+        });
+      });
     </script>
   <%
      end
-     end
   %>
-
-<% if edit_mode %>
   <table class="spaced width100 box">
     <tr>
       <td>
       </td>
     </tr>
   </table>
-  <script>
-    $j("#select-metric").on("change", function (e) {
-      var selectedKey = $j("#select-metric option:selected").val();
-      if (selectedKey.indexOf('metric:') == 0) {
-        if (selectedKey.indexOf('metric:new_') == 0) {
-          $j('#select-period option :eq(0)').attr('disabled', 'disabled');
-          $j('#select-period ').val('1');
-        } else {
-          $j('#select-period option :eq(0)').removeAttr('disabled');
-          $j('#select-period').val('');
-        }
-        $j('#select-period').show();
-      } else {
-        $j('#select-period').hide();
-      }
-      $j("#add-metric").removeAttr('disabled');
-
-    });
-    $j("#add-metric").on("click", function (e) {
-      var columnKey = $j("#select-metric option:selected").val();
-      var period = $j("#select-period option:selected").val();
-      if (period.length > 0) {
-        columnKey += ':' + period;
-      }
-      cols.push(columnKey);
-      window.location = removeUrlAttr(decodeURI(window.location.href), 'cols\\[\\]') + '&' + $j.map(cols,function (a) {
-        return a ? 'cols[]=' + a : null;
-      }).join('&');
-    });
-    $j("#exit-edit").on("click", function (e) {
-      var url = removeUrlAttr(decodeURI(window.location.href), 'cols\\[\\]');
-      url = removeUrlAttr(url, 'edit');
-      url += '&' + $j.map(cols,function (a) {
-        return a ? 'cols[]=' + a : null;
-      }).join('&');
-      window.location = url;
-    });
-  </script>
-<% end %>
+<%
+   end
+%>
 
 <table class="data" id="measures-table">
   <thead>
       <th class="thin"></th>
     <% end %>
     <% filter.display.columns.each do |column| %>
-      <%= list_column_html(filter, column) -%>
+      <%= list_column_html(filter, column, widget_id) -%>
     <% end %>
   </tr>
   </thead>
   <% end %>
 
   </tbody>
-  <%= render :partial => 'utils/tfoot_pagination', :locals => {:pagination => filter.pagination, :colspan => colspan} %>
-</table>
\ No newline at end of file
+  <% pagination_partial = widget_id ? 'utils/tfoot_ajax_pagination' : 'utils/tfoot_pagination' %>
+  <%= render :partial => pagination_partial, :locals => {
+    :pagination => filter.pagination,
+    :colspan => colspan,
+    :id => "measure_filter_foot#{widget_id}",
+    :include_loading => true,
+    :js_function => "pageList#{widget_id}"
+  } -%>
+</table>
+</div>
\ No newline at end of file
index 7129a6b37486d9bbd77754acfee242cdb18d7543..242bb0e6f4eccd646aba588d1457e943850902fd 100644 (file)
           </div>
         </div>
 
-        <% if @filter.security_exclusions %>
-          <p class="notes"><%= message('results_not_display_due_to_security') -%></p>
-        <% end %>
-
-        <% if !@filter.errors.empty? %>
-          <% @filter.errors.full_messages.each do |message| %>
-            <div class="warning"><%= h message %></div>
-          <% end %>
-        <% elsif @filter.rows && @filter.display %>
-          <%= render :partial => "measures/display_#{@filter.display.class::KEY}", :locals => {:filter => @filter, :edit_mode => edit_mode} -%>
-        <% end %>
+        <%= render :partial => 'measures/display', :locals => {:filter => @filter, :edit_mode => edit_mode, :widget_id => nil} -%>
       </div>
     </div>
   <% end %>
diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/utils/_tfoot_ajax_pagination.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/utils/_tfoot_ajax_pagination.html.erb
new file mode 100644 (file)
index 0000000..2ee7bb0
--- /dev/null
@@ -0,0 +1,48 @@
+<tfoot <%= "id=#{id}" if id -%>>
+<tr>
+  <td colspan="<%= colspan || 1 -%>">
+    <div <%= "id=#{id}_pages" if id -%>>
+      <% if pagination.count > 0 %>
+        <%= message('x_results', :params => [pagination.count]) -%>
+      <% end %>
+      <%
+         if pagination.pages > 1
+           max_pages = pagination.pages
+           current_page = pagination.page
+           start_page = 1
+           end_page = max_pages
+           if max_pages > 20
+             if current_page < 12
+               start_page = 1
+               end_page = 20
+             elsif current_page > max_pages-10
+               start_page = max_pages-20
+               end_page = max_pages
+             else
+               start_page = current_page-10
+               end_page = current_page+9
+             end
+           end
+      %>
+        |
+        <% if max_pages > 20 && start_page > 1 %>
+          <%= link_to_function_if current_page != 1, message('paging_first'), "#{js_function}(1)" -%>
+        <% end %>
+        <%= link_to_function_if pagination.previous?, message('paging_previous'), "#{js_function}(#{current_page-1})" -%>
+        <% for index in start_page..end_page %>
+          <%= link_to_function_if index != current_page, index.to_s, "#{js_function}(#{index})" -%>
+        <% end %>
+        <%= link_to_function_if pagination.next?, message('paging_next'), "#{js_function}(#{current_page+1})" -%>
+        <% if max_pages > 20 && end_page < max_pages %>
+          <%= link_to_function_if current_page != max_pages, message('paging_last'), "#{js_function}(#{max_pages})" -%>
+        <%
+           end
+         end
+      %>
+    </div>
+    <% if id && local_assigns[:include_loading] %>
+      <img src="<%= ApplicationController.root_context -%>/images/loading-small.gif" style="display: none" id="<%= id -%>_loading">
+    <% end %>
+  </td>
+</tr>
+</tfoot>
\ No newline at end of file
index f50dafc2aa16fc848cc4bac2eb30f9ec0daf18e1..b35a2976be03d30ceb511ae83e0f0db31bda9496 100644 (file)
@@ -1,6 +1,7 @@
-<tfoot>
+<tfoot <%= "id=#{id}" if id -%>>
 <tr>
   <td colspan="<%= colspan || 1 -%>">
+    <div <%= "id=#{id}_pages" if id -%>>
     <% if pagination.count > 0 %>
       <%= message('x_results', :params => [pagination.count]) -%>
     <% end %>
@@ -25,7 +26,7 @@
     %>
       |
       <% if max_pages > 20 && start_page > 1 %>
-      <%= link_to_if current_page != 1, message('paging_first'), params.merge(:page => 1) %>
+        <%= link_to_if current_page != 1, message('paging_first'), params.merge(:page => 1) %>
       <% end %>
       <%= link_to_if pagination.previous?, message('paging_previous'), params.merge(:page => current_page-1) %>
       <% for index in start_page..end_page %>
       <% end %>
       <%= link_to_if pagination.next?, message('paging_next'), params.merge(:page => current_page+1) %>
       <% if max_pages > 20 && end_page < max_pages %>
-      <%= link_to_if current_page != max_pages, message('paging_last'), params.merge(:page => max_pages) %>
+        <%= link_to_if current_page != max_pages, message('paging_last'), params.merge(:page => max_pages) %>
       <% end %>
-  <%
+    <%
        end
     %>
+    </div>
+    <% if id && local_assigns[:include_loading] %>
+      <img src="<%= ApplicationController.root_context -%>/images/loading-small.gif" style="display: none" id="<%= id -%>_loading">
+    <% end %>
   </td>
 </tr>
 </tfoot>
\ No newline at end of file