Merge remote-tracking branch 'origin/master' into 2961-load-tab-partials
authorPeter Amstutz <peter.amstutz@curoverse.com>
Mon, 9 Jun 2014 13:09:20 +0000 (09:09 -0400)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Mon, 9 Jun 2014 13:09:20 +0000 (09:09 -0400)
13 files changed:
apps/workbench/app/assets/images/ajax-loader.gif [new file with mode: 0644]
apps/workbench/app/assets/javascripts/event_log.js
apps/workbench/app/assets/javascripts/pipeline_instances.js
apps/workbench/app/controllers/application_controller.rb
apps/workbench/app/controllers/collections_controller.rb
apps/workbench/app/controllers/folders_controller.rb
apps/workbench/app/controllers/groups_controller.rb
apps/workbench/app/controllers/jobs_controller.rb
apps/workbench/app/controllers/pipeline_instances_controller.rb
apps/workbench/app/controllers/sessions_controller.rb
apps/workbench/app/models/arvados_api_client.rb
apps/workbench/app/views/application/_content.html.erb
apps/workbench/app/views/pipeline_instances/_show_components.html.erb

diff --git a/apps/workbench/app/assets/images/ajax-loader.gif b/apps/workbench/app/assets/images/ajax-loader.gif
new file mode 100644 (file)
index 0000000..3288d10
Binary files /dev/null and b/apps/workbench/app/assets/images/ajax-loader.gif differ
index 0ebb999b7645f69907e0f9b56b4958c549d3f74c..0539021d836c9fd23d8aa374ed20950ef776ba15 100644 (file)
@@ -4,7 +4,7 @@
 
 /* The subscribe method takes a window element id and object id.
    Any log events for that particular object id are sent to that window element. */
-function subscribeToEventLog (elementId) {
+function subscribeToEventLog () {
   // if websockets are not supported by browser, do not subscribe for events
   websocketsSupported = ('WebSocket' in window);
   if (websocketsSupported == false) {
@@ -40,6 +40,13 @@ function onEventLogDispatcherMessage(event) {
   object_uuid = parsedData.object_uuid;
 
   // if there are any listeners for this object uuid or "all", trigger the event
-  matches = ".arv-log-event-listener[data-object-uuid=\"" + object_uuid + "\"],.arv-log-event-listener[data-object-uuids~=\"" + object_uuid + "\"],.arv-log-event-listener[data-object-uuid=\"all\"]";
+  matches = ".arv-log-event-listener[data-object-uuid=\"" + object_uuid + "\"],.arv-log-event-listener[data-object-uuids~=\"" + object_uuid + "\"],.arv-log-event-listener[data-object-uuid=\"all\"],.arv-log-event-listener[data-object-kind=\"" + parsedData.object_kind + "\"]";
   $(matches).trigger('arv-log-event', event.data);
 }
+
+$(document).on('ajax:complete ready', function() {
+  var a = $('.arv-log-event-listener');
+  if (a.length > 0) {
+    subscribeToEventLog();
+  }
+});
index d23ced7fbc31335cd5d44217f4448bf5e1f2398b..c61e336c7ae2377c343fa159b6c9c39abf4fc33d 100644 (file)
@@ -47,21 +47,12 @@ $(document).on('ready ajax:complete', function() {
     run_pipeline_button_state();
 });
 
-$(document).on('ajax:complete ready', function() {
-  var a = $('.arv-log-event-listener');
-  if (a.length > 0) {
-    $('.arv-log-event-listener').each(function() {
-      subscribeToEventLog(this.id);
-    });
-  }
-});
-
 $(document).on('arv-log-event', '.arv-log-event-handler-append-logs', function(event, eventData){
-  parsedData = JSON.parse(eventData);
+  var parsedData = JSON.parse(eventData);
 
-  propertyText = undefined
+  var propertyText = undefined
 
-  properties = parsedData.properties;
+  var properties = parsedData.properties;
     if (properties !== null) {
       propertyText = properties.text;
     }
index 7d49f55e33625c4eaa477762ba7652192b58e924..78884a020ef781b9840b5ced4ae383d204869a1f 100644 (file)
@@ -87,7 +87,15 @@ class ApplicationController < ActionController::Base
     @objects = @objects.filter(@filters).limit(@limit).offset(@offset).all
     respond_to do |f|
       f.json { render json: @objects }
-      f.html { render }
+      f.html {
+        if params['tab_pane']
+          comparable = self.respond_to? :compare
+          render(partial: 'show_' + params['tab_pane'].downcase,
+                 locals: { comparable: comparable, objects: @objects })
+        else
+          render
+        end
+      }
       f.js { render }
     end
   end
@@ -97,12 +105,19 @@ class ApplicationController < ActionController::Base
       return render_not_found("object not found")
     end
     respond_to do |f|
+      puts f
       f.json { render json: @object.attributes.merge(href: url_for(@object)) }
       f.html {
-        if request.method == 'GET'
-          render
+        if params['tab_pane']
+          comparable = self.respond_to? :compare
+          render(partial: 'show_' + params['tab_pane'].downcase,
+                 locals: { comparable: comparable, objects: @objects })
         else
-          redirect_to params[:return_to] || @object
+          if request.method == 'GET'
+            render
+          else
+            redirect_to params[:return_to] || @object
+          end
         end
       }
       f.js { render }
@@ -174,8 +189,18 @@ class ApplicationController < ActionController::Base
   end
 
   def current_user
+    return Thread.current[:user] if Thread.current[:user]
+
     if Thread.current[:arvados_api_token]
-      Thread.current[:user] ||= User.current
+      if session[:user]
+        if session[:user][:is_active] != true
+          Thread.current[:user] = User.current
+        else
+          Thread.current[:user] = User.new(session[:user])
+        end
+      else
+        Thread.current[:user] = User.current
+      end
     else
       logger.error "No API token in Thread"
       return nil
@@ -269,6 +294,15 @@ class ApplicationController < ActionController::Base
         # call to verify its authenticity.
         if verify_api_token
           session[:arvados_api_token] = params[:api_token]
+          u = User.current
+          session[:user] = {
+            email: u.email,
+            first_name: u.first_name,
+            last_name: u.last_name,
+            is_active: u.is_active,
+            is_admin: u.is_admin,
+            prefs: u.prefs
+          }
           if !request.format.json? and request.method == 'GET'
             # Repeat this request with api_token in the (new) session
             # cookie instead of the query string.  This prevents API
@@ -413,6 +447,8 @@ class ApplicationController < ActionController::Base
   }
 
   def check_user_notifications
+    return if params['tab_pane']
+
     @notification_count = 0
     @notifications = []
 
index 218ba893fc43d6c089be664a80baf7e570d2e6be..7c6bab63f6ee6f580d9f02b2ad1a74568c7b3497 100644 (file)
@@ -88,6 +88,8 @@ class CollectionsController < ApplicationController
       info[:links] << link
     end
     @request_url = request.url
+
+    super
   end
 
   def show_file_links
index 8ebb1a34b101bf8bdbab1050a3485f9330ab8d0f..e00608eb8d7a909b67f6a2af50afed737557cd00 100644 (file)
@@ -74,6 +74,8 @@ class FoldersController < ApplicationController
     @shared_folder_tree =
       sorted_paths.call({'Shared with me' =>
                           buildtree.call(children_of, false)})
+
+    super
   end
 
   def choose
index 854496a56a27c2e73e4a2b6a68cbc8803a440bac..30cd1e35c8b8d8971b994d44c531d322cc71dcea 100644 (file)
@@ -4,6 +4,7 @@ class GroupsController < ApplicationController
     @group_uuids = @groups.collect &:uuid
     @links_from = Link.where link_class: 'permission', tail_uuid: @group_uuids
     @links_to = Link.where link_class: 'permission', head_uuid: @group_uuids
+    super
   end
 
   def show
index 841d3a9fdc6827486a7f54948e6c63ee4b3b5b1a..dc31229189e9a7be5636eb38ec58f9aa510aec0e 100644 (file)
@@ -1,6 +1,8 @@
 class JobsController < ApplicationController
 
   def generate_provenance(jobs)
+    return if params['tab_pane'] != "Provenance"
+
     nodes = []
     collections = []
     jobs.each do |j|
@@ -27,8 +29,8 @@ class JobsController < ApplicationController
       generate_provenance(@objects)
     else
       @limit = 20
-      super
     end
+    super
   end
 
   def cancel
@@ -38,6 +40,7 @@ class JobsController < ApplicationController
 
   def show
     generate_provenance([@object])
+    super
   end
 
   def index_pane_list
index 761dc914145904ca92a01ab28fceb8a9e2acd674..500927bdb62ba240301382cc0239a50f308d34ab 100644 (file)
@@ -4,7 +4,9 @@ class PipelineInstancesController < ApplicationController
   include PipelineInstancesHelper
 
   def graph(pipelines)
-    count = {}    
+    return nil, nil if params['tab_pane'] != "Graph"
+
+    count = {}
     provenance = {}
     pips = {}
     n = 1
@@ -43,7 +45,7 @@ class PipelineInstancesController < ApplicationController
         pips[uuid] = 0 unless pips[uuid] != nil
         pips[uuid] |= n
       end
-      
+
       n = n << 1
     end
 
@@ -60,13 +62,15 @@ class PipelineInstancesController < ApplicationController
     end
 
     provenance, pips = graph(@pipelines)
+    if provenance
+      @prov_svg = ProvenanceHelper::create_provenance_graph provenance, "provenance_svg", {
+        :request => request,
+        :all_script_parameters => true,
+        :combine_jobs => :script_and_version,
+        :script_version_nodes => true,
+        :pips => pips }
+    end
 
-    @prov_svg = ProvenanceHelper::create_provenance_graph provenance, "provenance_svg", {
-      :request => request,
-      :all_script_parameters => true, 
-      :combine_jobs => :script_and_version,
-      :script_version_nodes => true,
-      :pips => pips }
     super
   end
 
@@ -135,7 +139,7 @@ class PipelineInstancesController < ApplicationController
 
     @prov_svg = ProvenanceHelper::create_provenance_graph provenance, "provenance_svg", {
       :request => request,
-      :all_script_parameters => true, 
+      :all_script_parameters => true,
       :combine_jobs => :script_and_version,
       :script_version_nodes => true,
       :pips => pips }
@@ -149,9 +153,9 @@ class PipelineInstancesController < ApplicationController
     panes
   end
 
-  def compare_pane_list 
+  def compare_pane_list
     %w(Compare Graph)
-  end 
+  end
 
   def index
     @limit = 20
index 585f322a859186d06ba02d9b8a37e8f50c965490..abed6b68a7127e33fae06943025385f0bd43a7bc 100644 (file)
@@ -8,5 +8,6 @@ class SessionsController < ApplicationController
   end
   def index
     redirect_to root_url if session[:arvados_api_token]
+    super
   end
 end
index 7574cf665be17d058c737b43d9dc2e65d4f10b94..25c54d1e9ce76385488aff128074c1bdc47a146e 100644 (file)
@@ -194,6 +194,10 @@ class ArvadosApiClient
     resource_class.to_s.underscore
   end
 
+  def self.class_kind(resource_class)
+    resource_class.to_s.underscore
+  end
+
   protected
   def profile_checkpoint label=nil
     return if !@@profiling_enabled
index 8a0624b7afc9a7523a716599964e6fbde8a8b8db..494a3ab8aea095397677aacb9b4e09bc3162bdfe 100644 (file)
@@ -1,30 +1,64 @@
+<% content_for :js do %>
+  function ajaxRefreshTabPane(pane) {
+    $.ajax('<%= url_for @object %>?tab_pane='+pane, {dataType: 'html', type: 'GET'}).
+      done(function(data, status, jqxhr) {
+        $('#' + pane + ' > div > div').html(data);
+        $(document).trigger('ajax:complete')
+      });
+  }
+
+  $(window).on('load', smart_scroll_fixup);
+
+  $(document).on('shown.bs.tab', 'ul.nav-tabs > li > a', smart_scroll_fixup);
+  $(document).on('shown.bs.tab', function(e) {
+    ajaxRefreshTabPane(e.target.id.slice(0, -4));
+  });
+
+  $(document).on('arv-log-event', function() {
+    ajaxRefreshTabPane($('.tab-pane.active')[0].id);
+  });
+<% end %>
+
 <% content_for :tab_panes do %>
 
 <% comparable = controller.respond_to? :compare %>
-<% pane_list ||= %w(recent) %>
-<% panes = Hash[pane_list.map { |pane|
-     [pane, render(partial: 'show_' + pane.downcase,
-                   locals: { comparable: comparable, objects: @objects })]
-   }.compact] %>
 
 <ul class="nav nav-tabs">
-  <% panes.each_with_index do |(pane, content), i| %>
+  <% pane_list.each_with_index do |pane, i| %>
     <li class="<%= 'active' if i==0 %>"><a href="#<%= pane %>" data-toggle="tab" id="<%= pane %>-tab"> <%= pane.gsub('_', ' ') %></a></li>
   <% end %>
 </ul>
 <div class="tab-content">
-<% panes.each_with_index do |(pane, content), i| %>
-  <div id="<%= pane %>" class="tab-pane fade <%= 'in active' if i==0 %>">
+<% pane_list.each_with_index do |pane, i| %>
+  <div id="<%= pane %>"
+       class="tab-pane fade <%= 'in active' if i==0 %> arv-log-event-listener"
+<% if controller.action_name == "index" %>
+       data-object-kind="arvados#<%= ArvadosApiClient.class_kind controller.model_class %>"
+<% else %>
+       data-object-uuid="<%= @object.uuid %>"
+<% end %>
+>
+
+<% content_for :js do %>
+  <% if i != 0 %>
+    $(document).on('ready', function() {
+      ajaxRefreshTabPane('<%= pane %>');
+    });
+  <% end %>
+<% end %>
+
     <div class="smart-scroll" style="margin-top:0.5em;">
-      <%= content %>
+      <div class="pane-content">
+        <% if i == 0 %>
+          <%= render(partial: 'show_' + pane.downcase,
+                     locals: { comparable: comparable, objects: @objects }) %>
+          <% else %>
+            <%= image_tag 'ajax-loader.gif' %>
+        <% end %>
+      </div>
     </div>
   </div>
 <% end %>
 </div>
 
 <% end %>
-
-<% content_for :js do %>
-    $(window).on('load', smart_scroll_fixup);
-    $(document).on('shown.bs.tab', 'ul.nav-tabs > li > a', smart_scroll_fixup);
-<% end %>
index c07561060ef208c2d89941d6b94b13e6a788aefe..099d4cd49cb877f4808aaab01e11137c2c135bbf 100644 (file)
@@ -92,9 +92,6 @@
 </table>
 
 <% if @object.state == 'RunningOnServer' || @object.state == 'RunningOnClient' %>
-<% content_for :js do %>
-setInterval(function(){$('a.refresh').click()}, 15000);
-<% end %>
 
 <% content_for :tab_line_buttons do %>
   <%= form_tag @object, :method => :put do |f| %>