2872: Merge branch 'master' into 2872-folder-nav
[arvados.git] / apps / workbench / app / views / collections / show.html.erb
index afe4606223e13ba3bfd5c03dd2eee4f0cc28ebf3..f91357b12067b4f4662bdfaebd6cf3ccfac81490 100644 (file)
-<%= 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;
-}
-#provenance_graph {
- padding-left: 3px;
- overflow:auto;
- border:solid;
- border-width:1px;
- border-color: gray
-}
-<% end %>
-
-<%#= render :partial => 'nav' %>
-
-<div class="tabbable">
-<ul class="nav nav-tabs">
-  <li class="active"><a href="#files" data-toggle="tab">Files (<%= @object.files ? @object.files.size : 0 %>)</a></li>
-  <li><a href="#provenance" data-toggle="tab">Provenance (<%= @provenance.size %>)</a></li>
-  <li><a href="#jobs" data-toggle="tab">Jobs (<%= @provenance.size %>)</a></li>
-  <li><a href="#sourcedata" data-toggle="tab">Source data (<%= @sourcedata.size %>)</a></li>
-  <li><a href="#owner-groups-resources" data-toggle="tab">Owner, groups, resources</a></li>
-  <li><a href="#provenance2" data-toggle="tab" id="prov-tab">Provenance graph</a></li>
-  <li><a href="#used-by" data-toggle="tab">Used by</a></li>
-</ul>
-
-<div class="tab-content">
-  <div id="files" class="tab-pane fade in active">
-    <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>
+<div class="row row-fill-height">
+  <div class="col-md-6">
+    <div class="panel panel-info">
+      <div class="panel-heading">
+       <h3 class="panel-title">
+          <% i = 0 %>
+            <% @folder_links.each do |l| %>
+              <%= if i > 0 then ', ' end %>
+              <% i += 1 %>
+              <%= l.name %>
+            <% end %>
+       </h3>
+      </div>
+      <div class="panel-body">
+        <img src="/favicon.ico" class="pull-right" alt="" style="opacity: 0.3"/>
+        <% if not (@output_of.andand.any? or @log_of.andand.any?) %>
+          <p><i>No source information available.</i></p>
+        <% end %>
+
+        <% if @output_of.andand.any? %>
+          <p>This collection was the output of:<br />
+          <%= render_arvados_object_list_start(@output_of, 'Show all jobs',
+                jobs_path(filter: [['output', '=', @object.uuid]].to_json)) do |job| %>
+            <%= link_to_if_arvados_object(job, friendly_name: true) %><br />
+          <% end %>
+          </p>
+        <% end %>
+
+        <% if @log_of.andand.any? %>
+          <p>This collection contains log messages from:<br />
+          <%= render_arvados_object_list_start(@log_of, 'Show all jobs',
+                jobs_path(filter: [['log', '=', @object.uuid]].to_json)) do |job| %>
+            <%= link_to_if_arvados_object(job, friendly_name: true) %><br />
+          <% end %>
+          </p>
+        <% end %>
+      </div>
+    </div>
   </div>
-  <div id="provenance" class="tab-pane fade">
-    <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>
-  </div>
-  <div id="provenance2" class="tab-pane fade">
-  <script>
-    function provenance_sizing_fixup() {
-      var a = document.getElementById("provenance_graph");
-      a.style.height = String(window.innerHeight - (a.getBoundingClientRect().top + window.scrollY) - 2) + "px";
-    }
-    $(window).resize(provenance_sizing_fixup);
-    $(window).load(provenance_sizing_fixup);
-
-    function graph_zoom(scale) {
-      var pg = document.getElementById("provenance_graph");
-      vcenter = (pg.scrollTop + (pg.scrollHeight - pg.scrollTopMax)/2.0) / pg.scrollHeight;
-      hcenter = (pg.scrollLeft + (pg.scrollWidth - pg.scrollLeftMax)/2.0) / pg.scrollWidth;
-      var g = document.getElementById("graph1").parentNode;
-      g.setAttribute("height", parseFloat(g.getAttribute("height")) * scale);
-      g.setAttribute("width", parseFloat(g.getAttribute("width")) * scale);
-      pg.scrollTop = (vcenter * pg.scrollHeight) - (pg.scrollHeight - pg.scrollTopMax)/2.0;
-      pg.scrollLeft = (hcenter * pg.scrollWidth) - (pg.scrollWidth - pg.scrollLeftMax)/2.0;
-    }
-
-    $(function() {
-      $('#prov-tab').on('shown', provenance_sizing_fixup);
-    })
-  </script>
-  <div style="text-align: right">
-  <a href="#"><span class="icon-zoom-out" onclick="graph_zoom(.9)"></span></a>
-  <a href="#"><span class="icon-zoom-in" onclick="graph_zoom(1./.9)"></span></a>
+  <div class="col-md-3">
+    <div class="panel panel-default">
+      <div class="panel-heading">
+       <h3 class="panel-title">
+         Activity
+       </h3>
+      </div>
+      <div class="panel-body smaller-text">
+        <!--
+       <input type="text" class="form-control" placeholder="Search"/>
+        -->
+       <div style="height:0.5em;"></div>
+        <% name_or_object = @name_link.andand.uuid ? @name_link : @object %>
+        <% if name_or_object.created_at and not @logs.andand.any? %>
+          <p>
+            Created: <%= name_or_object.created_at.to_s(:long) %>
+          </p>
+          <p>
+            Last modified: <%= name_or_object.modified_at.to_s(:long) %> by <%= link_to_if_arvados_object name_or_object.modified_by_user_uuid, friendly_name: true %>
+          </p>
+        <% else %>
+          <%= render_arvados_object_list_start(@logs, 'Show all activity',
+                logs_path(filters: [['object_uuid','=',name_or_object.uuid]].to_json)) do |log| %>
+          <p>
+          <%= time_ago_in_words(log.event_at) rescue 'unknown time' %> ago: <%= log.summary %>
+            <% if log.object_uuid %>
+            <%= link_to_if_arvados_object log.object_uuid, link_text: raw('<i class="fa fa-hand-o-right"></i>') %>
+            <% end %>
+          </p>
+          <% end %>
+        <% end %>
+      </div>
+    </div>
   </div>
-  
-  <div id="provenance_graph">
-      <%= raw(@prov_svg) %>
-  </div>
-  </div>
-  <div id="jobs" class="tab-pane fade">
-    <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.active then 'label-primary'; else 'label-warning'; end %>">
-             <%= j.success || j.active ? '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>
-  </div>
-  <div id="sourcedata" class="tab-pane fade">
-    <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>
-  </div>
-  <div id="owner-groups-resources" class="tab-pane fade">
-    <%= render :partial => 'application/arvados_object' %>
+  <div class="col-md-3">
+    <div class="panel panel-default">
+      <div class="panel-heading">
+       <h3 class="panel-title">
+         Sharing and permissions
+       </h3>
+      </div>
+      <div class="panel-body">
+        <!--
+       <input type="text" class="form-control" placeholder="Search"/>
+        -->
+
+        <div id="sharing-button">
+          <%= render partial: 'sharing_button' %>
+        </div>
+
+       <div style="height:0.5em;"></div>
+        <% if @projects.andand.any? %>
+          <p>Included in projects:<br />
+          <%= render_arvados_object_list_start(@projects, 'Show all projects',
+                links_path(filter: [['head_uuid', '=', @object.uuid],
+                                    ['link_class', '=', 'name']].to_json)) do |project| %>
+          <%= link_to_if_arvados_object(project, friendly_name: true) %><br />
+          <% end %>
+          </p>
+        <% end %>
+        <% if @permissions.andand.any? %>
+          <p>Readable by:<br />
+          <%= render_arvados_object_list_start(@permissions, 'Show all permissions',
+                links_path(filter: [['head_uuid', '=', @object.uuid],
+                                    ['link_class', '=', 'permission']].to_json)) do |link| %>
+          <%= link_to_if_arvados_object(link.tail_uuid, friendly_name: true) %><br />
+          <% end %>
+          </p>
+        <% end %>
+
+      </div>
+    </div>
   </div>
 </div>
-</div>
+
+<%= render file: 'application/show.html.erb' %>