source: branches/3.18-stable/www/views/experiments/bioassaysets/analysis_tree.jsp @ 7938

Last change on this file since 7938 was 7938, checked in by Nicklas Nordborg, 3 months ago

References #2246: Sticky table headers

Implemented for all items in the "View" menu.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 31.7 KB
Line 
1<%-- $Id: analysis_tree.jsp 7938 2021-05-03 11:20:19Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell, Jari Häkkinen, Nicklas Nordborg
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.ItemContext"
31  import="net.sf.basedb.core.BasicItem"
32  import="net.sf.basedb.core.Experiment"
33  import="net.sf.basedb.core.BioAssaySet"
34  import="net.sf.basedb.core.Transformation"
35  import="net.sf.basedb.core.ExtraValue"
36  import="net.sf.basedb.core.ExtraValueType"
37  import="net.sf.basedb.core.AnnotationSet"
38  import="net.sf.basedb.core.AnnotationType"
39  import="net.sf.basedb.core.Annotation"
40  import="net.sf.basedb.core.Job"
41  import="net.sf.basedb.core.ItemQuery"
42  import="net.sf.basedb.core.Nameable"
43  import="net.sf.basedb.core.ItemResultIterator"
44  import="net.sf.basedb.core.ItemResultList"
45  import="net.sf.basedb.core.Permission"
46  import="net.sf.basedb.core.PluginDefinition"
47  import="net.sf.basedb.core.PluginConfiguration"
48  import="net.sf.basedb.core.PermissionDeniedException"
49  import="net.sf.basedb.core.query.Restrictions"
50  import="net.sf.basedb.core.query.Expressions"
51  import="net.sf.basedb.core.query.Orders"
52  import="net.sf.basedb.core.query.Hql"
53  import="net.sf.basedb.core.query.Restrictions"
54  import="net.sf.basedb.core.plugin.GuiContext"
55  import="net.sf.basedb.core.plugin.Plugin"
56  import="net.sf.basedb.core.snapshot.AnnotationLoaderUtil"
57  import="net.sf.basedb.core.snapshot.AnnotationTypeFilter"
58  import="net.sf.basedb.core.snapshot.AnnotationSnapshot"
59  import="net.sf.basedb.core.snapshot.AnnotationSetSnapshot"
60  import="net.sf.basedb.core.snapshot.SnapshotManager"
61  import="net.sf.basedb.util.Tree"
62  import="net.sf.basedb.util.Enumeration"
63  import="net.sf.basedb.clients.web.Base"
64  import="net.sf.basedb.clients.web.ModeInfo"
65  import="net.sf.basedb.clients.web.util.HTML"
66  import="net.sf.basedb.util.Values"
67  import="net.sf.basedb.util.formatter.Formatter"
68  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
69  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
70  import="net.sf.basedb.clients.web.extensions.toolbar.ButtonAction"
71  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
72  import="net.sf.basedb.clients.web.extensions.list.ListColumnAction"
73  import="net.sf.basedb.clients.web.extensions.list.ListColumnUtil"
74  import="net.sf.basedb.clients.web.extensions.JspContext"
75  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
76  import="net.sf.basedb.clients.web.util.ProjectSpecificInfoFilter"
77  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
78  import="net.sf.basedb.util.extensions.Renderer"
79  import="java.util.Date"
80  import="java.util.List"
81  import="java.util.ArrayList"
82  import="java.util.LinkedList"
83  import="java.util.Map"
84  import="java.util.HashMap"
85  import="java.util.Iterator"
86  import="java.util.Collection"
87  import="org.json.simple.JSONObject"
88  import="org.json.simple.JSONArray"
89%>
90<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
91<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
92<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
93<%!
94  private static final Item itemType = Item.BIOASSAYSET;
95  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
96%>
97<%!
98
99private static void addToTree(Tree<BasicItem> tree, BioAssaySet bas)
100{
101  if (!tree.contains(bas))
102  {
103    Transformation transformation = bas.getTransformation();
104    Tree.Entry<BasicItem> parent = tree.getEntry(transformation);
105    if (parent == null) 
106    {
107      addToTree(tree, transformation);
108      parent = tree.getEntry(transformation);
109    }
110    Tree.Entry<BasicItem> basEntry = parent.addChild(bas);
111    for (ExtraValue xv : bas.getExtraValues().list(bas.getDbControl())) 
112    {
113      basEntry.addChild(xv);
114    }
115  }
116}
117
118private static void addToTree(Tree<BasicItem> tree, Transformation transformation)
119{
120  if (!tree.contains(transformation))
121  {
122    BioAssaySet source = transformation.getSource();
123    Tree.Entry<BasicItem> parent = tree.getEntry(source);
124    if (parent == null) 
125    {
126      addToTree(tree, source);
127      parent = tree.getEntry(source);
128    }
129    parent.addChild(transformation);
130  }
131}
132
133private static Tree<BasicItem> getAnalysisTree(DbControl dc, ItemQuery<BioAssaySet> bioAssaySetQuery, ItemQuery<Transformation> transformationQuery)
134{
135  Tree<BasicItem> tree = new Tree<BasicItem>(null);
136  ItemResultList<BioAssaySet> allBioAssaySets = bioAssaySetQuery.list(dc);
137  List<Integer> ids = new ArrayList<Integer>(allBioAssaySets.size());
138 
139  for (BioAssaySet bas : allBioAssaySets)
140  {
141    addToTree(tree, bas);
142    ids.add(bas.getId());
143  }
144 
145  transformationQuery.restrict(
146    Restrictions.in(
147      Hql.property("source.id"), 
148      Expressions.parameter("bioAssaySets", ids)
149    )
150  );
151  ItemResultList<Transformation> allTransformations = transformationQuery.list(dc);
152  for (Transformation t: allTransformations)
153  {
154    addToTree(tree, t);
155  }
156  return tree;
157}
158
159JSONArray generateSubTree(JSONObject jsonParent, BasicItem parent, Tree<BasicItem> tree, Collection<String> closed)
160{
161  JSONArray json = new JSONArray();
162 
163  Tree.Entry<BasicItem> parentEntry = tree.getEntry(parent);
164  if (parentEntry == null) return json;
165 
166  if (jsonParent == null && parent != null)
167  {
168    Item parentType = parent.getType();
169    if (parentType == Item.BIOASSAYSET)
170    {
171      jsonParent = newJoustBioAssaySet(null, (BioAssaySet)parent, true);
172    }
173    else if (parentType == Item.TRANSFORMATION)
174    {
175      jsonParent = newJoustTransformation(null, (Transformation)parent, true);
176    }
177    if (jsonParent != null) 
178    {
179      jsonParent.put("noOutlineIcon", 1);
180      json.add(jsonParent);
181    }
182  }
183 
184  List<Tree.Entry<BasicItem>> children = parentEntry.getChildren();
185  if (children != null)
186  {
187    for (Tree.Entry<BasicItem> childEntry : children)
188    {
189      BasicItem child = childEntry.getNode();
190      Item childType = child.getType();
191      JSONObject jsonChild = null;
192      String var = childType.name() + "_" + child.getId();
193      boolean isOpen = (closed == null || !closed.contains(var)) && childEntry.getNumChildren() > 0;
194      if (childType == Item.BIOASSAYSET)
195      {
196        jsonChild = newJoustBioAssaySet(jsonParent, (BioAssaySet)child, isOpen);
197      }
198      else if (childType == Item.TRANSFORMATION)
199      {
200        jsonChild = newJoustTransformation(jsonParent, (Transformation)child, isOpen);
201      }
202      else if (childType == Item.EXTRAVALUE)
203      {
204        jsonChild = newJoustExtraValue(jsonParent, (ExtraValue)child, isOpen);
205      }
206      if (jsonParent == null) json.add(jsonChild);
207      generateSubTree(jsonChild, child, tree, closed);
208    }
209  }
210  return json;
211}
212
213
214JSONObject newJoustBioAssaySet(JSONObject jsonParent, BioAssaySet bas, boolean open)
215{
216  String id = "BIOASSAYSET_"+bas.getId();
217  String name = bas.getName();
218  String icon = "BioAssaySet";
219 
220  JSONObject json = newJoustEntry(jsonParent, icon, HTML.encodeTags(name), id);
221  json.put("type", "bioassayset");
222  json.put("isOpen", open ? 1 : 0);
223  return json;
224}
225
226JSONObject newJoustTransformation(JSONObject jsonParent, Transformation t, boolean open)
227{
228  String id = "TRANSFORMATION_"+t.getId();
229  String name = t.getName();
230  String icon = "Transformation";
231  try
232  {
233    if (t.getJob().getPluginDefinition().supports("net.sf.basedb.core.plugin.AnalysisFilterPlugin"))
234    {
235      icon = "Filter";
236    }
237  }
238  catch (Throwable tt)
239  {}
240 
241  JSONObject json = newJoustEntry(jsonParent, icon, HTML.encodeTags(name), id);
242  json.put("type", "transformation");
243  json.put("isOpen", open ? 1 : 0);
244  return json;
245}
246
247JSONObject newJoustExtraValue(JSONObject jsonParent, ExtraValue ev, boolean open)
248{
249  String id = "EXTRAVALUE_"+ev.getId();
250  String name = ev.getValueType().toString();
251  String icon = "ExtraValue";
252 
253  try
254  {
255    name = ev.getExtraValueType().getName();
256  }
257  catch (PermissionDeniedException ex)
258  {}
259 
260  JSONObject json = newJoustEntry(jsonParent, icon, HTML.encodeTags(name), id);
261  json.put("type", "extra-value");
262  json.put("isOpen", open ? 1 : 0);
263  return json;
264}
265
266JSONObject newJoustEntry(JSONObject jsonParent, String icon, String text, String id)
267{
268  JSONObject jsonJoust = new JSONObject();
269  jsonJoust.put("icon", icon);
270  jsonJoust.put("text", text);
271  jsonJoust.put("id", id);
272  if (jsonParent != null)
273  {
274    JSONArray jsonChildren = (JSONArray)jsonParent.get("children");
275    if (jsonChildren == null)
276    {
277      jsonChildren = new JSONArray();
278      jsonParent.put("children", jsonChildren);
279      jsonParent.remove("isLazy");
280    }
281    jsonChildren.add(jsonJoust);
282  }
283  return jsonJoust;
284}
285%>
286<%
287final int experimentId = Values.getInt(request.getParameter("experiment_id"));
288final int bioAssaySetId = Values.getInt(request.getParameter("item_id"));
289final int transformationId = Values.getInt(request.getParameter("transformation_id"));
290final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
291final String ID = sc.getId();
292final String rootPath = request.getContextPath()+"/";
293final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
294final ItemContext tc = sc.getCurrentContext(Item.TRANSFORMATION);
295final ItemContext xvc = sc.getCurrentContext(Item.EXTRAVALUE);
296
297final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
298final String callback = request.getParameter("callback");
299final String title = mode.generateTitle("bioassay set", "bioassay sets");
300final DbControl dc = sc.newDbControl();
301Tree<BasicItem> analysisTree = null;
302List<AnnotationLoaderUtil> annotationLoaders = new ArrayList<AnnotationLoaderUtil>();
303try
304{
305  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
306  final ItemQuery<AnnotationType> annotationTypeQuery = Base.getAnnotationTypesQuery(itemType);
307  SnapshotManager manager = new SnapshotManager();
308  ProjectSpecificInfoFilter psInfo = new ProjectSpecificInfoFilter();
309  for (AnnotationType at : annotationTypeQuery.list(dc))
310  {
311    annotationLoaders.add(new AnnotationLoaderUtil(dc, manager, at));
312  }
313  final Experiment experiment = Experiment.getById(dc, experimentId);
314  final BasicItem root = transformationId == 0 ? 
315      (bioAssaySetId == 0 ? null : BioAssaySet.getById(dc, bioAssaySetId))
316      : Transformation.getById(dc, transformationId);
317  final boolean createPermission = experiment.hasPermission(Permission.USE);
318  final boolean deletePermission = createPermission;
319  final boolean writePermission = createPermission;
320
321  final ItemQuery<Transformation> transformationQuery = experiment.getTransformations();
322  transformationQuery.include(cc.getInclude());
323  transformationQuery.setFirstResult(0);
324  transformationQuery.setMaxResults(-1);
325  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
326  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, 
327      guiContext, root == null ? experiment : root);
328  try
329  {
330    final ItemQuery<BioAssaySet> query = Base.getConfiguredQuery(dc, cc, jspContext, true, experiment.getBioAssaySets(), mode);
331    query.setFirstResult(0);
332    query.setMaxResults(-1);
333    analysisTree = getAnalysisTree(dc, query, transformationQuery);
334  }
335  catch (Throwable t)
336  {
337    cc.setMessage(t.getMessage());
338    t.printStackTrace();
339  }
340  // Contains the ID:s of the bioassaysets that are closed in the tree
341  Collection<String> closed = cc.getObject("closed");
342  int numListed = 0;
343 
344  ExtensionsInvoker<ButtonAction> toolsInvoker = ExtensionsControl.useExtensions(jspContext, 
345      "net.sf.basedb.clients.web.bioassayset.list.tools");
346  ExtensionsInvoker<ButtonAction> toolbarInvoker = ToolbarUtil.useExtensions(jspContext);
347  ExtensionsInvoker<ListColumnAction<BioAssaySet,?>> columnsInvoker = ListColumnUtil.useExtensions(jspContext);
348 
349  JSONArray json = generateSubTree(null, root, analysisTree, closed);
350  %>
351  <base:page type="include">
352  <base:head scripts="joust-2.js,/views/experiments/bioassaysets/analysis_tree.js" />
353  <base:body>
354    <ext:scripts context="<%=jspContext%>" />
355    <ext:stylesheets context="<%=jspContext%>" />
356   
357    <div id="tree-data" class="datacontainer"
358      data-experiment-id="<%=experimentId%>"
359      data-bioassayset-id="<%=bioAssaySetId%>"
360      data-transformation-id="<%=transformationId %>"
361      data-joust-tree="<%=HTML.encodeTags(json.toJSONString()) %>"
362    ></div>
363   
364    <tbl:table 
365      id="bioAssaySets" 
366      columns="<%=cc.getSetting("columns")%>"
367      sortby="<%=cc.getSortProperty()%>" 
368      direction="<%=cc.getSortDirection()%>"
369      action="<%=transformationId != 0 ? "../bioassaysets/index.jsp" : "index.jsp"%>"
370      sc="<%=sc%>"
371      item="<%=itemType%>"
372      filterrows="<%=cc.getFilterRows()%>"
373      subclass="<%=root == null ? "fulltable" : "" %>"
374      stickyheaders="name"
375      >
376      <tbl:hidden 
377        name="mode" 
378        value="<%=mode.getName()%>" 
379      />
380      <tbl:hidden 
381        name="experiment_id" 
382        value="<%=String.valueOf(experimentId)%>" 
383      />
384      <tbl:hidden 
385        name="item_id" 
386        value="<%=String.valueOf(bioAssaySetId)%>"
387        skip="<%=bioAssaySetId == 0%>"
388      />
389      <tbl:hidden 
390        name="transformation_id" 
391        value="<%=String.valueOf(transformationId)%>"
392        skip="<%=transformationId == 0%>"
393      />
394      <tbl:hidden 
395        name="callback" 
396        value="<%=callback%>" 
397        skip="<%=callback == null%>" 
398      />
399      <tbl:hidden
400        name="closed"
401        value="<%=closed == null ? "," : ","+Values.getString(closed, ",", true)+","%>"
402      />
403      <tbl:columndef 
404        id="name"
405        property="name"
406        datatype="string"
407        title="Name"
408        sortable="true" 
409        filterable="true"
410        exportable="true"
411        show="always" 
412      />
413      <tbl:columndef 
414        id="spots"
415        property="numSpots"
416        datatype="int"
417        title="Spots/Values in db"
418        sortable="true" 
419        filterable="true"
420        exportable="true"
421      />
422      <tbl:columndef 
423        id="reporters"
424        property="numReporters"
425        datatype="int"
426        title="Reporters in db"
427        sortable="true" 
428        filterable="true"
429        exportable="true"
430      />
431      <tbl:columndef 
432        id="fileSpots"
433        property="numFileSpots"
434        datatype="int"
435        title="Spots/Values in file"
436        sortable="true" 
437        filterable="true"
438        exportable="true"
439      />
440      <tbl:columndef 
441        id="fileReporters"
442        property="numFileReporters"
443        datatype="int"
444        title="Reporters in file"
445        sortable="true" 
446        filterable="true"
447        exportable="true"
448      />
449      <tbl:columndef 
450        id="date"
451        property="transformation.job.ended"
452        datatype="timestamp"
453        title="Date"
454        sortable="true" 
455        filterable="true"
456        exportable="true"
457      />
458      <tbl:columndef 
459        id="plugin"
460        property="transformation.job.pluginDefinition.name"
461        datatype="string"
462        title="Plugin"
463        sortable="true" 
464        filterable="true"
465        exportable="true"
466      />
467      <tbl:columndef 
468        id="description"
469        property="description"
470        datatype="string"
471        title="Description" 
472        sortable="true" 
473        filterable="true" 
474        exportable="true"
475      />
476      <%
477      for (AnnotationLoaderUtil loader : annotationLoaders)
478      {
479        AnnotationType at = loader.getAnnotationType();
480        Enumeration<String, String> annotationEnum = null;
481        Formatter<Object> formatter = FormatterFactory.getTypeFormatter(sc, at.getValueType());
482        if (at.isEnumeration())
483        {
484          annotationEnum = new Enumeration<String, String>();
485          if (!at.getDisplayAsList()) annotationEnum.add("", "-none-");
486          List<?> values = at.getValues();
487          for (Object value : values)
488          {
489            String encoded = formatter.format(value);
490            annotationEnum.add(encoded, encoded);
491          }
492        }
493        %>
494        <tbl:columndef 
495          id="<%="at"+at.getId()%>"
496          title="<%=HTML.encodeTags(at.getName())+" [A]"%>" 
497          property="<%="#"+at.getId()%>"
498          annotation="true"
499          datatype="<%=at.getValueType().getStringValue()%>"
500          enumeration="<%=annotationEnum%>"
501          smartenum="<%=at.getDisplayAsList() %>"
502          sortable="<%=at.getMultiplicity() == 1%>" 
503          filterable="true" 
504          exportable="true"
505          formatter="<%=formatter%>"
506          unit="<%=at.getDefaultUnit()%>"
507        />
508        <%
509      }
510      %>
511      <tbl:columndef 
512        id="tools"
513        title="Tools" 
514      />
515      <tbl:columndef 
516        id="xt-columns" 
517        extensions="<%=columnsInvoker%>" 
518        jspcontext="<%=jspContext%>" 
519      />
520
521      <div class="panelgroup">
522      <tbl:toolbar
523        visible="<%=mode.hasToolbar()%>"
524        subclass="<%=root == null ? "bottomborder bg-filled-50" : "topborder leftborder rightborder bg-filled-50" %>"
525        >
526        <tbl:button 
527          id="btnNewRootBioAssaySet"
528          disabled="<%=!createPermission%>" 
529          image="new.png" 
530          title="New root bioassay set&hellip;" 
531          tooltip="<%=createPermission ? "Create a new root bioassay set" : "You do not have permission to create bioassay sets"%>" 
532          visible="<%=root == null && pluginCount.containsKey(Plugin.MainType.INTENSITY)%>"
533        />
534        <tbl:button 
535          id="btnDeleteTreeItems"
536          disabled="<%=!deletePermission%>" 
537          image="delete.png" 
538          title="Delete"
539          tooltip="<%=deletePermission ? "Delete the selected items" : "You do not have permission to delete items"%>" 
540        />
541        <tbl:button 
542          id="btnRestoreTreeItems"
543          disabled="<%=!writePermission%>" 
544          image="restore.png" 
545          title="Restore"
546          tooltip="<%=writePermission ? "Restore the selected (deleted) items" : "You do not have permission to restore items"%>" 
547        />
548        <tbl:button 
549          id="btnTreeColumns"
550          image="columns.png" 
551          title="Columns&hellip;" 
552          tooltip="Show, hide and re-order columns" 
553        />
554        <tbl:button 
555          id="btnTreeImport"
556          data-plugin-type="IMPORT"
557          image="import.png" 
558          title="Import&hellip;" 
559          tooltip="Import data" 
560          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
561        />
562        <tbl:button 
563          id="btnTreeExport"
564          data-plugin-type="EXPORT"
565          image="export.png" 
566          title="Export&hellip;" 
567          tooltip="Export data" 
568          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
569        />
570        <tbl:button 
571          id="btnTreeRunPlugin"
572          data-plugin-type="OTHER"
573          image="runplugin.png" 
574          title="Run plugin&hellip;" 
575          tooltip="Run a plugin" 
576          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
577        />
578        <ext:render extensions="<%=toolbarInvoker%>" context="<%=jspContext%>" 
579          wrapper="<%=new PrefixSuffixRenderer<ButtonAction>(jspContext, "<td>", "</td>") %>"/>
580      </tbl:toolbar>
581      </div>
582      <tbl:data style="<%=root == null ? "top: 1.75em;" : "" %>">
583        <tbl:headers>
584          <tbl:headerrow>
585            <tbl:header clazz="row-index bg-filled-100">
586            <tbl:presetselector 
587              style="border-right: 0px; display: block;"
588            />
589            </tbl:header>
590            <tbl:columnheaders />
591          </tbl:headerrow>
592          <%
593          int numFilters = cc.getNumPropertyFilters();
594          int numRows = cc.getFilterRows();
595          for (int filterNo = 0; filterNo < numRows; filterNo++)
596          {
597            boolean lastRow = filterNo == numRows-1;
598            %>
599            <tbl:headerrow>
600              <tbl:header subclass="row-index bg-filled-100">
601                <div class="index-<%=mode.getName()%>">
602                  <div class="index"></div>
603                  <div class="check">
604                    <base:icon 
605                      subclass="link table-check"
606                      image="check_uncheck.png" 
607                      tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)" 
608                      visible="<%=lastRow && mode.hasCheck()%>"
609                    />
610                  </div>
611                  <div class="icons">
612                    <base:icon
613                      subclass="link table-filter-row-action"
614                      image="add.png"
615                      tooltip="Add extra filter row"
616                      visible="<%=lastRow%>"
617                    /><base:icon
618                      subclass="link table-filter-row-action"
619                      image="remove.png"
620                      tooltip="Remove this filter row"
621                      visible="<%=numRows > 1 || numFilters > 0 %>"
622                      data-remove-row="<%=filterNo%>"
623                    />
624                  </div>
625                </div>
626              </tbl:header>
627              <tbl:propertyfilter row="<%=filterNo%>" />
628            </tbl:headerrow>
629            <%
630          }
631          %>
632          <tbl:columnsubtitles />
633        </tbl:headers>
634        <tbl:rows>
635          <%
636          if (cc.getMessage() != null)
637          {
638            %>
639            <tbl:panel subclass="bg-filled-50">
640              <div class="messagecontainer error"><%=cc.getMessage()%></div>
641            </tbl:panel>
642            <%
643            cc.setMessage(null);
644          }
645          int index = cc.getPage()*cc.getRowsPerPage();
646          int selectedItemId = cc.getId();
647          if (analysisTree != null)
648          {           
649            Iterator<Tree.Entry<BasicItem>> baas = analysisTree.entryIterator(root);
650            while (baas.hasNext())
651            {
652              Tree.Entry<BasicItem> entry = baas.next();
653              BasicItem item = entry.getNode();
654              if (item != null)
655              {
656                int level = entry.getDepth() - 1;
657                int itemId = item.getId();
658                String joustId = item.getType().name() + "_" + itemId;
659               
660                boolean isVisible = true;
661                BasicItem parent = entry.getParent().getNode();
662                if (parent != null && closed != null)
663                {
664                  String parentId = parent.getType().name()+"_"+parent.getId();
665                  isVisible = !closed.contains(parentId);
666                  if (!isVisible) closed.add(joustId);
667                }
668                String name = "";
669                String description = "";
670                String tooltip = mode.isSelectionMode() ?
671                    "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
672                boolean removed = false;
673                Transformation t = null;
674                BioAssaySet bas = null;
675                ExtraValue xv = null;
676                PluginDefinition plugin = null;
677                Job job = null;
678                String prefix = "";
679                ItemContext ccc = null;
680                Item itemType = item.getType();
681                if (itemType == Item.TRANSFORMATION)
682                {
683                  t = (Transformation)item;
684                  removed = t.isRemoved();
685                  prefix = "T:";
686                  ccc = tc;
687                  name = HTML.encodeTags(t.getName());
688                  description = HTML.encodeTags(t.getDescription());
689                  try
690                  {
691                    job = t.getJob();
692                    plugin = job.getPluginDefinition();
693                  }
694                  catch (Throwable ex)
695                  {}
696                }
697                else if (itemType == Item.BIOASSAYSET)
698                {
699                  bas = (BioAssaySet)item;
700                  removed = bas.isRemoved();
701                  ccc = cc;
702                  name = HTML.encodeTags(bas.getName());
703                  description = HTML.encodeTags(bas.getDescription());
704                }
705                else if (itemType == Item.EXTRAVALUE)
706                {
707                  xv = (ExtraValue)item;
708                  prefix = "X:";
709                  removed = false;
710                  ccc = xvc;
711                  try
712                  {
713                    ExtraValueType xvType = xv.getExtraValueType();
714                    name = HTML.encodeTags(xvType.getName());
715                    description = HTML.encodeTags(xvType.getDescription());
716                  }
717                  catch (PermissionDeniedException ex)
718                  {
719                    name = xv.getValueType().toString();
720                    description = "";
721                  }
722                  try
723                  {
724                    job = xv.getJob();
725                    plugin = job.getPluginDefinition();
726                  }
727                  catch (Throwable ex)
728                  {}
729                }
730               
731                index++;
732                numListed++;
733                %>
734                <tbl:row
735                  id="<%="row."+joustId%>"
736                  style="<%=isVisible ? "" : "display: none;" %>"
737                  >
738                  <tbl:header clazz="row-index bg-filled-100">
739                    <div class="index-<%=mode.getName()%>">
740                      <div class="index <%=index>999?"index-smaller":""%>"><%=index%></div>
741                      <div class="check">
742                        <base:input
743                          type="checkbox" 
744                          name="<%=prefix+itemId%>" 
745                          value="<%=itemId%>" 
746                          title="<%=name%>" 
747                          checked="<%=cc.getSelected().contains(itemId)%>"
748                          visible="<%=mode.hasCheck()%>"
749                        />
750                        <base:input 
751                          type="radio" 
752                          name="item_id" 
753                          value="<%=itemId%>" 
754                          title="<%=name%>" 
755                          checked="<%=selectedItemId == itemId%>"
756                          visible="<%=mode.hasRadio()%>"
757                        />                   
758                      </div>
759                      <div class="icons">
760                        <base:icon 
761                          image="deleted.png"
762                          id="<%="delete."+itemId %>"
763                          subclass="<%=deletePermission ? "table-delete-item" : "disabled" %>"
764                          data-item-type="<%=itemType.name() %>"
765                          data-item-id="<%=itemId%>"
766                          data-notify="reloadOnNotify"
767                          tooltip="This item has been scheduled for deletion" 
768                          visible="<%=removed%>"
769                        />
770                      </div>
771                    </div>
772                  </tbl:header>
773                  <tbl:cell clazz="cell joust" column="name">
774                    <div id="<%=joustId%>" class="link auto-init"
775                      data-auto-init="item-link"
776                      data-item-type="<%=itemType.name() %>" 
777                      data-item-id="<%=itemId %>"
778                      data-no-edit="<%=writePermission ? 0 : 1 %>" 
779                      tabindex="0"
780                      title="<%=tooltip%>"><%=name%></div>
781                  </tbl:cell>
782                  <%
783                  if (t != null)
784                  {
785                    %>
786                    <tbl:cell column="spots">&nbsp;</tbl:cell>
787                    <tbl:cell column="reporters">&nbsp;</tbl:cell>
788                    <tbl:cell column="fileSpots">&nbsp;</tbl:cell>
789                    <tbl:cell column="fileReporters">&nbsp;</tbl:cell>
790                    <tbl:cell column="tools" style="white-space: nowrap;">
791                      <%
792                      if (createPermission && job != null && plugin != null && plugin.isInteractive() && plugin.hasPermission(Permission.USE))
793                      {
794                        // User may not have permission to read plug-in configuration for job
795                        boolean copyTransformationAllowed = false;
796                        try
797                        {
798                          PluginConfiguration pluginConfig = job.getPluginConfiguration();
799                          if (pluginConfig == null || pluginConfig.hasPermission(Permission.USE))
800                          {
801                            copyTransformationAllowed = true;
802                          }
803                        }
804                        catch (Exception e)
805                        {}
806                        if (copyTransformationAllowed)
807                        {
808                          %>
809                          <base:icon 
810                            subclass="link auto-init"
811                            data-auto-init="copy-job"
812                            data-job-id="<%=job.getId() %>"
813                            image="copy.png" 
814                            tooltip="Copy this transformation"
815                          />
816                          <%
817                        }
818                      }
819                      %>
820                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />
821                    </tbl:cell>
822                    <%
823                  }
824                  if (bas != null)
825                  {
826                    %>
827                    <tbl:cell column="spots"><%=bas.getNumSpots()%></tbl:cell>
828                    <tbl:cell column="reporters"><%=bas.getNumReporters()%></tbl:cell>
829                    <tbl:cell column="fileSpots"><%=bas.getNumFileSpots()%></tbl:cell>
830                    <tbl:cell column="fileReporters"><%=bas.getNumFileReporters()%></tbl:cell>
831                    <tbl:cell column="date">&nbsp;</tbl:cell>
832                    <tbl:cell column="plugin">&nbsp;</tbl:cell>
833                    <%
834                    if (bas.isAnnotated())
835                    {
836                      AnnotationSetSnapshot snapshot = manager.getSnapshot(dc, bas.getAnnotationSet().getId());
837                      for (AnnotationLoaderUtil loader : annotationLoaders)
838                      {
839                        %>
840                        <tbl:cell 
841                          column="<%="at"+loader.getId()%>"
842                          ><%
843                          if (loader.find(snapshot, psInfo.reset())) 
844                          {
845                            %><tbl:cellvalue 
846                              list="<%=loader.getValues()%>"
847                              suffix="<%=loader.getUnitSymbol()%>"
848                              clazz="<%=psInfo.overridesDefaultAnnotation() ? "ps-annotation" : null%>"
849                            /><%
850                          }
851                          %></tbl:cell>
852                        <%
853                      }
854                    }
855                    %>
856                    <tbl:cell column="tools" style="white-space: nowrap;">
857                      <%
858                      if (bas.getNumSpots() > 0)
859                      {
860                        %>
861                        <base:icon 
862                          subclass="link auto-init"
863                          data-auto-init="bioassayset-plotter"
864                          data-item-id="<%=itemId %>"
865                          image="plotter.png" 
866                          tooltip="A simple plot tool"
867                        />
868                        <base:icon 
869                          subclass="link auto-init"
870                          data-auto-init="experiment-explorer"
871                          data-item-id="<%=itemId %>"
872                          image="explorer.png" 
873                          tooltip="Experiment explorer"
874                        />
875                        <%
876                      }
877                      %>
878                      <base:icon 
879                        subclass="link auto-init"
880                        data-auto-init="bioassayset-plugin"
881                        data-plugin-type="EXPORT"
882                        data-item-id="<%=itemId %>"
883                        image="export.png" 
884                        tooltip="Export data"
885                      />
886                      <%
887                      if (createPermission)
888                      {
889                        %>
890                        <base:icon 
891                          subclass="link auto-init"
892                          data-auto-init="bioassayset-plugin"
893                          data-plugin-type="ANALYZE"
894                          data-cmd="NewFilteredBioAssaySet"
895                          data-item-id="<%=itemId %>"
896                          image="filter.png" 
897                          tooltip="Create a filtered bioassay set"
898                        />
899                        <base:icon 
900                          subclass="link auto-init"
901                          data-auto-init="bioassayset-plugin"
902                          data-plugin-type="ANALYZE"
903                          data-item-id="<%=itemId %>"
904                          image="runplugin.png" 
905                          tooltip="Run an analysis plugin"
906                        />
907                        <%
908                      }
909                      %>
910                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />
911                    </tbl:cell>
912                    <%
913                  }
914                  if (xv != null)
915                  {
916                    %>
917                    <tbl:cell column="spots"><%=xv.getNumValues()%></tbl:cell>
918                    <tbl:cell column="reporters">&nbsp;</tbl:cell>
919                    <tbl:cell column="fileSpots"><%=xv.getNumFileValues()%></tbl:cell>
920                    <tbl:cell column="fileReporters">&nbsp;</tbl:cell>
921                    <tbl:cell column="tools" style="white-space: nowrap;">
922                      <%
923                      if (createPermission && job != null && plugin != null && plugin.isInteractive() && plugin.hasPermission(Permission.USE))
924                      {
925                        // User may not have permission to read plug-in configuration for job
926                        boolean copyTransformationAllowed = false;
927                        try
928                        {
929                          PluginConfiguration pluginConfig = job.getPluginConfiguration();
930                          if (pluginConfig == null || pluginConfig.hasPermission(Permission.USE))
931                          {
932                            copyTransformationAllowed = true;
933                          }
934                        }
935                        catch (Exception e)
936                        {}
937                        if (copyTransformationAllowed)
938                        {
939                          %>
940                          <base:icon 
941                            subclass="link auto-init"
942                            data-auto-init="copy-job"
943                            data-job-id="<%=job.getId() %>"
944                            image="copy.png" 
945                            tooltip="Copy this extra value"
946                          />
947                          <%
948                        }
949                      }
950                      %>
951                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />
952                    </tbl:cell>
953                    <%
954                  }
955                  %>
956                  <tbl:cell column="date"><%=job == null ? "" : dateTimeFormatter.format(job.getEnded())%></tbl:cell>
957                  <tbl:cell column="plugin"><%=plugin == null ? "" : Base.getLinkedName(ID, plugin, false, true)%></tbl:cell>
958                  <tbl:cell column="description"><%=description%></tbl:cell>
959                  <tbl:xt-cells dc="<%=dc%>" item="<%=item%>">
960                    <tbl:cell column="xt-columns" />
961                  </tbl:xt-cells>
962                </tbl:row>
963                <%
964              }
965            }
966          }
967          if (numListed == 0)
968          {
969            %>
970            <tbl:panel subclass="bg-filled-50">
971              <div class="messagecontainer note">
972              No bioassay sets or transformations were found.
973              </div>
974            </tbl:panel>
975            <%
976          }
977          %>
978        </tbl:rows>
979      </tbl:data>
980    </tbl:table>
981
982    <div id="reloadOnNotify"></div>
983  </base:body>
984  </base:page>
985  <%
986}
987finally
988{
989  if (dc != null) dc.close();
990}
991%>
Note: See TracBrowser for help on using the repository browser.