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

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

References #2246: Sticky table headers

Implemented for all item list pages and a few other places:

  • Extensions installation dialog
  • Administrate / Services list page
  • Batch inherit annotations
  • Manage list presets
  • List of changed item in view job dialog


  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 25.2 KB
Line 
1<%-- $Id: list_jobs.jsp 7932 2021-04-28 07:16:56Z 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 sticky-headers"
168      >
169      <tbl:hidden 
170        name="mode" 
171        value="<%=mode.getName()%>" 
172      />
173      <tbl:hidden 
174        name="callback" 
175        value="<%=callback%>" 
176        skip="<%=callback == null%>" 
177      />
178      <tbl:columndef 
179        id="name"
180        property="name"
181        datatype="string"
182        title="Name"
183        sortable="true" 
184        filterable="true"
185        exportable="true"
186        show="always" 
187      />
188      <tbl:columndef 
189        id="id"
190        clazz="uniquecol"
191        property="id"
192        datatype="int"
193        title="ID"
194        sortable="true"
195        filterable="true"
196        exportable="true"
197      />
198      <tbl:columndef 
199        id="externalId"
200        property="externalId"
201        datatype="string"
202        title="External ID"
203        sortable="true"
204        filterable="true"
205        exportable="true"
206      />
207      <tbl:columndef 
208        id="itemSubtype"
209        property="itemSubtype"
210        sortproperty="itemSubtype.name"
211        exportproperty="itemSubtype.name:string"
212        datatype="int"
213        enumeration="<%=Enumeration.fromItems(typeQuery.list(dc), "-none-")%>"
214        title="Subtype"
215        sortable="true" 
216        filterable="true"
217        exportable="true"
218      />
219      <tbl:columndef 
220        id="owner"
221        property="owner.name"
222        datatype="string"
223        title="Owner"
224        sortable="true" 
225        filterable="true"
226        exportable="true"
227      />
228      <tbl:columndef 
229        id="priority"
230        property="priority"
231        datatype="int"
232        title="Priority"
233        sortable="true" 
234        filterable="true"
235        exportable="true"
236      />
237      <tbl:columndef 
238        id="status"
239        property="status"
240        datatype="int"
241        enumeration="<%=status%>"
242        title="Status"
243        sortable="true" 
244        filterable="true"
245        exportable="true"
246      />
247      <tbl:columndef 
248        id="statusMessage"
249        property="statusMessage"
250        datatype="string"
251        title="Status message"
252        sortable="true" 
253        filterable="true"
254        exportable="true"
255      />
256      <tbl:columndef 
257        id="dryRun"
258        property="dryRun"
259        datatype="boolean"
260        title="Dry run"
261        sortable="true" 
262        filterable="true"
263        exportable="true"
264      />
265      <tbl:columndef 
266        id="stackTrace"
267        property="stackTrace"
268        datatype="string"
269        title="Stack trace"
270        sortable="true" 
271        filterable="true"
272        exportable="true"
273      />
274      <tbl:columndef 
275        id="server"
276        property="server"
277        datatype="string"
278        title="Server"
279        sortable="true" 
280        filterable="true"
281        exportable="true"
282      />
283      <tbl:columndef 
284        id="node"
285        property="node"
286        datatype="string"
287        title="Node"
288        sortable="true" 
289        filterable="true"
290        exportable="true"
291      />
292      <tbl:columndef 
293        id="jobagent"
294        property="jobAgentId"
295        datatype="int"
296        title="Job agent"
297        filterable="true"
298        enumeration="<%=agents%>"
299      />
300      <tbl:columndef 
301        id="percentComplete"
302        property="percentComplete"
303        datatype="int"
304        title="Percent complete"
305        sortable="true" 
306        filterable="true"
307        exportable="true"
308      />
309      <tbl:columndef 
310        id="estimatedExecutionTime"
311        property="estimatedExecutionTime"
312        datatype="int"
313        enumeration="<%=execTime%>"
314        title="Estimated time"
315        tooltip="An estimation of the execution time of the plugin"
316        sortable="true" 
317        filterable="true"
318        exportable="true"
319      />
320      <tbl:columndef
321        id="runningTime"
322        title="Running time"
323      />
324      <tbl:columndef 
325        id="created" 
326        property="created"
327        datatype="timestamp" 
328        title="Created" 
329        sortable="true" 
330        filterable="true" 
331        exportable="true"
332        formatter="<%=dateTimeFormatter%>"
333      />
334      <tbl:columndef 
335        id="scheduled" 
336        property="scheduled"
337        datatype="timestamp" 
338        title="Scheduled" 
339        sortable="true" 
340        filterable="true" 
341        exportable="true"
342        formatter="<%=dateTimeFormatter%>"
343      />
344      <tbl:columndef 
345        id="started" 
346        property="started"
347        datatype="timestamp" 
348        title="Started" 
349        sortable="true" 
350        filterable="true" 
351        exportable="true"
352        formatter="<%=dateTimeFormatter%>"
353      />
354      <tbl:columndef 
355        id="ended" 
356        property="ended"
357        datatype="timestamp" 
358        title="Ended" 
359        sortable="true" 
360        filterable="true" 
361        exportable="true"
362        formatter="<%=dateTimeFormatter%>"
363      />
364      <tbl:columndef
365        id="pluginType"
366        property="pluginDefinition.mainType"
367        datatype="int"
368        title="Type"
369        enumeration="<%=pluginTypes%>"
370        sortable="true" 
371        filterable="true"
372        exportable="true"
373      />
374      <tbl:columndef 
375        id="activeProject"
376        property="activeProjectId"
377        datatype="int"
378        title="Active project"
379        enumeration="<%=Enumeration.fromItems(projectQuery.list(dc), "-none-", "0")%>"
380        sortable="true" 
381        filterable="true"
382        exportable="true"
383      />
384      <tbl:columndef 
385        id="experiment"
386        property="experiment.name"
387        datatype="string"
388        title="Experiment"
389        sortable="true" 
390        filterable="true"
391        exportable="true"
392      />
393      <tbl:columndef 
394        id="plugin"
395        property="pluginDefinition.name"
396        datatype="string"
397        title="Plugin"
398        sortable="true" 
399        filterable="true"
400        exportable="true"
401      />
402      <tbl:columndef 
403        id="pluginVersion"
404        property="pluginVersion"
405        datatype="string"
406        title="Plugin version"
407        sortable="true" 
408        filterable="true"
409        exportable="true"
410      />
411      <tbl:columndef 
412        id="configuration"
413        property="pluginConfiguration.name"
414        datatype="string"
415        title="Configuration"
416        sortable="true" 
417        filterable="true"
418        exportable="true"
419      />
420      <tbl:columndef 
421        id="description"
422        property="description"
423        datatype="string"
424        title="Description" 
425        sortable="true" 
426        filterable="true" 
427        exportable="true"
428      />
429      <tbl:columndef
430        id="permission"
431        title="Permission"
432      />
433      <tbl:columndef
434        id="sharedTo"
435        title="Shared to"
436        filterable="true"
437        filterproperty="!sharedTo.name"
438        datatype="string"
439      />
440      <tbl:columndef 
441        id="xt-columns" 
442        extensions="<%=columnsInvoker%>" 
443        jspcontext="<%=jspContext%>" 
444      />
445      <div class="panelgroup bg-filled-50 bottomborder">
446        <tbl:toolbar
447          subclass="bottomborder"
448          visible="<%=mode.hasToolbar()%>"
449          >
450          <tbl:button 
451            id="btnDeleteItems"
452            image="delete.png"
453            title="Delete" 
454            tooltip="Delete the selected items" 
455          />
456          <tbl:button 
457            id="btnRestoreItems"
458            image="restore.png"
459            title="Restore" 
460            tooltip="Restore the selected (deleted) items"
461          />
462          <tbl:button 
463            id="btnAbort"
464            image="abort.png"
465            title="Abort&hellip;" 
466            tooltip="Abort the selected items"
467          />
468          <tbl:button 
469            id="btnPause"
470            image="pause.png"
471            title="Pause&hellip;" 
472            tooltip="Pause the selected items (if they supports it)"
473          />
474          <tbl:button 
475            id="btnShareItems"
476            image="share.png"
477            title="Share&hellip;" 
478            tooltip="Share the selected items"
479          />
480          <tbl:button 
481            id="btnSetOwner"
482            image="take_ownership.png"
483            title="Set owner&hellip;"
484            tooltip="Change owner of the selected items"
485          />
486          <tbl:button 
487            id="btnColumns"
488            image="columns.png" 
489            title="Columns&hellip;" 
490            tooltip="Show, hide and re-order columns" 
491          />
492          <tbl:button 
493            id="btnImport"
494            data-plugin-type="IMPORT"
495            image="import.png" 
496            title="Import&hellip;" 
497            tooltip="Import data" 
498            visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
499          />
500          <tbl:button 
501            id="btnExport"
502            data-plugin-type="EXPORT"
503            image="export.png" 
504            title="Export&hellip;" 
505            tooltip="Export data" 
506            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
507          />
508          <tbl:button 
509            id="btnRunPlugin"
510            data-plugin-type="OTHER"
511            image="runplugin.png" 
512            title="Run plugin&hellip;" 
513            tooltip="Run a plugin" 
514            visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
515          />
516          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
517            wrapper="<%=new PrefixSuffixRenderer<ButtonAction>(jspContext, "<td>", "</td>") %>"/>
518        </tbl:toolbar>
519        <tbl:panel>
520          <tbl:presetselector />
521          <tbl:navigator
522            page="<%=cc.getPage()%>" 
523            rowsperpage="<%=cc.getRowsPerPage()%>" 
524            totalrows="<%=jobs == null ? 0 : jobs.getTotalCount()%>" 
525            visible="<%=mode.hasNavigator()%>"
526          />
527        </tbl:panel>
528      </div>
529      <tbl:data>
530        <tbl:headers>
531          <tbl:headerrow>
532            <tbl:header colspan="3" />
533            <tbl:columnheaders />
534          </tbl:headerrow>
535          <%
536          int numFilters = cc.getNumPropertyFilters();
537          int numRows = cc.getFilterRows();
538          for (int filterNo = 0; filterNo < numRows; filterNo++)
539          {
540            boolean lastRow = filterNo == numRows-1;
541            %>
542            <tbl:headerrow>
543              <tbl:header subclass="index" />
544              <tbl:header 
545                subclass="check" 
546                visible="<%=mode.hasCheck()%>"
547                ><base:icon 
548                  subclass="link table-check"
549                  image="check_uncheck.png" 
550                  tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
551                  visible="<%=lastRow%>"
552                /></tbl:header>
553              <tbl:header 
554                subclass="check" 
555                visible="<%=mode.hasRadio()%>"
556                />
557              <tbl:header 
558                subclass="icons" 
559                visible="<%=mode.hasIcons()%>"
560                >
561                <base:icon
562                  subclass="link table-filter-row-action"
563                  image="add.png"
564                  tooltip="Add extra filter row"
565                  visible="<%=lastRow%>"
566                /><base:icon
567                  subclass="link table-filter-row-action"
568                  image="remove.png"
569                  tooltip="Remove this filter row"
570                  visible="<%=numRows > 1 || numFilters > 0 %>"
571                  data-remove-row="<%=filterNo%>"
572                />
573              </tbl:header>
574              <tbl:propertyfilter row="<%=filterNo%>" />
575            </tbl:headerrow>
576            <%
577          }
578          %>
579          <tbl:columnsubtitles />
580        </tbl:headers>
581        <tbl:rows>
582          <%
583          if (cc.getMessage() != null)
584          {
585            %>
586            <tbl:panel subclass="bg-filled-50">
587              <div class="messagecontainer error"><%=cc.getMessage()%></div>
588            </tbl:panel>
589            <%
590            cc.setMessage(null);
591          }
592          int index = cc.getPage()*cc.getRowsPerPage();
593          int selectedItemId = cc.getId();
594          if (jobs != null)
595          {
596            String tooltip = mode.isSelectionMode() ?
597              "Select this item" : "View this item";
598            while (jobs.hasNext())
599            {
600              Job item = jobs.next();
601              int itemId = item.getId();
602              String name = HTML.encodeTags(item.getName());
603             
604              boolean deletePermission = item.hasPermission(Permission.DELETE);
605              index++;
606              numListed++;
607              PluginDefinition plugin = null;
608              boolean readPlugin = true;
609              try
610              {
611                plugin = item.getPluginDefinition();
612              }
613              catch (PermissionDeniedException ex)
614              {
615                readPlugin = false;
616              }
617              JobAgent agent = null;
618              boolean readAgent = true;
619              try
620              {
621                agent = item.getJobAgent();
622              }
623              catch (PermissionDeniedException ex)
624              {
625                readAgent = false;
626              }
627              %>
628              <tbl:row>
629                <tbl:header 
630                  clazz="index"
631                  ><%=index%></tbl:header>
632                <tbl:header 
633                  clazz="check" 
634                  visible="<%=mode.hasCheck()%>"
635                  ><input 
636                    type="checkbox" 
637                    name="<%=itemId%>" 
638                    value="<%=itemId%>" 
639                    title="<%=name%>" 
640                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
641                  ></tbl:header>
642                <tbl:header 
643                  clazz="check" 
644                  visible="<%=mode.hasRadio()%>"
645                  ><input 
646                    type="radio" 
647                    name="item_id" 
648                    value="<%=itemId%>" 
649                    title="<%=name%>" 
650                    <%=selectedItemId == itemId ? "checked" : ""%>
651                  ></tbl:header>
652                <tbl:header 
653                  clazz="icons" 
654                  visible="<%=mode.hasIcons()%>"
655                  ><base:icon 
656                    image="deleted.png"
657                    id="<%="delete."+itemId %>"
658                    subclass="<%=deletePermission ? "table-delete-item" : "disabled" %>"
659                    data-item-id="<%=itemId%>"
660                    tooltip="This item has been scheduled for deletion" 
661                    visible="<%=item.isRemoved()%>"
662                  />&nbsp;</tbl:header>
663                <tbl:cell column="name"><div 
664                  class="link table-item"
665                  data-item-id="<%=itemId%>"
666                  data-no-edit="1"
667                  tabindex="0"
668                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
669                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
670                <tbl:cell column="externalId"><%=HTML.encodeTags(item.getExternalId())%></tbl:cell>
671                <tbl:cell column="itemSubtype"
672                  ><base:propertyvalue 
673                    item="<%=item%>" 
674                    property="itemSubtype"
675                    enableEditLink="<%=mode.hasEditLink()%>" 
676                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
677                  /></tbl:cell>
678                <tbl:cell column="owner"
679                  ><base:propertyvalue 
680                    item="<%=item%>" 
681                    property="owner"
682                    enableEditLink="<%=mode.hasEditLink()%>" 
683                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
684                  /></tbl:cell>
685                <tbl:cell column="priority"><%=item.getPriority()%></tbl:cell>
686                <tbl:cell column="status"><%=item.getStatus()%></tbl:cell>
687                <tbl:cell column="statusMessage"><%=HTML.encodeTags(item.getStatusMessage())%></tbl:cell>
688                <tbl:cell column="dryRun"><%=item.isDryRun()%></tbl:cell>
689                <tbl:cell column="stackTrace"><%=HTML.encodeTags(item.getStackTrace())%></tbl:cell>
690                <tbl:cell column="server"><%=HTML.encodeTags(item.getServer())%></tbl:cell>
691                <tbl:cell column="node"><%=HTML.encodeTags(item.getNode())%></tbl:cell>
692                <tbl:cell column="jobagent"><%=Base.getLinkedName(ID, agent, !readAgent, true)%></tbl:cell>
693                <tbl:cell column="estimatedExecutionTime"><%=item.getEstimatedExecutionTime()%></tbl:cell>
694                <tbl:cell column="percentComplete">
695                  <table class="progressbar <%=item.getStatus() == Job.Status.ERROR ? "failed" : ""%>">
696                  <tr>
697                  <td>
698                    <table class="bar" style="width: 100px;">
699                    <tr>
700                      <%
701                      int percent = item.getPercentComplete();
702                      if (percent > 0) 
703                      {
704                        %>
705                        <td style="width: <%=percent%>%;" class="percentDone">&nbsp;</td>
706                        <% 
707                      }
708                      if (percent == -1)
709                      {
710                        %>
711                        <td style="width: 100%;" class="percentUnknown">unknown</td>
712                        <%
713                      }
714                      else if (percent < 100) 
715                      { 
716                        %>
717                        <td style="width: <%=100-percent%>%;" class="percentRemain">&nbsp;</td>
718                        <%
719                      }
720                      %>
721                    </tr>
722                    </table>
723                  </td>
724                  <%if (percent != -1) { %>
725                    <td class="percentText"><%=percent%>%</td>
726                  <%} %>
727                  </tr>
728                  </table>
729                </tbl:cell>
730                <tbl:cell column="created" value="<%=item.getCreated()%>" />
731                <tbl:cell column="scheduled" value="<%=item.getScheduled()%>" />
732                <tbl:cell column="started" value="<%=item.getStarted()%>" />
733                <tbl:cell column="ended" value="<%=item.getEnded()%>" />
734                <tbl:cell column="runningTime">
735                  <%
736                  Date started = item.getStarted();
737                  if (started != null)
738                  {
739                    Date ended = item.getEnded();
740                    if (ended == null) ended = now;
741                    long runningTime = ended.getTime() - started.getTime();
742                    %>
743                    <%=Values.formatTime(runningTime / 1000)%>
744                    <%
745                  }
746                  %>
747                </tbl:cell>
748                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
749                <tbl:cell column="pluginType">
750                  <%
751                  if (!readPlugin)
752                  {
753                    %>
754                    <i>- denied -</i>
755                    <%
756                  }
757                  else if (plugin == null)
758                  {
759                    %>
760                    <i>- none -</i>
761                    <%
762                  }
763                  else
764                  {
765                    %>
766                    <%=plugin.getMainType()%>
767                    <%
768                  }
769                  %>
770                </tbl:cell>
771                <tbl:cell column="activeProject">
772                  <%
773                  if (item.getActiveProjectId() == 0)
774                  {
775                    %>
776                    <i>- none -</i>
777                    <%
778                  }
779                  else
780                  {
781                    try
782                    {
783                      Project p = Project.getById(dc, item.getActiveProjectId());
784                      %>
785                      <%=HTML.encodeTags(p.getName())%>
786                      <%
787                    }
788                    catch (RuntimeException ex)
789                    {
790                      %>
791                      <i>- denied -</i>
792                      <%
793                    }
794                  }
795                  %>
796                </tbl:cell>
797                <tbl:cell column="experiment"
798                  ><base:propertyvalue 
799                    item="<%=item%>" 
800                    property="experiment"
801                    enableEditLink="<%=mode.hasEditLink()%>" 
802                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
803                  /></tbl:cell>
804                <tbl:cell column="plugin">
805                  <%
806                  if (!readPlugin)
807                  {
808                    %>
809                    <i>- denied -</i>
810                    <%
811                  }
812                  else if (plugin == null)
813                  {
814                    %>
815                    <i>- none -</i>
816                    <%
817                  }
818                  else
819                  {
820                    %>
821                    <%=HTML.encodeTags(plugin.getName())%>
822                    <%
823                  }
824                  %>
825                </tbl:cell>
826                <tbl:cell column="pluginVersion"><%=HTML.encodeTags(item.getPluginVersion())%></tbl:cell>
827                <tbl:cell column="configuration"
828                  ><base:propertyvalue 
829                    item="<%=item%>" 
830                    property="pluginConfiguration"
831                    enableEditLink="<%=mode.hasEditLink()%>" 
832                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
833                  /></tbl:cell>
834                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
835                <tbl:cell column="sharedTo">
836                  <%
837                  Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, item).iterator();
838                  while(sharees.hasNext())
839                  {
840                    Nameable n = sharees.next();
841                    if (mode.hasPropertyLink())
842                    {
843                      out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
844                    }
845                    else
846                    {
847                      out.write(HTML.encodeTags(n.getName()));
848                    }
849                    out.write(sharees.hasNext() ? ", " : "");
850                  }
851                  %>
852                </tbl:cell>
853                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
854                  <tbl:cell column="xt-columns" />
855                </tbl:xt-cells>
856              </tbl:row>
857              <%
858              }
859            }
860          if (numListed == 0)
861          {
862            %>
863            <tbl:panel subclass="bg-filled-50">
864              <div class="messagecontainer note">
865              <%=jobs == null || jobs.getTotalCount() == 0 ? "No jobs were found" : "No jobs on this page. Please select another page!" %>
866              </div>
867            </tbl:panel>
868            <%
869          }
870          %>
871        </tbl:rows>
872      </tbl:data>
873    </tbl:table>
874    </div>
875   
876    <base:buttongroup subclass="dialogbuttons">
877      <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
878      <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
879      <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
880    </base:buttongroup>
881   
882  </base:body>
883  </base:page>
884  <%
885}
886finally
887{
888  if (jobs != null) jobs.close();
889  if (dc != null) dc.close();
890}
891%>
Note: See TracBrowser for help on using the repository browser.