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