source: trunk/www/biomaterials/tags/list_tags.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: 16.1 KB
Line 
1<%-- $Id: list_tags.jsp 5948 2012-02-08 13:16:27Z 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    <%
190    if (cc.getMessage() != null)
191    {
192      %>
193      <div class="error"><%=cc.getMessage()%></div>
194      <%
195      cc.setMessage(null);
196    }
197    %>
198    <tbl:table 
199      id="tags" 
200       
201      columns="<%=cc.getSetting("columns")%>"
202      sortby="<%=cc.getSortProperty()%>" 
203      direction="<%=cc.getSortDirection()%>"
204      title="<%=title%>"
205      action="index.jsp"
206      sc="<%=sc%>"
207      item="<%=itemType%>"
208      >
209      <tbl:hidden 
210        name="mode" 
211        value="<%=mode.getName()%>" 
212      />
213      <tbl:hidden 
214        name="callback" 
215        value="<%=callback%>" 
216        skip="<%=callback == null%>" 
217      />
218      <tbl:columndef 
219        id="name"
220        property="name"
221        datatype="string"
222        title="Name"
223        sortable="true" 
224        filterable="true"
225        exportable="true"
226        show="always" 
227      />
228      <tbl:columndef 
229        id="id"
230        clazz="uniquecol"
231        property="id"
232        datatype="int"
233        title="ID"
234        sortable="true"
235        filterable="true"
236        exportable="true"
237      />
238      <tbl:columndef 
239        id="owner"
240        property="owner.name"
241        datatype="string"
242        title="Owner"
243        sortable="true" 
244        filterable="true"
245        exportable="true"
246      />
247      <tbl:columndef 
248        id="entryDate"
249        property="entryDate"
250        datatype="date"
251        title="Registered"
252        sortable="true" 
253        filterable="true"
254        exportable="true"
255        formatter="<%=dateFormatter%>"
256      />
257      <%
258      Enumeration<String, String> tagTypes = new Enumeration<String, String>();
259      for (ItemSubtype subtype : typeQuery.list(dc))
260      {
261        tagTypes.add(Integer.toString(subtype.getId()), HTML.encodeTags(subtype.getName()));
262      }
263      %>   
264      <tbl:columndef 
265        id="itemSubtype"
266        property="itemSubtype"
267        sortproperty="itemSubtype.name"
268        exportproperty="itemSubtype.name:string"
269        datatype="int"
270        enumeration="<%=tagTypes%>"
271        title="Type"
272        sortable="true" 
273        filterable="true"
274        exportable="true"
275      />
276      <tbl:columndef 
277        id="description"
278        property="description"
279        datatype="string"
280        title="Description" 
281        sortable="true" 
282        filterable="true" 
283        exportable="true"
284      />
285      <tbl:columndef
286        id="permission"
287        title="Permission"
288      />
289      <tbl:columndef
290        id="sharedTo"
291        title="Shared to"
292        filterable="true"
293        filterproperty="!sharedTo.name"
294        datatype="string"
295      />
296      <tbl:toolbar
297        visible="<%=mode.hasToolbar()%>"
298        >
299        <tbl:button 
300          disabled="<%=!createPermission%>" 
301          image="new.png" 
302          onclick="newItem()" 
303          title="New&hellip;" 
304          tooltip="<%=createPermission ? "Create new tag" : "You do not have permission to create tags"%>" 
305        />
306        <tbl:button 
307          image="delete.png"
308          onclick="deleteItems()" 
309          title="Delete" 
310          tooltip="Delete the selected items" 
311        />
312        <tbl:button 
313          image="restore.png"
314          onclick="restoreItems()" 
315          title="Restore" 
316          tooltip="Restore the selected (deleted) items"
317        />
318        <tbl:button 
319          image="share.png"
320          onclick="shareItems()" 
321          title="Share&hellip;" 
322          tooltip="Share the selected items"
323        />
324        <tbl:button 
325          image="take_ownership.png"
326          onclick="setOwner()" 
327          title="Set owner&hellip;"
328          tooltip="Change owner of the selected items"
329        />
330        <tbl:button 
331          image="columns.png" 
332          onclick="configureColumns()" 
333          title="Columns&hellip;" 
334          tooltip="Show, hide and re-order columns" 
335        />
336        <tbl:button 
337          image="import.png" 
338          onclick="runPlugin('ImportItems')" 
339          title="Import&hellip;" 
340          tooltip="Import data" 
341          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
342        />
343        <tbl:button 
344          image="export.png" 
345          onclick="runPlugin('ExportItems')" 
346          title="Export&hellip;" 
347          tooltip="Export data" 
348          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
349        />
350        <tbl:button 
351          image="runplugin.png" 
352          onclick="runPlugin('RunListPlugin')" 
353          title="Run plugin&hellip;" 
354          tooltip="Run a plugin" 
355          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
356        />
357        <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
358          wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
359      </tbl:toolbar>
360      <tbl:navigator
361        page="<%=cc.getPage()%>" 
362        rowsperpage="<%=cc.getRowsPerPage()%>" 
363        totalrows="<%=tags == null ? 0 : tags.getTotalCount()%>" 
364        visible="<%=mode.hasNavigator()%>"
365      />
366      <tbl:data>
367        <tbl:headers>
368          <tbl:headerrow>
369            <tbl:header colspan="3" />
370            <tbl:columnheaders />
371          </tbl:headerrow>
372          <tbl:headerrow>
373            <tbl:header subclass="index" />
374            <tbl:header 
375              subclass="check" 
376              visible="<%=mode.hasCheck()%>"
377              ><base:icon 
378                image="check_uncheck.png" 
379                tooltip="Check/uncheck all" 
380                onclick="Forms.checkUncheck(document.forms[formId])" 
381              /></tbl:header>
382            <tbl:header 
383              subclass="check" 
384              visible="<%=mode.hasRadio()%>"
385              />
386            <tbl:header 
387              subclass="icons" 
388              visible="<%=mode.hasIcons()%>"
389              />
390            <tbl:propertyfilter />
391          </tbl:headerrow>
392        </tbl:headers>
393        <tbl:rows>
394          <%
395          int index = cc.getPage()*cc.getRowsPerPage();
396          int selectedItemId = cc.getId();
397          if (tags != null)
398          {           
399            while (tags.hasNext())
400            {
401              Tag item = tags.next();
402              int itemId = item.getId(); 
403              String openSharePopup = "shareItem("+itemId+")";
404              String deletePermanently = "deleteItemPermanently("+itemId+")";
405              boolean deletePermission = item.hasPermission(Permission.DELETE);
406              boolean sharePermission = item.hasPermission(Permission.SET_PERMISSION); 
407              boolean usePermission = item.hasPermission(Permission.USE);
408              boolean writePermission = item.hasPermission(Permission.WRITE);
409              String tooltip = mode.isSelectionMode() ? 
410                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
411              String name = HTML.encodeTags(item.getName());
412              index++;
413              numListed++;
414              %>
415              <tbl:row>
416                <tbl:header 
417                  clazz="index"
418                  ><%=index%></tbl:header>
419                <tbl:header 
420                  clazz="check" 
421                  visible="<%=mode.hasCheck()%>"
422                  ><input 
423                    type="checkbox" 
424                    name="<%=itemId%>" 
425                    value="<%=itemId%>" 
426                    title="<%=name%>" 
427                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
428                  ></tbl:header>
429                <tbl:header 
430                  clazz="check" 
431                  visible="<%=mode.hasRadio()%>"
432                  ><input 
433                    type="radio" 
434                    name="item_id" 
435                    value="<%=itemId%>" 
436                    title="<%=name%>" 
437                    <%=selectedItemId == itemId ? "checked" : ""%>
438                  ></tbl:header>
439                <tbl:header 
440                  clazz="icons" 
441                  visible="<%=mode.hasIcons()%>"
442                  ><base:icon 
443                    image="deleted.png"
444                    onclick="<%=deletePermission ? deletePermanently : null%>"
445                    tooltip="This item has been scheduled for deletion" 
446                    visible="<%=item.isRemoved()%>"
447                  /><base:icon 
448                    image="shared.png" 
449                    onclick="<%=sharePermission ? openSharePopup : null%>"
450                    tooltip="This item is shared to other users, groups and/or projects" 
451                    visible="<%=item.isShared()%>"
452                  />&nbsp;</tbl:header>
453                <tbl:cell column="name"><div class="link" 
454                  onclick="itemOnClick(<%=writePermission ? "event" : null%>, <%=itemId%>)" 
455                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
456                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
457                <tbl:cell column="owner"
458                  ><base:propertyvalue 
459                    item="<%=item%>" 
460                    property="owner"
461                    enableEditLink="<%=mode.hasEditLink()%>" 
462                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
463                  /></tbl:cell>
464                <tbl:cell column="entryDate" value="<%=item.getEntryDate()%>" />
465                <tbl:cell column="itemSubtype"
466                  ><base:propertyvalue 
467                    item="<%=item%>" 
468                    property="itemSubtype"
469                    enableEditLink="<%=mode.hasEditLink()%>" 
470                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
471                  /></tbl:cell>
472                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
473                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
474                <tbl:cell column="sharedTo">
475                  <%
476                  Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, item).iterator();
477                  while(sharees.hasNext())
478                  {
479                    Nameable n = sharees.next();
480                    if (mode.hasPropertyLink())
481                    {
482                      out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
483                    }
484                    else
485                    {
486                      out.write(HTML.encodeTags(n.getName()));
487                    }
488                    out.write(sharees.hasNext() ? ", " : "");
489                  }
490                  %>
491                </tbl:cell>
492              </tbl:row>
493              <%
494              }
495            }
496          %>
497          </tbl:rows>
498      </tbl:data>
499      <%
500      if (numListed == 0)
501      {
502        %>
503        <tbl:panel><%=tags == null || tags.getTotalCount() == 0 ? "No tags were found" : "No tags on this page. Please select another page!" %></tbl:panel>
504        <%
505      }
506      else
507      {
508        %>
509        <tbl:navigator
510          page="<%=cc.getPage()%>" 
511          rowsperpage="<%=cc.getRowsPerPage()%>" 
512          totalrows="<%=tags == null ? 0 : tags.getTotalCount()%>" 
513          visible="<%=mode.hasNavigator()%>"
514          locked="true"
515        />
516        <%
517      }
518      %>
519    </tbl:table>
520    <base:buttongroup clazz="fixedatbottom">
521      <base:button onclick="returnSelected();" title="Ok" visible="<%=mode.hasOkButton()%>" />
522      <base:button onclick="window.close();" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
523      <base:button onclick="window.close();" title="Close" visible="<%=mode.hasCloseButton()%>" />
524    </base:buttongroup>
525    <br><br><br>
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.