3618: now can use a list of sort columns if there are multiple models involved
authorPhil Hodgson <bitbucket@philhodgson.net>
Thu, 9 Oct 2014 17:05:19 +0000 (13:05 -0400)
committerPhil Hodgson <bitbucket@philhodgson.net>
Thu, 9 Oct 2014 17:05:19 +0000 (13:05 -0400)
(but note that still there can only be one sort column at a time per model)

apps/workbench/app/assets/javascripts/infinite_scroll.js
apps/workbench/app/controllers/application_controller.rb
apps/workbench/app/views/projects/_show_jobs_and_pipelines.html.erb
apps/workbench/app/views/projects/_show_tab_contents.html.erb

index 4c177e1922a1cb325d8f49b98d872af74c8c6854..1f947e1c14c8232a13a022dd791d472859d0de3b 100644 (file)
@@ -182,8 +182,8 @@ $(document).
         var $target = $(this).closest('table').find('[data-infinite-content-params-attr]');
         var params_attr = 'infinite-content-params-' + $target.data('infinite-content-params-attr');
         var params = $target.data(params_attr) || {};
-        params.order = $(this).data('sort-order') + ' ' + direction;
-        $target.data('params_attr', params);
+        params.order = $(this).data('sort-order').split(",").join( ' ' + direction + ', ' ) + ' ' + direction;
+        $target.data(params_attr, params);
         $target.trigger('refresh-content');
     }).
     on('ready arv:pane:loaded refresh-content', function() {
index a027e2ea182c337b3f129a20b3519b22d3155e52..1b87ceaa42261fe236018ed8b0f2406c451caedc 100644 (file)
@@ -107,20 +107,19 @@ class ApplicationController < ActionController::Base
 
   # params[:order]:
   #
-  # The order can be unspecified, or it can be a column name.
+  # The order can be left empty to allow it to default.
+  # Or it can be a comma separated list of real database column names, one per model.
   # Column names should always be qualified by a table name and a direction is optional, defaulting to asc
   # (e.g. "collections.name" or "collections.name desc").
   # If a column name is specified, that table will be sorted by that column.
   # If there are objects from different models that will be shown (such as in Jobs and Pipelines tab),
-  # then a sort column name can optionally be specified for each model, passed as an array (e.g. "['jobs.description', 'pipeline_instances.name']")
+  # then a sort column name can optionally be specified for each model, passed as an comma-separated list (e.g. "jobs.script, pipeline_instances.name")
   # Currently only one sort column name and direction can be specified for each model.
   def load_filters_and_paging_params
     if params[:order].blank?
       @order = 'created_at desc'
-    elsif params[:order].starts_with? '['
-      @order = Oj.load params[:order]
-    else
-      @order = params[:order]
+    elsif !params[:order].is_a? Array
+      @order = params[:order].split(',')
     end
     @order = [@order] unless @order.is_a? Array
 
index df31fec8ee0bf19df7058fa358d0330636d06798..9f6e5238354674a1c99b1a75b63800d15e4915c1 100644 (file)
@@ -1,3 +1,4 @@
 <%= render_pane 'tab_contents', to_string: true, locals: {
-    filters: [['uuid', 'is_a', ["arvados#job", "arvados#pipelineInstance"]]]
+           filters: [['uuid', 'is_a', ["arvados#job", "arvados#pipelineInstance"]]],
+           sortable_columns: { 'name' => 'jobs.script, pipeline_instances.name' }
     }.merge(local_assigns) %>
index 7254d9cf070db08b8aa22ec6c692a2bfa4569e27..af634bfa1240c6a2530c475305339b7a9f526987 100644 (file)
         <th></th>
         <th></th>
         <% sort_order = sortable_columns['name'] %>
-        <th <%= raw sort_order.nil? ? "" : "data-sort-order='#{sort_order}'" %>>
+        <th <% if !sort_order.nil? %>
+              data-sort-order='<%= raw sort_order %>'
+            <% end %> >
           name
         </th>
-        <th>description</th>
+        <% sort_order = sortable_columns['description'] %>
+        <th <% if !sort_order.nil? %>
+              data-sort-order='<%= raw sort_order %>'
+            <% end %> >
+          description
+        </th>
       </tr>
     </thead>
   </table>