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

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

References #1655: GUI improvements

Started with the list pages. So far the reporters and the biosurce, sample and extract list pages have been done. The other pages have just been modified to not cause any compilation problems and to display almost ok.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 32.4 KB
Line 
1<%-- $Id: analysis_tree.jsp 5948 2012-02-08 13:16:27Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell, 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.png', 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%>" 
694          image="new.png" 
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%>" 
702          image="delete.png" 
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%>" 
709          image="restore.png" 
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.png" 
716          onclick="configureColumns()" 
717          title="Columns&hellip;" 
718          tooltip="Show, hide and re-order columns" 
719        />
720        <tbl:button 
721          image="import.png" 
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.png" 
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.png" 
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:headers>
746          <tbl:headerrow>
747            <tbl:header colspan="3" />
748            <tbl:columnheaders />
749          </tbl:headerrow>
750          <tbl:headerrow>
751            <tbl:header subclass="index" />
752            <tbl:header 
753              subclass="check" 
754              visible="<%=mode.hasCheck()%>"
755              ><base:icon 
756                image="check_uncheck.png" 
757                tooltip="Check/uncheck all" 
758                onclick="Forms.checkUncheck(document.forms[formId])" 
759              /></tbl:header>
760            <tbl:header 
761              subclass="check" 
762              visible="<%=mode.hasRadio()%>"
763              />
764            <tbl:header 
765              subclass="icons" 
766              visible="<%=mode.hasIcons()%>"
767              />
768            <tbl:propertyfilter />
769          </tbl:headerrow>
770        </tbl:headers>
771        <tbl:rows>
772          <%
773          int index = cc.getPage()*cc.getRowsPerPage();
774          int selectedItemId = cc.getId();
775          if (analysisTree != null)
776          {           
777            Iterator<Tree.Entry<BasicItem>> baas = analysisTree.entryIterator(root);
778            while (baas.hasNext())
779            {
780              Tree.Entry<BasicItem> entry = baas.next();
781              BasicItem item = entry.getNode();
782              if (item != null)
783              {
784                int level = entry.getDepth() - 1;
785                int itemId = item.getId();
786                String joustId = item.getType().name() + "_" + itemId;
787                String name = "";
788                String description = "";
789                String tooltip = mode.isSelectionMode() ?
790                    "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
791                String deletePermanently = "deleteItemPermanently('" + item.getType().name() + "', "+itemId+")";
792                boolean removed = false;
793                Transformation t = null;
794                BioAssaySet bas = null;
795                ExtraValue xv = null;
796                PluginDefinition plugin = null;
797                Job job = null;
798                String prefix = "";
799                ItemContext ccc = null;
800                String view = "";
801                String onClick = "";
802                Item itemType = item.getType();
803                if (itemType == Item.TRANSFORMATION)
804                {
805                  t = (Transformation)item;
806                  removed = t.isRemoved();
807                  prefix = "T:";
808                  ccc = tc;
809                  onClick = "transformationOnClick";
810                  name = HTML.encodeTags(t.getName());
811                  description = HTML.encodeTags(t.getDescription());
812                  try
813                  {
814                    job = t.getJob();
815                    plugin = job.getPluginDefinition();
816                  }
817                  catch (Throwable ex)
818                  {}
819                }
820                else if (itemType == Item.BIOASSAYSET)
821                {
822                  bas = (BioAssaySet)item;
823                  removed = bas.isRemoved();
824                  ccc = cc;
825                  onClick = "bioAssaySetOnClick";
826                  name = HTML.encodeTags(bas.getName());
827                  description = HTML.encodeTags(bas.getDescription());
828                }
829                else if (itemType == Item.EXTRAVALUE)
830                {
831                  xv = (ExtraValue)item;
832                  prefix = "X:";
833                  removed = false;
834                  ccc = xvc;
835                  onClick = "extraValueOnClick";
836                  try
837                  {
838                    ExtraValueType xvType = xv.getExtraValueType();
839                    name = HTML.encodeTags(xvType.getName());
840                    description = HTML.encodeTags(xvType.getDescription());
841                  }
842                  catch (PermissionDeniedException ex)
843                  {
844                    name = xv.getValueType().toString();
845                    description = "";
846                  }
847                  try
848                  {
849                    job = xv.getJob();
850                    plugin = job.getPluginDefinition();
851                  }
852                  catch (Throwable ex)
853                  {}
854                }
855               
856                index++;
857                numListed++;
858
859                %>
860                <tbl:row
861                  id="<%="row."+joustId%>"
862                  >
863                  <tbl:header 
864                    clazz="index"
865                    ><%=index%></tbl:header>
866                  <tbl:header 
867                    clazz="check" 
868                    visible="<%=mode.hasCheck()%>"
869                    ><input 
870                        type="checkbox" 
871                        name="<%=prefix+itemId%>" 
872                        value="<%=itemId%>" 
873                        title="<%=name%>" 
874                        <%=ccc.getSelected().contains(itemId) ? "checked" : ""%>
875                      ></tbl:header>
876                  <tbl:header 
877                    clazz="check" 
878                    visible="<%=mode.hasRadio()%>"
879                    ><input 
880                        type="radio" 
881                        name="item_id" 
882                        value="<%=itemId%>" 
883                        title="<%=name%>" 
884                        <%=selectedItemId == itemId ? "checked" : ""%>
885                      ></tbl:header>
886                  <tbl:header 
887                    clazz="icons" 
888                    visible="<%=mode.hasIcons()%>"
889                    ><base:icon 
890                      image="deleted.png"
891                      onclick="<%=deletePermission ? deletePermanently : null%>"
892                      tooltip="This item has been scheduled for deletion" 
893                      visible="<%=removed%>"
894                    />&nbsp;</tbl:header>
895                 
896                  <tbl:cell clazz="joustcell" column="name">
897                    <div id="tree.<%=joustId%>" class="link" 
898                      onclick="<%=onClick%>(<%=writePermission ? "event" : null%>, <%=itemId%>)" 
899                      title="<%=tooltip%>"><%=name%>
900                    </div>
901                  </tbl:cell>
902                  <%
903                  if (t != null)
904                  {
905                    %>
906                    <tbl:cell column="spots">&nbsp;</tbl:cell>
907                    <tbl:cell column="reporters">&nbsp;</tbl:cell>
908                    <tbl:cell column="fileSpots">&nbsp;</tbl:cell>
909                    <tbl:cell column="fileReporters">&nbsp;</tbl:cell>
910                    <tbl:cell column="tools">
911                      <nobr>
912                      <%
913                      if (createPermission && job != null && plugin != null && plugin.isInteractive())
914                      {
915                        %>
916                        <a href="javascript:copyJob(<%=job.getId()%>)" 
917                          title="Copy this transformation"><img 
918                          src="../../../images/copy.png" border="0"></a>
919                        <%
920                      }
921                      %>
922                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />
923                      </nobr>
924                    </tbl:cell>
925                    <%
926                  }
927                  if (bas != null)
928                  {
929                    %>
930                    <tbl:cell column="spots"><%=bas.getNumSpots()%></tbl:cell>
931                    <tbl:cell column="reporters"><%=bas.getNumReporters()%></tbl:cell>
932                    <tbl:cell column="fileSpots"><%=bas.getNumFileSpots()%></tbl:cell>
933                    <tbl:cell column="fileReporters"><%=bas.getNumFileReporters()%></tbl:cell>
934                    <tbl:cell column="date">&nbsp;</tbl:cell>
935                    <tbl:cell column="plugin">&nbsp;</tbl:cell>
936                    <%
937                    AnnotationSet as = bas.isAnnotated() ? bas.getAnnotationSet() : null;
938                    if (as != null)
939                    {
940                      for (AnnotationType at : annotationTypes)
941                      {
942                        if (as.hasAnnotation(at))
943                        {
944                          Annotation a = as.getAnnotation(at);
945                          String suffix = a.getUnitSymbol(null);
946                          if (suffix != null) suffix = "&nbsp;" + suffix;
947                          %>
948                          <tbl:cell 
949                            column="<%="at"+at.getId()%>"
950                            ><tbl:cellvalue 
951                              list="<%=a.getValues(null)%>"
952                              suffix="<%=suffix%>"
953                          /></tbl:cell>
954                          <%
955                        }
956                      }
957                    }
958                    %>
959                    <tbl:cell column="tools">
960                      <nobr>
961                      <%
962                      if (bas.getNumSpots() > 0)
963                      {
964                        %>
965                        <a href="javascript:openPlotTool(<%=itemId%>)" 
966                          title="A simple plot tool"><img 
967                          src="../../../images/plotter.png" border="0"></a>
968                        <a href="javascript:openExperimentExplorer(<%=itemId%>)"
969                          title="Experiment explorer"><img
970                          src="../../../images/explorer.png" border="0"></a>
971                        <%
972                      }
973                      %>
974                      <a href="javascript:runExportPlugin(<%=itemId%>)"
975                        title="Export data"><img 
976                        src="../../../images/export.png" border="0"></a>
977                       
978                      <%
979                      if (createPermission)
980                      {
981                        %>
982                        <a href="javascript:filter(<%=itemId%>)" 
983                          title="Create a filtered bioassay set"><img 
984                          src="../../../images/filter.png" border="0"></a>
985                        <a href="javascript:runAnalysisPlugin(<%=itemId%>)" title="Run an analysis plugin"><img 
986                          src="../../../images/runplugin.png" border="0"></a>
987                        <%
988                      }
989                      %>
990                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />
991                      </nobr>
992                    </tbl:cell>
993                    <%
994                  }
995                  if (xv != null)
996                  {
997                    %>
998                    <tbl:cell column="spots"><%=xv.getNumValues()%></tbl:cell>
999                    <tbl:cell column="reporters">&nbsp;</tbl:cell>
1000                    <tbl:cell column="fileSpots"><%=xv.getNumFileValues()%></tbl:cell>
1001                    <tbl:cell column="fileReporters">&nbsp;</tbl:cell>
1002                    <tbl:cell column="tools">
1003                      <nobr>
1004                      <%
1005                      if (createPermission && job != null && plugin != null && plugin.isInteractive())
1006                      {
1007                        %>
1008                        <a href="javascript:copyJob(<%=job.getId()%>)" 
1009                          title="Copy this extra value"><img 
1010                          src="../../../images/copy.png" border="0"></a>
1011                        <%
1012                      }
1013                      %>
1014                      <ext:render extensions="<%=toolsInvoker%>" context="<%=jspContext%>" item="<%=item%>" />                           
1015                      </nobr>
1016                    </tbl:cell>
1017                    <%
1018                  }
1019                  %>
1020                  <tbl:cell column="date"><%=job == null ? "" : dateTimeFormatter.format(job.getEnded())%></tbl:cell>
1021                  <tbl:cell column="plugin"><%=plugin == null ? "" : Base.getLinkedName(ID, plugin, false, true)%></tbl:cell>
1022                  <tbl:cell column="description"><%=description%></tbl:cell>
1023                </tbl:row>
1024                <%
1025              }
1026            }
1027          }
1028          %>
1029          </tbl:rows>
1030        </tbl:data>
1031      <%
1032      if (numListed == 0)
1033      {
1034        %>
1035        <tbl:panel>No bioassay sets or transformations were found.</tbl:panel>
1036        <%
1037      }
1038      %>
1039    </tbl:table>
1040
1041    <script language="JavaScript">
1042    initTree();
1043    </script>
1044  </base:body>
1045  </base:page>
1046  <%
1047}
1048finally
1049{
1050  if (dc != null) dc.close();
1051}
1052%>
Note: See TracBrowser for help on using the repository browser.