Provenance graph now uses full width of window
[arvados.git] / apps / workbench / app / views / collections / show.html.erb
1 <%= content_for :css do %>
2 <%# https://github.com/mbostock/d3/wiki/Ordinal-Scales %>
3 <% n=-1; %w(#1f77b4 #ff7f0e #2ca02c #d62728 #9467bd #8c564b #e377c2 #7f7f7f #bcbd22 #17becf).each do |color| %>
4 .colorseries-10-<%= n += 1 %>, .btn.colorseries-10-<%= n %>:hover, .label.colorseries-10-<%= n %>:hover {
5   *background-color: <%= color %>;
6   background-color: <%= color %>;
7   background-image: none;
8 }
9 <% end %>
10 .colorseries-nil { }
11 .label a {
12   color: inherit;
13 }
14 #provenance_graph {
15  padding-left: 3px;
16  overflow:auto;
17  border:solid;
18  border-width:1px;
19  border-color: gray;
20  position: absolute;
21  left: 1px;
22 }
23 <% end %>
24
25 <%#= render :partial => 'nav' %>
26
27 <div class="tabbable">
28 <ul class="nav nav-tabs">
29   <li class="active"><a href="#files" data-toggle="tab">Files (<%= @object.files ? @object.files.size : 0 %>)</a></li>
30   <li><a href="#provenance" data-toggle="tab">Provenance (<%= @provenance.size %>)</a></li>
31   <li><a href="#jobs" data-toggle="tab">Jobs (<%= @provenance.size %>)</a></li>
32   <li><a href="#sourcedata" data-toggle="tab">Source data (<%= @sourcedata.size %>)</a></li>
33   <li><a href="#owner-groups-resources" data-toggle="tab">Owner, groups, resources</a></li>
34   <li><a href="#provenance2" data-toggle="tab" id="prov-tab">Provenance graph</a></li>
35   <li><a href="#used-by" data-toggle="tab">Used by</a></li>
36 </ul>
37
38 <div class="tab-content">
39   <div id="files" class="tab-pane fade in active">
40     <table class="table table-bordered" style="table-layout: fixed">
41       <thead>
42         <tr>
43           <th>path</th>
44           <th>file</th>
45           <th style="width:1.5em">d/l</th>
46           <th style="width: 7em; text-align:right">size</th>
47         </tr>
48       </thead><tbody>
49         <% if @object then @object.files.sort_by{|f|f[1]}.each do |file| %>
50         <% file_path = "#{file[0]}/#{file[1]}" %>
51         <tr>
52           <td>
53             <%= file[0] %>
54           </td>
55
56           <td>
57             <%= link_to file[1], {controller: 'collections', action: 'show_file', uuid: @object.uuid, file: file_path, size: file[2], disposition: 'inline'}, {title: 'View in browser'} %>
58           </td>
59
60           <td>
61             <div style="display:inline-block">
62             <%= 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'} %>
63             </div>
64           </td>
65
66           <td style="text-align:right">
67             <%= raw(human_readable_bytes_html(file[2])) %>
68           </td>
69
70         </tr>
71         <% end; end %>
72       </tbody>
73     </table>
74   </div>
75   <div id="provenance" class="tab-pane fade">
76     <table class="topalign table table-bordered">
77       <thead>
78       </thead>
79       <tbody>
80
81         <% @provenance.reverse.each do |p| %>
82         <% j = p[:job] %>
83
84         <% if j %>
85
86         <tr class="job">
87           <td style="padding-bottom: 3em">
88             <table class="table" style="margin-bottom: 0; background: #f0f0ff">
89               <% j.script_parameters.each do |k,v| %>
90               <tr>
91                 <td style="width: 20%">
92                   <%= k.to_s %>
93                 </td><td style="width: 60%">
94                   <% if v and @output2job.has_key? v %>
95                   <tt class="label colorseries-10-<%= @output2colorindex[v] %>"><%= link_to_if_arvados_object v %></tt>
96                   <% else %>
97                   <span class="deemphasize"><%= link_to_if_arvados_object v %></span>
98                   <% end %>
99                 </td><td style="text-align: center; width: 20%">
100                   <% if v
101                        if @protected[v]
102                          labelclass = 'success'
103                          labeltext = 'keep'
104                        else
105                          labelclass = @output2job.has_key?(v) ? 'warning' : 'danger'
106                          labeltext = 'cache'
107                        end %>
108
109                   <tt class="label label-<%= labelclass %>"><%= labeltext %></tt>
110                   <% end %>
111                 </td>
112               </tr>
113               <% end %>
114             </table>
115             <div style="text-align: center">
116               &darr;
117               <br />
118               <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>
119               <br />
120               &darr;
121               <br />
122               <tt class="label colorseries-10-<%= @output2colorindex[p[:output]] %>"><%= link_to_if_arvados_object p[:output] %></tt>
123             </div>
124           </td>
125           <td>
126             <tt><span class="deemphasize">job:</span><br /><%= link_to_if_arvados_object j %><br /><span class="deemphasize"><%= j.submit_id %></span></tt>
127           </td>
128         </tr>
129
130         <% else %>
131         <tr>
132           <td>
133             <span class="label label-danger">lookup fail</span>
134             <br />
135             <tt class="deemphasize"><%= p[:target] %></tt>
136           </td><td colspan="5">
137           </td>
138         </tr>
139         <% end %>
140
141         <% end %>
142
143       </tbody>
144     </table>
145   </div>
146   <div id="provenance2" class="tab-pane fade">
147   <script>
148     function provenance_sizing_fixup() {
149       var a = document.getElementById("provenance_graph");
150       a.style.height = String(window.innerHeight - (a.getBoundingClientRect().top + window.scrollY) - 2) + "px";
151       a.style.width = String(window.innerWidth - 10) + "px";
152     }
153     $(window).resize(provenance_sizing_fixup);
154
155     function graph_zoom(scale) {
156       var pg = document.getElementById("provenance_graph");
157       vcenter = (pg.scrollTop + (pg.scrollHeight - pg.scrollTopMax)/2.0) / pg.scrollHeight;
158       hcenter = (pg.scrollLeft + (pg.scrollWidth - pg.scrollLeftMax)/2.0) / pg.scrollWidth;
159       var g = document.getElementById("graph1").parentNode;
160       g.setAttribute("height", parseFloat(g.getAttribute("height")) * scale);
161       g.setAttribute("width", parseFloat(g.getAttribute("width")) * scale);
162       pg.scrollTop = (vcenter * pg.scrollHeight) - (pg.scrollHeight - pg.scrollTopMax)/2.0;
163       pg.scrollLeft = (hcenter * pg.scrollWidth) - (pg.scrollWidth - pg.scrollLeftMax)/2.0;
164     }
165
166     $(function() {
167       $('#prov-tab').on('shown', provenance_sizing_fixup);
168     })
169   </script>
170   <div style="text-align: right">
171   <a href="#"><span class="icon-zoom-out" onclick="graph_zoom(.9)"></span></a>
172   <a href="#"><span class="icon-zoom-in" onclick="graph_zoom(1./.9)"></span></a>
173   </div>
174   
175   <div id="provenance_graph">
176       <%= raw(@prov_svg) %>
177   </div>
178   </div>
179   <div id="jobs" class="tab-pane fade">
180     <table class="topalign table table-bordered">
181       <thead>
182         <tr class="contain-align-left">
183           <th>
184             job
185           </th><th>
186             version
187           </th><th>
188             status
189           </th><th>
190             start
191           </th><th>
192             finish
193           </th><th>
194             clock time
195           </th>
196         </tr>
197       </thead>
198       <tbody>
199
200         <% @provenance.reverse.each do |p| %>
201         <% j = p[:job] %>
202
203         <% if j %>
204
205         <tr class="job">
206           <td>
207             <tt><%= j.uuid %></tt>
208             <br />
209             <tt class="deemphasize"><%= j.submit_id %></tt>
210           </td><td>
211             <%= j.script_version %>
212           </td><td>
213             <span class="label <%= if j.success then 'label-success'; elsif j.active then 'label-primary'; else 'label-warning'; end %>">
214               <%= j.success || j.active ? 'ok' : 'failed' %>
215             </span>
216           </td><td>
217             <%= j.started_at %>
218           </td><td>
219             <%= j.finished_at %>
220           </td><td>
221             <% if j.started_at and j.finished_at %>
222             <%= raw(distance_of_time_in_words(j.started_at, j.finished_at).sub('about ','~').sub(' ','&nbsp;')) %>
223             <% elsif j.started_at and j.running %>
224             <%= raw(distance_of_time_in_words(j.started_at, Time.now).sub('about ','~').sub(' ','&nbsp;')) %> (running)
225             <% end %>
226           </td>
227         </tr>
228
229         <% else %>
230         <tr>
231           <td>
232             <span class="label label-danger">lookup fail</span>
233             <br />
234             <tt class="deemphasize"><%= p[:target] %></tt>
235           </td><td colspan="4">
236           </td>
237         </tr>
238         <% end %>
239
240         <% end %>
241
242       </tbody>
243     </table>
244   </div>
245   <div id="sourcedata" class="tab-pane fade">
246     <table class="table table-bordered table-striped">
247       <thead>
248         <tr class="contain-align-left">
249           <th>
250             collection
251           </th><th class="data-size">
252             data size
253           </th><th>
254             storage
255           </th><th>
256             origin
257           </th>
258         </tr>
259       </thead>
260       <tbody>
261
262         <% @sourcedata.values.each do |sourcedata| %>
263
264         <tr class="collection">
265           <td>
266             <tt class="label"><%= sourcedata[:uuid] %></tt>
267           </td><td class="data-size">
268             <%= raw(human_readable_bytes_html(sourcedata[:collection].data_size)) if sourcedata[:collection] and sourcedata[:collection].data_size %>
269           </td><td>
270             <% if @protected[sourcedata[:uuid]] %>
271             <span class="label label-success">keep</span>
272             <% else %>
273             <span class="label label-danger">cache</span>
274             <% end %>
275           </td><td>
276             <% if sourcedata[:data_origins] %>
277             <% sourcedata[:data_origins].each do |data_origin| %>
278             <span class="deemphasize"><%= data_origin[0] %></span>
279             <%= data_origin[2] %>
280             <br />
281             <% end %>
282             <% end %>
283           </td>
284         </tr>
285
286         <% end %>
287
288       </tbody>
289     </table>
290   </div>
291   <div id="owner-groups-resources" class="tab-pane fade">
292     <%= render :partial => 'application/arvados_object' %>
293   </div>
294 </div>
295 </div>