source: trunk/www/admin/software/list_software.jsp @ 6222

Last change on this file since 6222 was 6222, checked in by Nicklas Nordborg, 9 years ago

References #1729 and #1730. Fixed for the software pages. Includes adding support for 'Share' and 'Set owner' buttons. Added support for using custom events instead of callback methods to return selected items. Slightly tested with the 'Edit project' page, but need a page with updated script for full testing.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 14.6 KB
Line 
1<%-- $Id: list_software.jsp 6222 2013-01-14 11:46:55Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell, 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.Software"
31  import="net.sf.basedb.core.ItemSubtype"
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.Nameable"
38  import="net.sf.basedb.core.Permission"
39  import="net.sf.basedb.core.PluginDefinition"
40  import="net.sf.basedb.core.query.Orders"
41  import="net.sf.basedb.core.query.Hql"
42  import="net.sf.basedb.core.plugin.GuiContext"
43  import="net.sf.basedb.core.plugin.Plugin"
44  import="net.sf.basedb.util.Enumeration"
45  import="net.sf.basedb.util.ShareableUtil"
46  import="net.sf.basedb.clients.web.Base"
47  import="net.sf.basedb.clients.web.ModeInfo"
48  import="net.sf.basedb.clients.web.PermissionUtil"
49  import="net.sf.basedb.clients.web.util.HTML"
50  import="net.sf.basedb.util.Values"
51  import="net.sf.basedb.util.formatter.Formatter"
52  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
53  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
54  import="net.sf.basedb.clients.web.extensions.JspContext"
55  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
56  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
57  import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
58  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
59  import="java.util.Date"
60  import="java.util.Iterator"
61  import="java.util.List"
62  import="java.util.Map"
63%>
64<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
65<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
66<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
67<%!
68  private static final Item itemType = Item.SOFTWARE;
69  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
70%>
71<%
72final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
73final String ID = sc.getId();
74final boolean createPermission = sc.hasPermission(Permission.CREATE, itemType);
75final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
76
77final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
78final String callback = request.getParameter("callback");
79final String title = mode.generateTitle("software", "software");
80final DbControl dc = sc.newDbControl();
81ItemResultIterator<Software> software = null;
82try
83{
84  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
85  final ItemQuery<ItemSubtype> subtypesQuery = Base.getSubtypesQuery(itemType);
86
87  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
88  try
89  {
90    final ItemQuery<Software> query = Base.getConfiguredQuery(dc, cc, true, Software.getQuery(), mode);
91    software = query.iterate(dc);
92  }
93  catch (Throwable t)
94  {
95    cc.setMessage(t.getMessage());
96  }
97  int numListed = 0;
98  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, null);
99  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
100  ExtensionsInvoker columnsInvoker = ListColumnUtil.useExtensions(jspContext);
101  %>
102  <base:page title="<%=title==null ? "Software" : title%>" type="<%=mode.getPageType()%>" id="list-page">
103  <base:head scripts="table.js,~software.js" styles="table.css,toolbar.css">
104    <ext:scripts context="<%=jspContext%>" />
105    <ext:stylesheets context="<%=jspContext%>" />
106  </base:head>
107 
108  <base:body>
109    <h1><%=title==null ? "Software" : title%></h1>
110    <div class="content">
111    <tbl:table 
112      id="software" 
113      columns="<%=cc.getSetting("columns")%>"
114      sortby="<%=cc.getSortProperty()%>" 
115      direction="<%=cc.getSortDirection()%>"
116      action="index.jsp"
117      sc="<%=sc%>"
118      item="<%=itemType%>"
119      subclass="fulltable"
120      >
121      <tbl:hidden 
122        name="mode" 
123        value="<%=mode.getName()%>" 
124      />
125      <tbl:hidden 
126        name="callback" 
127        value="<%=callback%>" 
128        skip="<%=callback == null%>" 
129      />
130      <tbl:columndef 
131        id="name"
132        property="name"
133        datatype="string"
134        title="Name"
135        sortable="true" 
136        filterable="true"
137        exportable="true"
138        show="always" 
139      />
140      <tbl:columndef 
141        id="id"
142        clazz="uniquecol"
143        property="id"
144        datatype="int"
145        title="ID"
146        sortable="true"
147        filterable="true"
148        exportable="true"
149      />
150      <tbl:columndef 
151        id="entryDate"
152        property="entryDate"
153        datatype="date"
154        title="Registered"
155        sortable="true" 
156        filterable="true"
157        exportable="true"
158        formatter="<%=dateFormatter%>"
159      />
160      <tbl:columndef 
161        id="version"
162        property="versionString"
163        datatype="string"
164        title="Version"
165        sortable="true"
166        filterable="true"
167        exportable="true"
168      />
169      <tbl:columndef 
170        id="itemSubtype"
171        property="itemSubtype"
172        sortproperty="itemSubtype.name"
173        exportproperty="itemSubtype.name:string"
174        datatype="int"
175        enumeration="<%=Enumeration.fromItems(subtypesQuery.list(dc), "-none-")%>"
176        title="Type"
177        sortable="true" 
178        filterable="true"
179        exportable="true"
180      />
181      <tbl:columndef 
182        id="owner"
183        property="owner.name"
184        datatype="string"
185        title="Owner"
186        sortable="true" 
187        filterable="true"
188        exportable="true"
189      />
190      <tbl:columndef 
191        id="description"
192        property="description"
193        datatype="string"
194        title="Description" 
195        sortable="true" 
196        filterable="true" 
197        exportable="true"
198      />
199      <tbl:columndef
200        id="permission"
201        title="Permission"
202      />
203      <tbl:columndef
204        id="sharedTo"
205        title="Shared to"
206        filterable="true"
207        filterproperty="!sharedTo.name"
208        datatype="string"
209      />
210      <tbl:columndef 
211        id="xt-columns" 
212        extensions="<%=columnsInvoker%>" 
213        jspcontext="<%=jspContext%>" 
214      />
215      <div class="panelgroup bottomborder">
216        <tbl:toolbar
217          subclass="bottomborder"
218          visible="<%=mode.hasToolbar()%>"
219          >
220          <tbl:button 
221            id="btnNewItem"
222            disabled="<%=!createPermission%>" 
223            image="new.png" 
224            title="New&hellip;" 
225            tooltip="<%=createPermission ? "Create new software" : "You do not have permission to create software"%>" 
226          />
227          <tbl:button
228            id="btnDeleteItems" 
229            image="delete.png"
230            title="Delete" 
231            tooltip="Delete the selected items" 
232          />
233          <tbl:button 
234            id="btnRestoreItems"
235            image="restore.png" 
236            title="Restore" 
237            tooltip="Restore the selected (deleted) items"
238          />
239          <tbl:button 
240            id="btnShareItems"
241            image="share.png"
242            title="Share&hellip;" 
243            tooltip="Share the selected items"
244          />
245          <tbl:button 
246            id="btnSetOwnerOfItems"
247            image="take_ownership.png"
248            title="Set owner&hellip;"
249            tooltip="Change owner of the selected items"
250          />
251          <tbl:button 
252            id="btnColumns"
253            image="columns.png" 
254            title="Columns&hellip;" 
255            tooltip="Show, hide and re-order columns" 
256          />
257          <tbl:button 
258            id="btnImport"
259            data-plugin-type="IMPORT"
260            image="import.png" 
261            title="Import&hellip;" 
262            tooltip="Import data" 
263            visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
264          />
265          <tbl:button 
266            id="btnExport"
267            data-plugin-type="EXPORT"
268            image="export.png" 
269            title="Export&hellip;" 
270            tooltip="Export data" 
271            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
272          />
273          <tbl:button 
274            id="btnRunPlugin"
275            data-plugin-type="OTHER"
276            image="runplugin.png" 
277            title="Run plugin&hellip;" 
278            tooltip="Run a plugin" 
279            visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
280          />
281          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
282            wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
283        </tbl:toolbar>
284        <tbl:panel>
285          <tbl:presetselector />
286          <tbl:navigator
287            page="<%=cc.getPage()%>" 
288            rowsperpage="<%=cc.getRowsPerPage()%>" 
289            totalrows="<%=software == null ? 0 : software.getTotalCount()%>" 
290            visible="<%=mode.hasNavigator()%>"
291          />
292        </tbl:panel>
293      </div>
294      <tbl:data>
295        <tbl:headers>
296          <tbl:headerrow>
297            <tbl:header colspan="3" />
298            <tbl:columnheaders />
299          </tbl:headerrow>
300          <tbl:headerrow>
301            <tbl:header subclass="index" />
302            <tbl:header 
303              subclass="check" 
304              visible="<%=mode.hasCheck()%>"
305              ><base:icon 
306                id="check.uncheck"
307                image="check_uncheck.png" 
308                tooltip="Check/uncheck all" 
309                 
310              /></tbl:header>
311            <tbl:header 
312              subclass="check" 
313              visible="<%=mode.hasRadio()%>"
314              />
315            <tbl:header 
316              subclass="icons" 
317              visible="<%=mode.hasIcons()%>"
318              />
319            <tbl:propertyfilter />
320          </tbl:headerrow>
321        </tbl:headers>
322        <tbl:rows>
323          <%
324          if (cc.getMessage() != null)
325          {
326            %>
327            <tbl:panel clazz="messagepanel">
328              <div class="messagecontainer error"><%=cc.getMessage()%></div>
329            </tbl:panel>
330            <%
331            cc.setMessage(null);
332          }
333          int index = cc.getPage()*cc.getRowsPerPage();
334          int selectedItemId = Values.getInt(request.getParameter("item_id"));
335          if (software != null)
336          {           
337            while (software.hasNext())
338            {
339              Software item = software.next();
340              int itemId = item.getId();
341             
342             
343              boolean deletePermission = item.hasPermission(Permission.DELETE);
344              boolean sharePermission = item.hasPermission(Permission.SET_PERMISSION);
345              boolean writePermission = item.hasPermission(Permission.WRITE);
346              String tooltip = mode.isSelectionMode() ? 
347                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
348              String name = HTML.encodeTags(item.getName());
349              index++;
350              numListed++;
351              %>
352              <tbl:row>
353                <tbl:header 
354                  clazz="index"
355                  ><%=index%></tbl:header>
356                <tbl:header 
357                  clazz="check" 
358                  visible="<%=mode.hasCheck()%>"
359                  ><input 
360                    type="checkbox" 
361                    name="<%=itemId%>" 
362                    value="<%=itemId%>" 
363                    title="<%=name%>" 
364                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
365                  ></tbl:header>
366                <tbl:header 
367                  clazz="check" 
368                  visible="<%=mode.hasRadio()%>"
369                  ><input 
370                    type="radio" 
371                    name="item_id" 
372                    value="<%=itemId%>" 
373                    title="<%=name%>" 
374                    <%=selectedItemId == itemId ? "checked" : ""%>
375                  ></tbl:header>
376                <tbl:header 
377                  clazz="icons" 
378                  visible="<%=mode.hasIcons()%>"
379                  ><base:icon 
380                    image="deleted.png"
381                    id="<%="delete."+itemId %>"
382                    subclass="<%=deletePermission ? "table-delete-item" : null %>"
383                    data-item-id="<%=itemId%>"
384                    tooltip="This item has been scheduled for deletion" 
385                    visible="<%=item.isRemoved()%>"
386                  /><base:icon 
387                    image="shared.png" 
388                    id="<%="share."+itemId %>"
389                    subclass="<%=sharePermission ? "table-share-item" : null %>"
390                    data-item-id="<%=itemId%>"
391                    tooltip="This item is shared to other users, groups and/or projects" 
392                    visible="<%=item.isShared()%>"
393                  />&nbsp;</tbl:header>
394                <tbl:cell column="name"><div 
395                  class="link table-item" 
396                  data-item-id="<%=itemId%>"
397                  data-no-edit="<%=writePermission ? 0 : 1 %>"
398                  tabindex="0"
399                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
400                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
401                <tbl:cell column="entryDate" value="<%=item.getEntryDate()%>" />
402                <tbl:cell column="owner"
403                  ><base:propertyvalue 
404                    item="<%=item%>" 
405                    property="owner"
406                    enableEditLink="<%=mode.hasEditLink()%>" 
407                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
408                  /></tbl:cell>
409                <tbl:cell column="version"><%=HTML.encodeTags(item.getVersionString())%></tbl:cell>
410                <tbl:cell column="itemSubtype"
411                  ><base:propertyvalue 
412                    item="<%=item%>" 
413                    property="itemSubtype"
414                    enableEditLink="<%=mode.hasEditLink()%>" 
415                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
416                  /></tbl:cell>
417                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
418                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
419                <tbl:cell column="sharedTo">
420                  <%
421                  Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, item).iterator();
422                  while(sharees.hasNext())
423                  {
424                    Nameable n = sharees.next();
425                    if (mode.hasPropertyLink())
426                    {
427                      out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
428                    }
429                    else
430                    {
431                      out.write(HTML.encodeTags(n.getName()));
432                    }
433                    out.write(sharees.hasNext() ? ", " : "");
434                  }
435                  %>
436                </tbl:cell>
437                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
438                  <tbl:cell column="xt-columns" />
439                </tbl:xt-cells>
440              </tbl:row>
441              <%
442              }
443            }
444          if (numListed == 0)
445          {
446            %>
447            <tbl:panel clazz="messagepanel">
448              <div class="messagecontainer note">
449              <%=software == null || software.getTotalCount() == 0 ? "No software were found" : "No software on this page. Please select another page!" %>
450              </div>
451            </tbl:panel>
452            <%
453          }
454          %>
455        </tbl:rows>
456      </tbl:data>
457    </tbl:table>
458    </div>
459   
460    <base:buttongroup subclass="dialogbuttons">
461      <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
462      <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
463      <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
464    </base:buttongroup>
465   
466  </base:body>
467  </base:page>
468  <%
469}
470finally
471{
472  if (software != null) software.close();
473  if (dc != null) dc.close();
474}
475%>
Note: See TracBrowser for help on using the repository browser.