source: trunk/www/lims/arrayslides/list_slides.jsp @ 6702

Last change on this file since 6702 was 6702, checked in by Nicklas Nordborg, 7 years ago

References #1912: Add more filter rows in list pages

Implemented on the array lims list pages.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 20.0 KB
Line 
1<%-- $Id: list_slides.jsp 6702 2015-02-02 08:13: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.PhysicalBioAssay"
31  import="net.sf.basedb.core.ArraySlide"
32  import="net.sf.basedb.core.AnnotationType"
33  import="net.sf.basedb.core.AnnotationSet"
34  import="net.sf.basedb.core.Annotation"
35  import="net.sf.basedb.core.ItemQuery"
36  import="net.sf.basedb.core.Include"
37  import="net.sf.basedb.core.ItemResultIterator"
38  import="net.sf.basedb.core.ItemResultList"
39  import="net.sf.basedb.core.ItemContext"
40  import="net.sf.basedb.core.Nameable"
41  import="net.sf.basedb.core.Permission"
42  import="net.sf.basedb.core.PluginDefinition"
43  import="net.sf.basedb.core.query.Hql"
44  import="net.sf.basedb.core.query.Restrictions"
45  import="net.sf.basedb.core.query.Expressions"
46  import="net.sf.basedb.core.plugin.GuiContext"
47  import="net.sf.basedb.core.plugin.Plugin"
48  import="net.sf.basedb.core.snapshot.AnnotationLoaderUtil"
49  import="net.sf.basedb.core.snapshot.AnnotationTypeFilter"
50  import="net.sf.basedb.core.snapshot.AnnotationSnapshot"
51  import="net.sf.basedb.core.snapshot.AnnotationSetSnapshot"
52  import="net.sf.basedb.core.snapshot.SnapshotManager"
53  import="net.sf.basedb.util.Enumeration"
54  import="net.sf.basedb.util.ShareableUtil"
55  import="net.sf.basedb.clients.web.Base"
56  import="net.sf.basedb.clients.web.ModeInfo"
57  import="net.sf.basedb.clients.web.PermissionUtil"
58  import="net.sf.basedb.clients.web.util.HTML"
59  import="net.sf.basedb.util.Values"
60  import="net.sf.basedb.util.formatter.Formatter"
61  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
62  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
63  import="net.sf.basedb.clients.web.extensions.JspContext"
64  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
65  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
66  import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
67  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
68  import="java.util.Date"
69  import="java.util.Iterator"
70  import="java.util.List"
71  import="java.util.Map"
72  import="java.util.ArrayList"
73%>
74<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
75<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
76<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
77<%!
78  private static final Item itemType = Item.ARRAYSLIDE;
79  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
80%>
81<%
82final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
83final String ID = sc.getId();
84final boolean createPermission = sc.hasPermission(Permission.CREATE, itemType);
85final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
86
87final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
88final String callback = request.getParameter("callback");
89final String title = mode.generateTitle("array slide", "array slides");
90final DbControl dc = sc.newDbControl();
91ItemResultIterator<ArraySlide> slides = null;
92List<AnnotationLoaderUtil> annotationLoaders = new ArrayList<AnnotationLoaderUtil>();
93try
94{
95  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
96  ItemQuery<AnnotationType> annotationTypeQuery = Base.getAnnotationTypesQuery(itemType);
97  SnapshotManager manager = new SnapshotManager();
98  for (AnnotationType at : annotationTypeQuery.list(dc))
99  {
100    annotationLoaders.add(new AnnotationLoaderUtil(dc, manager, at));
101  }
102  annotationTypeQuery = Base.getInheritedAnnotationColumns(cc.getSetting("columns"));
103  for (AnnotationType at : annotationTypeQuery.list(dc))
104  {
105    annotationLoaders.add(new AnnotationLoaderUtil(dc, manager, at, false, true));
106  }
107
108  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
109  try
110  {
111    final ItemQuery<ArraySlide> query = Base.getConfiguredQuery(dc, cc, true, ArraySlide.getQuery(), mode);
112    slides = query.iterate(dc);
113  }
114  catch (Throwable t)
115  {
116    cc.setMessage(t.getMessage());
117    t.printStackTrace();
118  }
119  int numListed = 0;
120  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, guiContext, null);
121  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
122  ExtensionsInvoker columnsInvoker = ListColumnUtil.useExtensions(jspContext);
123  %>
124  <base:page title="<%=title==null ? "Array slides" : title%>" type="<%=mode.getPageType()%>" id="list-page">
125  <base:head scripts="table.js,~slides.js" styles="table.css,toolbar.css">
126    <ext:scripts context="<%=jspContext%>" />
127    <ext:stylesheets context="<%=jspContext%>" />
128  </base:head>
129 
130  <base:body>
131    <h1><%=title==null ? "Array slides" : title%></h1>
132    <div class="content">
133    <tbl:table 
134      id="slides" 
135      columns="<%=cc.getSetting("columns")%>"
136      sortby="<%=cc.getSortProperty()%>" 
137      direction="<%=cc.getSortDirection()%>"
138      action="index.jsp"
139      sc="<%=sc%>"
140      item="<%=itemType%>"
141      filterrows="<%=cc.getFilterRows()%>"
142      subclass="fulltable"
143      data-inherited-annotations="true"
144      >
145      <tbl:hidden 
146        name="mode" 
147        value="<%=mode.getName()%>" 
148      />
149      <tbl:hidden 
150        name="callback" 
151        value="<%=callback%>" 
152        skip="<%=callback == null%>" 
153      />
154      <tbl:columndef 
155        id="name"
156        property="name"
157        datatype="string"
158        title="Name"
159        sortable="true" 
160        filterable="true"
161        exportable="true"
162        show="always" 
163      />
164      <tbl:columndef 
165        id="id"
166        clazz="uniquecol"
167        property="id"
168        datatype="int"
169        title="ID"
170        sortable="true"
171        filterable="true"
172        exportable="true"
173      />
174      <tbl:columndef 
175        id="entryDate"
176        property="entryDate"
177        datatype="date"
178        title="Registered"
179        sortable="true" 
180        filterable="true"
181        exportable="true"
182        formatter="<%=dateFormatter%>"
183      />
184      <tbl:columndef 
185        id="arrayBatch"
186        property="arrayBatch.name"
187        datatype="string"
188        title="Array batch"
189        sortable="true" 
190        filterable="true"
191        exportable="true"
192      />
193      <tbl:columndef 
194        id="arrayDesign"
195        property="arrayBatch.arrayDesign.name"
196        datatype="string"
197        title="Array design"
198        sortable="true" 
199        filterable="true"
200        exportable="true"
201      />
202      <tbl:columndef 
203        id="physicalBioAssay"
204        property="physicalBioAssay.name"
205        datatype="string"
206        title="Physical bioassay"
207        sortable="true" 
208        filterable="true"
209        exportable="true"
210      />
211      <tbl:columndef 
212        id="barcode"
213        property="barcode"
214        datatype="string"
215        title="Barcode"
216        sortable="true" 
217        filterable="true"
218        exportable="true"
219      />
220      <tbl:columndef 
221        id="destroyed"
222        property="destroyed"
223        datatype="boolean"
224        title="Destroyed"
225        sortable="true" 
226        filterable="true"
227        exportable="true"
228      />
229      <tbl:columndef 
230        id="batchIndex"
231        property="batchIndex"
232        datatype="int"
233        title="Batch index"
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="description"
249        property="description"
250        datatype="string"
251        title="Description" 
252        sortable="true" 
253        filterable="true" 
254        exportable="true"
255      />     
256      <%
257      for (AnnotationLoaderUtil loader : annotationLoaders)
258      {
259        AnnotationType at = loader.getAnnotationType();
260        Formatter formatter = FormatterFactory.getTypeFormatter(sc, at.getValueType());
261        Enumeration<String, String> annotationEnum = null;
262        if (at.isEnumeration())
263        {
264          annotationEnum = new Enumeration<String, String>();
265          List<?> values = at.getValues();
266          for (Object value : values)
267          {
268            String encoded = formatter.format(value);
269            annotationEnum.add(encoded, encoded);
270          }
271        }
272        %>
273        <tbl:columndef 
274          id="<%=(loader.isSearchingInheritedAnnotations() ? "ia" : "at")+at.getId()%>"
275          title="<%=HTML.encodeTags(at.getName())+(loader.isSearchingInheritedAnnotations() ? " [I]" : " [A]")%>" 
276          property="<%=(loader.isSearchingInheritedAnnotations() ? "##" : "#")+at.getId()%>"
277          annotation="true"
278          datatype="<%=at.getValueType().getStringValue()%>"
279          enumeration="<%=annotationEnum%>"
280          smartenum="<%=at.getDisplayAsList() %>"
281          sortable="<%=at.getMultiplicity() == 1 && !loader.isSearchingInheritedAnnotations()%>" 
282          filterable="true" 
283          exportable="true"
284          formatter="<%=formatter%>"
285          unit="<%=at.getDefaultUnit()%>"
286        />
287        <%
288      }
289      %>
290      <tbl:columndef
291        id="permission"
292        title="Permission"
293      />
294      <tbl:columndef
295        id="sharedTo"
296        title="Shared to"
297        filterable="true"
298        filterproperty="!sharedTo.name"
299        datatype="string"
300      />
301      <tbl:columndef 
302        id="xt-columns" 
303        extensions="<%=columnsInvoker%>" 
304        jspcontext="<%=jspContext%>" 
305      />
306      <div class="panelgroup bg-filled-50 bottomborder">
307        <tbl:toolbar
308          subclass="bottomborder"
309          visible="<%=mode.hasToolbar()%>"
310          >
311          <tbl:button 
312            id="btnNewItem"
313            disabled="<%=!createPermission%>" 
314            image="new.png" 
315            title="New&hellip;" 
316            tooltip="<%=createPermission ? "Create new array slide" : "You do not have permission to create array slides"%>" 
317          />
318          <tbl:button
319            id="btnNewItemsWizard"
320            disabled="<%=!createPermission%>"
321            image="new_wizard.png"
322            title="Create multiple&hellip;"
323            tooltip="<%=createPermission ? "Create multiple new array slides using a wizard" : "You do not have permission to create array slides"%>" 
324          />
325          <tbl:button 
326            id="btnDeleteItems"
327            image="delete.png"
328            title="Delete" 
329            tooltip="Delete the selected items" 
330          />
331          <tbl:button 
332            id="btnRestoreItems"
333            image="restore.png"
334            title="Restore" 
335            tooltip="Restore the selected (deleted) items"
336          />
337          <tbl:button 
338            id="btnShareItems"
339            image="share.png"
340            title="Share&hellip;" 
341            tooltip="Share the selected items"
342          />
343          <tbl:button 
344            id="btnSetOwner"
345            image="take_ownership.png"
346            title="Set owner&hellip;"
347            tooltip="Change owner of the selected items"
348          />
349          <tbl:button 
350            id="btnColumns"
351            image="columns.png" 
352            title="Columns&hellip;" 
353            tooltip="Show, hide and re-order columns" 
354          />
355          <tbl:button
356            id="btnInheritAnnotations"
357            image="inherit.png"
358            title="Inherit annotations&hellip;"
359            tooltip="Batch inherit annotations from parent items"
360          />
361          <tbl:button 
362            id="btnImport"
363            data-plugin-type="IMPORT"
364            image="import.png" 
365            title="Import&hellip;" 
366            tooltip="Import data" 
367            visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
368          />
369          <tbl:button 
370            id="btnExport"
371            data-plugin-type="EXPORT"
372            image="export.png" 
373            title="Export&hellip;" 
374            tooltip="Export data" 
375            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
376          />
377          <tbl:button 
378            id="btnRunPlugin"
379            data-plugin-type="OTHER"
380            image="runplugin.png" 
381            title="Run plugin&hellip;" 
382            tooltip="Run a plugin" 
383            visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
384          />
385          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
386            wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
387        </tbl:toolbar>
388        <tbl:panel>
389          <tbl:presetselector />
390          <tbl:navigator
391            page="<%=cc.getPage()%>" 
392            rowsperpage="<%=cc.getRowsPerPage()%>" 
393            totalrows="<%=slides == null ? 0 : slides.getTotalCount()%>" 
394            visible="<%=mode.hasNavigator()%>"
395          />
396        </tbl:panel>
397      </div>
398      <tbl:data>
399        <tbl:headers>
400          <tbl:headerrow>
401            <tbl:header colspan="3" />
402            <tbl:columnheaders />
403          </tbl:headerrow>
404          <%
405          int numFilters = cc.getNumPropertyFilters();
406          int numRows = cc.getFilterRows();
407          for (int filterNo = 0; filterNo < numRows; filterNo++)
408          {
409            boolean lastRow = filterNo == numRows-1;
410            %>
411            <tbl:headerrow>
412              <tbl:header subclass="index" />
413              <tbl:header 
414                subclass="check" 
415                visible="<%=mode.hasCheck()%>"
416                ><base:icon 
417                  id="check.uncheck"
418                  image="check_uncheck.png" 
419                  tooltip="Check/uncheck all" 
420                  visible="<%=lastRow%>"
421                /></tbl:header>
422              <tbl:header 
423                subclass="check" 
424                visible="<%=mode.hasRadio()%>"
425                />
426              <tbl:header 
427                subclass="icons" 
428                visible="<%=mode.hasIcons()%>"
429                >
430                <base:icon
431                  subclass="link table-filter-row-action"
432                  image="add.png"
433                  tooltip="Add extra filter row"
434                  visible="<%=lastRow%>"
435                /><base:icon
436                  subclass="link table-filter-row-action"
437                  image="remove.png"
438                  tooltip="Remove this filter row"
439                  visible="<%=numRows > 1 || numFilters > 0 %>"
440                  data-remove-row="<%=filterNo%>"
441                />
442              </tbl:header>
443              <tbl:propertyfilter row="<%=filterNo%>" />
444            </tbl:headerrow>
445            <%
446          }
447          %>
448        </tbl:headers>
449        <tbl:rows>
450          <%
451          if (cc.getMessage() != null)
452          {
453            %>
454            <tbl:panel subclass="bg-filled-50">
455              <div class="messagecontainer error"><%=cc.getMessage()%></div>
456            </tbl:panel>
457            <%
458            cc.setMessage(null);
459          }
460          int index = cc.getPage()*cc.getRowsPerPage();
461          int selectedItemId = cc.getId();
462          if (slides != null)
463          {
464            while (slides.hasNext())
465            {
466              ArraySlide item = slides.next();
467              int itemId = item.getId();
468             
469             
470              boolean deletePermission = item.hasPermission(Permission.DELETE);
471              boolean sharePermission = item.hasPermission(Permission.SET_PERMISSION);
472              boolean writePermission = item.hasPermission(Permission.WRITE);
473              String tooltip = mode.isSelectionMode() ? 
474                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
475              String name = HTML.encodeTags(item.getName());
476              index++;
477              numListed++;
478              %>
479              <tbl:row>
480                <tbl:header 
481                  clazz="index"
482                  ><%=index%></tbl:header>
483                <tbl:header 
484                  clazz="check" 
485                  visible="<%=mode.hasCheck()%>"
486                  ><input 
487                    type="checkbox" 
488                    name="<%=itemId%>" 
489                    value="<%=itemId%>" 
490                    title="<%=name%>" 
491                    <%=cc.getSelected().contains(itemId) ? "checked" : ""%> 
492                  ></tbl:header>
493                <tbl:header 
494                  clazz="check" 
495                  visible="<%=mode.hasRadio()%>"
496                  ><input 
497                    type="radio" 
498                    name="item_id" 
499                    value="<%=itemId%>" 
500                    title="<%=name%>" 
501                    <%=selectedItemId == itemId ? "checked" : ""%>
502                  ></tbl:header>
503                <tbl:header 
504                  clazz="icons" 
505                  visible="<%=mode.hasIcons()%>"
506                  ><base:icon 
507                    image="deleted.png"
508                    id="<%="delete."+itemId %>"
509                    subclass="<%=deletePermission ? "table-delete-item" : null %>"
510                    data-item-id="<%=itemId%>"
511                    tooltip="This item has been scheduled for deletion" 
512                    visible="<%=item.isRemoved()%>"
513                  /><base:icon 
514                    image="shared.png" 
515                    id="<%="share."+itemId %>"
516                    subclass="<%=sharePermission ? "table-share-item" : null %>"
517                    data-item-id="<%=itemId%>"
518                    tooltip="This item is shared to other users, groups and/or projects" 
519                    visible="<%=item.isShared()%>"
520                  />&nbsp;</tbl:header>
521                <tbl:cell column="name"><div
522                  class="link table-item"
523                  data-item-id="<%=itemId%>"
524                  data-no-edit="<%=writePermission ? 0 : 1 %>" 
525                  tabindex="0"
526                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
527                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
528                <tbl:cell column="entryDate" value="<%=item.getEntryDate()%>" />
529                <tbl:cell column="arrayBatch"
530                  ><base:propertyvalue 
531                    item="<%=item%>" 
532                    property="arrayBatch"
533                    enableEditLink="<%=mode.hasEditLink()%>" 
534                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
535                  /></tbl:cell>
536                <tbl:cell column="arrayDesign"
537                  ><base:propertyvalue 
538                    item="<%=item%>" 
539                    property="arrayBatch.arrayDesign"
540                    enableEditLink="<%=mode.hasEditLink()%>" 
541                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
542                  /></tbl:cell>
543                <tbl:cell column="physicalBioAssay"
544                  ><base:propertyvalue 
545                    item="<%=item%>" 
546                    property="physicalBioAssay"
547                    enableEditLink="<%=mode.hasEditLink()%>" 
548                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
549                  /></tbl:cell>
550                <tbl:cell column="barcode"><%=HTML.encodeTags(item.getBarcode())%></tbl:cell>
551                <tbl:cell column="batchIndex"><%=item.getBatchIndex()%></tbl:cell>
552                <tbl:cell column="destroyed"><%=item.isDestroyed()%></tbl:cell>
553                <tbl:cell column="owner"
554                  ><base:propertyvalue 
555                    item="<%=item%>" 
556                    property="owner"
557                    enableEditLink="<%=mode.hasEditLink()%>" 
558                    enablePropertyLink="<%=mode.hasPropertyLink()%>"
559                  /></tbl:cell>
560                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>               
561                <%
562                if (item.isAnnotated())
563                {
564                  AnnotationSetSnapshot snapshot = manager.getSnapshot(dc, item.getAnnotationSet().getId());
565                  for (AnnotationLoaderUtil loader : annotationLoaders)
566                  {
567                    if (loader.find(snapshot))
568                    {
569                      %>
570                      <tbl:cell 
571                        column="<%=(loader.isSearchingInheritedAnnotations() ? "ia" : "at")+loader.getId()%>"
572                        ><tbl:cellvalue 
573                          list="<%=loader.getValues()%>"
574                          suffix="<%=loader.getUnitSymbol()%>"
575                      /></tbl:cell>
576                      <%
577                    }
578                  }
579                }
580                %>
581                <tbl:cell column="permission"><%=PermissionUtil.getShortPermissions(item)%></tbl:cell>
582                <tbl:cell column="sharedTo">
583                  <%
584                  Iterator<Nameable> sharees = ShareableUtil.getSharedTo(dc, item).iterator();
585                  while(sharees.hasNext())
586                  {
587                    Nameable n = sharees.next();
588                    if (mode.hasPropertyLink())
589                    {
590                      out.write(Base.getLinkedName(ID, n, false, mode.hasEditLink()));
591                    }
592                    else
593                    {
594                      out.write(HTML.encodeTags(n.getName()));
595                    }
596                    out.write(sharees.hasNext() ? ", " : "");
597                  }
598                  %>
599                </tbl:cell>
600                <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
601                  <tbl:cell column="xt-columns" />
602                </tbl:xt-cells>
603              </tbl:row>
604              <%
605              }
606            }
607          if (numListed == 0)
608          {
609            %>
610            <tbl:panel subclass="bg-filled-50">
611              <div class="messagecontainer note">
612              <%=slides == null || slides.getTotalCount() == 0 ? "No array slides were found" : "No array slides on this page. Please select another page!" %>
613              </div>
614            </tbl:panel>
615            <%
616          }
617          %>
618        </tbl:rows>
619      </tbl:data>
620    </tbl:table>
621    </div>
622   
623    <base:buttongroup subclass="dialogbuttons">
624      <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
625      <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
626      <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
627    </base:buttongroup>
628   
629  </base:body>
630  </base:page>
631  <%
632}
633finally
634{
635  if (slides != null) slides.close();
636  if (dc != null) dc.close();
637}
638%>
Note: See TracBrowser for help on using the repository browser.