source: trunk/www/views/experiments/bioassaysets/analysis_tree.jsp @ 5939

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

References #1655: GUI improvements

View pages for:

  • File server
  • Projects
  • Permission templates
  • Physical, derived and raw bioassays
  • Experiments, bioassay set
  • Formulas
  • Reporters
  • Reporter lists
  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 32.6 KB
Line 
1<%-- $Id: analysis_tree.jsp 5939 2012-01-30 14:42:18Z 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.PermissionDeniedException"
48  import="net.sf.basedb.core.query.Restrictions"
49  import="net.sf.basedb.core.query.Expressions"
50  import="net.sf.basedb.core.query.Orders"
51  import="net.sf.basedb.core.query.Hql"
52  import="net.sf.basedb.core.query.Restrictions"
53  import="net.sf.basedb.core.plugin.GuiContext"
54  import="net.sf.basedb.core.plugin.Plugin"
55  import="net.sf.basedb.util.Tree"
56  import="net.sf.basedb.util.Enumeration"
57  import="net.sf.basedb.clients.web.Base"
58  import="net.sf.basedb.clients.web.ModeInfo"
59  import="net.sf.basedb.clients.web.util.HTML"
60  import="net.sf.basedb.util.Values"
61  import="net.sf.basedb.util.formatter.Formatter"
62  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
63  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
64  import="net.sf.basedb.clients.web.extensions.toolbar.ButtonAction"
65  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
66  import="net.sf.basedb.clients.web.extensions.JspContext"
67  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
68  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
69  import="net.sf.basedb.util.extensions.Renderer"
70  import="java.util.Date"
71  import="java.util.List"
72  import="java.util.ArrayList"
73  import="java.util.LinkedList"
74  import="java.util.Map"
75  import="java.util.HashMap"
76  import="java.util.Iterator"
77  import="java.util.Collection"
78%>
79<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
80<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
81<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
82<%!
83  private static final Item itemType = Item.BIOASSAYSET;
84  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
85%>
86<%!
87
88private static void addToTree(Tree<BasicItem> tree, BioAssaySet bas)
89{
90  if (!tree.contains(bas))
91  {
92    Transformation transformation = bas.getTransformation();
93    Tree.Entry<BasicItem> parent = tree.getEntry(transformation);
94    if (parent == null) 
95    {
96      addToTree(tree, transformation);
97      parent = tree.getEntry(transformation);
98    }
99    Tree.Entry<BasicItem> basEntry = parent.addChild(bas);
100    for (ExtraValue xv : bas.getExtraValues().list(bas.getDbControl())) 
101    {
102      basEntry.addChild(xv);
103    }
104  }
105}
106
107private static void addToTree(Tree<BasicItem> tree, Transformation transformation)
108{
109  if (!tree.contains(transformation))
110  {
111    BioAssaySet source = transformation.getSource();
112    Tree.Entry<BasicItem> parent = tree.getEntry(source);
113    if (parent == null) 
114    {
115      addToTree(tree, source);
116      parent = tree.getEntry(source);
117    }
118    parent.addChild(transformation);
119  }
120}
121
122private static Tree<BasicItem> getAnalysisTree(DbControl dc, ItemQuery<BioAssaySet> bioAssaySetQuery, ItemQuery<Transformation> transformationQuery)
123{
124  Tree<BasicItem> tree = new Tree<BasicItem>(null);
125  ItemResultList<BioAssaySet> allBioAssaySets = bioAssaySetQuery.list(dc);
126  List<Integer> ids = new ArrayList<Integer>(allBioAssaySets.size());
127 
128  for (BioAssaySet bas : allBioAssaySets)
129  {
130    addToTree(tree, bas);
131    ids.add(bas.getId());
132  }
133 
134  transformationQuery.restrict(
135    Restrictions.in(
136      Hql.property("source.id"), 
137      Expressions.parameter("bioAssaySets", ids)
138    )
139  );
140  ItemResultList<Transformation> allTransformations = transformationQuery.list(dc);
141  for (Transformation t: allTransformations)
142  {
143    addToTree(tree, t);
144  }
145  return tree;
146}
147String generateTree(Tree<BasicItem> tree, BasicItem root, BasicItem parentItem, Collection<String> closed)
148{
149  StringBuilder sb = new StringBuilder();
150  Tree.Entry<BasicItem> parentEntry = tree.getEntry(parentItem);
151  if (parentEntry == null) return "";
152 
153  if (root != null && root == parentItem)
154  {
155    appendNode(sb, root, null, true);
156  }
157 
158  List<Tree.Entry<BasicItem>> children = parentEntry.getChildren();
159  if (children != null)
160  {
161    for (Tree.Entry<BasicItem> child : children)
162    {
163      BasicItem node = child.getNode();
164      String var = node.getType().name() + "_" + node.getId();
165      appendNode(sb, node, parentItem, (closed == null || !closed.contains(var)) && child.getNumChildren() > 0);
166      sb.append(generateTree(tree, root, node, closed));
167    }
168  }
169  return sb.toString();
170}
171
172void appendNode(StringBuilder sb, BasicItem node, BasicItem parentItem, boolean open)
173{
174  int id = node.getId();
175  String var = node.getType().name() + "_" + id;
176  String name = "";
177 
178  Item nodeType = node.getType();
179  String folderIcon = "";
180  if (nodeType == Item.BIOASSAYSET)
181  {
182    folderIcon = "BioAssaySet";
183    name = ((BioAssaySet)node).getName();
184  } 
185  else if (nodeType == Item.TRANSFORMATION)
186  {
187    Transformation t = (Transformation)node;
188    folderIcon = "Transformation";
189    try
190    {
191      if (t.getJob().getPluginDefinition().supports("net.sf.basedb.core.plugin.AnalysisFilterPlugin"))
192      {
193        folderIcon = "Filter";
194      }
195    }
196    catch (Throwable tt)
197    {}
198    name = t.getName();
199  } 
200  else if (nodeType == Item.EXTRAVALUE) 
201  {
202    folderIcon = "ExtraValue";
203    try
204    {
205      name = ((ExtraValue)node).getExtraValueType().getName();
206    }
207    catch (PermissionDeniedException ex)
208    {
209      name = ((ExtraValue)node).getValueType().toString();
210    }
211  }
212  sb.append("var ").append(var);
213  if (parentItem == null)
214  {
215    sb.append(" = JoustMenu.addMenuItem(-1");
216  }
217  else
218  {
219    String rootVar = parentItem.getType().name() + "_" + parentItem.getId();
220    sb.append(" = JoustMenu.addChildItem(").append(rootVar); 
221  }
222  sb.append(",'").append(folderIcon).append("'");
223  sb.append(",'").append(HTML.javaScriptEncode(name)).append("'");
224  sb.append(", null, '', '").append(var).append("');\n");
225  if (open)
226  {
227    sb.append("JoustMenu.menuItems[").append(var).append("].isOpen = true;\n");
228  }
229}
230%>
231<%
232final int experimentId = Values.getInt(request.getParameter("experiment_id"));
233final int bioAssaySetId = Values.getInt(request.getParameter("item_id"));
234final int transformationId = Values.getInt(request.getParameter("transformation_id"));
235final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
236final String ID = sc.getId();
237final String rootPath = request.getContextPath()+"/";
238final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
239final ItemContext tc = sc.getCurrentContext(Item.TRANSFORMATION);
240final ItemContext xvc = sc.getCurrentContext(Item.EXTRAVALUE);
241
242final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
243final String callback = request.getParameter("callback");
244final String title = mode.generateTitle("bioassay set", "bioassay sets");
245final DbControl dc = sc.newDbControl();
246Tree<BasicItem> analysisTree = null;
247ItemResultList<AnnotationType> annotationTypes = null;
248try
249{
250  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
251  final ItemQuery<AnnotationType> annotationTypeQuery = Base.getAnnotationTypesQuery(itemType);
252  final Experiment experiment = Experiment.getById(dc, experimentId);
253  final BasicItem root = transformationId == 0 ? 
254      (bioAssaySetId == 0 ? null : BioAssaySet.getById(dc, bioAssaySetId))
255      : Transformation.getById(dc, transformationId);
256  final boolean createPermission = experiment.hasPermission(Permission.USE);
257  final boolean deletePermission = createPermission;
258  final boolean writePermission = createPermission;
259
260  final ItemQuery<Transformation> transformationQuery = experiment.getTransformations();
261  transformationQuery.include(cc.getInclude());
262  transformationQuery.setFirstResult(0);
263  transformationQuery.setMaxResults(-1);
264  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
265  annotationTypes = annotationTypeQuery.list(dc);
266  try
267  {
268    final ItemQuery<BioAssaySet> query = Base.getConfiguredQuery(dc, cc, true, experiment.getBioAssaySets(), mode);
269    query.setFirstResult(0);
270    query.setMaxResults(-1);
271    analysisTree = getAnalysisTree(dc, query, transformationQuery);
272  }
273  catch (Throwable t)
274  {
275    cc.setMessage(t.getMessage());
276    t.printStackTrace();
277  }
278  // Contains the ID:s of the bioassaysets that are closed in the tree
279  Collection<String> closed = (Collection<String>)cc.getObject("closed");
280  int numListed = 0;
281 
282  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, 
283    guiContext, root == null ? experiment : root);
284  ExtensionsInvoker toolsInvoker = ExtensionsControl.useExtensions(jspContext, 
285      "net.sf.basedb.clients.web.bioassayset.list.tools");
286  ExtensionsInvoker toolbarInvoker = ToolbarUtil.useExtensions(jspContext);
287  %>
288  <base:page type="include">
289  <base:body>
290    <ext:scripts context="<%=jspContext%>" />
291    <ext:stylesheets context="<%=jspContext%>" />
292    <script language="JavaScript">
293    var submitPage = '<%=transformationId != 0 ? "../bioassaysets/index.jsp" : "index.jsp"%>';
294    var formId = 'bioAssaySets';
295    function newItem()
296    {
297      Main.openPopup('index.jsp?ID=<%=ID%>&cmd=NewItem&experiment_id=<%=experimentId%>', 'NewBioAssaySet', 750, 500);
298    }
299    function editBioAssaySet(itemId)
300    {
301      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, true);
302    }
303    function viewBioAssaySet(itemId)
304    {
305      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', itemId, false);
306    }
307    function bioAssaySetOnClick(evt, itemId)
308    {
309      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewBioAssaySet, editBioAssaySet, returnSelected);
310    }
311    function viewTransformation(itemId)
312    {
313      Main.viewOrEditItem('<%=ID%>', 'TRANSFORMATION', itemId, false);
314    }
315    function editTransformation(itemId)
316    {
317      Main.viewOrEditItem('<%=ID%>', 'TRANSFORMATION', itemId, true);
318    }
319    function transformationOnClick(evt, itemId)
320    {
321      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewTransformation, editTransformation, returnSelected);
322    }
323    function viewExtraValue(itemId)
324    {
325      Main.viewOrEditItem('<%=ID%>', 'EXTRAVALUE', itemId, false);
326    }
327    function editExtraValue(itemId)
328    {
329      Main.viewOrEditItem('<%=ID%>', 'EXTRAVALUE', itemId, true);
330    }
331    function extraValueOnClick(evt, itemId)
332    {
333      Table.itemOnClick(formId, evt, itemId, '<%=mode.getName()%>', viewExtraValue, editExtraValue, returnSelected);
334    }
335    function deleteItems()
336    {
337      var frm = document.forms[formId];
338      if (Forms.numChecked(frm) == 0)
339      {
340        alert('Please select at least one item in the list');
341        return;
342      }
343      if (Forms.numChecked(frm, /^X:/) > 0)
344      {
345        if (!confirm('Extra values are deleted immediately and cannot be restored. Do you want to continue?'))
346        {
347          return;
348        }
349      }
350      frm.action = submitPage;
351      frm.cmd.value = 'DeleteItems';
352      frm.submit();
353    }
354    function restoreItems()
355    {
356      var frm = document.forms[formId];
357      if (Forms.numChecked(frm) == 0)
358      {
359        alert('Please select at least one item in the list');
360        return;
361      }
362      frm.action = submitPage;
363      frm.cmd.value = 'RestoreItems';
364      frm.submit();
365    }
366    function deleteItemPermanently(itemType, itemId)
367    {
368      Main.deleteItemPermanently('<%=ID%>', true, itemType, itemId);
369    }
370    function configureColumns()
371    {
372      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
373    }
374    function runPlugin(cmd)
375    {
376      Table.submitToPopup(formId, cmd, 750, 500);
377    }
378    function filter(itemId)
379    {
380      Main.openPopup('../bioassaysets/index.jsp?ID=<%=ID%>&cmd=NewFilteredBioAssaySet&experiment_id=<%=experimentId%>&item_id='+itemId, 'FilterBioAssaySet', 750, 500);
381    }
382    function openPlotTool(itemId)
383    {
384      Main.openPopup('../plotter/index.jsp?ID=<%=ID%>&bioassayset_id='+itemId, 'Plotter', 1050, 700);
385    }
386    function openExperimentExplorer(itemId)
387    {
388      location.href = '../explorer/view/index.jsp?ID=<%=ID%>&bioassayset_id='+itemId;
389    }
390    function runAnalysisPlugin(itemId)
391    {
392      Main.openPopup('../bioassaysets/index.jsp?ID=<%=ID%>&cmd=RunAnalysisPlugin&experiment_id=<%=experimentId%>&item_id='+itemId, 'RunPlugin', 750, 500);
393    }
394    function runExportPlugin(itemId)
395    {
396      Main.openPopup('../bioassaysets/index.jsp?ID=<%=ID%>&cmd=ExportItem&experiment_id=<%=experimentId%>&item_id='+itemId, 'Export', 750, 500);
397    }
398    function copyJob(jobId)
399    {
400      var url = '../../../common/plugin/index.jsp?ID=<%=ID%>';
401      url += '&cmd=CopyJob&job_id='+jobId;
402      url += '&item_type=BIOASSAYSET&context_type=LIST'
403      Main.openPopup(url, 'CopyJob', 750, 500);
404    }
405    function returnSelected()
406    {
407      Table.returnSelected(formId, <%=callback != null ? "window.opener."+callback : "null" %>);
408      window.close();
409    }
410    function presetOnChange()
411    {
412      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>');
413    }
414   
415    function sendClosedWithAjax()
416    {
417      var request = Main.getAjaxRequest();
418      if (request != null)
419      {
420        var frm = document.forms[formId];
421        var url = '../bioassaysets/index.jsp?ID=<%=ID%>&cmd=SetClosedWithAjax';
422        request.open("POST", url, true);
423        var postdata = 'closed=' + frm.closed.value;
424        request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
425        request.setRequestHeader("Content-length", postdata.length);
426        request.setRequestHeader("Connection", "close");
427        request.send(postdata);
428      }
429    }
430   
431    function initTree()
432    {
433      var bigDir = getRoot()+'images/joust/big/';
434      IconStore.init(bigDir, 18, 22);
435      IconStore.addIcon('BioAssaySet', bigDir + 'bioassayset.gif', 18, 22);
436      IconStore.addIcon('Transformation', bigDir + 'transformation.gif', 18, 22);
437      IconStore.addIcon('Filter', bigDir + 'filter.gif', 18, 22);
438      IconStore.addIcon('ExtraValue', bigDir + 'extravalue.gif', 18, 22);
439
440      JoustMenu.toggle = function(menuItemIndex)
441      {
442        var menuItem = this.menuItems[menuItemIndex];
443        if (!menuItem) return;
444        // Switch the open/closed status and hide or show the children
445        menuItem.isOpen = !menuItem.isOpen;
446        if (menuItem.isOpen)
447        {
448          this.showChildren(menuItemIndex);
449          var frm = document.forms[formId];
450          frm.closed.value = frm.closed.value.replace(','+menuItem.externalId+',', ',');
451        }
452        else
453        {
454          this.hideChildren(menuItemIndex);
455          var frm = document.forms[formId];
456          frm.closed.value += menuItem.externalId+',';
457        }
458        sendClosedWithAjax();
459        // alert(document.forms[formId].closed.value);
460        this.updateIconsAndText(menuItemIndex);
461      }
462     
463      JoustMenu.drawMenuItems = function(firstIndex, indentString)
464      {
465        var menuItem = this.menuItems[firstIndex];
466        while (menuItem)
467        {
468          var html = menuItem.draw(indentString);
469          var padIcon = IconStore.getIcon(menuItem.noOutlineIcon == true ? null : menuItem.nextItemIndex == -1 ? 'iconBlank' : 'iconLine');
470          var padHtml = padIcon == null ? '' : padIcon.getImgTag();
471         
472          var menuDiv = document.getElementById('tree.'+menuItem.externalId);
473          menuDiv.innerHTML = html;
474         
475          if (menuItem.firstChildIndex != -1)
476          {
477            this.drawMenuItems(menuItem.firstChildIndex, indentString+padHtml);
478          }
479          if (!menuItem.isOpen)
480          {
481            this.hideChildren(menuItem.index);
482          }
483          menuItem = this.menuItems[menuItem.nextItemIndex];
484        }
485        return '';
486      }
487
488      JoustMenu.hideChildren = function(menuItemIndex)
489      {
490        var menuItem = this.menuItems[menuItemIndex];
491        if (menuItem)
492        {
493          var firstChildIndex = menuItem.firstChildIndex;
494          var child = this.menuItems[firstChildIndex];
495          while (child)
496          {
497            var e = document.getElementById('row.'+child.externalId);
498            e.style.display = 'none';
499            this.hideChildren(child.index);
500            child = this.menuItems[child.nextItemIndex];
501          }
502        }
503      }
504     
505      JoustMenu.showChildren = function(menuItemIndex)
506      {
507        var menuItem = this.menuItems[menuItemIndex];
508        if (menuItem)
509        {
510          var firstChildIndex = menuItem.firstChildIndex;
511          var child = this.menuItems[firstChildIndex];
512          while (child)
513          {
514            var e = document.getElementById('row.'+child.externalId);
515            e.style.display = Browser.isIE ? 'block' : 'table-row';
516            if (child.isOpen)
517            {
518              this.showChildren(child.index);
519            }
520            child = this.menuItems[child.nextItemIndex];
521          }
522        }
523      }
524
525      <%=analysisTree == null ? "" : generateTree(analysisTree, root, root, closed)%>
526      JoustMenu.draw('joust');
527     
528    }
529    </script>
530 
531
532    <%
533    if (cc.getMessage() != null)
534    {
535      %>
536      <div class="error"><%=cc.getMessage()%></div>
537      <%
538      cc.setMessage(null);
539    }
540    %>
541    <tbl:table 
542      id="bioAssaySets" 
543      columns="<%=cc.getSetting("columns")%>"
544      sortby="<%=cc.getSortProperty()%>" 
545      direction="<%=cc.getSortDirection()%>"
546      title="<%=title%>"
547      action="<%=transformationId != 0 ? "../bioassaysets/index.jsp" : "index.jsp"%>"
548      sc="<%=sc%>"
549      item="<%=itemType%>"
550      >
551      <tbl:hidden 
552        name="mode" 
553        value="<%=mode.getName()%>" 
554      />
555      <tbl:hidden 
556        name="experiment_id" 
557        value="<%=String.valueOf(experimentId)%>" 
558      />
559      <tbl:hidden 
560        name="item_id" 
561        value="<%=String.valueOf(bioAssaySetId)%>"
562        skip="<%=bioAssaySetId == 0%>"
563      />
564      <tbl:hidden 
565        name="transformation_id" 
566        value="<%=String.valueOf(transformationId)%>"
567        skip="<%=transformationId == 0%>"
568      />
569      <tbl:hidden 
570        name="callback" 
571        value="<%=callback%>" 
572        skip="<%=callback == null%>" 
573      />
574      <tbl:hidden
575        name="closed"
576        value="<%=closed == null ? "," : ","+Values.getString(closed, ",", true)+","%>"
577      />
578      <tbl:columndef 
579        id="name"
580        property="name"
581        datatype="string"
582        title="Name"
583        sortable="true" 
584        filterable="true"
585        exportable="true"
586        show="always" 
587      />
588      <tbl:columndef 
589        id="spots"
590        property="numSpots"
591        datatype="int"
592        title="Spots/Values in db"
593        sortable="true" 
594        filterable="true"
595        exportable="true"
596      />
597      <tbl:columndef 
598        id="reporters"
599        property="numReporters"
600        datatype="int"
601        title="Reporters in db"
602        sortable="true" 
603        filterable="true"
604        exportable="true"
605      />
606      <tbl:columndef 
607        id="fileSpots"
608        property="numFileSpots"
609        datatype="int"
610        title="Spots/Values in file"
611        sortable="true" 
612        filterable="true"
613        exportable="true"
614      />
615      <tbl:columndef 
616        id="fileReporters"
617        property="numFileReporters"
618        datatype="int"
619        title="Reporters in file"
620        sortable="true" 
621        filterable="true"
622        exportable="true"
623      />
624      <tbl:columndef 
625        id="date"
626        property="transformation.job.ended"
627        datatype="string"
628        title="Date"
629        sortable="true" 
630        filterable="true"
631        exportable="true"
632      />
633      <tbl:columndef 
634        id="plugin"
635        property="transformation.job.pluginDefinition.name"
636        datatype="string"
637        title="Plugin"
638        sortable="true" 
639        filterable="true"
640        exportable="true"
641      />
642      <tbl:columndef 
643        id="description"
644        property="description"
645        datatype="string"
646        title="Description" 
647        sortable="true" 
648        filterable="true" 
649        exportable="true"
650      />
651      <%
652      for (AnnotationType at : annotationTypes)
653      {
654        Enumeration<String, String> annotationEnum = null;
655        Formatter formatter = FormatterFactory.getTypeFormatter(sc, at.getValueType());
656        if (at.isEnumeration())
657        {
658          annotationEnum = new Enumeration<String, String>();
659          List<?> values = at.getValues();
660          for (Object value : values)
661          {
662            String encoded = formatter.format(value);
663            annotationEnum.add(encoded, encoded);
664          }
665        }
666        %>
667        <tbl:columndef 
668          id="<%="at"+at.getId()%>"
669          title="<%=HTML.encodeTags(at.getName())+" [A]"%>" 
670          property="<%="#"+at.getId()%>"
671          annotation="true"
672          datatype="<%=at.getValueType().getStringValue()%>"
673          enumeration="<%=annotationEnum%>"
674          smartenum="<%=at.getDisplayAsList() %>"
675          sortable="false" 
676          filterable="true" 
677          exportable="true"
678          formatter="<%=formatter%>"
679          unit="<%=at.getDefaultUnit()%>"
680        />
681        <%
682      }
683      %>
684      <tbl:columndef 
685        id="tools"
686        title="Tools" 
687      />
688
689      <tbl:toolbar
690        visible="<%=mode.hasToolbar()%>"
691        >
692        <tbl:button 
693          disabled="<%=createPermission ? false : true%>" 
694          image="<%=createPermission ? "new.gif" : "new_disabled.gif"%>" 
695          onclick="newItem()" 
696          title="New root bioassay set&hellip;" 
697          tooltip="<%=createPermission ? "Create a new root bioassay set" : "You do not have permission to create bioassay sets"%>" 
698          visible="<%=root == null && pluginCount.containsKey(Plugin.MainType.INTENSITY)%>"
699        />
700        <tbl:button 
701          disabled="<%=deletePermission ? false : true%>" 
702          image="delete.gif" 
703          title="Delete"
704          onclick="deleteItems()" 
705          tooltip="<%=deletePermission ? "Delete the selected items" : "You do not have permission to delete items"%>" 
706        />
707        <tbl:button 
708          disabled="<%=writePermission ? false : true%>" 
709          image="restore.gif" 
710          onclick="restoreItems()" 
711          title="Restore"
712          tooltip="<%=writePermission ? "Restore the selected (deleted) items" : "You do not have permission to restore items"%>" 
713        />
714        <tbl:button 
715          image="columns.gif" 
716          onclick="configureColumns()" 
717          title="Columns&hellip;" 
718          tooltip="Show, hide and re-order columns" 
719        />
720        <tbl:button 
721          image="import.gif" 
722          onclick="runPlugin('ImportItems')" 
723          title="Import&hellip;" 
724          tooltip="Import data" 
725          visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
726        />
727        <tbl:button 
728          image="export.gif" 
729          onclick="runPlugin('ExportItems')" 
730          title="Export&hellip;" 
731          tooltip="Export data" 
732          visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
733        />
734        <tbl:button 
735          image="runplugin.gif" 
736          onclick="runPlugin('RunListPlugin')" 
737          title="Run plugin&hellip;" 
738          tooltip="Run a plugin" 
739          visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
740        />
741        <ext:render extensions="<%=toolbarInvoker%>" context="<%=jspContext%>" 
742          wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
743      </tbl:toolbar>
744      <tbl:data>
745        <tbl:columns>
746        <tbl:presetselector 
747          clazz="columnheader"
748          colspan="3"
749          onchange="presetOnChange()"
750        />
751        </tbl:columns>
752        <tr>
753          <tbl:header 
754            clazz="index"
755            >&nbsp;</tbl:header>
756          <tbl:header 
757            clazz="check" 
758            visible="<%=mode.hasCheck()%>"
759            ><base:icon 
760              image="check_uncheck.gif" 
761              tooltip="Check/uncheck all" 
762              onclick="Forms.checkUncheck(document.forms[formId])" style="align: left;"
763            /></tbl:header>
764          <tbl:header 
765            clazz="check" 
766            visible="<%=mode.hasRadio()%>"
767            />
768          <tbl:header 
769            clazz="icons" 
770            visible="<%=mode.hasIcons()%>"
771            >&nbsp;</tbl:header>
772          <tbl:propertyfilter />
773        </tr>
774   
775          <tbl:rows>
776          <%
777          int index = cc.getPage()*cc.getRowsPerPage();
778          int selectedItemId = cc.getId();
779          if (analysisTree != null)
780          {           
781            Iterator<Tree.Entry<BasicItem>> baas = analysisTree.entryIterator(root);
782            while (baas.hasNext())
783            {
784              Tree.Entry<BasicItem> entry = baas.next();
785              BasicItem item = entry.getNode();
786              if (item != null)
787              {
788                int level = entry.getDepth() - 1;
789                int itemId = item.getId();
790                String joustId = item.getType().name() + "_" + itemId;
791                String name = "";
792                String description = "";
793                String tooltip = mode.isSelectionMode() ?
794                    "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
795                String deletePermanently = "deleteItemPermanently('" + item.getType().name() + "', "+itemId+")";
796                boolean removed = false;
797                Transformation t = null;
798                BioAssaySet bas = null;
799                ExtraValue xv = null;
800                PluginDefinition plugin = null;
801                Job job = null;
802                String prefix = "";
803                ItemContext ccc = null;
804                String view = "";
805                String onClick = "";
806                Item itemType = item.getType();
807                if (itemType == Item.TRANSFORMATION)
808                {
809                  t = (Transformation)item;
810                  removed = t.isRemoved();
811                  prefix = "T:";
812                  ccc = tc;
813                  onClick = "transformationOnClick";
814                  name = HTML.encodeTags(t.getName());
815                  description = HTML.encodeTags(t.getDescription());
816                  try
817                  {
818                    job = t.getJob();
819                    plugin = job.getPluginDefinition();
820                  }
821                  catch (Throwable ex)
822                  {}
823                }
824                else if (itemType == Item.BIOASSAYSET)
825                {
826                  bas = (BioAssaySet)item;
827                  removed = bas.isRemoved();
828                  ccc = cc;
829                  onClick = "bioAssaySetOnClick";
830                  name = HTML.encodeTags(bas.getName());
831                  description = HTML.encodeTags(bas.getDescription());
832                }
833                else if (itemType == Item.EXTRAVALUE)
834                {
835                  xv = (ExtraValue)item;
836                  prefix = "X:";
837                  removed = false;
838                  ccc = xvc;
839                  onClick = "extraValueOnClick";
840                  try
841                  {
842                    ExtraValueType xvType = xv.getExtraValueType();
843                    name = HTML.encodeTags(xvType.getName());
844                    description = HTML.encodeTags(xvType.getDescription());
845                  }
846                  catch (PermissionDeniedException ex)
847                  {
848                    name = xv.getValueType().toString();
849                    description = "";
850                  }
851                  try
852                  {
853                    job = xv.getJob();
854                    plugin = job.getPluginDefinition();
855                  }
856                  catch (Throwable ex)
857                  {}
858                }
859               
860                index++;
861                numListed++;
862
863                %>
864                <tbl:row
865                  id="<%="row."+joustId%>"
866                  >
867                  <tbl:header 
868                    clazz="index"
869                    ><%=index%></tbl:header>
870                  <tbl:header 
871                    clazz="check" 
872                    visible="<%=mode.hasCheck()%>"
873                    ><input 
874                        type="checkbox" 
875                        name="<%=prefix+itemId%>" 
876                        value="<%=itemId%>" 
877                        title="<%=name%>" 
878                        <%=ccc.getSelected().contains(itemId) ? "checked" : ""%>
879                      ></tbl:header>
880                  <tbl:header 
881                    clazz="check" 
882                    visible="<%=mode.hasRadio()%>"
883                    ><input 
884                        type="radio" 
885                        name="item_id" 
886                        value="<%=itemId%>" 
887                        title="<%=name%>" 
888                        <%=selectedItemId == itemId ? "checked" : ""%>
889                      ></tbl:header>
890                  <tbl:header 
891                    clazz="icons" 
892                    visible="<%=mode.hasIcons()%>"
893                    ><base:icon 
894                      image="<%=deletePermission ? "deleted.gif" : "deleted_disabled.gif"%>"
895                      onclick="<%=deletePermission ? deletePermanently : null%>"
896                      tooltip="This item has been scheduled for deletion" 
897                      visible="<%=removed%>"
898                    />&nbsp;</tbl:header>
899                 
900                  <tbl:cell clazz="joustcell" column="name">
901                    <div id="tree.<%=joustId%>" class="link" 
902                      onclick="<%=onClick%>(<%=writePermission ? "event" : null%>, <%=itemId%>)" 
903                      title="<%=tooltip%>"><%=name%>
904                    </div>
905                  </tbl:cell>
906                  <%
907                  if (t != null)
908                  {
909                    %>
910                    <tbl:cell column="spots">&nbsp;</tbl:cell>
911                    <tbl:cell column="reporters">&nbsp;</tbl:cell>
912                    <tbl:cell column="fileSpots">&nbsp;</tbl:cell>
913                    <tbl:cell column="fileReporters">&nbsp;</tbl:cell>
914                    <tbl:cell column="tools">
915                      <nobr>
916                      <%
917                      if (createPermission && job != null && plugin != null && plugin.isInteractive())
918                      {
919                        %>
920                        <a href="javascript:copyJob(<%=job.getId()%>)" 
921                          title="Copy this transformation"><img 
922                          src="../../../images/copy.gif" border="0"></a>
923                        <%
924                      }
925                      %>
926                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />
927                      </nobr>
928                    </tbl:cell>
929                    <%
930                  }
931                  if (bas != null)
932                  {
933                    %>
934                    <tbl:cell column="spots"><%=bas.getNumSpots()%></tbl:cell>
935                    <tbl:cell column="reporters"><%=bas.getNumReporters()%></tbl:cell>
936                    <tbl:cell column="fileSpots"><%=bas.getNumFileSpots()%></tbl:cell>
937                    <tbl:cell column="fileReporters"><%=bas.getNumFileReporters()%></tbl:cell>
938                    <tbl:cell column="date">&nbsp;</tbl:cell>
939                    <tbl:cell column="plugin">&nbsp;</tbl:cell>
940                    <%
941                    AnnotationSet as = bas.isAnnotated() ? bas.getAnnotationSet() : null;
942                    if (as != null)
943                    {
944                      for (AnnotationType at : annotationTypes)
945                      {
946                        if (as.hasAnnotation(at))
947                        {
948                          Annotation a = as.getAnnotation(at);
949                          String suffix = a.getUnitSymbol(null);
950                          if (suffix != null) suffix = "&nbsp;" + suffix;
951                          %>
952                          <tbl:cell 
953                            column="<%="at"+at.getId()%>"
954                            ><tbl:cellvalue 
955                              list="<%=a.getValues(null)%>"
956                              suffix="<%=suffix%>"
957                          /></tbl:cell>
958                          <%
959                        }
960                      }
961                    }
962                    %>
963                    <tbl:cell column="tools">
964                      <nobr>
965                      <%
966                      if (bas.getNumSpots() > 0)
967                      {
968                        %>
969                        <a href="javascript:openPlotTool(<%=itemId%>)" 
970                          title="A simple plot tool"><img 
971                          src="../../../images/plotter.gif" border="0"></a>
972                        <a href="javascript:openExperimentExplorer(<%=itemId%>)"
973                          title="Experiment explorer"><img
974                          src="../../../images/explorer.png" border="0"></a>
975                        <%
976                      }
977                      %>
978                      <a href="javascript:runExportPlugin(<%=itemId%>)"
979                        title="Export data"><img 
980                        src="../../../images/export.gif" border="0"></a>
981                       
982                      <%
983                      if (createPermission)
984                      {
985                        %>
986                        <a href="javascript:filter(<%=itemId%>)" 
987                          title="Create a filtered bioassay set"><img 
988                          src="../../../images/filter.gif" border="0"></a>
989                        <a href="javascript:runAnalysisPlugin(<%=itemId%>)" title="Run an analysis plugin"><img 
990                          src="../../../images/runplugin.gif" border="0"></a>
991                        <%
992                      }
993                      %>
994                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />
995                      </nobr>
996                    </tbl:cell>
997                    <%
998                  }
999                  if (xv != null)
1000                  {
1001                    %>
1002                    <tbl:cell column="spots"><%=xv.getNumValues()%></tbl:cell>
1003                    <tbl:cell column="reporters">&nbsp;</tbl:cell>
1004                    <tbl:cell column="fileSpots"><%=xv.getNumFileValues()%></tbl:cell>
1005                    <tbl:cell column="fileReporters">&nbsp;</tbl:cell>
1006                    <tbl:cell column="tools">
1007                      <nobr>
1008                      <%
1009                      if (createPermission && job != null && plugin != null && plugin.isInteractive())
1010                      {
1011                        %>
1012                        <a href="javascript:copyJob(<%=job.getId()%>)" 
1013                          title="Copy this extra value"><img 
1014                          src="../../../images/copy.gif" border="0"></a>
1015                        <%
1016                      }
1017                      %>
1018                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />                           
1019                      </nobr>
1020                    </tbl:cell>
1021                    <%
1022                  }
1023                  %>
1024                  <tbl:cell column="date"><%=job == null ? "" : dateTimeFormatter.format(job.getEnded())%></tbl:cell>
1025                  <tbl:cell column="plugin"><%=plugin == null ? "" : Base.getLinkedName(ID, plugin, false, true)%></tbl:cell>
1026                  <tbl:cell column="description"><%=description%></tbl:cell>
1027                </tbl:row>
1028                <%
1029              }
1030            }
1031          }
1032          %>
1033          </tbl:rows>
1034        </tbl:data>
1035      <%
1036      if (numListed == 0)
1037      {
1038        %>
1039        <tbl:panel>No bioassay sets or transformations were found.</tbl:panel>
1040        <%
1041      }
1042      %>
1043    </tbl:table>
1044
1045    <script language="JavaScript">
1046    initTree();
1047    </script>
1048  </base:body>
1049  </base:page>
1050  <%
1051}
1052finally
1053{
1054  if (dc != null) dc.close();
1055}
1056%>
Note: See TracBrowser for help on using the repository browser.