Merge branch '4840-workbench-selections-action-forms-wip'
authorBrett Smith <brett@curoverse.com>
Mon, 19 Jan 2015 20:27:42 +0000 (15:27 -0500)
committerBrett Smith <brett@curoverse.com>
Mon, 19 Jan 2015 20:28:55 +0000 (15:28 -0500)
Closes #4840, #4996.

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

index 0068b738ec903067c3352e9ae92d5a6ed82c2b19..55df78697c59112b50e4b0d61f753dc56f775453 100644 (file)
@@ -11,29 +11,43 @@ jQuery(function($){
 });
 
 function dispatch_selection_action() {
-    // Build a new "href" attribute for this link by starting with the
-    // "data-href" attribute and appending ?foo[]=bar&foo[]=baz (or
-    // &foo=... as appropriate) to reflect the current object
-    // selections.
-    var data = [];
-    var param_name = $(this).attr('data-selection-param-name');
-    var href = $(this).attr('data-href');
-    if ($(this).closest('.disabled').length > 0) {
+    /* When the user clicks a selection action link, build a form to perform
+       the action on the selected data, and submit it.
+       This is based on handleMethod from rails-ujs, extended to add the
+       selections to the submitted form.
+       Copyright (c) 2007-2010 Contributors at http://github.com/rails/jquery-ujs/contributors
+       */
+    var $container = $(this);
+    if ($container.closest('.disabled').length) {
         return false;
     }
-    $(this).
+    $container.closest('.dropdown-menu').dropdown('toggle');
+
+    var href = $container.data('href'),
+    method = $container.data('method') || 'GET',
+    paramName = $container.data('selection-param-name'),
+    csrfToken = $('meta[name=csrf-token]').attr('content'),
+    csrfParam = $('meta[name=csrf-param]').attr('content'),
+    form = $('<form method="post" action="' + href + '"></form>'),
+    metadataInput = ('<input name="_method" value="' + method +
+                     '" type="hidden" />');
+
+    if (csrfParam !== undefined && csrfToken !== undefined) {
+        metadataInput += ('<input type="hidden" name="' + csrfParam +
+                          '" value="' + csrfToken + '" />');
+    }
+    $container.
         closest('.selection-action-container').
         find(':checkbox:checked:visible').
-        each(function() {
-            data.push({name: param_name, value: $(this).val()});
+        each(function(index, elem) {
+            metadataInput += ('<input type="hidden" name="' + paramName +
+                              '" value="' + elem.value + '" />');
         });
-    if (href.indexOf('?') >= 0)
-        href += '&';
-    else
-        href += '?';
-    href += $.param(data, true);
-    $(this).attr('href', href);
-    return true;
+
+    form.data('remote', $container.data('remote'));
+    form.hide().append(metadataInput).appendTo('body');
+    form.submit();
+    return false;
 }
 
 function enable_disable_selection_actions() {
index 3ca0fc73c0f9c55113fd1a737585bb03600dfd87..a064d5399f7fce8be577f6df7c8a38107bf39398 100644 (file)
@@ -255,7 +255,7 @@ class ApplicationController < ActionController::Base
       f.html {
         if params['tab_pane']
           render_pane(if params['tab_pane'].is_a? Hash then params['tab_pane']["name"] else params['tab_pane'] end)
-        elsif request.method.in? ['GET', 'HEAD']
+        elsif request.request_method.in? ['GET', 'HEAD']
           render
         else
           redirect_to (params[:return_to] ||
index e1996a7f406f2700dbfb291b07cd1d7962d6164e..a6a371275b35b54782c5e647eb611efd887090f7 100644 (file)
@@ -7,7 +7,7 @@
       >
     <td>
       <div style="width:1em; display:inline-block;">
-        <%= render partial: 'selection_checkbox', locals: {object: name_object, friendly_name: ((name_object.name rescue '') || '')} %>
+        <%= render partial: 'selection_checkbox', locals: {object: object, friendly_name: ((name_object.name rescue '') || '')} %>
       </div>
     </td>
 
index fe9595a527b20dc96f038e745550052bf50e0d0c..bf8e4667cf644dc8576432a9ffca107117cd3938 100644 (file)
                   'data-selection-action' => 'combine-project-contents',
                   'data-toggle' => 'dropdown'
             %></li>
-          <li><%= link_to "Compare selected", 'action',
+          <li><%= link_to "Compare selected", '#',
                   'data-href' => compare_pipeline_instances_path,
                   'data-selection-param-name' => 'uuids[]',
-                  'data-selection-action' => 'compare'
+                  'data-selection-action' => 'compare',
+                  'data-toggle' => 'dropdown'
             %></li>
           <li><%= link_to "Copy selected...", '#',
                   'data-href' => choose_projects_path(
@@ -34,7 +35,8 @@
                       success: 'page-refresh'}.to_json),
                   'data-remote' => true,
                   'data-selection-param-name' => 'selection[]',
-                  'data-selection-action' => 'copy'
+                  'data-selection-action' => 'copy',
+                  'data-toggle' => 'dropdown'
             %></li>
           <% if @object.editable? %>
           <li><%= link_to "Move selected...", '#',
@@ -51,7 +53,8 @@
                       success: 'page-refresh'}.to_json),
                   'data-remote' => true,
                   'data-selection-param-name' => 'selection[]',
-                  'data-selection-action' => 'move'
+                  'data-selection-action' => 'move',
+                  'data-toggle' => 'dropdown'
             %></li>
           <li><%= link_to "Remove selected", '#',
                   method: :delete,