source: trunk/www/biomaterials/lists/list_lists.jsp @ 4705

Last change on this file since 4705 was 4705, checked in by Nicklas Nordborg, 14 years ago

Fixes #1191: Biomaterial lists manager API and interface

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 15.3 KB
Line 
1<%-- $Id: list_lists.jsp 4705 2008-12-16 13:29:12Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2008 Nicklas Nordborg
4
5  This file is part of BASE - BioArray Software Environment.
6  Available at http://base.thep.lu.se/
7
8  BASE is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License
10  as published by the Free Software Foundation; either version 3
11  of the License, or (at your option) any later version.
12
13  BASE is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with BASE. If not, see <http://www.gnu.org/licenses/>.
20  ------------------------------------------------------------------
21
22  @author Nicklas
23  @version 2.10
24--%>
25<%@ page session="false"
26  import="net.sf.basedb.core.SessionControl"
27  import="net.sf.basedb.core.DbControl"
28  import="net.sf.basedb.core.Item"
29  import="net.sf.basedb.core.BioMaterialList"
30  import="net.sf.basedb.core.ItemQuery"
31  import="net.sf.basedb.core.ItemResultIterator"
32  import="net.sf.basedb.core.ItemContext"
33  import="net.sf.basedb.core.LabeledExtract"
34  import="net.sf.basedb.core.Nameable"
35  import="net.sf.basedb.core.Permission"
36  import="net.sf.basedb.core.PluginDefinition"
37  import="net.sf.basedb.core.plugin.GuiContext"
38  import="net.sf.basedb.core.plugin.Plugin"
39  import="net.sf.basedb.core.query.Hql"
40  import="net.sf.basedb.core.query.Orders"
41  import="net.sf.basedb.clients.web.Base"
42  import="net.sf.basedb.clients.web.PermissionUtil"
43  import="net.sf.basedb.clients.web.ModeInfo"
44  import="net.sf.basedb.clients.web.util.HTML"
45  import="net.sf.basedb.util.Enumeration"
46  import="net.sf.basedb.util.ShareableUtil"
47  import="net.sf.basedb.util.Values"
48  import="java.util.Iterator"
49  import="java.util.List"
50  import="java.util.Map"
51%>
52<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
53<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
54<%!
55  private static final Item itemType = Item.BIOMATERIALLIST;
56  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
57  private static Enumeration<String, String> memberTypes = new Enumeration<String, String>();
58  static
59  {
60    memberTypes.add(Integer.toString(Item.BIOSOURCE.getValue()), Item.BIOSOURCE.toString());
61    memberTypes.add(Integer.toString(Item.SAMPLE.getValue()), Item.SAMPLE.toString());
62    memberTypes.add(Integer.toString(Item.EXTRACT.getValue()), Item.EXTRACT.toString());
63    memberTypes.add(Integer.toString(Item.LABELEDEXTRACT.getValue()), Item.LABELEDEXTRACT.toString());
64  }
65
66%>
67<%
68final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
69final String ID = sc.getId();
70final boolean createPermission = sc.hasPermission(Permission.CREATE, itemType);
71final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
72
73final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
74final String callback = request.getParameter("callback");
75final String title = mode.generateTitle("biomaterial list", "biomaterial lists");
76final DbControl dc = sc.newDbControl();
77ItemResultIterator<BioMaterialList> lists = null;
78try
79{
80  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
81  try
82  {
83    final ItemQuery<BioMaterialList> query = Base.getConfiguredQuery(cc, true, BioMaterialList.getQuery(), mode);
84    lists = query.iterate(dc);
85  }
86  catch (Throwable t)
87  {
88    cc.setMessage(t.getMessage());
89  }
90  int numListed = 0;
91  %>
92  <base:page title="<%=title==null ? "Biomaterial lists" : title%>" type="<%=mode.getPageType()%>">
93  <base:head scripts="menu.js,table.js" styles="menu.css,table.css">
94    <script language="JavaScript">
95    var submitPage = 'index.jsp';
96    var formId = 'lists';
97    function newItem()
98    {
99      var controller = Main.getController('BIOMATERIALLIST');
100      Table.submitToPopup(formId, 'NewItem', controller.width, controller.height);
101    }
102    function editItem(itemId)
103    {
104      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, true);
105    }
106    function viewItem(itemId)
107    {
108      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, false);
109    }
110    function itemOnClick(evt, itemId)
111    {
112      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewItem, editItem, returnSelected);
113    }
114    function deleteItems()
115    {
116      var frm = document.forms[formId];
117      if (Forms.numChecked(frm) == 0)
118      {
119        alert('Please select at least one item in the list');
120        return;
121      }
122      frm.action = submitPage;
123      frm.cmd.value = 'DeleteItems';
124      frm.submit();
125    }
126    function restoreItems()
127    {
128      var frm = document.forms[formId];
129      if (Forms.numChecked(frm) == 0)
130      {
131        alert('Please select at least one item in the list');
132        return;
133      }
134      frm.action = submitPage;
135      frm.cmd.value = 'RestoreItems';
136      frm.submit();
137    }
138    function deleteItemPermanently(itemId)
139    {
140      Main.deleteItemPermanently('<%=ID%>', true, '<%=itemType.name()%>', itemId);
141    }
142    function setOwner()
143    {
144      Table.setOwnerOfItems(submitPage, '<%=ID%>', formId, '<%=itemType.name()%>', 'SetOwnerOfItems');
145    }
146    function shareItem(itemId)
147    {
148      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=ShareItem&item_id='+itemId, 'ShareBioMaterialList', 600, 400);
149    }
150    function shareItems()
151    {
152      Table.shareItems(submitPage, '<%=ID%>', formId, '<%=itemType.name()%>', 'ShareItems');
153    }
154    function configureColumns()
155    {
156      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
157    }
158    function runPlugin(cmd)
159    {
160      Table.submitToPopup(formId, cmd, 740, 540);
161    }
162    function returnSelected()
163    {
164      Table.returnSelected(formId, <%=callback != null ? "window.opener."+callback : "null" %>);
165      window.close();
166    }
167    function presetOnChange()
168    {
169      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
170    }
171    </script>
172  </base:head>
173 
174  <base:body>
175    <%
176    if (cc.getMessage() != null)
177    {
178      %>
179      <div class="error"><%=cc.getMessage()%></div>
180      <%
181      cc.setMessage(null);
182    }
183    %>
184    <tbl:table 
185      id="lists" 
186      clazz="itemlist" 
187      columns="<%=cc.getSetting("columns")%>"
188      sortby="<%=cc.getSortProperty()%>" 
189      direction="<%=cc.getSortDirection()%>"
190      title="<%=title%>"
191      action="index.jsp"
192      sc="<%=sc%>"
193      item="<%=itemType%>"
194      >
195      <tbl:hidden 
196        name="mode" 
197        value="<%=mode.getName()%>" 
198      />
199      <tbl:hidden 
200        name="callback" 
201        value="<%=callback%>" 
202        skip="<%=callback == null%>" 
203      />
204      <tbl:columndef 
205        id="name"
206        property="name"
207        datatype="string"
208        title="Name"
209        sortable="true" 
210        filterable="true"
211        exportable="true"
212        show="always" 
213      />
214      <tbl:columndef 
215        id="externalId"
216        property="externalId"
217        datatype="string"
218        title="External ID"
219        sortable="true" 
220        filterable="true"
221        exportable="true"
222      />
223      <tbl:columndef 
224        id="memberType"
225        property="memberType"
226        datatype="int"
227        title="Member type"
228        sortable="true" 
229        filterable="true"
230        exportable="true"
231        enumeration="<%=memberTypes%>"
232      />
233      <tbl:columndef 
234        id="size"
235        property="size"
236        datatype="int"
237        title="Size"
238        sortable="true" 
239        filterable="true"
240        exportable="true"
241      />
242      <tbl:columndef 
243        id="id"
244        clazz="uniquecol"
245        property="id"
246        datatype="int"
247        title="ID"
248        sortable="true"
249        filterable="true"
250        exportable="true"
251      />
252      <tbl:columndef 
253        id="owner"
254        property="owner.name"
255        datatype="string"
256        title="Owner"
257        sortable="true" 
258        filterable="true"
259        exportable="true"
260      />
261      <tbl:columndef 
262        id="description"
263        property="description"
264        datatype="string"
265        title="Description" 
266        sortable="true" 
267        filterable="true" 
268        exportable="true"
269      />
270      <tbl:columndef
271        id="permission"
272        title="Permission"
273      />
274      <tbl:columndef 
275        id="sharedTo" 
276        title="Shared to"
277      />
278      <tbl:toolbar
279        visible="<%=mode.hasToolbar()%>"
280        >
281        <tbl:button 
282          disabled="<%=createPermission ? false : true%>" 
283          image="<%=createPermission ? "new.gif" : "new_disabled.gif"%>" 
284          onclick="newItem()" 
285          title="New&hellip;" 
286          tooltip="<%=createPermission ? "Create new biomaterial list" : "You do not have permission to create biomaterial lists"%>" 
287        />
288        <tbl:button 
289          image="delete.gif"
290          onclick="deleteItems()" 
291          title="Delete" 
292          tooltip="Delete the selected items" 
293        />
294        <tbl:button 
295          image="restore.gif"
296          onclick="restoreItems()" 
297          title="Restore" 
298          tooltip="Restore the selected (deleted) items"
299        />
300        <tbl:button 
301          image="share.gif"
302          onclick="shareItems()" 
303          title="Share&hellip;" 
304          tooltip="Share the selected items"
305        />
306        <tbl:button 
307          image="take_ownership.png"
308          onclick="setOwner()" 
309          title="Set owner&hellip;"
310          tooltip="Change owner of the selected items"
311        />
312        <tbl:button 
313          image="columns.gif" 
314          onclick="configureColumns()" 
315          title="Columns&hellip;" 
316          tooltip="Show, hide and re-order columns" 
317        />
318        <tbl:button 
319          image="import.gif" 
320          onclick="runPlugin('ImportItems')" 
321          title="Import&hellip;" 
322          tooltip="Import data" 
323          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
324        />
325        <tbl:button 
326          image="export.gif" 
327          onclick="runPlugin('ExportItems')" 
328          title="Export&hellip;" 
329          tooltip="Export data" 
330          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
331        />
332        <tbl:button 
333          image="runplugin.gif" 
334          onclick="runPlugin('RunListPlugin')" 
335          title="Run plugin&hellip;" 
336          tooltip="Run a plugin" 
337          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
338        />
339      </tbl:toolbar>
340      <tbl:navigator
341        page="<%=cc.getPage()%>" 
342        rowsperpage="<%=cc.getRowsPerPage()%>" 
343        totalrows="<%=lists == null ? 0 : lists.getTotalCount()%>" 
344        visible="<%=mode.hasNavigator()%>"
345      />
346      <tbl:data>
347        <tbl:columns>
348        <tbl:presetselector 
349          clazz="columnheader"
350          colspan="3"
351          onchange="presetOnChange()"
352        />
353        </tbl:columns>
354
355        <tr>
356          <tbl:header 
357            clazz="index"
358            >&nbsp;</tbl:header>
359          <tbl:header 
360            clazz="check" 
361            visible="<%=mode.hasCheck()%>"
362            ><base:icon 
363              image="check_uncheck.gif" 
364              tooltip="Check/uncheck all" 
365              onclick="Forms.checkUncheck(document.forms[formId])" style="align: left;"
366            /></tbl:header>
367          <tbl:header 
368            clazz="check" 
369            visible="<%=mode.hasRadio()%>"
370            >&nbsp;</tbl:header>
371          <tbl:header 
372            clazz="icons" 
373            visible="<%=mode.hasIcons()%>"
374            >&nbsp;</tbl:header>
375          <tbl:propertyfilter />
376        </tr>
377         
378          <tbl:rows>
379          <%
380          int index = cc.getPage()*cc.getRowsPerPage();
381          int selectedItemId = cc.getId();
382          if (lists != null)
383          {           
384            while (lists.hasNext())
385            {
386              BioMaterialList item = lists.next();
387              int itemId = item.getId();       
388              String openSharePopup = "shareItem("+itemId+")";
389              String deletePermanently = "deleteItemPermanently("+itemId+")";
390              boolean deletePermission = item.hasPermission(Permission.DELETE);
391              boolean sharePermission = item.hasPermission(Permission.SET_PERMISSION); 
392              boolean usePermission = item.hasPermission(Permission.USE);
393              boolean writePermission = item.hasPermission(Permission.WRITE);
394              String tooltip = mode.isSelectionMode() ? 
395                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
396              String name = HTML.encodeTags(item.getName());
397              index++;
398              numListed++;
399              %>
400              <tbl:row>
401                <tbl:header 
402                  clazz="index"
403                  ><%=index%></tbl:header>
404                <tbl:header 
405                  clazz="check" 
406                  visible="<%=mode.hasCheck()%>"
407                  ><input 
408                    type="checkbox" 
409                    name="<%=itemId%>" 
410                    value="<%=itemId%>" 
411                    title="<%=name%>" 
412                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
413                  ></tbl:header>
414                <tbl:header 
415                  clazz="check" 
416                  visible="<%=mode.hasRadio()%>"
417                  ><input 
418                    type="radio" 
419                    name="item_id" 
420                    value="<%=itemId%>" 
421                    title="<%=name%>" 
422                    <%=selectedItemId == itemId ? "checked" : ""%>
423                  ></tbl:header>
424                <tbl:header 
425                  clazz="icons" 
426                  visible="<%=mode.hasIcons()%>"
427                  ><base:icon 
428                    image="<%=deletePermission ? "deleted.gif" : "deleted_disabled.gif"%>"
429                    onclick="<%=deletePermission ? deletePermanently : null%>"
430                    tooltip="This item has been scheduled for deletion" 
431                    visible="<%=item.isRemoved()%>"
432                  /><base:icon 
433                    image="<%=sharePermission ? "shared.gif" : "shared_disabled.gif"%>" 
434                    onclick="<%=sharePermission ? openSharePopup : null%>"
435                    tooltip="This item is shared to other users, groups and/or projects" 
436                    visible="<%=item.isShared()%>"
437                  />&nbsp;</tbl:header>
438                <tbl:cell column="name"><div class="link" 
439                  onclick="itemOnClick(<%=writePermission ? "event" : null%>, <%=itemId%>)" 
440                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
441                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
442                <tbl:cell column="size"><%=item.getSize()%></tbl:cell>
443                <tbl:cell column="externalId"><%=HTML.encodeTags(item.getExternalId())%></tbl:cell>
444                <tbl:cell column="memberType"><%=item.getMemberType()%></tbl:cell>
445                <tbl:cell column="owner"
446                  ><base:propertyvalue 
447                    item="<%=item%>" 
448                    property="owner"
449                    enableEditLink="<%=mode.hasEditLink()%>" 
450                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
451                  /></tbl:cell>
452                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
453                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
454                <tbl:cell column="sharedTo">
455                  <%
456                  Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, item).iterator();
457                  while(sharees.hasNext())
458                  {
459                    Nameable n = sharees.next();
460                    if (mode.hasPropertyLink())
461                    {
462                      out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
463                    }
464                    else
465                    {
466                      out.write(HTML.encodeTags(n.getName()));
467                    }
468                    out.write(sharees.hasNext() ? ", " : "");
469                  }
470                  %>
471                </tbl:cell>
472              </tbl:row>
473              <%
474              }
475            }
476          %>
477          </tbl:rows>
478      </tbl:data>
479      <%
480      if (numListed == 0)
481      {
482        %>
483        <tbl:panel><%=lists == null || lists.getTotalCount() == 0 ? "No lists were found" : "No lists on this page. Please select another page!" %></tbl:panel>
484        <%
485      }
486      else
487      {
488        %>
489        <tbl:navigator
490          page="<%=cc.getPage()%>" 
491          rowsperpage="<%=cc.getRowsPerPage()%>" 
492          totalrows="<%=lists == null ? 0 : lists.getTotalCount()%>" 
493          visible="<%=mode.hasNavigator()%>"
494          locked="true"
495        />
496        <%
497      }
498      %>
499    </tbl:table>
500    <base:buttongroup align="center" clazz="fixedatbottom">
501      <base:button onclick="returnSelected();" title="Ok" visible="<%=mode.hasOkButton()%>" />
502      <base:button onclick="window.close();" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
503      <base:button onclick="window.close();" title="Close" visible="<%=mode.hasCloseButton()%>" />
504    </base:buttongroup>
505    <br><br><br>
506  </base:body>
507  </base:page>
508  <%
509}
510finally
511{
512  if (lists != null) lists.close();
513  if (dc != null) dc.close();
514}
515%>
Note: See TracBrowser for help on using the repository browser.