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

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

References #1655: GUI improvements

  • Fixes rest of list pages in Biomaterial LIMS menu
  • Introduced an 'iframe' page type so that thos pages doesn't have to 'cannibalise' on the 'popup' page type (doesn't works well with absolutely positioned content).
  • Fixed subclass="dialogbuttons" on all list pages when used in popup form


  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 21.6 KB
Line 
1<%-- $Id: list_jobs.jsp 5951 2012-02-09 14:19:17Z 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,toolbar.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, 750, 500);
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       
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.png"
447          onclick="deleteItems()" 
448          title="Delete" 
449          tooltip="Delete the selected items" 
450        />
451        <tbl:button 
452          image="restore.png"
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.png" 
465          onclick="configureColumns()" 
466          title="Columns&hellip;" 
467          tooltip="Show, hide and re-order columns" 
468        />
469        <tbl:button 
470          image="import.png" 
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.png" 
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.png" 
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:headers>
501          <tbl:headerrow>
502            <tbl:header colspan="3" />
503            <tbl:columnheaders />
504          </tbl:headerrow>
505          <tbl:headerrow>
506            <tbl:header subclass="index" />
507            <tbl:header 
508              subclass="check" 
509              visible="<%=mode.hasCheck()%>"
510              ><base:icon 
511                image="check_uncheck.png" 
512                tooltip="Check/uncheck all" 
513                onclick="Forms.checkUncheck(document.forms[formId])" 
514              /></tbl:header>
515            <tbl:header 
516              subclass="check" 
517              visible="<%=mode.hasRadio()%>"
518              />
519            <tbl:header 
520              subclass="icons" 
521              visible="<%=mode.hasIcons()%>"
522              />
523            <tbl:propertyfilter />
524          </tbl:headerrow>
525        </tbl:headers>
526        <tbl:rows>
527          <%
528          int index = cc.getPage()*cc.getRowsPerPage();
529          int selectedItemId = cc.getId();
530          if (jobs != null)
531          {
532            String tooltip = mode.isSelectionMode() ?
533              "Select this item" : "View this item";
534            while (jobs.hasNext())
535            {
536              Job item = jobs.next();
537              int itemId = item.getId();
538              String name = HTML.encodeTags(item.getName());
539              String deletePermanently = "deleteItemPermanently("+itemId+")";
540              boolean deletePermission = item.hasPermission(Permission.DELETE);
541              index++;
542              numListed++;
543              PluginDefinition plugin = null;
544              boolean readPlugin = true;
545              try
546              {
547                plugin = item.getPluginDefinition();
548              }
549              catch (PermissionDeniedException ex)
550              {
551                readPlugin = false;
552              }
553              JobAgent agent = null;
554              boolean readAgent = true;
555              try
556              {
557                agent = item.getJobAgent();
558              }
559              catch (PermissionDeniedException ex)
560              {
561                readAgent = false;
562              }
563              %>
564              <tbl:row>
565                <tbl:header 
566                  clazz="index"
567                  ><%=index%></tbl:header>
568                <tbl:header 
569                  clazz="check" 
570                  visible="<%=mode.hasCheck()%>"
571                  ><input 
572                    type="checkbox" 
573                    name="<%=itemId%>" 
574                    value="<%=itemId%>" 
575                    title="<%=name%>" 
576                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
577                  ></tbl:header>
578                <tbl:header 
579                  clazz="check" 
580                  visible="<%=mode.hasRadio()%>"
581                  ><input 
582                    type="radio" 
583                    name="item_id" 
584                    value="<%=itemId%>" 
585                    title="<%=name%>" 
586                    <%=selectedItemId == itemId ? "checked" : ""%>
587                  ></tbl:header>
588                <tbl:header 
589                  clazz="icons" 
590                  visible="<%=mode.hasIcons()%>"
591                  ><base:icon 
592                    image="deleted.png"
593                    onclick="<%=deletePermission ? deletePermanently : null%>"
594                    tooltip="This item has been scheduled for deletion" 
595                    visible="<%=item.isRemoved()%>"
596                  />&nbsp;</tbl:header>
597                <tbl:cell column="name"><div class="link" onclick="itemOnClick(event, <%=itemId%>)" 
598                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
599                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
600                <tbl:cell column="owner"
601                  ><base:propertyvalue 
602                    item="<%=item%>" 
603                    property="owner"
604                    enableEditLink="<%=mode.hasEditLink()%>" 
605                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
606                  /></tbl:cell>
607                <tbl:cell column="priority"><%=item.getPriority()%></tbl:cell>
608                <tbl:cell column="status"><%=item.getStatus()%></tbl:cell>
609                <tbl:cell column="statusMessage"><%=HTML.encodeTags(item.getStatusMessage())%></tbl:cell>
610                <tbl:cell column="dryRun"><%=item.isDryRun()%></tbl:cell>
611                <tbl:cell column="stackTrace"><%=HTML.encodeTags(item.getStackTrace())%></tbl:cell>
612                <tbl:cell column="server"><%=HTML.encodeTags(item.getServer())%></tbl:cell>
613                <tbl:cell column="jobagent"><%=Base.getLinkedName(ID, agent, !readAgent, true)%></tbl:cell>
614                <tbl:cell column="estimatedExecutionTime"><%=item.getEstimatedExecutionTime()%></tbl:cell>
615                <tbl:cell column="percentComplete">
616                  <table border=0 cellspacing=0 cellpadding=0>
617                  <tr>
618                  <td width="100">
619                    <table width="100" class="progressbar <%=item.getStatus() == Job.Status.ERROR ? "error" : ""%>" border=0 cellspacing=0 cellpadding=0>
620                    <tr>
621                      <%
622                      int percent = item.getPercentComplete();
623                      if (percent > 0) 
624                      {
625                        %>
626                        <td width="<%=percent%>%" class="done">&nbsp;</td>
627                        <% 
628                      }
629                      if (percent == -1)
630                      {
631                        %>
632                        <td width="100%" class="unknown">unknown</td>
633                        <%
634                      }
635                      else if (percent < 100) 
636                      { 
637                        %>
638                        <td width="<%=100-percent%>%" class="remain">&nbsp;</td>
639                        <%
640                      }
641                      %>
642                    </tr>
643                    </table>
644                  </td>
645                  <%if (percent != -1) { %>
646                  <td>&nbsp;<%=percent%>%</td>
647                  <%} %>
648                  </tr>
649                  </table>
650                </tbl:cell>
651                <tbl:cell column="created" value="<%=item.getCreated()%>" />
652                <tbl:cell column="scheduled" value="<%=item.getScheduled()%>" />
653                <tbl:cell column="started" value="<%=item.getStarted()%>" />
654                <tbl:cell column="ended" value="<%=item.getEnded()%>" />
655                <tbl:cell column="runningTime">
656                  <%
657                  Date started = item.getStarted();
658                  if (started != null)
659                  {
660                    Date ended = item.getEnded();
661                    if (ended == null) ended = now;
662                    long runningTime = ended.getTime() - started.getTime();
663                    %>
664                    <%=Values.formatTime(runningTime / 1000)%>
665                    <%
666                  }
667                  %>
668                </tbl:cell>
669                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
670                <tbl:cell column="pluginType">
671                  <%
672                  if (!readPlugin)
673                  {
674                    %>
675                    <i>- denied -</i>
676                    <%
677                  }
678                  else if (plugin == null)
679                  {
680                    %>
681                    <i>- none -</i>
682                    <%
683                  }
684                  else
685                  {
686                    %>
687                    <%=plugin.getMainType()%>
688                    <%
689                  }
690                  %>
691                </tbl:cell>
692                <tbl:cell column="experiment"
693                  ><base:propertyvalue 
694                    item="<%=item%>" 
695                    property="experiment"
696                    enableEditLink="<%=mode.hasEditLink()%>" 
697                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
698                  /></tbl:cell>
699                <tbl:cell column="plugin">
700                  <%
701                  if (!readPlugin)
702                  {
703                    %>
704                    <i>- denied -</i>
705                    <%
706                  }
707                  else if (plugin == null)
708                  {
709                    %>
710                    <i>- none -</i>
711                    <%
712                  }
713                  else
714                  {
715                    %>
716                    <%=HTML.encodeTags(plugin.getName())%>
717                    <%
718                  }
719                  %>
720                </tbl:cell>
721                <tbl:cell column="pluginVersion"><%=HTML.encodeTags(item.getPluginVersion())%></tbl:cell>
722                <tbl:cell column="configuration"
723                  ><base:propertyvalue 
724                    item="<%=item%>" 
725                    property="pluginConfiguration"
726                    enableEditLink="<%=mode.hasEditLink()%>" 
727                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
728                  /></tbl:cell>
729                  <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
730              </tbl:row>
731              <%
732              }
733            }
734          %>
735          </tbl:rows>
736      </tbl:data>
737      <%
738      if (numListed == 0)
739      {
740        %>
741        <tbl:panel><%=jobs == null || jobs.getTotalCount() == 0 ? "No jobs were found" : "No jobs on this page. Please select another page!" %></tbl:panel>
742        <%
743      }
744      else
745      {
746        %>
747        <tbl:navigator
748          page="<%=cc.getPage()%>" 
749          rowsperpage="<%=cc.getRowsPerPage()%>" 
750          totalrows="<%=jobs == null ? 0 : jobs.getTotalCount()%>" 
751          visible="<%=mode.hasNavigator()%>"
752          locked="true"
753        />
754        <%
755      }
756      %>
757    </tbl:table>
758    <base:buttongroup subclass="dialogbuttons">
759      <base:button onclick="returnSelected();" title="Ok" visible="<%=mode.hasOkButton()%>" />
760      <base:button onclick="window.close();" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
761      <base:button onclick="window.close();" title="Close" visible="<%=mode.hasCloseButton()%>" />
762    </base:buttongroup>
763   
764  </base:body>
765  </base:page>
766  <%
767}
768finally
769{
770  if (jobs != null) jobs.close();
771  if (dc != null) dc.close();
772}
773%>
Note: See TracBrowser for help on using the repository browser.