Move show-object content into tabs.
authorTom Clegg <tom@curoverse.com>
Tue, 4 Feb 2014 10:54:23 +0000 (02:54 -0800)
committerTom Clegg <tom@curoverse.com>
Tue, 4 Feb 2014 10:54:23 +0000 (02:54 -0800)
refs #1979

16 files changed:
apps/workbench/app/controllers/application_controller.rb
apps/workbench/app/controllers/authorized_keys_controller.rb
apps/workbench/app/controllers/collections_controller.rb
apps/workbench/app/controllers/repositories_controller.rb
apps/workbench/app/controllers/virtual_machines_controller.rb
apps/workbench/app/helpers/authorized_keys_helper.rb
apps/workbench/app/helpers/repositories_helper.rb
apps/workbench/app/helpers/virtual_machines_helper.rb
apps/workbench/app/views/application/_show_attributes.html.erb [new file with mode: 0644]
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 [new file with mode: 0644]
apps/workbench/app/views/collections/_show_jobs.html.erb [new file with mode: 0644]
apps/workbench/app/views/collections/_show_provenance.html.erb [new file with mode: 0644]
apps/workbench/app/views/collections/_show_provenance_graph.html.erb [new file with mode: 0644]
apps/workbench/app/views/collections/_show_source_data.html.erb [new file with mode: 0644]

index 8d6d4949c3c1a57b9a0d9968f8b16c6711ce51ae..3f495ca59330f174122ea7dd593cafd08917123a 100644 (file)
@@ -54,9 +54,6 @@ class ApplicationController < ActionController::Base
     self.render_error status: 404
   end
 
-  def helper
-    (self.class.to_s.sub(/Controller$/,'')+'Helper').constantize
-  end
   def index
     @objects ||= model_class.limit(1000).all
     respond_to do |f|
index 2e3d8b1efb6819721472db1ff881dcc2f5826899..4cd5280b9fe65e7638490421fa430e0ad9462272 100644 (file)
@@ -1,6 +1,6 @@
 class AuthorizedKeysController < ApplicationController
   def index_pane_list
-    %w(recent setup)
+    %w(recent help)
   end
 
   def new
index 62e513db09ef1f7c47beeafa355ac337c4e1402f..7feba20c881d5ca2c32493d8a784b9c5c0bb2a05 100644 (file)
@@ -2,6 +2,9 @@ class CollectionsController < ApplicationController
   skip_before_filter :find_object_by_uuid, :only => [:provenance]
   skip_before_filter :check_user_agreements, :only => [:show_file]
 
+  def show_pane_list
+    %w(files attributes provenance provenance_graph)
+  end
   def index
     if params[:search].andand.length.andand > 0
       tags = Link.where(any: ['contains', params[:search]])
index d710bd611d8814a7cff4c4725d9b25699d86467f..b6b3295ef8a381f71bc6439446307639d9bbb269 100644 (file)
@@ -1,2 +1,5 @@
 class RepositoriesController < ApplicationController
+  def index_pane_list
+    %w(recent help)
+  end
 end
index a62ba81b0941cf46870ddc7f27bf3b97692fd172..c3512e2e4d1028635cda1a51b1c09f2a2b63ade5 100644 (file)
@@ -1,4 +1,7 @@
 class VirtualMachinesController < ApplicationController
+  def index_pane_list
+    %w(recent help)
+  end
   def index
     @objects ||= model_class.all
     @vm_logins = {}
index 1ea45c177533fb7d36d4ebbe7d53b9310b943b74..9a486f28ae37a325fe7e6a56249bfb7a6a0b9ec3 100644 (file)
@@ -1,5 +1,2 @@
 module AuthorizedKeysHelper
-  def index_pane_list
-    %w(recent help)
-  end
 end
index c8d1590ba421e6f98f4a6ffa20c20be2c19430a3..2860b5a91632501f329faf3df6a1929614250c15 100644 (file)
@@ -1,5 +1,2 @@
 module RepositoriesHelper
-  def index_pane_list
-    %w(recent help)
-  end
 end
index 69a3e2177c390f7fe57c0f6f611ddbfd142356f5..cbb398d1b9474b6d817212274ceb8d955d578356 100644 (file)
@@ -1,5 +1,2 @@
 module VirtualMachinesHelper
-  def index_pane_list
-    %w(recent help)
-  end
 end
diff --git a/apps/workbench/app/views/application/_show_attributes.html.erb b/apps/workbench/app/views/application/_show_attributes.html.erb
new file mode 100644 (file)
index 0000000..0e8d2a2
--- /dev/null
@@ -0,0 +1 @@
+<%= render partial: 'arvados_object' %>
index e3dde58cad4cfbe982a8c584e6a29f9222f15f23..95e0b4172af179b1da0457eb8270bf19a6df29fa 100644 (file)
@@ -12,7 +12,7 @@
 &nbsp;
 <% end rescue nil %>
 
-<% pane_list = (controller.class.to_s.sub(/Controller$/,'')+'Helper').constantize.index_pane_list rescue %w(recent) %>
+<% pane_list = controller.index_pane_list rescue %w(recent) %>
 
 <div class="tabbable">
 <ul class="nav nav-tabs">
index f3046990c1ff32c82d6ef4383ca45c78bb6ce52f..348d9d982acdd8920ca9e23c78192948324c1fe5 100644 (file)
 <% end %>
 <% end %>
 
+<% pane_list = controller.show_pane_list rescue %w(attributes) %>
 
-<%= render :partial => 'application/arvados_object' %>
+<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"><%= pane.capitalize.gsub '_', ' ' %></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: 'show_' + pane %>
+  </div>
+  <% end %>
+</div>
diff --git a/apps/workbench/app/views/collections/_show_files.html.erb b/apps/workbench/app/views/collections/_show_files.html.erb
new file mode 100644 (file)
index 0000000..3973800
--- /dev/null
@@ -0,0 +1,34 @@
+<table class="table table-bordered" style="table-layout: fixed">
+  <thead>
+    <tr>
+      <th>path</th>
+      <th>file</th>
+      <th style="width:1.5em">d/l</th>
+      <th style="width: 7em; text-align:right">size</th>
+    </tr>
+  </thead><tbody>
+    <% if @object then @object.files.sort_by{|f|f[1]}.each do |file| %>
+    <% file_path = "#{file[0]}/#{file[1]}" %>
+    <tr>
+      <td>
+        <%= file[0] %>
+      </td>
+
+      <td>
+        <%= link_to file[1], {controller: 'collections', action: 'show_file', uuid: @object.uuid, file: file_path, size: file[2], disposition: 'inline'}, {title: 'View in browser'} %>
+      </td>
+
+      <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'} %>
+        </div>
+      </td>
+
+      <td style="text-align:right">
+        <%= raw(human_readable_bytes_html(file[2])) %>
+      </td>
+
+    </tr>
+    <% end; end %>
+  </tbody>
+</table>
diff --git a/apps/workbench/app/views/collections/_show_jobs.html.erb b/apps/workbench/app/views/collections/_show_jobs.html.erb
new file mode 100644 (file)
index 0000000..98fd199
--- /dev/null
@@ -0,0 +1,64 @@
+<table class="topalign table table-bordered">
+  <thead>
+    <tr class="contain-align-left">
+      <th>
+       job
+      </th><th>
+       version
+      </th><th>
+       status
+      </th><th>
+       start
+      </th><th>
+       finish
+      </th><th>
+       clock time
+      </th>
+    </tr>
+  </thead>
+  <tbody>
+
+    <% @provenance.reverse.each do |p| %>
+    <% j = p[:job] %>
+
+    <% if j %>
+
+    <tr class="job">
+      <td>
+       <tt><%= j.uuid %></tt>
+       <br />
+       <tt class="deemphasize"><%= j.submit_id %></tt>
+      </td><td>
+       <%= j.script_version %>
+      </td><td>
+        <span class="label <%= if j.success then 'label-success'; elsif j.running then 'label-primary'; else 'label-warning'; end %>">
+         <%= j.success || j.running ? 'ok' : 'failed' %>
+        </span>
+      </td><td>
+       <%= j.started_at %>
+      </td><td>
+       <%= j.finished_at %>
+      </td><td>
+       <% if j.started_at and j.finished_at %>
+       <%= raw(distance_of_time_in_words(j.started_at, j.finished_at).sub('about ','~').sub(' ','&nbsp;')) %>
+       <% elsif j.started_at and j.running %>
+       <%= raw(distance_of_time_in_words(j.started_at, Time.now).sub('about ','~').sub(' ','&nbsp;')) %> (running)
+       <% end %>
+      </td>
+    </tr>
+
+    <% else %>
+    <tr>
+      <td>
+       <span class="label label-danger">lookup fail</span>
+       <br />
+       <tt class="deemphasize"><%= p[:target] %></tt>
+      </td><td colspan="4">
+      </td>
+    </tr>
+    <% end %>
+
+    <% end %>
+
+  </tbody>
+</table>
diff --git a/apps/workbench/app/views/collections/_show_provenance.html.erb b/apps/workbench/app/views/collections/_show_provenance.html.erb
new file mode 100644 (file)
index 0000000..bd96238
--- /dev/null
@@ -0,0 +1,84 @@
+<%= content_for :css do %>
+<%# https://github.com/mbostock/d3/wiki/Ordinal-Scales %>
+<% n=-1; %w(#1f77b4 #ff7f0e #2ca02c #d62728 #9467bd #8c564b #e377c2 #7f7f7f #bcbd22 #17becf).each do |color| %>
+.colorseries-10-<%= n += 1 %>, .btn.colorseries-10-<%= n %>:hover, .label.colorseries-10-<%= n %>:hover {
+  *background-color: <%= color %>;
+  background-color: <%= color %>;
+  background-image: none;
+}
+<% end %>
+.colorseries-nil { }
+.label a {
+  color: inherit;
+}
+<% end %>
+
+<table class="topalign table table-bordered">
+  <thead>
+  </thead>
+  <tbody>
+
+    <% @provenance.reverse.each do |p| %>
+    <% j = p[:job] %>
+
+    <% if j %>
+
+    <tr class="job">
+      <td style="padding-bottom: 3em">
+        <table class="table" style="margin-bottom: 0; background: #f0f0ff">
+         <% j.script_parameters.each do |k,v| %>
+          <tr>
+            <td style="width: 20%">
+              <%= k.to_s %>
+            </td><td style="width: 60%">
+             <% if v and @output2job.has_key? v %>
+             <tt class="label colorseries-10-<%= @output2colorindex[v] %>"><%= link_to_if_arvados_object v %></tt>
+              <% else %>
+             <span class="deemphasize"><%= link_to_if_arvados_object v %></span>
+              <% end %>
+            </td><td style="text-align: center; width: 20%">
+              <% if v
+                 if @protected[v]
+                 labelclass = 'success'
+                 labeltext = 'keep'
+                 else
+                 labelclass = @output2job.has_key?(v) ? 'warning' : 'danger'
+                 labeltext = 'cache'
+                 end %>
+
+             <tt class="label label-<%= labelclass %>"><%= labeltext %></tt>
+              <% end %>
+            </td>
+          </tr>
+         <% end %>
+        </table>
+        <div style="text-align: center">
+          &darr;
+          <br />
+         <span class="label"><%= j.script %><br /><tt><%= link_to_if j.script_version.match(/[0-9a-f]{40}/), j.script_version, "https://arvados.org/projects/arvados/repository/revisions/#{j.script_version}/entry/crunch_scripts/#{j.script}" if j.script_version %></tt></span>
+          <br />
+          &darr;
+          <br />
+         <tt class="label colorseries-10-<%= @output2colorindex[p[:output]] %>"><%= link_to_if_arvados_object p[:output] %></tt>
+        </div>
+      </td>
+      <td>
+       <tt><span class="deemphasize">job:</span><br /><%= link_to_if_arvados_object j %><br /><span class="deemphasize"><%= j.submit_id %></span></tt>
+      </td>
+    </tr>
+
+    <% else %>
+    <tr>
+      <td>
+       <span class="label label-danger">lookup fail</span>
+       <br />
+       <tt class="deemphasize"><%= p[:target] %></tt>
+      </td><td colspan="5">
+      </td>
+    </tr>
+    <% end %>
+
+    <% end %>
+
+  </tbody>
+</table>
diff --git a/apps/workbench/app/views/collections/_show_provenance_graph.html.erb b/apps/workbench/app/views/collections/_show_provenance_graph.html.erb
new file mode 100644 (file)
index 0000000..1f367c7
--- /dev/null
@@ -0,0 +1,9 @@
+<% content_for :js do %>
+    $(function() {
+      $('#prov-tab').on('shown', function() { provenance_sizing_fixup("provenance_graph", "provenance_svg"); });
+    })
+<% end %>
+<%= render partial: 'application/svg_div', locals: {
+    divId: "provenance_graph", 
+    svgId: "provenance_svg", 
+    svg: @prov_svg } %>
diff --git a/apps/workbench/app/views/collections/_show_source_data.html.erb b/apps/workbench/app/views/collections/_show_source_data.html.erb
new file mode 100644 (file)
index 0000000..cb96f08
--- /dev/null
@@ -0,0 +1,44 @@
+<table class="table table-bordered table-striped">
+  <thead>
+    <tr class="contain-align-left">
+      <th>
+       collection
+      </th><th class="data-size">
+       data size
+      </th><th>
+       storage
+      </th><th>
+       origin
+      </th>
+    </tr>
+  </thead>
+  <tbody>
+
+    <% @sourcedata.values.each do |sourcedata| %>
+
+    <tr class="collection">
+      <td>
+       <tt class="label"><%= sourcedata[:uuid] %></tt>
+      </td><td class="data-size">
+       <%= raw(human_readable_bytes_html(sourcedata[:collection].data_size)) if sourcedata[:collection] and sourcedata[:collection].data_size %>
+      </td><td>
+       <% if @protected[sourcedata[:uuid]] %>
+       <span class="label label-success">keep</span>
+       <% else %>
+       <span class="label label-danger">cache</span>
+       <% end %>
+      </td><td>
+       <% if sourcedata[:data_origins] %>
+       <% sourcedata[:data_origins].each do |data_origin| %>
+       <span class="deemphasize"><%= data_origin[0] %></span>
+       <%= data_origin[2] %>
+       <br />
+       <% end %>
+       <% end %>
+      </td>
+    </tr>
+
+    <% end %>
+
+  </tbody>
+</table>