source: trunk/www/views/jobs/list_jobs.jsp @ 5707

Last change on this file since 5707 was 5707, checked in by Nicklas Nordborg, 10 years ago

Fixes #1617: Use a different color for progress bar of failed jobs

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 21.7 KB
Line 
1<%-- $Id: list_jobs.jsp 5707 2011-08-25 07:06:07Z 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.ItemQuery"
33  import="net.sf.basedb.core.Include"
34  import="net.sf.basedb.core.ItemResultIterator"
35  import="net.sf.basedb.core.ItemResultList"
36  import="net.sf.basedb.core.ItemContext"
37  import="net.sf.basedb.core.Permission"
38  import="net.sf.basedb.core.PluginDefinition"
39  import="net.sf.basedb.core.PermissionDeniedException"
40  import="net.sf.basedb.core.query.Hql"
41  import="net.sf.basedb.core.query.Orders"
42  import="net.sf.basedb.core.query.Restrictions"
43  import="net.sf.basedb.core.query.Expressions"
44  import="net.sf.basedb.core.plugin.GuiContext"
45  import="net.sf.basedb.core.plugin.Plugin"
46  import="net.sf.basedb.util.Enumeration"
47  import="net.sf.basedb.clients.web.Base"
48  import="net.sf.basedb.clients.web.ModeInfo"
49  import="net.sf.basedb.clients.web.PermissionUtil"
50  import="net.sf.basedb.clients.web.util.HTML"
51  import="net.sf.basedb.util.Values"
52  import="net.sf.basedb.util.formatter.Formatter"
53  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
54  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
55  import="net.sf.basedb.clients.web.extensions.JspContext"
56  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
57  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
58  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
59  import="java.util.List"
60  import="java.util.Map"
61  import="java.util.Date"
62%>
63<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
64<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
65<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
66<%!
67  private static final Item itemType = Item.JOB;
68  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
69 
70  private static final Enumeration<String, String> status = new Enumeration<String, String>();
71  private static final Enumeration<String, String> pluginTypes = new Enumeration<String, String>();
72  private static final Enumeration<String, String> execTime = new Enumeration<String, String>();
73  static
74  {
75    for (Job.Status s : Job.Status.values())
76    {
77      status.add(Integer.toString(s.getValue()), HTML.encodeTags(s.toString()));
78    }
79    for (Plugin.MainType pt : Plugin.MainType.values())
80    {
81      pluginTypes.add(Integer.toString(pt.getValue()), HTML.encodeTags(pt.toString()));
82    }
83    for (Job.ExecutionTime et : Job.ExecutionTime.values())
84    {
85      execTime.add(Integer.toString(et.getValue()), HTML.encodeTags(et.toString()));
86    }
87  }
88%>
89<%
90final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
91final String ID = sc.getId();
92final boolean createPermission = sc.hasPermission(Permission.CREATE, itemType);
93final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
94final Date now = new Date();
95final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
96final String callback = request.getParameter("callback");
97final String title = mode.generateTitle("job", "jobs");
98final DbControl dc = sc.newDbControl();
99ItemResultIterator<Job> jobs = null;
100try
101{
102 
103  // Get all job agents
104  final ItemQuery<JobAgent> agentQuery = JobAgent.getQuery();
105  agentQuery.include(Include.ALL);
106  agentQuery.order(Orders.asc(Hql.property("name")));
107  agentQuery.setCacheResult(true);
108  Enumeration<String, String> agents = new Enumeration<String, String>();
109  for (JobAgent a : agentQuery.list(dc))
110  {
111    agents.add(Integer.toString(a.getId()), a.getName());
112  }
113 
114  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
115  try
116  {
117    final ItemQuery<Job> query = Base.getConfiguredQuery(dc, cc, true, Job.getQuery(), mode);
118    jobs = query.iterate(dc);
119  }
120  catch (Throwable t)
121  {
122    cc.setMessage(t.getMessage());
123    t.printStackTrace();
124  }
125  int numListed = 0;
126  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
127  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, null);
128  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
129  %>
130  <base:page title="<%=title==null ? "Jobs" : title%>" type="<%=mode.getPageType()%>">
131  <base:head scripts="menu.js,table.js" styles="menu.css,table.css,progressbar.css">
132    <ext:scripts context="<%=jspContext%>" />
133    <ext:stylesheets context="<%=jspContext%>" />
134    <script language="JavaScript">
135    var submitPage = 'index.jsp';
136    var formId = 'jobs';
137    function viewItem(itemId)
138    {
139      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, false);
140    }
141    function itemOnClick(evt, itemId)
142    {
143      viewItem(itemId);
144    }
145    function deleteItems()
146    {
147      var frm = document.forms[formId];
148      if (Forms.numChecked(frm) == 0)
149      {
150        alert('Please select at least one item in the list');
151        return;
152      }
153      frm.action = submitPage;
154      frm.cmd.value = 'DeleteItems';
155      frm.submit();
156    }
157    function restoreItems()
158    {
159      var frm = document.forms[formId];
160      if (Forms.numChecked(frm) == 0)
161      {
162        alert('Please select at least one item in the list');
163        return;
164      }
165      frm.action = submitPage;
166      frm.cmd.value = 'RestoreItems';
167      frm.submit();
168    }
169    function deleteItemPermanently(itemId)
170    {
171      Main.deleteItemPermanently('<%=ID%>', true, '<%=itemType.name()%>', itemId);
172    }
173    function setOwner()
174    {
175      Table.setOwnerOfItems(submitPage, '<%=ID%>', formId, '<%=itemType.name()%>', 'SetOwnerOfItems');
176    }
177    function configureColumns()
178    {
179      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
180    }
181    function runPlugin(cmd)
182    {
183      Table.submitToPopup(formId, cmd, 740, 540);
184    }
185    function returnSelected()
186    {
187      Table.returnSelected(formId, <%=callback != null ? "window.opener."+callback : "null" %>);
188      window.close();
189    }
190    function presetOnChange()
191    {
192      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
193    }
194    </script>
195  </base:head>
196 
197  <base:body>
198    <%
199    if (cc.getMessage() != null)
200    {
201      %>
202      <div class="error"><%=cc.getMessage()%></div>
203      <%
204      cc.setMessage(null);
205    }
206    %>
207    <tbl:table 
208      id="jobs" 
209      clazz="itemlist" 
210      columns="<%=cc.getSetting("columns")%>"
211      sortby="<%=cc.getSortProperty()%>" 
212      direction="<%=cc.getSortDirection()%>"
213      title="<%=title%>"
214      action="index.jsp"
215      sc="<%=sc%>"
216      item="<%=itemType%>"
217      >
218      <tbl:hidden 
219        name="mode" 
220        value="<%=mode.getName()%>" 
221      />
222      <tbl:hidden 
223        name="callback" 
224        value="<%=callback%>" 
225        skip="<%=callback == null%>" 
226      />
227      <tbl:columndef 
228        id="name"
229        property="name"
230        datatype="string"
231        title="Name"
232        sortable="true" 
233        filterable="true"
234        exportable="true"
235        show="always" 
236      />
237      <tbl:columndef 
238        id="id"
239        clazz="uniquecol"
240        property="id"
241        datatype="int"
242        title="ID"
243        sortable="true"
244        filterable="true"
245        exportable="true"
246      />
247      <tbl:columndef 
248        id="owner"
249        property="owner.name"
250        datatype="string"
251        title="Owner"
252        sortable="true" 
253        filterable="true"
254        exportable="true"
255      />
256      <tbl:columndef 
257        id="priority"
258        property="priority"
259        datatype="int"
260        title="Priority"
261        sortable="true" 
262        filterable="true"
263        exportable="true"
264      />
265      <tbl:columndef 
266        id="status"
267        property="status"
268        datatype="int"
269        enumeration="<%=status%>"
270        title="Status"
271        sortable="true" 
272        filterable="true"
273        exportable="true"
274      />
275      <tbl:columndef 
276        id="statusMessage"
277        property="statusMessage"
278        datatype="string"
279        title="Status message"
280        sortable="true" 
281        filterable="true"
282        exportable="true"
283      />
284      <tbl:columndef 
285        id="dryRun"
286        property="dryRun"
287        datatype="boolean"
288        title="Dry run"
289        sortable="true" 
290        filterable="true"
291        exportable="true"
292      />
293      <tbl:columndef 
294        id="stackTrace"
295        property="stackTrace"
296        datatype="string"
297        title="Stack trace"
298        sortable="true" 
299        filterable="true"
300        exportable="true"
301      />
302      <tbl:columndef 
303        id="server"
304        property="server"
305        datatype="string"
306        title="Server"
307        sortable="true" 
308        filterable="true"
309        exportable="true"
310      />
311      <tbl:columndef 
312        id="jobagent"
313        property="jobAgentId"
314        datatype="int"
315        title="Job agent"
316        filterable="true"
317        enumeration="<%=agents%>"
318      />
319      <tbl:columndef 
320        id="percentComplete"
321        property="percentComplete"
322        datatype="int"
323        title="Percent complete"
324        sortable="true" 
325        filterable="true"
326        exportable="true"
327      />
328      <tbl:columndef 
329        id="estimatedExecutionTime"
330        property="estimatedExecutionTime"
331        datatype="int"
332        enumeration="<%=execTime%>"
333        title="Estimated time"
334        tooltip="An estimation of the execution time of the plugin"
335        sortable="true" 
336        filterable="true"
337        exportable="true"
338      />
339      <tbl:columndef
340        id="runningTime"
341        title="Running time"
342      />
343      <tbl:columndef 
344        id="created" 
345        property="created"
346        datatype="timestamp" 
347        title="Created" 
348        sortable="true" 
349        filterable="true" 
350        exportable="true"
351        formatter="<%=dateTimeFormatter%>"
352      />
353      <tbl:columndef 
354        id="scheduled" 
355        property="scheduled"
356        datatype="timestamp" 
357        title="Scheduled" 
358        sortable="true" 
359        filterable="true" 
360        exportable="true"
361        formatter="<%=dateTimeFormatter%>"
362      />
363      <tbl:columndef 
364        id="started" 
365        property="started"
366        datatype="timestamp" 
367        title="Started" 
368        sortable="true" 
369        filterable="true" 
370        exportable="true"
371        formatter="<%=dateTimeFormatter%>"
372      />
373      <tbl:columndef 
374        id="ended" 
375        property="ended"
376        datatype="timestamp" 
377        title="Ended" 
378        sortable="true" 
379        filterable="true" 
380        exportable="true"
381        formatter="<%=dateTimeFormatter%>"
382      />
383      <tbl:columndef
384        id="pluginType"
385        property="pluginDefinition.mainType"
386        datatype="int"
387        title="Type"
388        enumeration="<%=pluginTypes%>"
389        sortable="true" 
390        filterable="true"
391        exportable="true"
392      />
393      <tbl:columndef 
394        id="experiment"
395        property="experiment.name"
396        datatype="string"
397        title="Experiment"
398        sortable="true" 
399        filterable="true"
400        exportable="true"
401      />
402      <tbl:columndef 
403        id="plugin"
404        property="pluginDefinition.name"
405        datatype="string"
406        title="Plugin"
407        sortable="true" 
408        filterable="true"
409        exportable="true"
410      />
411      <tbl:columndef 
412        id="pluginVersion"
413        property="pluginVersion"
414        datatype="string"
415        title="Plugin version"
416        sortable="true" 
417        filterable="true"
418        exportable="true"
419      />
420      <tbl:columndef 
421        id="configuration"
422        property="pluginConfiguration.name"
423        datatype="string"
424        title="Configuration"
425        sortable="true" 
426        filterable="true"
427        exportable="true"
428      />
429      <tbl:columndef 
430        id="description"
431        property="description"
432        datatype="string"
433        title="Description" 
434        sortable="true" 
435        filterable="true" 
436        exportable="true"
437      />
438      <tbl:columndef
439        id="permission"
440        title="Permission"
441      />
442      <tbl:toolbar
443        visible="<%=mode.hasToolbar()%>"
444        >
445        <tbl:button 
446          image="delete.gif"
447          onclick="deleteItems()" 
448          title="Delete" 
449          tooltip="Delete the selected items" 
450        />
451        <tbl:button 
452          image="restore.gif"
453          onclick="restoreItems()" 
454          title="Restore" 
455          tooltip="Restore the selected (deleted) items"
456        />
457        <tbl:button 
458          image="take_ownership.png"
459          onclick="setOwner()" 
460          title="Set owner&hellip;"
461          tooltip="Change owner of the selected items"
462        />
463        <tbl:button 
464          image="columns.gif" 
465          onclick="configureColumns()" 
466          title="Columns&hellip;" 
467          tooltip="Show, hide and re-order columns" 
468        />
469        <tbl:button 
470          image="import.gif" 
471          onclick="runPlugin('ImportItems')" 
472          title="Import&hellip;" 
473          tooltip="Import data" 
474          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
475        />
476        <tbl:button 
477          image="export.gif" 
478          onclick="runPlugin('ExportItems')" 
479          title="Export&hellip;" 
480          tooltip="Export data" 
481          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
482        />
483        <tbl:button 
484          image="runplugin.gif" 
485          onclick="runPlugin('RunListPlugin')" 
486          title="Run plugin&hellip;" 
487          tooltip="Run a plugin" 
488          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
489        />
490        <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
491          wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
492      </tbl:toolbar>
493      <tbl:navigator
494        page="<%=cc.getPage()%>" 
495        rowsperpage="<%=cc.getRowsPerPage()%>" 
496        totalrows="<%=jobs == null ? 0 : jobs.getTotalCount()%>" 
497        visible="<%=mode.hasNavigator()%>"
498      />
499      <tbl:data>
500        <tbl:columns>
501        <tbl:presetselector 
502          clazz="columnheader"
503          colspan="3"
504          onchange="presetOnChange()"
505        />
506        </tbl:columns>
507
508        <tr>
509          <tbl:header 
510            clazz="index"
511            >&nbsp;</tbl:header>
512          <tbl:header 
513            clazz="check" 
514            visible="<%=mode.hasCheck()%>"
515            ><base:icon 
516              image="check_uncheck.gif" 
517              tooltip="Check/uncheck all" 
518              onclick="Forms.checkUncheck(document.forms[formId])" style="align: left;"
519            /></tbl:header>
520          <tbl:header 
521            clazz="check" 
522            visible="<%=mode.hasRadio()%>"
523            >&nbsp;</tbl:header>
524          <tbl:header 
525            clazz="icons" 
526            visible="<%=mode.hasIcons()%>"
527            >&nbsp;</tbl:header>
528          <tbl:propertyfilter />
529        </tr>
530         
531          <tbl:rows>
532          <%
533          int index = cc.getPage()*cc.getRowsPerPage();
534          int selectedItemId = cc.getId();
535          if (jobs != null)
536          {
537            String tooltip = mode.isSelectionMode() ?
538              "Select this item" : "View this item";
539            while (jobs.hasNext())
540            {
541              Job item = jobs.next();
542              int itemId = item.getId();
543              String name = HTML.encodeTags(item.getName());
544              String deletePermanently = "deleteItemPermanently("+itemId+")";
545              boolean deletePermission = item.hasPermission(Permission.DELETE);
546              index++;
547              numListed++;
548              PluginDefinition plugin = null;
549              boolean readPlugin = true;
550              try
551              {
552                plugin = item.getPluginDefinition();
553              }
554              catch (PermissionDeniedException ex)
555              {
556                readPlugin = false;
557              }
558              JobAgent agent = null;
559              boolean readAgent = true;
560              try
561              {
562                agent = item.getJobAgent();
563              }
564              catch (PermissionDeniedException ex)
565              {
566                readAgent = false;
567              }
568              %>
569              <tbl:row>
570                <tbl:header 
571                  clazz="index"
572                  ><%=index%></tbl:header>
573                <tbl:header 
574                  clazz="check" 
575                  visible="<%=mode.hasCheck()%>"
576                  ><input 
577                    type="checkbox" 
578                    name="<%=itemId%>" 
579                    value="<%=itemId%>" 
580                    title="<%=name%>" 
581                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
582                  ></tbl:header>
583                <tbl:header 
584                  clazz="check" 
585                  visible="<%=mode.hasRadio()%>"
586                  ><input 
587                    type="radio" 
588                    name="item_id" 
589                    value="<%=itemId%>" 
590                    title="<%=name%>" 
591                    <%=selectedItemId == itemId ? "checked" : ""%>
592                  ></tbl:header>
593                <tbl:header 
594                  clazz="icons" 
595                  visible="<%=mode.hasIcons()%>"
596                  ><base:icon 
597                    image="<%=deletePermission ? "deleted.gif" : "deleted_disabled.gif"%>"
598                    onclick="<%=deletePermission ? deletePermanently : null%>"
599                    tooltip="This item has been scheduled for deletion" 
600                    visible="<%=item.isRemoved()%>"
601                  />&nbsp;</tbl:header>
602                <tbl:cell column="name"><div class="link" onclick="itemOnClick(event, <%=itemId%>)" 
603                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
604                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
605                <tbl:cell column="owner"
606                  ><base:propertyvalue 
607                    item="<%=item%>" 
608                    property="owner"
609                    enableEditLink="<%=mode.hasEditLink()%>" 
610                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
611                  /></tbl:cell>
612                <tbl:cell column="priority"><%=item.getPriority()%></tbl:cell>
613                <tbl:cell column="status"><%=item.getStatus()%></tbl:cell>
614                <tbl:cell column="statusMessage"><%=HTML.encodeTags(item.getStatusMessage())%></tbl:cell>
615                <tbl:cell column="dryRun"><%=item.isDryRun()%></tbl:cell>
616                <tbl:cell column="stackTrace"><%=HTML.encodeTags(item.getStackTrace())%></tbl:cell>
617                <tbl:cell column="server"><%=HTML.encodeTags(item.getServer())%></tbl:cell>
618                <tbl:cell column="jobagent"><%=Base.getLinkedName(ID, agent, !readAgent, true)%></tbl:cell>
619                <tbl:cell column="estimatedExecutionTime"><%=item.getEstimatedExecutionTime()%></tbl:cell>
620                <tbl:cell column="percentComplete">
621                  <table border=0 cellspacing=0 cellpadding=0>
622                  <tr>
623                  <td width="100">
624                    <table width="100" class="progressbar <%=item.getStatus() == Job.Status.ERROR ? "error" : ""%>" border=0 cellspacing=0 cellpadding=0>
625                    <tr>
626                      <%
627                      int percent = item.getPercentComplete();
628                      if (percent > 0) 
629                      {
630                        %>
631                        <td width="<%=percent%>%" class="done">&nbsp;</td>
632                        <% 
633                      }
634                      if (percent == -1)
635                      {
636                        %>
637                        <td width="100%" class="unknown">unknown</td>
638                        <%
639                      }
640                      else if (percent < 100) 
641                      { 
642                        %>
643                        <td width="<%=100-percent%>%" class="remain">&nbsp;</td>
644                        <%
645                      }
646                      %>
647                    </tr>
648                    </table>
649                  </td>
650                  <%if (percent != -1) { %>
651                  <td>&nbsp;<%=percent%>%</td>
652                  <%} %>
653                  </tr>
654                  </table>
655                </tbl:cell>
656                <tbl:cell column="created" value="<%=item.getCreated()%>" />
657                <tbl:cell column="scheduled" value="<%=item.getScheduled()%>" />
658                <tbl:cell column="started" value="<%=item.getStarted()%>" />
659                <tbl:cell column="ended" value="<%=item.getEnded()%>" />
660                <tbl:cell column="runningTime">
661                  <%
662                  Date started = item.getStarted();
663                  if (started != null)
664                  {
665                    Date ended = item.getEnded();
666                    if (ended == null) ended = now;
667                    long runningTime = ended.getTime() - started.getTime();
668                    %>
669                    <%=Values.formatTime(runningTime / 1000)%>
670                    <%
671                  }
672                  %>
673                </tbl:cell>
674                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
675                <tbl:cell column="pluginType">
676                  <%
677                  if (!readPlugin)
678                  {
679                    %>
680                    <i>- denied -</i>
681                    <%
682                  }
683                  else if (plugin == null)
684                  {
685                    %>
686                    <i>- none -</i>
687                    <%
688                  }
689                  else
690                  {
691                    %>
692                    <%=plugin.getMainType()%>
693                    <%
694                  }
695                  %>
696                </tbl:cell>
697                <tbl:cell column="experiment"
698                  ><base:propertyvalue 
699                    item="<%=item%>" 
700                    property="experiment"
701                    enableEditLink="<%=mode.hasEditLink()%>" 
702                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
703                  /></tbl:cell>
704                <tbl:cell column="plugin">
705                  <%
706                  if (!readPlugin)
707                  {
708                    %>
709                    <i>- denied -</i>
710                    <%
711                  }
712                  else if (plugin == null)
713                  {
714                    %>
715                    <i>- none -</i>
716                    <%
717                  }
718                  else
719                  {
720                    %>
721                    <%=HTML.encodeTags(plugin.getName())%>
722                    <%
723                  }
724                  %>
725                </tbl:cell>
726                <tbl:cell column="pluginVersion"><%=HTML.encodeTags(item.getPluginVersion())%></tbl:cell>
727                <tbl:cell column="configuration"
728                  ><base:propertyvalue 
729                    item="<%=item%>" 
730                    property="pluginConfiguration"
731                    enableEditLink="<%=mode.hasEditLink()%>" 
732                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
733                  /></tbl:cell>
734                  <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
735              </tbl:row>
736              <%
737              }
738            }
739          %>
740          </tbl:rows>
741      </tbl:data>
742      <%
743      if (numListed == 0)
744      {
745        %>
746        <tbl:panel><%=jobs == null || jobs.getTotalCount() == 0 ? "No jobs were found" : "No jobs on this page. Please select another page!" %></tbl:panel>
747        <%
748      }
749      else
750      {
751        %>
752        <tbl:navigator
753          page="<%=cc.getPage()%>" 
754          rowsperpage="<%=cc.getRowsPerPage()%>" 
755          totalrows="<%=jobs == null ? 0 : jobs.getTotalCount()%>" 
756          visible="<%=mode.hasNavigator()%>"
757          locked="true"
758        />
759        <%
760      }
761      %>
762    </tbl:table>
763    <base:buttongroup align="center" clazz="fixedatbottom">
764      <base:button onclick="returnSelected();" title="Ok" visible="<%=mode.hasOkButton()%>" />
765      <base:button onclick="window.close();" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
766      <base:button onclick="window.close();" title="Close" visible="<%=mode.hasCloseButton()%>" />
767    </base:buttongroup>
768    <br><br><br>
769  </base:body>
770  </base:page>
771  <%
772}
773finally
774{
775  if (jobs != null) jobs.close();
776  if (dc != null) dc.close();
777}
778%>
Note: See TracBrowser for help on using the repository browser.