source: branches/3.18-stable/www/views/jobs/list_jobs.jsp @ 7938

Last change on this file since 7938 was 7938, checked in by Nicklas Nordborg, 3 months ago

References #2246: Sticky table headers

Implemented for all items in the "View" menu.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 25.7 KB
Line 
1<%-- $Id: list_jobs.jsp 7938 2021-05-03 11:20:19Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell, Nicklas Nordborg
5
6  This file is part of BASE - BioArray Software Environment.
7  Available at http://base.thep.lu.se/
8
9  BASE is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License
11  as published by the Free Software Foundation; either version 3
12  of the License, or (at your option) any later version.
13
14  BASE is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  GNU General Public License for more details.
18
19  You should have received a copy of the GNU General Public License
20  along with BASE. If not, see <http://www.gnu.org/licenses/>.
21  ------------------------------------------------------------------
22
23  @author Nicklas
24  @version 2.0
25--%>
26<%@ page pageEncoding="UTF-8" session="false"
27  import="net.sf.basedb.core.SessionControl"
28  import="net.sf.basedb.core.DbControl"
29  import="net.sf.basedb.core.Item"
30  import="net.sf.basedb.core.Job"
31  import="net.sf.basedb.core.JobAgent"
32  import="net.sf.basedb.core.ItemSubtype"
33  import="net.sf.basedb.core.ItemQuery"
34  import="net.sf.basedb.core.Include"
35  import="net.sf.basedb.core.ItemResultIterator"
36  import="net.sf.basedb.core.ItemResultList"
37  import="net.sf.basedb.core.ItemContext"
38  import="net.sf.basedb.core.Permission"
39  import="net.sf.basedb.core.Nameable"
40  import="net.sf.basedb.core.PluginDefinition"
41  import="net.sf.basedb.core.Project"
42  import="net.sf.basedb.core.PermissionDeniedException"
43  import="net.sf.basedb.core.query.Hql"
44  import="net.sf.basedb.core.query.Orders"
45  import="net.sf.basedb.core.query.Restrictions"
46  import="net.sf.basedb.core.query.Expressions"
47  import="net.sf.basedb.core.plugin.GuiContext"
48  import="net.sf.basedb.core.plugin.Plugin"
49  import="net.sf.basedb.util.Enumeration"
50  import="net.sf.basedb.util.ShareableUtil"
51  import="net.sf.basedb.clients.web.Base"
52  import="net.sf.basedb.clients.web.ModeInfo"
53  import="net.sf.basedb.clients.web.PermissionUtil"
54  import="net.sf.basedb.clients.web.util.HTML"
55  import="net.sf.basedb.util.Values"
56  import="net.sf.basedb.util.formatter.Formatter"
57  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
58  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
59  import="net.sf.basedb.clients.web.extensions.JspContext"
60  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
61  import="net.sf.basedb.clients.web.extensions.toolbar.ButtonAction" 
62  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
63  import="net.sf.basedb.clients.web.extensions.list.ListColumnAction"
64  import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
65  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
66  import="java.util.Iterator"
67  import="java.util.List"
68  import="java.util.Map"
69  import="java.util.Date"
70%>
71<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
72<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
73<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
74<%!
75  private static final Item itemType = Item.JOB;
76  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
77 
78  private static final Enumeration<String, String> status = new Enumeration<String, String>();
79  private static final Enumeration<String, String> pluginTypes = new Enumeration<String, String>();
80  private static final Enumeration<String, String> execTime = new Enumeration<String, String>();
81  static
82  {
83    for (Job.Status s : Job.Status.values())
84    {
85      status.add(Integer.toString(s.getValue()), HTML.encodeTags(s.toString()));
86    }
87    for (Plugin.MainType pt : Plugin.MainType.values())
88    {
89      pluginTypes.add(Integer.toString(pt.getValue()), HTML.encodeTags(pt.toString()));
90    }
91    for (Job.ExecutionTime et : Job.ExecutionTime.values())
92    {
93      execTime.add(Integer.toString(et.getValue()), HTML.encodeTags(et.toString()));
94    }
95  }
96%>
97<%
98final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
99final String ID = sc.getId();
100final boolean createPermission = sc.hasPermission(Permission.CREATE, itemType);
101final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
102final Date now = new Date();
103final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
104final String callback = request.getParameter("callback");
105final String title = mode.generateTitle("job", "jobs");
106final DbControl dc = sc.newDbControl();
107ItemResultIterator<Job> jobs = null;
108try
109{
110 
111  // Get all job agents
112  final ItemQuery<JobAgent> agentQuery = JobAgent.getQuery();
113  agentQuery.include(Include.ALL);
114  agentQuery.order(Orders.asc(Hql.property("name")));
115  agentQuery.setCacheResult(true);
116  Enumeration<String, String> agents = new Enumeration<String, String>();
117  for (JobAgent a : agentQuery.list(dc))
118  {
119    agents.add(Integer.toString(a.getId()), a.getName());
120  }
121  // Load subtypes
122  final ItemQuery<ItemSubtype> typeQuery = ItemSubtype.getQuery(itemType);
123  typeQuery.order(Orders.asc(Hql.property("name")));
124  typeQuery.setCacheResult(true);
125 
126  // Load projects
127  final ItemQuery<Project> projectQuery = Project.getQuery();
128  projectQuery.setIncludes(cc.getInclude());
129  projectQuery.order(Orders.asc(Hql.property("name")));
130  projectQuery.setCacheResult(true);
131
132  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
133  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, null);
134  try
135  {
136    final ItemQuery<Job> query = Base.getConfiguredQuery(dc, cc, jspContext, true, Job.getQuery(), mode);
137    jobs = query.iterate(dc);
138  }
139  catch (Throwable t)
140  {
141    cc.setMessage(t.getMessage());
142    t.printStackTrace();
143  }
144  int numListed = 0;
145  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
146  ExtensionsInvoker<ButtonAction> invoker = ToolbarUtil.useExtensions(jspContext);
147  ExtensionsInvoker<ListColumnAction<Job,?>> columnsInvoker = ListColumnUtil.useExtensions(jspContext);
148  %>
149  <base:page title="<%=title==null ? "Jobs" : title%>" type="<%=mode.getPageType()%>" id="list-page">
150  <base:head scripts="table.js,~jobs.js" styles="table.css,toolbar.css,progressbar.css">
151    <ext:scripts context="<%=jspContext%>" />
152    <ext:stylesheets context="<%=jspContext%>" />
153  </base:head>
154 
155  <base:body>
156    <h1><%=title==null ? "Jobs" : title%></h1>
157    <div class="content">
158    <tbl:table 
159      id="jobs" 
160      columns="<%=cc.getSetting("columns")%>"
161      sortby="<%=cc.getSortProperty()%>" 
162      direction="<%=cc.getSortDirection()%>"
163      action="index.jsp"
164      sc="<%=sc%>"
165      item="<%=itemType%>"
166      filterrows="<%=cc.getFilterRows()%>"
167      subclass="fulltable"
168      stickyheaders="name"
169      >
170      <tbl:hidden 
171        name="mode" 
172        value="<%=mode.getName()%>" 
173      />
174      <tbl:hidden 
175        name="callback" 
176        value="<%=callback%>" 
177        skip="<%=callback == null%>" 
178      />
179      <tbl:columndef 
180        id="name"
181        property="name"
182        datatype="string"
183        title="Name"
184        sortable="true" 
185        filterable="true"
186        exportable="true"
187        show="always" 
188      />
189      <tbl:columndef 
190        id="id"
191        clazz="uniquecol"
192        property="id"
193        datatype="int"
194        title="ID"
195        sortable="true"
196        filterable="true"
197        exportable="true"
198      />
199      <tbl:columndef 
200        id="externalId"
201        property="externalId"
202        datatype="string"
203        title="External ID"
204        sortable="true"
205        filterable="true"
206        exportable="true"
207      />
208      <tbl:columndef 
209        id="itemSubtype"
210        property="itemSubtype"
211        sortproperty="itemSubtype.name"
212        exportproperty="itemSubtype.name:string"
213        datatype="int"
214        enumeration="<%=Enumeration.fromItems(typeQuery.list(dc), "-none-")%>"
215        title="Subtype"
216        sortable="true" 
217        filterable="true"
218        exportable="true"
219      />
220      <tbl:columndef 
221        id="owner"
222        property="owner.name"
223        datatype="string"
224        title="Owner"
225        sortable="true" 
226        filterable="true"
227        exportable="true"
228      />
229      <tbl:columndef 
230        id="priority"
231        property="priority"
232        datatype="int"
233        title="Priority"
234        sortable="true" 
235        filterable="true"
236        exportable="true"
237      />
238      <tbl:columndef 
239        id="status"
240        property="status"
241        datatype="int"
242        enumeration="<%=status%>"
243        title="Status"
244        sortable="true" 
245        filterable="true"
246        exportable="true"
247      />
248      <tbl:columndef 
249        id="statusMessage"
250        property="statusMessage"
251        datatype="string"
252        title="Status message"
253        sortable="true" 
254        filterable="true"
255        exportable="true"
256      />
257      <tbl:columndef 
258        id="dryRun"
259        property="dryRun"
260        datatype="boolean"
261        title="Dry run"
262        sortable="true" 
263        filterable="true"
264        exportable="true"
265      />
266      <tbl:columndef 
267        id="stackTrace"
268        property="stackTrace"
269        datatype="string"
270        title="Stack trace"
271        sortable="true" 
272        filterable="true"
273        exportable="true"
274      />
275      <tbl:columndef 
276        id="server"
277        property="server"
278        datatype="string"
279        title="Server"
280        sortable="true" 
281        filterable="true"
282        exportable="true"
283      />
284      <tbl:columndef 
285        id="node"
286        property="node"
287        datatype="string"
288        title="Node"
289        sortable="true" 
290        filterable="true"
291        exportable="true"
292      />
293      <tbl:columndef 
294        id="jobagent"
295        property="jobAgentId"
296        datatype="int"
297        title="Job agent"
298        filterable="true"
299        enumeration="<%=agents%>"
300      />
301      <tbl:columndef 
302        id="percentComplete"
303        property="percentComplete"
304        datatype="int"
305        title="Percent complete"
306        sortable="true" 
307        filterable="true"
308        exportable="true"
309      />
310      <tbl:columndef 
311        id="estimatedExecutionTime"
312        property="estimatedExecutionTime"
313        datatype="int"
314        enumeration="<%=execTime%>"
315        title="Estimated time"
316        tooltip="An estimation of the execution time of the plugin"
317        sortable="true" 
318        filterable="true"
319        exportable="true"
320      />
321      <tbl:columndef
322        id="runningTime"
323        title="Running time"
324      />
325      <tbl:columndef 
326        id="created" 
327        property="created"
328        datatype="timestamp" 
329        title="Created" 
330        sortable="true" 
331        filterable="true" 
332        exportable="true"
333        formatter="<%=dateTimeFormatter%>"
334      />
335      <tbl:columndef 
336        id="scheduled" 
337        property="scheduled"
338        datatype="timestamp" 
339        title="Scheduled" 
340        sortable="true" 
341        filterable="true" 
342        exportable="true"
343        formatter="<%=dateTimeFormatter%>"
344      />
345      <tbl:columndef 
346        id="started" 
347        property="started"
348        datatype="timestamp" 
349        title="Started" 
350        sortable="true" 
351        filterable="true" 
352        exportable="true"
353        formatter="<%=dateTimeFormatter%>"
354      />
355      <tbl:columndef 
356        id="ended" 
357        property="ended"
358        datatype="timestamp" 
359        title="Ended" 
360        sortable="true" 
361        filterable="true" 
362        exportable="true"
363        formatter="<%=dateTimeFormatter%>"
364      />
365      <tbl:columndef
366        id="pluginType"
367        property="pluginDefinition.mainType"
368        datatype="int"
369        title="Type"
370        enumeration="<%=pluginTypes%>"
371        sortable="true" 
372        filterable="true"
373        exportable="true"
374      />
375      <tbl:columndef 
376        id="activeProject"
377        property="activeProjectId"
378        datatype="int"
379        title="Active project"
380        enumeration="<%=Enumeration.fromItems(projectQuery.list(dc), "-none-", "0")%>"
381        sortable="true" 
382        filterable="true"
383        exportable="true"
384      />
385      <tbl:columndef 
386        id="experiment"
387        property="experiment.name"
388        datatype="string"
389        title="Experiment"
390        sortable="true" 
391        filterable="true"
392        exportable="true"
393      />
394      <tbl:columndef 
395        id="plugin"
396        property="pluginDefinition.name"
397        datatype="string"
398        title="Plugin"
399        sortable="true" 
400        filterable="true"
401        exportable="true"
402      />
403      <tbl:columndef 
404        id="pluginVersion"
405        property="pluginVersion"
406        datatype="string"
407        title="Plugin version"
408        sortable="true" 
409        filterable="true"
410        exportable="true"
411      />
412      <tbl:columndef 
413        id="configuration"
414        property="pluginConfiguration.name"
415        datatype="string"
416        title="Configuration"
417        sortable="true" 
418        filterable="true"
419        exportable="true"
420      />
421      <tbl:columndef 
422        id="description"
423        property="description"
424        datatype="string"
425        title="Description" 
426        sortable="true" 
427        filterable="true" 
428        exportable="true"
429      />
430      <tbl:columndef
431        id="permission"
432        title="Permission"
433      />
434      <tbl:columndef
435        id="sharedTo"
436        title="Shared to"
437        filterable="true"
438        filterproperty="!sharedTo.name"
439        datatype="string"
440      />
441      <tbl:columndef 
442        id="xt-columns" 
443        extensions="<%=columnsInvoker%>" 
444        jspcontext="<%=jspContext%>" 
445      />
446      <div class="panelgroup bg-filled-50 bottomborder">
447        <tbl:toolbar
448          subclass="bottomborder"
449          visible="<%=mode.hasToolbar()%>"
450          >
451          <tbl:button 
452            id="btnDeleteItems"
453            image="delete.png"
454            title="Delete" 
455            tooltip="Delete the selected items" 
456          />
457          <tbl:button 
458            id="btnRestoreItems"
459            image="restore.png"
460            title="Restore" 
461            tooltip="Restore the selected (deleted) items"
462          />
463          <tbl:button 
464            id="btnAbort"
465            image="abort.png"
466            title="Abort&hellip;" 
467            tooltip="Abort the selected items"
468          />
469          <tbl:button 
470            id="btnPause"
471            image="pause.png"
472            title="Pause&hellip;" 
473            tooltip="Pause the selected items (if they supports it)"
474          />
475          <tbl:button 
476            id="btnShareItems"
477            image="share.png"
478            title="Share&hellip;" 
479            tooltip="Share the selected items"
480          />
481          <tbl:button 
482            id="btnSetOwner"
483            image="take_ownership.png"
484            title="Set owner&hellip;"
485            tooltip="Change owner of the selected items"
486          />
487          <tbl:button 
488            id="btnColumns"
489            image="columns.png" 
490            title="Columns&hellip;" 
491            tooltip="Show, hide and re-order columns" 
492          />
493          <tbl:button 
494            id="btnImport"
495            data-plugin-type="IMPORT"
496            image="import.png" 
497            title="Import&hellip;" 
498            tooltip="Import data" 
499            visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
500          />
501          <tbl:button 
502            id="btnExport"
503            data-plugin-type="EXPORT"
504            image="export.png" 
505            title="Export&hellip;" 
506            tooltip="Export data" 
507            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
508          />
509          <tbl:button 
510            id="btnRunPlugin"
511            data-plugin-type="OTHER"
512            image="runplugin.png" 
513            title="Run plugin&hellip;" 
514            tooltip="Run a plugin" 
515            visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
516          />
517          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
518            wrapper="<%=new PrefixSuffixRenderer<ButtonAction>(jspContext, "<td>", "</td>") %>"/>
519        </tbl:toolbar>
520        <tbl:panel>
521          <tbl:presetselector />
522          <tbl:navigator
523            page="<%=cc.getPage()%>" 
524            rowsperpage="<%=cc.getRowsPerPage()%>" 
525            totalrows="<%=jobs == null ? 0 : jobs.getTotalCount()%>" 
526            visible="<%=mode.hasNavigator()%>"
527          />
528        </tbl:panel>
529      </div>
530      <tbl:data>
531        <tbl:headers>
532          <tbl:headerrow>
533            <tbl:header clazz="row-index bg-filled-100" />
534            <tbl:columnheaders />
535          </tbl:headerrow>
536          <%
537          int numFilters = cc.getNumPropertyFilters();
538          int numRows = cc.getFilterRows();
539          for (int filterNo = 0; filterNo < numRows; filterNo++)
540          {
541            boolean lastRow = filterNo == numRows-1;
542            %>
543            <tbl:headerrow>
544              <tbl:header subclass="row-index bg-filled-100">
545                <div class="index-<%=mode.getName()%>">
546                  <div class="index"></div>
547                  <div class="check">
548                    <base:icon 
549                      subclass="link table-check"
550                      image="check_uncheck.png" 
551                      tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
552                      visible="<%=lastRow && mode.hasCheck()%>"
553                    />
554                  </div>
555                  <div class="icons">
556                    <base:icon
557                      subclass="link table-filter-row-action"
558                      image="add.png"
559                      tooltip="Add extra filter row"
560                      visible="<%=lastRow%>"
561                    /><base:icon
562                      subclass="link table-filter-row-action"
563                      image="remove.png"
564                      tooltip="Remove this filter row"
565                      visible="<%=numRows > 1 || numFilters > 0 %>"
566                      data-remove-row="<%=filterNo%>"
567                    />
568                  </div>
569                </div>
570              </tbl:header>
571              <tbl:propertyfilter row="<%=filterNo%>" />
572            </tbl:headerrow>
573            <%
574          }
575          %>
576          <tbl:columnsubtitles />
577        </tbl:headers>
578        <tbl:rows>
579          <%
580          if (cc.getMessage() != null)
581          {
582            %>
583            <tbl:panel subclass="bg-filled-50">
584              <div class="messagecontainer error"><%=cc.getMessage()%></div>
585            </tbl:panel>
586            <%
587            cc.setMessage(null);
588          }
589          int index = cc.getPage()*cc.getRowsPerPage();
590          int selectedItemId = cc.getId();
591          if (jobs != null)
592          {
593            String tooltip = mode.isSelectionMode() ?
594              "Select this item" : "View this item";
595            while (jobs.hasNext())
596            {
597              Job item = jobs.next();
598              int itemId = item.getId();
599              String name = HTML.encodeTags(item.getName());
600             
601              boolean deletePermission = item.hasPermission(Permission.DELETE);
602              boolean sharePermission = item.hasPermission(Permission.SET_PERMISSION);
603              index++;
604              numListed++;
605              PluginDefinition plugin = null;
606              boolean readPlugin = true;
607              try
608              {
609                plugin = item.getPluginDefinition();
610              }
611              catch (PermissionDeniedException ex)
612              {
613                readPlugin = false;
614              }
615              JobAgent agent = null;
616              boolean readAgent = true;
617              try
618              {
619                agent = item.getJobAgent();
620              }
621              catch (PermissionDeniedException ex)
622              {
623                readAgent = false;
624              }
625              %>
626              <tbl:row>
627                <tbl:header clazz="row-index bg-filled-100">
628                  <div class="index-<%=mode.getName()%>">
629                    <div class="index <%=index>999?"index-smaller":""%>"><%=index%></div>
630                    <div class="check">
631                      <base:input
632                        type="checkbox" 
633                        name="<%=itemId%>" 
634                        value="<%=itemId%>" 
635                        title="<%=name%>" 
636                        checked="<%=cc.getSelected().contains(itemId)%>"
637                        visible="<%=mode.hasCheck()%>"
638                      />
639                      <base:input 
640                        type="radio" 
641                        name="item_id" 
642                        value="<%=itemId%>" 
643                        title="<%=name%>" 
644                        checked="<%=selectedItemId == itemId%>"
645                        visible="<%=mode.hasRadio()%>"
646                      />
647                    </div>
648                    <div class="icons">
649                      <base:icon 
650                        image="deleted.png"
651                        id="<%="delete."+itemId %>"
652                        subclass="<%=deletePermission ? "table-delete-item" : "disabled" %>"
653                        data-item-id="<%=itemId%>"
654                        tooltip="This item has been scheduled for deletion" 
655                        visible="<%=item.isRemoved()%>"
656                      /><base:icon 
657                        image="shared.png" 
658                        id="<%="share."+itemId %>"
659                        subclass="<%=sharePermission ? "table-share-item" : "disabled" %>"
660                        data-item-id="<%=itemId%>"
661                        tooltip="This item is shared to other users, groups and/or projects" 
662                        visible="<%=item.isShared()%>"
663                      />
664                    </div>
665                  </div>
666                </tbl:header>
667                <tbl:cell column="name"><div 
668                  class="link table-item"
669                  data-item-id="<%=itemId%>"
670                  data-no-edit="1"
671                  tabindex="0"
672                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
673                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
674                <tbl:cell column="externalId"><%=HTML.encodeTags(item.getExternalId())%></tbl:cell>
675                <tbl:cell column="itemSubtype"
676                  ><base:propertyvalue 
677                    item="<%=item%>" 
678                    property="itemSubtype"
679                    enableEditLink="<%=mode.hasEditLink()%>" 
680                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
681                  /></tbl:cell>
682                <tbl:cell column="owner"
683                  ><base:propertyvalue 
684                    item="<%=item%>" 
685                    property="owner"
686                    enableEditLink="<%=mode.hasEditLink()%>" 
687                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
688                  /></tbl:cell>
689                <tbl:cell column="priority"><%=item.getPriority()%></tbl:cell>
690                <tbl:cell column="status"><%=item.getStatus()%></tbl:cell>
691                <tbl:cell column="statusMessage"><%=HTML.encodeTags(item.getStatusMessage())%></tbl:cell>
692                <tbl:cell column="dryRun"><%=item.isDryRun()%></tbl:cell>
693                <tbl:cell column="stackTrace"><%=HTML.encodeTags(item.getStackTrace())%></tbl:cell>
694                <tbl:cell column="server"><%=HTML.encodeTags(item.getServer())%></tbl:cell>
695                <tbl:cell column="node"><%=HTML.encodeTags(item.getNode())%></tbl:cell>
696                <tbl:cell column="jobagent"><%=Base.getLinkedName(ID, agent, !readAgent, true)%></tbl:cell>
697                <tbl:cell column="estimatedExecutionTime"><%=item.getEstimatedExecutionTime()%></tbl:cell>
698                <tbl:cell column="percentComplete">
699                  <table class="progressbar <%=item.getStatus() == Job.Status.ERROR ? "failed" : ""%>">
700                  <tr>
701                  <td>
702                    <table class="bar" style="width: 100px;">
703                    <tr>
704                      <%
705                      int percent = item.getPercentComplete();
706                      if (percent > 0) 
707                      {
708                        %>
709                        <td style="width: <%=percent%>%;" class="percentDone">&nbsp;</td>
710                        <% 
711                      }
712                      if (percent == -1)
713                      {
714                        %>
715                        <td style="width: 100%;" class="percentUnknown">unknown</td>
716                        <%
717                      }
718                      else if (percent < 100) 
719                      { 
720                        %>
721                        <td style="width: <%=100-percent%>%;" class="percentRemain">&nbsp;</td>
722                        <%
723                      }
724                      %>
725                    </tr>
726                    </table>
727                  </td>
728                  <%if (percent != -1) { %>
729                    <td class="percentText"><%=percent%>%</td>
730                  <%} %>
731                  </tr>
732                  </table>
733                </tbl:cell>
734                <tbl:cell column="created" value="<%=item.getCreated()%>" />
735                <tbl:cell column="scheduled" value="<%=item.getScheduled()%>" />
736                <tbl:cell column="started" value="<%=item.getStarted()%>" />
737                <tbl:cell column="ended" value="<%=item.getEnded()%>" />
738                <tbl:cell column="runningTime">
739                  <%
740                  Date started = item.getStarted();
741                  if (started != null)
742                  {
743                    Date ended = item.getEnded();
744                    if (ended == null) ended = now;
745                    long runningTime = ended.getTime() - started.getTime();
746                    %>
747                    <%=Values.formatTime(runningTime / 1000)%>
748                    <%
749                  }
750                  %>
751                </tbl:cell>
752                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
753                <tbl:cell column="pluginType">
754                  <%
755                  if (!readPlugin)
756                  {
757                    %>
758                    <i>- denied -</i>
759                    <%
760                  }
761                  else if (plugin == null)
762                  {
763                    %>
764                    <i>- none -</i>
765                    <%
766                  }
767                  else
768                  {
769                    %>
770                    <%=plugin.getMainType()%>
771                    <%
772                  }
773                  %>
774                </tbl:cell>
775                <tbl:cell column="activeProject">
776                  <%
777                  if (item.getActiveProjectId() == 0)
778                  {
779                    %>
780                    <i>- none -</i>
781                    <%
782                  }
783                  else
784                  {
785                    try
786                    {
787                      Project p = Project.getById(dc, item.getActiveProjectId());
788                      %>
789                      <%=HTML.encodeTags(p.getName())%>
790                      <%
791                    }
792                    catch (RuntimeException ex)
793                    {
794                      %>
795                      <i>- denied -</i>
796                      <%
797                    }
798                  }
799                  %>
800                </tbl:cell>
801                <tbl:cell column="experiment"
802                  ><base:propertyvalue 
803                    item="<%=item%>" 
804                    property="experiment"
805                    enableEditLink="<%=mode.hasEditLink()%>" 
806                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
807                  /></tbl:cell>
808                <tbl:cell column="plugin">
809                  <%
810                  if (!readPlugin)
811                  {
812                    %>
813                    <i>- denied -</i>
814                    <%
815                  }
816                  else if (plugin == null)
817                  {
818                    %>
819                    <i>- none -</i>
820                    <%
821                  }
822                  else
823                  {
824                    %>
825                    <%=HTML.encodeTags(plugin.getName())%>
826                    <%
827                  }
828                  %>
829                </tbl:cell>
830                <tbl:cell column="pluginVersion"><%=HTML.encodeTags(item.getPluginVersion())%></tbl:cell>
831                <tbl:cell column="configuration"
832                  ><base:propertyvalue 
833                    item="<%=item%>" 
834                    property="pluginConfiguration"
835                    enableEditLink="<%=mode.hasEditLink()%>" 
836                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
837                  /></tbl:cell>
838                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
839                <tbl:cell column="sharedTo">
840                  <%
841                  Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, item).iterator();
842                  while(sharees.hasNext())
843                  {
844                    Nameable n = sharees.next();
845                    if (mode.hasPropertyLink())
846                    {
847                      out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
848                    }
849                    else
850                    {
851                      out.write(HTML.encodeTags(n.getName()));
852                    }
853                    out.write(sharees.hasNext() ? ", " : "");
854                  }
855                  %>
856                </tbl:cell>
857                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
858                  <tbl:cell column="xt-columns" />
859                </tbl:xt-cells>
860              </tbl:row>
861              <%
862              }
863            }
864          if (numListed == 0)
865          {
866            %>
867            <tbl:panel subclass="bg-filled-50">
868              <div class="messagecontainer note">
869              <%=jobs == null || jobs.getTotalCount() == 0 ? "No jobs were found" : "No jobs on this page. Please select another page!" %>
870              </div>
871            </tbl:panel>
872            <%
873          }
874          %>
875        </tbl:rows>
876      </tbl:data>
877    </tbl:table>
878    </div>
879   
880    <base:buttongroup subclass="dialogbuttons">
881      <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
882      <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
883      <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
884    </base:buttongroup>
885   
886  </base:body>
887  </base:page>
888  <%
889}
890finally
891{
892  if (jobs != null) jobs.close();
893  if (dc != null) dc.close();
894}
895%>
Note: See TracBrowser for help on using the repository browser.