<% if current_user.andand.is_active %>
<div>
<strong>Recent jobs</strong>
+ <%= link_to '(refresh)', request.fullpath, class: 'refresh', remote: true, method: 'get' %>
<%= link_to raw("Show all jobs →"), 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(' ',' ')) if j.created_at %>
+ <%= raw(distance_of_time_in_words(j.created_at, Time.now).sub('about ','~').sub(' ',' ')) 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 →"), jobs_path, class: 'pull-right' %>
+ <%= link_to '(refresh)', request.fullpath, class: 'refresh', remote: true, method: 'get' %>
+ <%= link_to raw("Show all pipeline instances →"), 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(' ',' ')) 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(' ',' ')) 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)', request.fullpath, class: 'refresh', remote: true, method: 'get' %>
<%= link_to raw("Show all collections →"), 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(' ',' ')) if c.created_at %>
+ <%= raw(distance_of_time_in_words(c.created_at, Time.now).sub('about ','~').sub(' ',' ')) 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 ✉'),
+ 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 %>