source: trunk/www/common/overview/info.jsp @ 5951

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

References #1655: GUI improvements

  • Fixes rest of list pages in Biomaterial LIMS menu
  • Introduced an 'iframe' page type so that thos pages doesn't have to 'cannibalise' on the 'popup' page type (doesn't works well with absolutely positioned content).
  • Fixed subclass="dialogbuttons" on all list pages when used in popup form


  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 16.8 KB
Line 
1<%-- $Id: info.jsp 5951 2012-02-09 14:19:17Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2009 Nicklas Nordborg
4
5  This file is part of BASE - BioArray Software Environment.
6  Available at http://base.thep.lu.se/
7
8  BASE is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License
10  as published by the Free Software Foundation; either version 3
11  of the License, or (at your option) any later version.
12
13  BASE is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with BASE. If not, see <http://www.gnu.org/licenses/>.
20  ------------------------------------------------------------------
21--%>
22<%@ page pageEncoding="UTF-8" session="false"
23  import="net.sf.basedb.core.SessionControl"
24  import="net.sf.basedb.core.DbControl"
25  import="net.sf.basedb.core.Project"
26  import="net.sf.basedb.core.Item"
27  import="net.sf.basedb.core.BasicItem"
28  import="net.sf.basedb.core.Nameable"
29  import="net.sf.basedb.core.Annotatable"
30  import="net.sf.basedb.core.AnnotationSet"
31  import="net.sf.basedb.core.AnnotationType"
32  import="net.sf.basedb.core.Annotation"
33  import="net.sf.basedb.core.ItemSubtype"
34  import="net.sf.basedb.core.Subtypable"
35  import="net.sf.basedb.core.AnyToAny"
36  import="net.sf.basedb.core.Protocol"
37  import="net.sf.basedb.core.FileStoreEnabled"
38  import="net.sf.basedb.core.FileSetMember"
39  import="net.sf.basedb.core.File"
40  import="net.sf.basedb.core.DataFileType"
41  import="net.sf.basedb.core.ItemContext"
42  import="net.sf.basedb.core.Permission"
43  import="net.sf.basedb.core.PermissionDeniedException"
44  import="net.sf.basedb.core.ItemNotFoundException"
45  import="net.sf.basedb.core.snapshot.SnapshotManager"
46  import="net.sf.basedb.core.snapshot.AnnotationSetSnapshot"
47  import="net.sf.basedb.core.snapshot.AnnotationSnapshot"
48  import="net.sf.basedb.core.snapshot.AnnotationTypeFilter"
49  import="net.sf.basedb.core.snapshot.AnnotationFilter"
50  import="net.sf.basedb.clients.web.Base"
51  import="net.sf.basedb.clients.web.util.HTML"
52  import="net.sf.basedb.util.Values"
53  import="net.sf.basedb.util.NestedIterator"
54  import="net.sf.basedb.util.overview.GenericOverview"
55  import="net.sf.basedb.util.overview.OverviewUtil"
56  import="net.sf.basedb.util.overview.Node"
57  import="net.sf.basedb.util.overview.ValidationOptions"
58  import="net.sf.basedb.util.overview.Validator"
59  import="net.sf.basedb.util.overview.Severity"
60  import="net.sf.basedb.util.overview.Failure"
61  import="net.sf.basedb.util.overview.Fix"
62  import="java.util.ArrayList"
63  import="java.util.List"
64  import="java.util.LinkedList"
65  import="java.util.Iterator"
66  import="java.util.Collection"
67  import="java.util.Collections"
68%>
69<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
70<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
71<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
72<%!
73private String getPath(DbControl dc, String ID, Node node)
74{
75  Node parent = node.getParent();
76  if (parent == null) return "";
77  String path = getPath(dc, ID, parent);
78  if (parent.getNodeType() == Node.Type.FOLDER)
79  {
80    //path += "/" + HTML.encodeTags(parent.getTitle());
81  }
82  else
83  {
84    BasicItem item = parent.getItem();
85    if (path.length() > 0)
86    {
87      path += " <b>›</b> ";
88    }
89    path += Base.getLink(ID, parent.getTitle(), item.getType(), item.getId(), item.hasPermission(Permission.WRITE));
90   
91    if (item instanceof Subtypable)
92    {
93      ItemSubtype subtype = ((Subtypable)parent.getItem(dc)).getItemSubtype();
94      if (subtype != null)
95      {
96        path += " <span class=\"subtype\">(" + Base.getLinkedName(ID, subtype, false, true) + ")</span>";
97      }
98    }
99  }
100  return path;
101}
102%>
103<%
104final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
105final String ID = sc.getId();
106final float scale = Base.getScale(sc);
107final DbControl dc = sc.newDbControl();
108try
109{
110  final GenericOverview overview = OverviewUtil.getCurrentOverview(sc);
111  final SnapshotManager snapshotManager = new SnapshotManager();
112  final AnnotationTypeFilter annotationTypeFilter = new AnnotationTypeFilter();
113  final AnnotationFilter annotationFilter = new AnnotationFilter();
114  ValidationOptions options = overview.getValidationOptions();
115  String nodeId = request.getParameter("nodeId");
116  Boolean showFailures = Values.getBoolean(request.getParameter("show_failures"), false);
117  Node node = overview.getNode(nodeId);
118  if (node == null) node = overview.getRootNode();
119
120  BasicItem item = node.getItem(dc);
121  List<Failure> failures = overview.getFailures();
122  if (failures == null) failures = new LinkedList<Failure>();
123  %>
124  <base:page title="" type="iframe">
125  <base:head styles="newjoust.css">
126  <script language="JavaScript">
127  function editItem(itemType, itemId, extraUrl)
128  {
129    Main.viewOrEditItem('<%=ID%>', itemType, itemId, true, extraUrl);
130  }
131  function editAnnotation(itemType, itemId, annotationTypeId)
132  {
133    var url = getRoot() + 'common/annotations/annotate.jsp?ID=<%=ID%>';
134    url += '&item_type=' + itemType;
135    url += '&item_id=' + itemId;
136    url += '&annotationtype_id='+annotationTypeId;
137    url += '&standalone=1';
138    Main.openPopup(url, 'EditAnnotation', 700, 460);
139  }
140  function editInheritedAnnotation(itemType, itemId, annotationTypeId)
141  {
142    var url = getRoot() + 'common/annotations/inherit.jsp?ID=<%=ID%>';
143    url += '&item_type='+itemType;
144    url += '&item_id='+itemId;
145    url += '&annotationtype_id='+annotationTypeId;
146    url += '&standalone=1';
147    Main.openPopup(url, 'EditAnnotation', 700, 460);
148  }
149  function editDataFile(itemType, itemId)
150  {
151    Main.viewOrEditItem('<%=ID%>', itemType, itemId, true, '&tab=datafiles');
152  }
153 
154  </script>
155  <style>
156  .subtype, .subtype .link {
157    font-size: 10px;
158    color: #777777;
159  }
160  </style>
161  </base:head>
162
163    <base:body>
164      <div class="absolutefull" onmousemove="parent.DragDrop.drag(event)" onmouseup="parent.DragDrop.endDrag(event)">
165      <div>
166      <table class="fullform bottomborder outlined">
167      <tr>
168        <th>Path</th>
169        <td><%=getPath(dc, ID, node)%></td>
170      </tr>
171      <%
172      if (item instanceof FileSetMember)
173      {
174        FileSetMember member = null;
175        boolean notFound = false;
176        try
177        { 
178          member = FileSetMember.getById(dc, item.getId());
179        }
180        catch (ItemNotFoundException ex)
181        {
182          notFound = true;
183        }
184        File file = null;
185        DataFileType dft = null;
186        boolean deniedFile = false;
187        boolean deniedFileType = false;
188        if (member != null)
189        {
190          try
191          {
192            file = member.getFile();
193          }
194          catch (PermissionDeniedException ex)
195          {
196            deniedFile = true;
197          }
198          try
199          {
200            dft = member.getDataFileType();
201          }
202          catch (PermissionDeniedException ex)
203          {
204            deniedFileType = true;
205          }
206        }
207        if (dft != null || file != null)
208        {
209          %>
210          <tr>
211            <th><%=dft == null ? "Data file" : HTML.encodeTags(dft.getName())%></th>
212            <td>
213              <%=Base.getLinkedFile(ID, file, deniedFile, true, true, "../../")%>
214            </td>
215          </tr>
216          <%
217        }
218        else
219        {
220          %>
221          <tr>
222          <th><%=HTML.encodeTags(node.getTitle())%></th>
223          <td>
224            <%=notFound ? "<i>- not found -</i>" : "<i>- denied -</i>"%>
225          </td>
226          </tr>
227          <%
228        }
229      }
230      else if (item instanceof AnyToAny)
231      {
232        AnyToAny any = AnyToAny.getById(dc, item.getId());
233        String linkTo = null;
234        try
235        {
236          BasicItem to = any.getTo();
237          String name = to instanceof Nameable ? ((Nameable)to).getName() : to.toString();
238          linkTo = Base.getLink(ID, HTML.encodeTags(name), 
239              to.getType(), to.getId(), to.hasPermission(Permission.WRITE));
240        }
241        catch (PermissionDeniedException ex)
242        {
243          linkTo = any.getToType() + "[id=" + any.getToId() + "] (<i>denied</i>)";
244        }
245        catch (ItemNotFoundException ex)
246        {
247          linkTo = any.getToType() + "[id=" + any.getToId() + "] (<i>missing</i>)";
248        }
249        %>
250        <tr>
251          <th>Any-to-any link</th>
252          <td>
253            <table>
254            <tr>
255              <td><%=Base.getLinkedName(ID, any, false, true) %></td>
256              <td><base:icon image="bullet.png" /></td>
257              <td><%=linkTo%></td>
258            </tr>
259            </table>
260          </td>
261        </tr>
262        <%
263      }
264      else
265      {
266        %>
267        <tr>
268          <th><%=node.getNodeType() == Node.Type.FOLDER ? 
269              "Folder" : item != null ? item.getType().toString() : "Item"%></th>
270          <td>
271            <%
272            if (item != null)
273            {
274              %>
275              <%=Base.getLink(ID, node.getTitle(), item.getType(),item.getId(), item.hasPermission(Permission.WRITE))%>
276              <%
277              if (item instanceof Subtypable)
278              {
279                ItemSubtype subtype = ((Subtypable)item).getItemSubtype();
280                if (subtype != null)
281                {
282                  %>
283                  <span class="subtype">(<%=Base.getLinkedName(ID, subtype, false, true)%>)</span>
284                  <%
285                }
286              }
287            }
288            else
289            {
290              %>
291              <%=HTML.encodeTags(node.getTitle())%>
292              <%
293            }
294            %>
295          </td>
296        </tr>
297        <%
298      }
299      %>
300      <tr>
301        <th>Errors (children)</th>
302        <%
303        if (showFailures)
304        {
305        %>
306          <td><%=node.getNumErrors()+node.getChildErrors()%> (<%=node.getChildErrors()%>)</td>
307        <%
308        }
309        else
310        {       
311        %>
312          <td><i>- n/a -</i></td>
313        <%
314        }
315        %>
316      </tr>
317      <tr>
318        <th>Warnings (children)</th>
319        <%
320        if (showFailures)
321        {
322        %>
323          <td><%=node.getNumWarnings()+node.getChildWarnings()%> (<%=node.getChildWarnings()%>)</td>
324        <%
325        }
326        else
327        {       
328        %>
329          <td><i>- n/a -</i></td>
330        <%
331        }
332        %>
333      </tr>
334      <%
335      if (item instanceof Nameable)
336      {
337        Nameable nameable = (Nameable)item;
338        %>
339        <tr>
340          <th>Description</th>
341          <td><%=HTML.niceFormat(nameable.getDescription())%></td>
342        </tr>
343        <%
344      }
345      %>
346      </table>
347      </div>
348     
349     
350      <%
351      List<AnnotationSnapshot> annotations = new LinkedList<AnnotationSnapshot>();
352      String annotationsTitle = "";
353      Annotatable annotatable = null;
354      if (item instanceof Annotation)
355      {
356        Annotation a = Annotation.getById(dc, item.getId());
357        AnnotationSetSnapshot snapshot = snapshotManager.getSnapshot(dc, a.getAnnotationSet().getId());
358        annotationFilter.setAnnotation(a);
359        annotations.addAll(snapshotManager.findAnnotations(dc, snapshot, annotationFilter, true));
360       
361        // Find the annotatable parent node
362        Node parentNode = node;
363        while (parentNode != null)
364        {
365          BasicItem parentItem = parentNode.getItem();
366          if (parentItem instanceof Annotatable)
367          {
368            annotatable = (Annotatable)parentItem;
369            break;
370          }
371          parentNode = parentNode.getParent();
372        }
373        annotationsTitle = "Annotation values";
374      }
375      else if (item instanceof AnnotationType)
376      {
377        // Find the annotatable parent
378        Node parentNode = node;
379        while (parentNode != null)
380        {
381          BasicItem parentItem = parentNode.getItem();
382          if (parentItem instanceof Annotatable && !(parentItem instanceof Protocol))
383          {
384            annotatable = (Annotatable)parentItem.getType().getById(dc, parentItem.getId());
385            if (annotatable.isAnnotated())
386            {
387              annotationTypeFilter.setAnnotationType((AnnotationType)item);
388              annotations.addAll(snapshotManager.findAnnotations(dc, annotatable, annotationTypeFilter, true));
389            }
390            annotationsTitle = "Annotation values";
391            break;
392          }
393          parentNode = parentNode.getParent();
394        }
395      }
396      else if (item instanceof Annotatable)
397      {
398        annotationsTitle = "Annotations &amp; protocol parameters";
399        annotatable = (Annotatable)item.getType().getById(dc, item.getId());
400        if (annotatable.isAnnotated())
401        {
402          annotations.addAll(snapshotManager.findAnnotations(dc, annotatable, null, true));
403        }
404      }
405      if (annotations != null && annotations.size() > 0)
406      {
407        %>
408        <h4><%=annotationsTitle%></h4>
409        <table border=0 cellspacing=0 cellpadding=0>
410        <%
411        for (AnnotationSnapshot snapshot : annotations)
412        {
413          Annotation a = snapshot.getAnnotation(dc);
414          String unitSymbol = a.hasUnit() ? "&nbsp;" + a.getUnitSymbol(null) : "";
415          AnnotationType at = null;
416          Annotatable annotationOwner = null;
417          try
418          {
419            at = snapshot.getAnnotationType(dc);
420          }
421          catch (Throwable t)
422          {}
423          try
424          {
425            annotationOwner = snapshot.getItem(dc);
426          }
427          catch (Throwable t)
428          {}
429          String icon = at != null && at.isProtocolParameter() ? 
430              "parameter.png" : "joust/annotation.gif";
431          String editLink = null;
432          String editTooltip = null;
433          if (annotatable != null && annotatable.hasPermission(Permission.WRITE) && at != null)
434          {
435            if (annotatable.equals(annotationOwner))
436            {
437              editLink = "editAnnotation('" + annotatable.getType().name() + "', " + annotatable.getId() + ", " + at.getId() + ")";
438              editTooltip = "Edit the values of this annotation";
439            }
440            else
441            {
442              editLink = "editInheritedAnnotation('" + annotatable.getType().name() + "', " + annotatable.getId() + ", " + at.getId() + ")";
443              editTooltip = "Inherit this annotation from another item";
444            }
445          }
446          %>
447          <tr>
448            <td><base:icon visible="<%=icon != null%>" image="<%=icon%>" />&nbsp;</td>
449            <td>
450              <%
451              if (at != null)
452              {
453                %>
454                <%=Base.getLinkedName(ID, at, false, true)%>
455                <%
456              }
457              else
458              {
459                %>
460                <%=a.getValueType() %>
461                <%
462              }
463              %>
464            </td>
465            <td>
466              <%
467              if (annotationOwner != null && !annotationOwner.equals(annotatable))
468              {
469                String ownerName = annotationOwner instanceof Nameable ?
470                    ((Nameable)annotationOwner).getName() : annotationOwner.toString();
471                %>
472                <base:icon image="bullet.png" tooltip="Annotation is inherited from" />
473                <%=Base.getLink(ID, ownerName, annotationOwner.getType(), annotationOwner.getId(), annotationOwner.hasPermission(Permission.WRITE)) %>
474                <%
475              }
476              %>
477            </td>
478            <td><base:icon image="bullet.png" /></td>
479            <td><%=Values.getString(a.getValues(null), ", ", true)%><%=unitSymbol%></td>
480            <td>&nbsp;
481              <%
482              if (editLink != null)
483              {
484                %><base:icon image="edit.png" onclick="<%=editLink%>" 
485                  tooltip="<%=editTooltip%>" />
486                <%
487              }
488              %>
489            </td>
490          </tr>
491          <%
492        }
493        %>
494        </table>
495        <%
496      }     
497      if (showFailures)
498      {
499        %>
500        <h4>Failure details</h4>     
501        <table>
502        <%
503        int numFailures = 0;
504        for (Failure failure : failures)
505        {
506          Validator validator = failure.getValidator();
507          Severity severity = options.getSeverity(validator);
508          if (failure.getNode() == node && severity != Severity.IGNORE)
509          {
510            numFailures++;
511            List<Fix> fixes = failure.getFixes();
512            %>
513            <tr>
514              <td><base:icon image="<%=severity == Severity.ERROR ? 
515                "error.png" : "warning.png"%>" /></td>
516              <td><b><%=HTML.encodeTags(failure.getMessage())%></b></td>
517            </tr>
518            <tr>
519              <td style="border-bottom: 1px dotted #999999;"></td>
520              <td style="border-bottom: 1px dotted #999999;">
521                <%=HTML.encodeTags(validator.getDescription())%><br>
522                <%
523                if (fixes != null && fixes.size() > 0)
524                {
525                  for (Fix fix : fixes)
526                  {
527                    if (fix == null) continue;
528                    BasicItem fixItem = fix.getItem();
529                    boolean enabled = fixItem.hasPermission(Permission.WRITE);
530                    String fixIt = null;
531                    if (enabled)
532                    {
533                      if (fix.isAnnotationFix())
534                      {
535                        AnnotationType at = fix.getAnnotationType();
536                        if (fix.isFromInherited())
537                        {
538                          fixIt = "editInheritedAnnotation('" + fixItem.getType().name() + "', " + 
539                            fixItem.getId() + ", " + at.getId() + ")";
540                        }
541                        else
542                        {
543                          fixIt = "editAnnotation('" + fixItem.getType().name() + "', " + 
544                            fixItem.getId() + ", " + at.getId() + ")";
545                        }
546                      }
547                      else if (fix.isDataFileFix())
548                      {
549                        FileSetMember member = fix.getFileSetMember();
550                        fixIt = "editDataFile('" + fixItem.getType().name() + "', " + 
551                          fixItem.getId() + ")";
552                      }
553                      else
554                      {
555                        fixIt = "editItem('" + fixItem.getType().name() + "', " + 
556                          fixItem.getId() + ")";
557                      }
558                    }
559                    %>
560                    <base:icon image="fixit.png" 
561                      style="padding-bottom: 4px;" 
562                      enabled="<%=enabled %>"
563                    /><% if (enabled)
564                    {
565                      %><a href="javascript:<%=fixIt%>" title="Edit this item to fix the problem"
566                        ><%=HTML.encodeTags(fix.getMessage())%></a><br>
567                      <%
568                    }
569                    else
570                    {
571                      %><span title="You do not have permission to modify this item" 
572                        style="color: #999999;"><%=HTML.encodeTags(fix.getMessage())%></a></span><br>
573                      <%
574                    }
575                  }
576                }
577                %>
578              </td>
579            </tr>
580            <%
581          }
582        }
583        %>
584        </table>
585        <%
586        if (numFailures == 0)
587        {
588          %>
589          No validation failures on this item
590          <%
591        }       
592      }
593      %>
594      </div>
595    </base:body>
596  </base:page>
597  <%
598}
599finally
600{
601  if (dc != null) dc.close();
602}
603%>
Note: See TracBrowser for help on using the repository browser.