Merge branch 'master' into 2681-new-inactive-user-notification
[arvados.git] / apps / workbench / app / views / users / _tables.html.erb
index bcbf3d7c6df0a52ddbd1d488622f05a466e662d4..13cc673de75ad0c9b10bca171e2ada95ef51f9b2 100644 (file)
@@ -1,80 +1,83 @@
 <% if current_user.andand.is_active %>
   <div>
     <strong>Recent jobs</strong>
+    <%= link_to '(refresh)', {format: :js}, {class: 'refresh', remote: true, method: 'get'} %>
     <%= link_to raw("Show all jobs &rarr;"), jobs_path, class: 'pull-right' %>
     <% if not current_user.andand.is_active or @my_jobs.empty? %>
-      <br/>(None)
+      <p>(None)</p>
     <% else %>
       <table class="table table-bordered table-condensed table-fixedlayout">
-       <colgroup>
-          <col width="28%" />
-          <col width="38%" />
-          <col width="7%" />
-          <col width="15%" />
-          <col width="12%" />
-       </colgroup>
+        <colgroup>
+          <col width="20%" />
+          <col width="20%" />
+          <col width="20%" />
+          <col width="13%" />
+          <col width="13%" />
+          <col width="20%" />
+        </colgroup>
 
         <tr>
-         <th>Script</th>
-         <th>Output</th>
-         <th>Log</th>
-         <th>Age</th>
-         <th>Status</th>
-       </tr>
+          <th>Script</th>
+          <th>Output</th>
+          <th>Log</th>
+          <th>Age</th>
+          <th>Status</th>
+          <th>Progress</th>
+        </tr>
 
         <% @my_jobs[0..6].each do |j| %>
-          <tr>
+          <tr data-object-uuid="<%= j.uuid %>">
             <td>
               <small>
-               <%= link_to j.script[0..31], job_path(j.uuid) %>
+                <%= link_to((j.script.andand[0..31] || j.uuid), job_path(j.uuid)) %>
               </small>
             </td>
 
-           <td>
-             <small>
-               <% if j.success %>
-
-                 <a href="<%= collection_path(j.output) %>">
-                   <% Collection.limit(1).where(uuid: j.output).each do |c|
-                        c.files.each do |file| %>
-                     <%= file[0] == '.' ? file[1] : "#{file[0]}/#{file[1]}" %>
-                   <% end %>
-               <% end %>
-               </a>
-
-       <% end %>
-       </small>
+            <td>
+              <small>
+                <% if j.success and j.output %>
+
+                  <a href="<%= collection_path(j.output) %>">
+                    <% Collection.limit(1).where(uuid: j.output).each do |c| %>
+                         <% c.files.each do |file| %>
+                      <%= file[0] == '.' ? file[1] : "#{file[0]}/#{file[1]}" %>
+                    <% end %>
+                <% end %>
+                </a>
+
+        <% end %>
+        </small>
 </td>
 
 <td>
   <small>
     <% if j.log %>
-      <a href="<%= collection_path(j.log) %>">Log</a>
+      <% fixup = /([a-f0-9]{32}\+\d+)(\+?.*)/.match(j.log)%>
+      <% Collection.limit(1).where(uuid: fixup[1]).each do |c| %>
+        <% c.files.each do |file| %>
+          <a href="<%= collection_path(j.log) %>/<%= file[1] %>?disposition=inline&size=<%= file[2] %>">Log</a>
+        <% end %>
+      <% end %>
+    <% elsif j.respond_to? :log_buffer and j.log_buffer.is_a? String %>
+      <% buf = j.log_buffer.strip.split("\n").last %>
+      <span title="<%= buf %>"><%= buf %></span>
     <% end %>
   </small>
 </td>
 
 <td>
   <small>
-    <%= raw(distance_of_time_in_words(j.created_at, Time.now).sub('about
-','~').sub(' ','&nbsp;')) if j.created_at %>
+    <%= raw(distance_of_time_in_words(j.created_at, Time.now).sub('about ','~').sub(' ','&nbsp;')) if j.created_at %>
   </small>
 </td>
 
 <td>
-  <% if j.success %>
-    <span class="label label-success">finished</span>
-  <% elsif j.success == false %>
-    <span class="label label-danger">failed</span>
-  <% elsif j.running and j.started_at and not j.finished_at %>
-    <% percent_total_tasks = 100 / (j.tasks_summary[:running] + j.tasks_summary[:done] + j.tasks_summary[:todo]) rescue 0 %>
-    <div class="progress" style="margin-bottom: 0">
-      <div class="bar bar-success" style="width: <%= j.tasks_summary[:done] * percent_total_tasks rescue 0 %>%;"></div>
-      <div class="bar" style="width: <%= j.tasks_summary[:running] * percent_total_tasks rescue 0 %>%; opacity: 0.3"></div>
-    </div>
-  <% else %>
-    <span class="label">queued</span>
-  <% end %>
+  <%= render partial: 'job_status_label', locals: {:j => j} %>
+</td>
+<td>
+  <div class="inline-progress-container">
+  <%= render partial: 'job_progress', locals: {:j => j} %>
+  </div>
 </td>
 
 </tr>
 
 <div>
   <strong>Recent pipeline instances</strong>
-  <%= link_to raw("Show all pipeline instances &rarr;"), jobs_path, class: 'pull-right' %>
+  <%= link_to '(refresh)', {format: :js}, {class: 'refresh', remote: true, method: 'get'} %>
+  <%= link_to raw("Show all pipeline instances &rarr;"), pipeline_instances_path, class: 'pull-right' %>
   <% if not current_user.andand.is_active or @my_pipelines.empty? %>
-    <br/>(None)
+    <p>(None)</p>
   <% else %>
     <table class="table table-bordered table-condensed table-fixedlayout">
       <colgroup>
-        <col width="73%" />
-        <col width="15%" />
-        <col width="12%" />
+        <col width="30%" />
+        <col width="30%" />
+        <col width="13%" />
+        <col width="13%" />
+        <col width="20%" />
       </colgroup>
 
       <tr>
-       <th>Pipeline template</th>
-       <th>Age</th>
-       <th>Status</th>
+        <th>Instance</th>
+        <th>Template</th>
+        <th>Age</th>
+        <th>Status</th>
+        <th>Progress</th>
       </tr>
 
       <% @my_pipelines[0..6].each do |p| %>
-        <tr>
+        <tr data-object-uuid="<%= p.uuid %>">
           <td>
             <small>
-             <% PipelineTemplate.limit(1).where(uuid: p.pipeline_template_uuid).each do |i| %>
-               <%= link_to i.name, pipeline_instance_path(p.uuid) %>
-             <% end %>
+              <%= link_to_if_arvados_object p.uuid, friendly_name: true %>
             </small>
           </td>
 
           <td>
             <small>
-             <%= raw(distance_of_time_in_words(p.created_at, Time.now).sub('about
-','~').sub(' ','&nbsp;')) if p.created_at %>
+              <%= link_to_if_arvados_object p.pipeline_template_uuid, friendly_name: true %>
             </small>
           </td>
 
           <td>
-            <% if p.success %>
-              <span class="label label-success">finished</span>
-            <% elsif p.success == false %>
-              <span class="label label-danger">failed</span>
-            <% elsif p.active %>
-              <span class="label label-info">running</span>
-            <% else %>
-              <span class="label">queued</span>
-            <% end %>
+            <small>
+              <%= raw(distance_of_time_in_words(p.created_at, Time.now).sub('about ','~').sub(' ','&nbsp;')) if p.created_at %>
+            </small>
           </td>
 
+          <td>
+            <%= render partial: 'pipeline_status_label', locals: {:p => p} %>
+          </td>
+
+          <td>
+            <div class="inline-progress-container">
+              <%= render partial: 'pipeline_progress', locals: {:p => p} %>
+            </div>
+          </td>
         </tr>
       <% end %>
     </table>
 
 <div>
   <strong>Recent collections</strong>
+  <%= link_to '(refresh)', {format: :js}, {class: 'refresh', remote: true, method: 'get'} %>
   <%= link_to raw("Show all collections &rarr;"), collections_path, class: 'pull-right' %>
-  <div class="pull-right" style="padding-right: 1em">
+  <div class="pull-right" style="padding-right: 1em; width: 30%;">
     <%= form_tag collections_path,
           method: 'get',
           class: 'form-search small-form-margin' do %>
-    <div class="input-append">
-      <%= text_field_tag :search, params[:search], class: 'search-query search-mini' %>
-      <%= submit_tag "Search", name: nil, class: 'btn btn-mini btn-info' %>
-    </div>  
+    <div class="input-group input-group-sm">
+      <%= text_field_tag :search, params[:search], class: 'form-control', placeholder: 'Search' %>
+      <span class="input-group-btn">
+        <%= button_tag(class: 'btn btn-info') do %>
+        <span class="glyphicon glyphicon-search"></span>
+        <% end %>
+      </span>
+    </div>
     <% end %>
   </div>
   <% if not current_user.andand.is_active or @my_collections.empty? %>
-    <br/>(None)
+    <p>(None)</p>
   <% else %>
     <table class="table table-bordered table-condensed table-fixedlayout">
       <colgroup>
         <col width="46%" />
-        <col width="27%" />
-        <col width="27%" />
+        <col width="32%" />
+        <col width="10%" />
+        <col width="12%" />
       </colgroup>
 
       <tr>
-       <th>Contents</th>
-       <th>Tags</th>
-       <th>Age</th>
+        <th>Contents</th>
+        <th>Tags</th>
+        <th>Age</th>
+        <th>Storage</th>
       </tr>
 
       <% @my_collections[0..6].each do |c| %>
-        <tr>
+        <tr data-object-uuid="<%= c.uuid %>">
           <td>
             <small>
-             <a href="<%= collection_path(c.uuid) %>">
-               <% c.files.each do |file| %>
-                 <%= file[0] == '.' ? file[1] : "#{file[0]}/#{file[1]}" %>
-               <% end %>
-             </a>
+              <a href="<%= collection_path(c.uuid) %>">
+                <% c.files.each do |file| %>
+                  <%= file[0] == '.' ? file[1] : "#{file[0]}/#{file[1]}" %>
+                <% end %>
+              </a>
             </small>
           </td>
           <td>
           </td>
           <td>
             <small>
-             <%= raw(distance_of_time_in_words(c.created_at, Time.now).sub('about
-','~').sub(' ','&nbsp;')) if c.created_at %>
+              <%= raw(distance_of_time_in_words(c.created_at, Time.now).sub('about ','~').sub(' ','&nbsp;')) if c.created_at %>
             </small>
           </td>
+          <td>
+            <%= render partial: 'collections/toggle_persist', locals: { uuid: c.uuid, current_state: @persist_state[c.uuid] } %>
+          </td>
         </tr>
       <% end %>
     </table>
 </div>
 
 <% else %>
-  <%= image_tag "dax.png", style: "max-width=40%" %>
+
+  <div class="row-fluid">
+    <div class="col-sm-4">
+      <%= image_tag "dax.png", style: "max-width:100%" %>
+    </div>
+    <div class="col-sm-8">
+      <h2>Welcome to Arvados, <%= current_user.first_name %>!</h2>
+      <div class="well">
+        <p>
+          Your account must be activated by an Arvados administrator.  If this
+          is your first time accessing Arvados and would like to request
+          access, or you believe you are seeing the page in error, please
+          <%= link_to "contact us", Rails.configuration.activation_contact_link %>.
+          You should receive an email at the address you used to log in when
+          your account is activated.  In the mean time, you can
+          <%= link_to "learn more about Arvados", "https://arvados.org/projects/arvados/wiki/Introduction_to_Arvados" %>,
+          and <%= link_to "read the Arvados user guide", "http://doc.arvados.org/user" %>.
+        </p>
+        <p style="padding-bottom: 1em">
+          <%= link_to raw('Contact us &#x2709;'),
+              Rails.configuration.activation_contact_link, class: "pull-right btn btn-primary" %></p>
+      </div>
+    </div>
+  </div>
+<% end %>
+
+<% content_for :js do %>
+setInterval(function(){$('a.refresh:eq(0)').click()}, 60000);
 <% end %>