* Left nav correctly highlights current section
authorPeter Amstutz <peter.amstutz@curoverse.com>
Thu, 6 Feb 2014 04:04:40 +0000 (23:04 -0500)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Thu, 6 Feb 2014 04:04:40 +0000 (23:04 -0500)
* Refactored pipeline instances and job pages to use tabs
* Uses javascript to adjust height of tab pane so that scrollbars show up in the right place
* Fixed some glyphicons broken by bootstrap 3

21 files changed:
apps/workbench/app/assets/javascripts/application.js
apps/workbench/app/assets/javascripts/provenance.js
apps/workbench/app/assets/stylesheets/application.css.scss
apps/workbench/app/controllers/application_controller.rb
apps/workbench/app/controllers/collections_controller.rb
apps/workbench/app/controllers/jobs_controller.rb
apps/workbench/app/controllers/pipeline_instances_controller.rb
apps/workbench/app/views/application/_arvados_object.html.erb
apps/workbench/app/views/application/_show_api.html.erb [new file with mode: 0644]
apps/workbench/app/views/application/_show_attributes.html.erb
apps/workbench/app/views/application/_show_json.html.erb [new file with mode: 0644]
apps/workbench/app/views/application/_show_links.html.erb [new file with mode: 0644]
apps/workbench/app/views/application/_svg_div.html.erb
apps/workbench/app/views/application/index.html.erb
apps/workbench/app/views/application/show.html.erb
apps/workbench/app/views/collections/_show_files.html.erb
apps/workbench/app/views/jobs/_show_provenance.html.erb [moved from apps/workbench/app/views/jobs/show.html.erb with 77% similarity]
apps/workbench/app/views/layouts/application.html.erb
apps/workbench/app/views/pipeline_instances/_show_components.html.erb [moved from apps/workbench/app/views/pipeline_instances/show.html.erb with 74% similarity]
apps/workbench/app/views/pipeline_instances/_show_graph.html.erb [new file with mode: 0644]
apps/workbench/app/views/pipeline_instances/_show_graph.js.erb [moved from apps/workbench/app/views/pipeline_instances/show.js.erb with 100% similarity]

index 863776bfff979bf5c7897bc8a14d2763d9009843..fbbf8f330b7a254b851e718dc1641d253721afdf 100644 (file)
@@ -14,6 +14,7 @@
 //= require jquery_ujs
 //= require bootstrap
 //= require bootstrap/dropdown
+//= require bootstrap/tab
 //= require bootstrap-editable
 //= require bootstrap-editable-rails
 //= require_tree .
@@ -46,3 +47,4 @@ jQuery(function($){
             $('.loading').hide();
         });
 })(jQuery);
+
index bacbfd1307dece5288c200078aafb4e444381907..53e2d19920359e5eeff4120605fec3fced8fa379 100644 (file)
@@ -29,6 +29,7 @@ function provenance_sizing_fixup(divId, svgId) {
         b.style.paddingTop = String(max) + "px";
     }
 
+    /*
     w = window.innerWidth - 25;
     a.style.width = String(w) + "px";
     gw = parseFloat(g.getAttribute("width"));
@@ -37,7 +38,7 @@ function provenance_sizing_fixup(divId, svgId) {
     }
     else {
         c.style.paddingLeft = "0px";
-    }
+    }*/
 }
 
 function graph_zoom(divId, svgId, scale) {
@@ -51,3 +52,13 @@ function graph_zoom(divId, svgId, scale) {
     pg.scrollLeft = (hcenter * pg.scrollWidth) - (pg.scrollWidth - pg.scrollLeftMax)/2.0;
     provenance_sizing_fixup(divId, svgId);
 }
+
+$(window).on('load resize', function () {
+    var s = document.getElementsByClassName("smart-scroll");
+    for (var i = 0; i < s.length; i++) {
+        a = s[i];
+        var h = window.innerHeight - a.getBoundingClientRect().top - 20;
+        height = String(h) + "px";
+        a.style.height = height;
+    }
+});
index 6fc4522828ca38e4de82410c59d8a6a79aa53d23..d94dc4efa42f291e230ca982bff2d4ad071abfb4 100644 (file)
@@ -117,3 +117,7 @@ ul.arvados-nav li ul li {
     margin-right: 1em;
     float: left
 }
+
+.smart-scroll {
+    overflow: auto;
+}
\ No newline at end of file
index aa87a603840dd3891680a7162f6c0e862cd3161e..4c2d6ddf62ce2c3ddeb2625164de9a8b4785e3db 100644 (file)
@@ -142,6 +142,10 @@ class ApplicationController < ActionController::Base
      (@object.friendly_link_name if @object.respond_to? :friendly_link_name))
   end
 
+  def show_pane_list
+    %w(attributes links json api)
+  end
+
   protected
     
   def find_object_by_uuid
@@ -343,34 +347,5 @@ class ApplicationController < ActionController::Base
     if @notification_count == 0
       @notification_count = ''
     end
-    
-    # @my_ssh_keys = AuthorizedKey.where(authorized_user_uuid: current_user.uuid)
-    # @my_vm_perms = Link.where(tail_uuid: current_user.uuid, head_kind: 'arvados#virtual_machine', link_class: 'permission', name: 'can_login')
-    # @my_repo_perms = Link.where(tail_uuid: current_user.uuid, head_kind: 'arvados#repository', link_class: 'permission', name: 'can_write')
-
-    # @my_tag_links = {}
-
-    # @my_jobs = Job.
-    #   limit(10).
-    #   order('created_at desc').
-    #   where(created_by: current_user.uuid)
-
-    # @my_collections = Collection.
-    #   limit(10).
-    #   order('created_at desc').
-    #   where(created_by: current_user.uuid)
-
-    # Link.limit(1000).where(head_uuid: @my_collections.collect(&:uuid),
-    #                        link_class: 'tag').each do |link|
-    #   (@my_tag_links[link.head_uuid] ||= []) << link
-    # end
-
-    # @my_pipelines = PipelineInstance.
-    #   limit(10).
-    #   order('created_at desc').
-    #   where(created_by: current_user.uuid)
-
-    
-
   end
 end
index c6a7eafafd3de19fcf93dfb0d70ddb5e5aa255ca..c38ca9a98c0ad6924938c5034af49e204e02664f 100644 (file)
@@ -3,7 +3,7 @@ class CollectionsController < ApplicationController
   skip_before_filter :check_user_agreements, :only => [:show_file]
 
   def show_pane_list
-    %w(files attributes provenance provenance_graph used_by)
+    %w(files attributes provenance_graph used_by)
   end
   def index
     if params[:search].andand.length.andand > 0
index e6179ffdd992c1cee118825e0f6792764aa1f608..9b52977b6ef32e47780ec26ede518d30840ab2e1 100644 (file)
@@ -30,4 +30,8 @@ class JobsController < ApplicationController
   def show
     generate_provenance([@object])
   end
+
+  def show_pane_list
+    %w(attributes provenance links json api)
+  end
 end
index 4798271109a24fa6667b520739cf2934c048ed72..b7339c07de0c16323747b6f03801131364aed903 100644 (file)
@@ -128,6 +128,10 @@ class PipelineInstancesController < ApplicationController
       :pips => pips }
   end
 
+  def show_pane_list
+    %w(components graph attributes  links json api)
+  end
+
   protected
   def for_comparison v
     if v.is_a? Hash or v.is_a? Array
index d04ca84439dd6f3216d9d72bab3797a6cc8d5df4..b4bf70dd237993a853df43ae7260913b02581c6c 100644 (file)
@@ -1,57 +1,5 @@
 <% content_for :arvados_object_table do %>
 
-<%= form_for @object do |f| %>
-<table class="table topalign">
-  <thead>
-  </thead>
-  <tbody>
-    <% @object.attributes_for_display.each do |attr, attrvalue| %>
-    <%= render partial: 'application/arvados_object_attr', locals: { attr: attr, attrvalue: attrvalue } %>
-    <% end %>
-  </tbody>
-</table>
-
-<% incoming = Link.where(tail_uuid: @object.uuid) %>
-<% if incoming.items_available > 0 %>
-<h3>Incoming Links</h3>
-<table class="table topalign">
-  <thead>
-  </thead>
-  <tbody>
-    <% incoming.each do |link| %>
-      <tr>
-        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "uuid", attrvalue: link.uuid } %></td>
-        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "link_class", attrvalue: link.link_class } %></td>
-        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "name", attrvalue: link.name } %></td>
-        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "head_uuid", attrvalue: link.head_uuid } %></td>
-        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "properties", attrvalue: link.properties } %></td>
-      </tr>
-    <% end %>
-  </tbody>
-</table>
-<% end %>
-
-<% outgoing = Link.where(head_uuid: @object.uuid) %>
-<% if outgoing.items_available > 0 %>
-<h3>Outgoing Links</h3>
-<table class="table topalign">
-  <thead>
-  </thead>
-  <tbody>
-    <% outgoing.each do |link| %>
-      <tr>
-        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "uuid", attrvalue: link.uuid } %></td>
-        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "link_class", attrvalue: link.link_class } %></td>
-        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "name", attrvalue: link.name } %></td>
-        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "tail_uuid", attrvalue: link.tail_uuid } %></td>
-        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "properties", attrvalue: link.properties } %></td>
-      </tr>
-    <% end %>
-  </tbody>
-</table>
-<% end %>
-
-<% end %>
 <% end %>
 
 <% if content_for? :page_content %>
     </div>
     <% end %>
     <div id="arvados-object-json" class="tab-pane fade in active">
-      <pre>
-<%= JSON.pretty_generate(@object.attributes.reject { |k,v| k == 'id' }) rescue nil %>
-      </pre>
-    </div>
 
-    <% if @object.andand.uuid %>
-
-    <div id="arvados-object-curl" class="tab-pane fade">
-      <pre>
-curl -X PUT \
- -H "Authorization: OAuth2 $ARVADOS_API_TOKEN" \
- --data-urlencode <%= @object.class.to_s.underscore %>@/dev/stdin \
- https://$ARVADOS_API_HOST/arvados/v1/<%= @object.class.to_s.pluralize.underscore %>/<%= @object.uuid %> \
- &lt;&lt;EOF
-<%= JSON.pretty_generate({@object.attributes.keys[-3] => @object.attributes.values[-3]}) %>
-EOF
-      </pre>
-    </div>
-
-    <div id="arvados-object-arv" class="tab-pane fade">
-      <pre>
-arv --pretty <%= @object.class.to_s.underscore %> get \
- --uuid <%= @object.uuid %>
-
-arv <%= @object.class.to_s.underscore %> update \
- --uuid <%= @object.uuid %> \
- --<%= @object.class.to_s.underscore.gsub '_', '-' %> '<%= JSON.generate({@object.attributes.keys[-3] => @object.attributes.values[-3]}).gsub("'","'\''") %>'
-      </pre>
     </div>
 
-    <div id="arvados-object-python" class="tab-pane fade">
-      <pre>
-import arvados
-
-x = arvados.api().<%= @object.class.to_s.pluralize.underscore %>().get(uuid='<%= @object.uuid %>').execute()
-      </pre>
-    </div>
-
-    <% end %>
 
   </div>
 </div>
diff --git a/apps/workbench/app/views/application/_show_api.html.erb b/apps/workbench/app/views/application/_show_api.html.erb
new file mode 100644 (file)
index 0000000..df271e0
--- /dev/null
@@ -0,0 +1,27 @@
+<% if @object.andand.uuid %>
+
+  <pre>
+curl -X PUT \
+ -H "Authorization: OAuth2 $ARVADOS_API_TOKEN" \
+ --data-urlencode <%= @object.class.to_s.underscore %>@/dev/stdin \
+ https://$ARVADOS_API_HOST/arvados/v1/<%= @object.class.to_s.pluralize.underscore %>/<%= @object.uuid %> \
+ &lt;&lt;EOF
+<%= JSON.pretty_generate({@object.attributes.keys[-3] => @object.attributes.values[-3]}) %>
+EOF
+  </pre>
+
+  <pre>
+arv --pretty <%= @object.class.to_s.underscore %> get \
+ --uuid <%= @object.uuid %>
+
+arv <%= @object.class.to_s.underscore %> update \
+ --uuid <%= @object.uuid %> \
+ --<%= @object.class.to_s.underscore.gsub '_', '-' %> '<%= JSON.generate({@object.attributes.keys[-3] => @object.attributes.values[-3]}).gsub("'","'\''") %>'
+      </pre>
+
+    <pre>
+import arvados
+
+x = arvados.api().<%= @object.class.to_s.pluralize.underscore %>().get(uuid='<%= @object.uuid %>').execute()
+      </pre>
+<% end %>
index 0e8d2a2bd8149ea6c7037b143c3051cd0e18d8c3..965ec5a29eb86632b3321eee22173c5ac07835b0 100644 (file)
@@ -1 +1,13 @@
-<%= render partial: 'arvados_object' %>
+<%= form_for @object do |f| %>
+<table class="table topalign">
+  <thead>
+  </thead>
+  <tbody>
+    <% @object.attributes_for_display.each do |attr, attrvalue| %>
+    <%= render partial: 'application/arvados_object_attr', locals: { attr: attr, attrvalue: attrvalue } %>
+    <% end %>
+  </tbody>
+</table>
+
+<% end %>
+
diff --git a/apps/workbench/app/views/application/_show_json.html.erb b/apps/workbench/app/views/application/_show_json.html.erb
new file mode 100644 (file)
index 0000000..2f0cd21
--- /dev/null
@@ -0,0 +1,3 @@
+<pre>
+<%= JSON.pretty_generate(@object.attributes.reject { |k,v| k == 'id' }) rescue nil %>
+</pre>
diff --git a/apps/workbench/app/views/application/_show_links.html.erb b/apps/workbench/app/views/application/_show_links.html.erb
new file mode 100644 (file)
index 0000000..8dcf335
--- /dev/null
@@ -0,0 +1,40 @@
+<% incoming = Link.where(tail_uuid: @object.uuid) %>
+<% if incoming.items_available > 0 %>
+<h3>Incoming Links</h3>
+<table class="table topalign">
+  <thead>
+  </thead>
+  <tbody>
+    <% incoming.each do |link| %>
+      <tr>
+        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "uuid", attrvalue: link.uuid } %></td>
+        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "link_class", attrvalue: link.link_class } %></td>
+        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "name", attrvalue: link.name } %></td>
+        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "head_uuid", attrvalue: link.head_uuid } %></td>
+        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "properties", attrvalue: link.properties } %></td>
+      </tr>
+    <% end %>
+  </tbody>
+</table>
+<% end %>
+
+<% outgoing = Link.where(head_uuid: @object.uuid) %>
+<% if outgoing.items_available > 0 %>
+<h3>Outgoing Links</h3>
+<table class="table topalign">
+  <thead>
+  </thead>
+  <tbody>
+    <% outgoing.each do |link| %>
+      <tr>
+        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "uuid", attrvalue: link.uuid } %></td>
+        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "link_class", attrvalue: link.link_class } %></td>
+        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "name", attrvalue: link.name } %></td>
+        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "tail_uuid", attrvalue: link.tail_uuid } %></td>
+        <td><%= render partial: 'application/arvados_attr_value', locals: { obj: link, attr: "properties", attrvalue: link.properties } %></td>
+      </tr>
+    <% end %>
+  </tbody>
+</table>
+<% end %>
+
index ddc8e6196037823a9843876e14f9e4bf74f8e325..9f5f330cdaf679574eee419aa0b4a35c9fa27ff4 100644 (file)
@@ -27,8 +27,8 @@ stroke-linecap: round;
 
 <div id="_<%= divId %>_container" style="padding-top: 41px; margin-top: -41px">
   <div style="text-align: right">
-    <a style="cursor: pointer"><span class="icon-zoom-out" onclick="graph_zoom('<%= divId %>', '<%= svgId %>', .9)"></span></a>
-    <a style="cursor: pointer"><span class="icon-zoom-in" onclick="graph_zoom('<%= divId %>', '<%= svgId %>', 1./.9)"></span></a>
+    <a style="cursor: pointer"><span class="glyphicon glyphicon-zoom-out" onclick="graph_zoom('<%= divId %>', '<%= svgId %>', .9)"></span></a>
+    <a style="cursor: pointer"><span class="glyphicon glyphicon-zoom-in" onclick="graph_zoom('<%= divId %>', '<%= svgId %>', 1./.9)"></span></a>
   </div>
 
   <div id="<%= divId %>">
index 4ebedf6d69f3090d29546315d650a1fbdb7c1983..26adf59c9f9d14a84b160260ed831e1700e94bc7 100644 (file)
@@ -7,6 +7,7 @@
     { action: 'create', return_to: request.url }, 
     { class: 'btn btn-primary pull-right' } %>
 <% end %>
+
 <%= form_tag({action: 'compare', controller: params[:controller], method: 'get'}, {method: 'get', id: 'compare', class: 'pull-right small-form-margin'}) do |f| %>
 <%= submit_tag 'Compare selected', {class: 'btn btn-primary', disabled: true, style: 'display: none'} %>
 &nbsp;
 
 <% pane_list = controller.index_pane_list rescue %w(recent) %>
 
-<% if pane_list.length > 1 %>
-<div class="tabbable">
 <ul class="nav nav-tabs">
   <% pane_list.each_with_index do |pane, i| %>
-  <li class="<%= 'active' if i==0 %>"><a href="#<%= pane %>" data-toggle="tab" id="<%= pane %>-tab"> <%= pane.capitalize %></a></li>
+    <li class="<%= 'active' if i==0 %>"><a href="#<%= pane %>" data-toggle="tab" id="<%= pane %>-tab"> <%= pane.capitalize %></a></li>
   <% end %>
 </ul>
-
 <div class="tab-content">
-  <% pane_list.each_with_index do |pane, i| %>
-  <div id="<%= pane %>" class="tab-pane fade in <%= 'active' if i==0 %>">
-    <%= render partial: pane %>
+<% pane_list.each_with_index do |pane, i| %>
+  <div id="<%= pane %>" class="tab-pane fade <%= 'in active' if i==0 %>">
+    <div class="smart-scroll">
+      <%= render partial: pane %>
+    </div>
   </div>
-  <% end %>
-</div>
-
-<% else %>
-  <% pane_list.each_with_index do |pane, i| %>
-    <%= render partial: pane %>
-  <% end %>
 <% end %>
+</div>
index d2abd72b87c96bf72cc2b957defb8e88edea1ab6..03a8f9bbb026790b79bd97d29d6b88c4978bf0ff 100644 (file)
@@ -21,9 +21,8 @@
 <% end %>
 <% end %>
 
-<% pane_list = controller.show_pane_list rescue %w(attributes) %>
+<% pane_list = controller.show_pane_list  %>
 
-<div class="tabbable">
 <ul class="nav nav-tabs">
   <% pane_list.each_with_index do |pane, i| %>
   <li class="<%= 'active' if i==0 %>"><a href="#<%= pane %>" data-toggle="tab" id="<%= pane %>-tab"><%= pane.capitalize.gsub '_', ' ' %></a></li>
@@ -33,7 +32,9 @@
 <div class="tab-content">
   <% pane_list.each_with_index do |pane, i| %>
   <div id="<%= pane %>" class="tab-pane fade in <%= 'active' if i==0 %>">
-    <%= render partial: 'show_' + pane %>
+    <div class="smart-scroll">
+      <%= render partial: 'show_' + pane %>
+    </div>
   </div>
   <% end %>
 </div>
index 3973800b7f8924201bc6fd54e98dac2b4ea3a6d0..991c92d746c8797679bd26ea44a32693f7b6dd50 100644 (file)
@@ -3,7 +3,7 @@
     <tr>
       <th>path</th>
       <th>file</th>
-      <th style="width:1.5em">d/l</th>
+      <th style="width: 3em">d/l</th>
       <th style="width: 7em; text-align:right">size</th>
     </tr>
   </thead><tbody>
@@ -20,7 +20,7 @@
 
       <td>
         <div style="display:inline-block">
-          <%= link_to raw('<i class="icon-download"></i>'), {controller: 'collections', action: 'show_file', uuid: @object.uuid, file: file_path, size: file[2], disposition: 'attachment'}, {class: 'label label-info', title: 'Download'} %>
+          <%= link_to raw('<i class="glyphicon glyphicon-download"></i>'), {controller: 'collections', action: 'show_file', uuid: @object.uuid, file: file_path, size: file[2], disposition: 'attachment'}, {class: 'label label-info', title: 'Download'} %>
         </div>
       </td>
 
similarity index 77%
rename from apps/workbench/app/views/jobs/show.html.erb
rename to apps/workbench/app/views/jobs/_show_provenance.html.erb
index 2bc74ca00e3475d2818b7d94b80776fee2994b81..253af56b77120bdc8676df1741ed61b66f5222b6 100644 (file)
@@ -1,5 +1,3 @@
-<%= render partial: 'arvados_object' %>
-
 <%= render partial: 'application/svg_div', locals: {
       divId: "provenance_graph", 
       svgId: "provenance_svg", 
index b5bf677581d4d9ee32be5975c7476078972ed21b..b7f4ad318b52f87aa4a0392b9de38ed00526200d 100644 (file)
   <% end %>
   <style>
     <%= yield :css %>
+    body {
+    min-height: 100%;
+    height: 100%;
+    }
+
     body > div.container-fluid {
     padding-top: 70px; /* 70px to make the container go all the way to the bottom of the navbar */
     }
+    
+    body > div.container-fluid > div.col-sm-9.col-sm-offset-3 {
+    overflow: auto;
+    }
+
     @media (max-width: 979px) { body { padding-top: 0; } }
 
     .navbar .nav li.nav-separator > span.glyphicon.glyphicon-arrow-right {
     width: 400px;
     overflow-y: auto;
     }
-    
+
+    .arvados-nav-container {
+    position: fixed; 
+    top: 70px; 
+    height: calc(100% - 70px); 
+    overflow: auto; 
+    z-index: 2;
+    }
     .arvados-nav-active {
     background: rgb(66, 139, 202);
     }
 
         <li>
           <form class="navbar-form" role="search">
-            <div class="input-group" style="width: 300px">
+            <div class="input-group" style="width: 220px">
               <input type="text" class="form-control" placeholder="search">
-              <span class="input-group-addon"><span class="glyphicon glyphicon-search"></span>
+              <span class="input-group-addon"><span class="glyphicon glyphicon-search"></span></span>
             </div>
+          </form>
         </li>
 
         <li class="dropdown">
     </div>
   </div>
 
-  <div style="padding: 70px 15px 0px">
-    <div class="row">
+  <div class="container-fluid">
       <div class="col-sm-3">
+        <div class="left-nav arvados-nav-container">
         <% if current_user %>
         <div class="well">
         <ul class="arvados-nav">
           <li><a href="/">Dashboard</a></li>
-          <li>Data
-            <ul>
-              <li class="arvados-nav-active"><a href="/humans">Humans</a></li>
-              <li><a href="/traits">Traits</a></li>
-              <li><a href="/specimens">Specimens</a></li>
-              <li><a href="/collections">Files</a></li>
-            </ul>
-          </li>
-          <li>Compute
-            <ul>
-              <li><a href="/pipeline_templates">Pipelines</a></li>
-              <li><a href="/repositories">Script repositories</a></li>
-              <li><a href="/virtual_machines">Virtual machines</a></li>
-            </ul>
-          </li>
-          <li>History
-            <ul>
-              <li><a href="/pipeline_instances">Pipeline history</a></li>
-              <li><a href="/jobs">Job history</a></li>
-            </ul>
-          </li>
+          
+          <% [['Data', [['humans'],
+                        ['traits'],
+                        ['specimens'],
+                        ['collections', 'Files']]],
+              ['Compute', [['pipeline_templates', 'Pipelines'],
+                           ['repositories', 'Code repositories'],
+                           ['virtual_machines']]],
+              ['Activity', [['pipeline_instances', 'Recent pipelines'],
+                            ['jobs', 'Recent jobs']]]].each do |j| %>
+            <li><%= j[0] %>
+              <ul>
+              <% j[1].each do |k| %>
+                <li class="<%= 'arvados-nav-active' if params[:controller] == k[0] %>">
+                  <a href="/<%= k[0] %>">
+                    <%= if k[1] then k[1] else k[0].capitalize.gsub('_', ' ') end %>
+                  </a>
+                </li>
+              <% end %>
+              </ul>
+            </li>
+          <% end %>
+
           <li>Help
             <ul>
               <li><%= link_to 'Tutorials and User guide', "#{Rails.configuration.arvados_docsite}/user", target: "_blank" %></li>
             </ul>
           </li>
           <% if current_user.andand.is_admin %>
-          <li>Admin
-            <ul>
-              <li><a href="/users">Users</a></li>
-              <li><a href="/groups">Groups</a></li>
-              <li><a href="/compute_nodes">Compute nodes</a></li>
-              <li><a href="/keep_disks">Keep disks</a></li>
-            </ul>
-          </li>
+
+          <% [['Admin', [['users'],
+                         ['groups'],
+                         ['nodes', 'Compute nodes'],
+                         ['keep_disks']]]].each do |j| %>   
+            <li><%= j[0] %>
+              <ul>
+              <% j[1].each do |k| %>
+                <li class="<%= "arvados-nav-active" if params[:controller] == k[0] %>">
+                  <a href="/<%= k[0] %>">
+                    <%= if k[1] then k[1] else k[0].capitalize.gsub('_', ' ') end %>
+                  </a>
+                </li>
+              <% end %>
+              </ul>
+            </li>
+          <% end %>
           <% end %>
         </ul>
         </div>
         <% end %>
       </div>
-      <div class="col-sm-9">
-        <%= yield %>
+        </div>
+      <div class="col-sm-9 col-sm-offset-3">
+        <div id="content">
+          <%= yield %>
+        </div>
       </div>
-    </div>
   </div>
 
   <%= piwik_tracking_tag %>
similarity index 74%
rename from apps/workbench/app/views/pipeline_instances/show.html.erb
rename to apps/workbench/app/views/pipeline_instances/_show_components.html.erb
index cf56b9798d191e2cd571819712494da941ae8d0f..c6f7f9a89842088e1cd2366af4aa55b98009ec62 100644 (file)
@@ -65,23 +65,6 @@ table.pipeline-components-table div.progress {
   </tfoot>
 </table>
 
-<% if @pipelines.count > 1 %>
-  <div style="text-align: center">
-    <span class="pipeline_color_legend" style="background: #88ff88">This pipeline</span> 
-    <span class="pipeline_color_legend" style="background: #8888ff">Comparison pipeline</span>
-    <span class="pipeline_color_legend" style="background: #88ffff">Shared by both pipelines</span>
-  </div>
-<% end %>
-
-   <%= render partial: 'application/svg_div', locals: {
-         divId: "provenance_graph", 
-         svgId: "provenance_svg", 
-         svg: @prov_svg } %>
-
-<div style="height: 1em"></div>
-
-<%= render partial: 'arvados_object' %>
-
 <% if @object.active %>
 <% content_for :js do %>
 setInterval(function(){$('a.refresh').click()}, 30000);
diff --git a/apps/workbench/app/views/pipeline_instances/_show_graph.html.erb b/apps/workbench/app/views/pipeline_instances/_show_graph.html.erb
new file mode 100644 (file)
index 0000000..ad3a8bb
--- /dev/null
@@ -0,0 +1,19 @@
+<% content_for :css do %>
+  .pipeline_color_legend {
+    padding-left: 1em;
+    padding-right: 1em;
+  }
+<% end %>
+
+<% if @pipelines.count > 1 %>
+  <div style="text-align: center">
+    <span class="pipeline_color_legend" style="background: #88ff88">This pipeline</span> 
+    <span class="pipeline_color_legend" style="background: #8888ff">Comparison pipeline</span>
+    <span class="pipeline_color_legend" style="background: #88ffff">Shared by both pipelines</span>
+  </div>
+<% end %>
+
+<%= render partial: 'application/svg_div', locals: {
+      divId: "provenance_graph", 
+      svgId: "provenance_svg", 
+      svg: @prov_svg } %>