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

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

References #1655: GUI improvements

Started with the list pages. So far the reporters and the biosurce, sample and extract list pages have been done. The other pages have just been modified to not cause any compilation problems and to display almost ok.

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