source: branches/3.18-stable/www/admin/plugindefinitions/list_plugins.jsp @ 7932

Last change on this file since 7932 was 7932, checked in by Nicklas Nordborg, 6 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: 23.0 KB
Line 
1<%-- $Id: list_plugins.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, Martin Svensson
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.PluginDefinition"
31  import="net.sf.basedb.core.PluginConfiguration"
32  import="net.sf.basedb.core.ItemQuery"
33  import="net.sf.basedb.core.Include"
34  import="net.sf.basedb.core.Type"
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.Nameable"
39  import="net.sf.basedb.core.Permission"
40  import="net.sf.basedb.core.PluginDefinition"
41  import="net.sf.basedb.core.query.Orders"
42  import="net.sf.basedb.core.query.Hql"
43  import="net.sf.basedb.core.query.Expressions"
44  import="net.sf.basedb.core.query.Restrictions"
45  import="net.sf.basedb.core.plugin.GuiContext"
46  import="net.sf.basedb.core.plugin.Plugin"
47  import="net.sf.basedb.util.Enumeration"
48  import="net.sf.basedb.util.JarClassLoader"
49  import="net.sf.basedb.util.ShareableUtil"
50  import="net.sf.basedb.util.ToStringComparator"
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.util.extensions.ExtensionsInvoker"
64  import="net.sf.basedb.clients.web.extensions.list.ListColumnAction"
65  import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
66  import="java.util.Date"
67  import="java.util.Iterator"
68  import="java.util.List"
69  import="java.util.Map"
70  import="java.util.Set"
71  import="java.util.EnumSet"
72  import="java.util.TreeSet"
73%>
74<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
75<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
76<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
77<%!
78  private static final Item itemType = Item.PLUGINDEFINITION;
79  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
80  private static final Enumeration<String, String> itemTypes = new Enumeration<String, String>();
81  private static final Enumeration<String, String> mainTypes = new Enumeration<String, String>();
82
83  static
84  {
85    Set<Item> temp = new TreeSet<Item>(new ToStringComparator<Item>(false));
86    temp.addAll(EnumSet.complementOf(EnumSet.of(Item.SYSTEM)));
87    itemTypes.add("", "- none -");   
88    for (Item item : temp)
89    {
90      itemTypes.add(Integer.toString(item.getValue()), item.toString());
91    }
92    for (Plugin.MainType v : Plugin.MainType.values())
93    {
94      mainTypes.add(Integer.toString(v.getValue()), v.toString());
95    }
96  }
97%>
98<%
99final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
100final String ID = sc.getId();
101final boolean createPermission = sc.hasPermission(Permission.CREATE, itemType);
102final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
103
104final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
105final String callback = request.getParameter("callback");
106final String title = mode.generateTitle("plugin", "plugins");
107final DbControl dc = sc.newDbControl();
108ItemResultIterator<PluginDefinition> plugins = null;
109try
110{
111  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
112  // Query for plugins relatated to the current type
113  final ItemQuery<PluginConfiguration> configQuery = PluginConfiguration.getQuery();
114  configQuery.include(cc.getInclude());
115  configQuery.restrict(Restrictions.eq(Hql.property("pluginDefinition"), Expressions.parameter("plugin")));
116  configQuery.order(Orders.asc(Hql.property("name"))); 
117  final boolean createConfigurationPermission = sc.hasPermission(Permission.CREATE, Item.PLUGINCONFIGURATION); 
118
119  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
120  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, null);
121  try
122  {
123    final ItemQuery<PluginDefinition> query = Base.getConfiguredQuery(dc, cc, jspContext, true, PluginDefinition.getQuery(), mode);
124    query.join(Hql.leftJoin("guiContexts", "ctx"));
125    query.setDistinct(true);
126    plugins = query.iterate(dc);
127  }
128  catch (Throwable t)
129  {
130    cc.setMessage(t.getMessage());
131    t.printStackTrace();
132  }
133  int numListed = 0;
134  ExtensionsInvoker<ButtonAction> invoker = ToolbarUtil.useExtensions(jspContext);
135  ExtensionsInvoker<ListColumnAction<PluginDefinition,?>> columnsInvoker = ListColumnUtil.useExtensions(jspContext);
136  %>
137  <base:page title="<%=title==null ? "Plugins" : title%>" type="<%=mode.getPageType()%>" id="list-page">
138  <base:head scripts="table.js,~plugins.js" styles="table.css,toolbar.css">
139    <ext:scripts context="<%=jspContext%>" />
140    <ext:stylesheets context="<%=jspContext%>" />
141  </base:head>
142 
143  <base:body>
144    <h1><%=title==null ? "Plugins" : title%></h1>
145    <div class="content">
146    <tbl:table 
147      id="plugins" 
148      columns="<%=cc.getSetting("columns")%>"
149      sortby="<%=cc.getSortProperty()%>" 
150      direction="<%=cc.getSortDirection()%>"
151      action="index.jsp"
152      sc="<%=sc%>"
153      item="<%=itemType%>"
154      filterrows="<%=cc.getFilterRows()%>"
155      subclass="fulltable sticky-headers"
156      >
157      <tbl:hidden 
158        name="mode" 
159        value="<%=mode.getName()%>" 
160      />
161      <tbl:hidden 
162        name="callback" 
163        value="<%=callback%>" 
164        skip="<%=callback == null%>" 
165      />
166      <tbl:columndef 
167        id="name"
168        property="name"
169        datatype="string"
170        title="Name"
171        sortable="true" 
172        filterable="true"
173        exportable="true"
174        show="always" 
175      />
176      <tbl:columndef 
177        id="id"
178        clazz="uniquecol"
179        property="id"
180        datatype="int"
181        title="ID"
182        sortable="true"
183        filterable="true"
184        exportable="true"
185      />
186      <tbl:columndef 
187        id="entryDate"
188        property="entryDate"
189        datatype="date"
190        title="Registered"
191        sortable="true" 
192        filterable="true"
193        exportable="true"
194        formatter="<%=dateFormatter%>"
195      />
196      <tbl:columndef 
197        id="pluginType"
198        property="mainType"
199        datatype="int"
200        enumeration="<%=mainTypes%>"
201        title="Type"
202        sortable="true" 
203        filterable="true"
204        exportable="true"
205      />
206      <tbl:columndef 
207        id="className"
208        clazz="uniquecol"
209        property="className"
210        datatype="string"
211        title="Class"
212        sortable="true" 
213        filterable="true"
214        exportable="true"
215      />
216      <tbl:columndef 
217        id="jarFile"
218        property="jarFile"
219        datatype="string"
220        title="JAR file"
221        sortable="true" 
222        filterable="true"
223        exportable="true"
224      />
225      <tbl:columndef 
226        id="version"
227        property="versionString"
228        datatype="string"
229        title="Version"
230        sortable="true" 
231        filterable="true"
232        exportable="true"
233      />
234      <tbl:columndef 
235        id="configurations"
236        title="Configurations"
237        property="&configurations(name)"
238        datatype="string"
239        filterable="true"
240        exportable="true"
241      />
242      <tbl:columndef 
243        id="contact"
244        property="contact"
245        datatype="string"
246        title="Contact"
247        sortable="true" 
248        filterable="true"
249        exportable="true"
250      />
251      <tbl:columndef 
252        id="copyright"
253        property="copyright"
254        datatype="string"
255        title="Copyright"
256        sortable="true" 
257        filterable="true"
258        exportable="true"
259      />
260      <tbl:columndef 
261        id="email"
262        property="email"
263        datatype="string"
264        title="Email"
265        sortable="true" 
266        filterable="true"
267        exportable="true"
268      />
269      <tbl:columndef 
270        id="url"
271        property="url"
272        datatype="string"
273        title="URL"
274        sortable="true" 
275        filterable="true"
276        exportable="true"
277      />
278      <tbl:columndef 
279        id="disabled"
280        property="disabled"
281        datatype="boolean"
282        title="Disabled"
283        sortable="true" 
284        filterable="true"
285        exportable="true"
286      />
287      <tbl:columndef 
288        id="interactive"
289        property="interactive"
290        datatype="boolean"
291        title="Is interactive"
292        sortable="true" 
293        filterable="true"
294        exportable="true"
295      />
296      <tbl:columndef 
297        id="supportsConfigurations"
298        property="supportsConfigurations"
299        datatype="boolean"
300        title="Support config"
301        sortable="true" 
302        filterable="true"
303        exportable="true"
304      />
305      <tbl:columndef 
306        id="requiresConfiguration"
307        property="requiresConfiguration"
308        datatype="boolean"
309        title="Requires config"
310        sortable="true" 
311        filterable="true"
312        exportable="true"
313      />
314      <tbl:columndef 
315        id="usePermissions"
316        property="usePermissions"
317        datatype="boolean"
318        title="Uses permissions"
319        sortable="true" 
320        filterable="true"
321        exportable="true"
322      />
323      <tbl:columndef 
324        id="allowImmediateExecution"
325        property="allowImmediateExecution"
326        datatype="boolean"
327        title="Immediate execution"
328        sortable="true" 
329        filterable="true"
330        exportable="true"
331      />
332      <tbl:columndef 
333        id="contexts"
334        property="$ctx.itemType"
335        exportproperty="guiContexts.itemType"
336        datatype="int"
337        enumeration="<%=itemTypes%>"
338        title="Items"
339        sortable="false" 
340        filterable="true"
341        exportable="false"
342      />
343      <tbl:columndef 
344        id="maxMemory"
345        property="maxMemory"
346        datatype="long"
347        title="Max memory"
348        sortable="true" 
349        filterable="true"
350        exportable="true"
351      />
352      <tbl:columndef 
353        id="trusted"
354        property="trusted"
355        datatype="boolean"
356        title="Trusted"
357        sortable="true" 
358        filterable="true"
359        exportable="true"
360      />
361      <tbl:columndef 
362        id="useInternalJobQueue"
363        property="useInternalJobQueue"
364        datatype="boolean"
365        title="Use internal job queue"
366        sortable="true" 
367        filterable="true"
368        exportable="true"
369      />
370      <tbl:columndef 
371        id="owner"
372        property="owner.name"
373        datatype="string"
374        title="Owner"
375        sortable="true" 
376        filterable="true"
377        exportable="true"
378      />
379      <tbl:columndef 
380        id="description"
381        property="description"
382        datatype="string"
383        title="Description" 
384        sortable="true" 
385        filterable="true" 
386        exportable="true"
387      />
388      <tbl:columndef
389        id="loaded"
390        title="Loaded"
391      />
392      <tbl:columndef
393        id="permission"
394        title="Permission"
395      />
396      <tbl:columndef
397        id="sharedTo"
398        title="Shared to"
399        filterable="true"
400        filterproperty="!sharedTo.name"
401        datatype="string"
402      />
403      <tbl:columndef 
404        id="xt-columns" 
405        extensions="<%=columnsInvoker%>" 
406        jspcontext="<%=jspContext%>" 
407      />
408      <div class="panelgroup bg-filled-50 bottomborder">
409        <tbl:toolbar
410          subclass="bottomborder"
411          visible="<%=mode.hasToolbar()%>"
412          >
413          <tbl:button 
414            id="btnNewItem"
415            disabled="<%=!createPermission%>" 
416            image="new.png" 
417            title="New&hellip;" 
418            tooltip="<%=createPermission ? "Create new plugin" : "You do not have permission to create plugins"%>" 
419          />
420          <tbl:button 
421            id="btnDeleteItems"
422            image="delete.png"
423            title="Delete" 
424            tooltip="Delete the selected items" 
425          />
426          <tbl:button 
427            id="btnRestoreItems"
428            image="restore.png"
429            title="Restore" 
430            tooltip="Restore the selected (deleted) items"
431          />
432          <tbl:button 
433            id="btnShareItems"
434            image="share.png"
435            title="Share&hellip;" 
436            tooltip="Share the selected items"
437          />
438          <tbl:button 
439            id="btnSetOwner"
440            image="take_ownership.png"
441            title="Set owner&hellip;"
442            tooltip="Change owner of the selected items"
443          />
444          <tbl:button 
445            id="btnColumns"
446            image="columns.png" 
447            title="Columns&hellip;" 
448            tooltip="Show, hide and re-order columns" 
449          />
450          <tbl:button 
451            id="btnImport"
452            data-plugin-type="IMPORT"
453            image="import.png" 
454            title="Import&hellip;" 
455            tooltip="Import data" 
456            visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
457          />
458          <tbl:button 
459            id="btnExport"
460            data-plugin-type="EXPORT"
461            image="export.png" 
462            title="Export&hellip;" 
463            tooltip="Export data" 
464            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
465          />
466          <tbl:button 
467            id="btnRunPlugin"
468            data-plugin-type="OTHER"
469            image="runplugin.png" 
470            title="Run plugin&hellip;" 
471            tooltip="Run a plugin" 
472            visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
473          />
474          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
475            wrapper="<%=new PrefixSuffixRenderer<ButtonAction>(jspContext, "<td>", "</td>") %>"/>
476        </tbl:toolbar>
477        <tbl:panel>
478          <tbl:presetselector />
479          <tbl:navigator
480            page="<%=cc.getPage()%>" 
481            rowsperpage="<%=cc.getRowsPerPage()%>" 
482            totalrows="<%=plugins == null ? 0 : plugins.getTotalCount()%>" 
483            visible="<%=mode.hasNavigator()%>"
484          />
485        </tbl:panel>
486      </div>
487      <tbl:data>
488        <tbl:headers>
489          <tbl:headerrow>
490            <tbl:header colspan="3" />
491            <tbl:columnheaders />
492          </tbl:headerrow>
493          <%
494          int numFilters = cc.getNumPropertyFilters();
495          int numRows = cc.getFilterRows();
496          for (int filterNo = 0; filterNo < numRows; filterNo++)
497          {
498            boolean lastRow = filterNo == numRows-1;
499            %>
500            <tbl:headerrow>
501              <tbl:header subclass="index" />
502              <tbl:header 
503                subclass="check" 
504                visible="<%=mode.hasCheck()%>"
505                ><base:icon 
506                  subclass="link table-check"
507                  image="check_uncheck.png" 
508                  tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
509                  visible="<%=lastRow%>"
510                /></tbl:header>
511              <tbl:header 
512                subclass="check" 
513                visible="<%=mode.hasRadio()%>"
514                />
515              <tbl:header 
516                subclass="icons" 
517                visible="<%=mode.hasIcons()%>"
518                >
519                <base:icon
520                  subclass="link table-filter-row-action"
521                  image="add.png"
522                  tooltip="Add extra filter row"
523                  visible="<%=lastRow%>"
524                /><base:icon
525                  subclass="link table-filter-row-action"
526                  image="remove.png"
527                  tooltip="Remove this filter row"
528                  visible="<%=numRows > 1 || numFilters > 0 %>"
529                  data-remove-row="<%=filterNo%>"
530                />
531              </tbl:header>
532              <tbl:propertyfilter row="<%=filterNo%>" />
533            </tbl:headerrow>
534            <%
535          }
536          %>
537          <tbl:columnsubtitles />
538        </tbl:headers>
539        <tbl:rows>
540          <%
541          if (cc.getMessage() != null)
542          {
543            %>
544            <tbl:panel subclass="bg-filled-50">
545              <div class="messagecontainer error"><%=cc.getMessage()%></div>
546            </tbl:panel>
547            <%
548            cc.setMessage(null);
549          }
550          int index = cc.getPage()*cc.getRowsPerPage();
551          int selectedItemId = cc.getId();
552          Set<GuiContext> contexts = new TreeSet<GuiContext>(new ToStringComparator<GuiContext>(false));
553          if (plugins != null)
554          {
555            while (plugins.hasNext())
556            {
557              PluginDefinition item = plugins.next();
558              int itemId = item.getId();
559             
560              boolean sharePermission = item.hasPermission(Permission.SET_PERMISSION);
561              String name = HTML.encodeTags(item.getName());
562             
563              boolean deletePermission = item.hasPermission(Permission.DELETE);
564              boolean usePermission = item.hasPermission(Permission.USE);
565              boolean writePermission = item.hasPermission(Permission.WRITE);
566              String tooltip = mode.isSelectionMode() ? 
567                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
568              index++;
569              numListed++;
570              %>
571              <tbl:row>
572                <tbl:header 
573                  clazz="index"
574                  ><%=index%></tbl:header>
575                <tbl:header 
576                  clazz="check" 
577                  visible="<%=mode.hasCheck()%>"
578                  ><input 
579                    type="checkbox" 
580                    name="<%=itemId%>" 
581                    value="<%=itemId%>" 
582                    title="<%=name%>" 
583                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
584                  ></tbl:header>
585                <tbl:header 
586                  clazz="check" 
587                  visible="<%=mode.hasRadio()%>"
588                  ><input 
589                    type="radio" 
590                    name="item_id" 
591                    value="<%=itemId%>" 
592                    title="<%=name%>" 
593                    <%=selectedItemId == itemId ? "checked" : ""%>
594                  ></tbl:header>
595                <tbl:header 
596                  clazz="icons" 
597                  visible="<%=mode.hasIcons()%>"
598                  ><base:icon 
599                    image="deleted.png"
600                    id="<%="delete."+itemId %>"
601                    subclass="<%=deletePermission ? "table-delete-item" : "disabled" %>"
602                    data-item-id="<%=itemId%>"
603                    tooltip="This item has been scheduled for deletion" 
604                    visible="<%=item.isRemoved()%>"
605                  /><base:icon 
606                    image="shared.png" 
607                    id="<%="share."+itemId %>"
608                    subclass="<%=sharePermission ? "table-share-item" : "disabled" %>"
609                    data-item-id="<%=itemId%>"
610                    tooltip="This item is shared to other users, groups and/or projects" 
611                    visible="<%=item.isShared()%>"
612                  />&nbsp;</tbl:header>
613                <tbl:cell column="name"><div 
614                  class="link table-item"
615                  data-item-id="<%=itemId%>"
616                  data-no-edit="<%=writePermission ? 0 : 1 %>" 
617                  tabindex="0"
618                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
619                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
620                <tbl:cell column="entryDate" value="<%=item.getEntryDate()%>" />
621                <tbl:cell column="pluginType"><%=item.getMainType()%></tbl:cell>
622                <tbl:cell column="className"><%=item.getClassName()%></tbl:cell>
623                <tbl:cell column="jarFile"><%=Values.getString(item.getJarFile(), "<i>-&nbsp;internal&nbsp;-</i>")%></tbl:cell>
624                <tbl:cell column="version"><%=HTML.encodeTags(item.getVersionString())%></tbl:cell>
625                <tbl:cell column="configurations">
626                  <%
627                  configQuery.setParameter("plugin", itemId, Type.INT);
628                  try
629                  {
630                    String separator = "";
631                    for (PluginConfiguration p : configQuery.list(dc))
632                    {
633                      out.write(separator);
634                      if (mode.hasPropertyLink())
635                      {
636                        out.write(Base.getLinkedName(ID, p, false, mode.hasEditLink()));
637                      }
638                      else
639                      {
640                        out.write(HTML.encodeTags(p.getName()));
641                      }
642                      separator = ", ";
643                    }
644                  }
645                  catch (Throwable t)
646                  {
647                    %>
648                    <div class="error"><%=t.getMessage()%></div>
649                    <%
650                  }
651                  %>
652                  <base:icon
653                    id="<%="create-config."+itemId %>"
654                    subclass="auto-init"
655                    data-auto-init="new-config"
656                    data-item-id="<%=itemId%>"
657                    image="add.png" 
658                    tooltip="Create new configuration" 
659                    visible="<%=mode.hasEditLink() && createConfigurationPermission && usePermission && item.supportsConfigurations() %>"
660                  />
661                </tbl:cell>
662                <tbl:cell column="contact"><%=HTML.encodeTags(item.getContact())%></tbl:cell>
663                <tbl:cell column="copyright"><%=HTML.encodeTags(item.getCopyright())%></tbl:cell>
664                <tbl:cell column="email"><%=HTML.encodeTags(item.getEmail())%></tbl:cell>
665                <tbl:cell column="url"><%=HTML.encodeTags(item.getUrl())%></tbl:cell>
666                <tbl:cell column="disabled"><%=item.isDisabled()%></tbl:cell>
667                <tbl:cell column="interactive"><%=item.isInteractive()%></tbl:cell>
668                <tbl:cell column="supportsConfigurations"><%=item.supportsConfigurations() ? "yes" : "no"%></tbl:cell>
669                <tbl:cell column="requiresConfiguration"><%=item.requiresConfiguration() ? "yes" : "no"%></tbl:cell>
670                <tbl:cell column="usePermissions"><%=item.getUsePermissions() ? "yes" : "no"%></tbl:cell>
671                <tbl:cell column="contexts">
672                  <%
673                  contexts.clear();
674                  contexts.addAll(item.getGuiContexts());
675                  %>
676                  <%=contexts.isEmpty() ? "<i>- none -</i>" : Values.getString(contexts, ", ", true)%>
677                </tbl:cell>
678                <tbl:cell column="loaded"><%=item.getJarPath() == null || JarClassLoader.exists(item.getJarPath()) ? "Yes" : "No"%></tbl:cell>
679                <tbl:cell column="maxMemory"><%=Values.formatBytes(item.getMaxMemory())%></tbl:cell>
680                <tbl:cell column="trusted"><%=item.isTrusted() ? "yes" : "no"%></tbl:cell>
681                <tbl:cell column="useInternalJobQueue"><%=item.getUseInternalJobQueue() ? "yes" : "no"%></tbl:cell>
682                <tbl:cell column="allowImmediateExecution"><%=item.getAllowImmediateExecution() ? "yes" : "no"%></tbl:cell>
683                <tbl:cell column="owner"
684                  ><base:propertyvalue 
685                    item="<%=item%>" 
686                    property="owner"
687                    enableEditLink="<%=mode.hasEditLink()%>" 
688                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
689                  /></tbl:cell>
690                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
691                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
692                <tbl:cell column="sharedTo">
693                  <%
694                  Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, item).iterator();
695                  while(sharees.hasNext())
696                  {
697                    Nameable n = sharees.next();
698                    if (mode.hasPropertyLink())
699                    {
700                      out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
701                    }
702                    else
703                    {
704                      out.write(HTML.encodeTags(n.getName()));
705                    }
706                    out.write(sharees.hasNext() ? ", " : "");
707                  }
708                  %>
709                </tbl:cell>
710                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
711                  <tbl:cell column="xt-columns" />
712                </tbl:xt-cells>
713              </tbl:row>
714              <%
715              }
716            }
717          if (numListed == 0)
718          {
719            %>
720            <tbl:panel subclass="bg-filled-50">
721              <div class="messagecontainer note">
722              <%=plugins == null || plugins.getTotalCount() == 0 ? "No plugins were found" : "No plugins on this page. Please select another page!" %>
723              </div>
724            </tbl:panel>
725            <%
726          }
727          %>
728        </tbl:rows>
729      </tbl:data>
730    </tbl:table>
731    </div>
732   
733    <base:buttongroup subclass="dialogbuttons">
734      <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
735      <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
736      <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
737    </base:buttongroup>
738   
739  </base:body>
740  </base:page>
741  <%
742}
743finally
744{
745  if (plugins != null) plugins.close();
746  if (dc != null) dc.close();
747}
748%>
Note: See TracBrowser for help on using the repository browser.