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

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

References #1655: GUI improvements

  • List of annotations and failures/warnings in the 'Item overview' details.
  • Bottom border in 'Inherit annotations' dialog.
  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 17.6 KB
Line 
1<%-- $Id: info.jsp 5957 2012-02-14 10:13:27Z 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=\"itemsubtype\">(" + 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 ItemContext cc = sc.getCurrentContext(overview.getRootItem().getType());
112  final SnapshotManager snapshotManager = new SnapshotManager();
113  final AnnotationTypeFilter annotationTypeFilter = new AnnotationTypeFilter();
114  final AnnotationFilter annotationFilter = new AnnotationFilter();
115  ValidationOptions options = overview.getValidationOptions();
116  String nodeId = request.getParameter("nodeId");
117  Boolean showFailures = Values.getBoolean(request.getParameter("show_failures"), false);
118  Node node = overview.getNode(nodeId);
119  if (node == null) node = overview.getRootNode();
120
121  BasicItem item = node.getItem(dc);
122  List<Failure> failures = overview.getFailures();
123  if (failures == null) failures = new LinkedList<Failure>();
124  %>
125  <base:page title="" type="iframe">
126  <base:head styles="table.css">
127  <script language="JavaScript">
128  function editItem(itemType, itemId, extraUrl)
129  {
130    Main.viewOrEditItem('<%=ID%>', itemType, itemId, true, extraUrl);
131  }
132  function editAnnotation(itemType, itemId, annotationTypeId)
133  {
134    var url = getRoot() + 'common/annotations/annotate.jsp?ID=<%=ID%>';
135    url += '&item_type=' + itemType;
136    url += '&item_id=' + itemId;
137    url += '&annotationtype_id='+annotationTypeId;
138    url += '&standalone=1';
139    Main.openPopup(url, 'EditAnnotation', 750, 500);
140  }
141  function editInheritedAnnotation(itemType, itemId, annotationTypeId)
142  {
143    var url = getRoot() + 'common/annotations/inherit.jsp?ID=<%=ID%>';
144    url += '&item_type='+itemType;
145    url += '&item_id='+itemId;
146    url += '&annotationtype_id='+annotationTypeId;
147    url += '&standalone=1';
148    Main.openPopup(url, 'EditAnnotation', 750, 500);
149  }
150  function editDataFile(itemType, itemId)
151  {
152    Main.viewOrEditItem('<%=ID%>', itemType, itemId, true, '&tab=datafiles');
153  }
154 
155  </script>
156  <style>
157  .itemsubtype .link
158  {
159    color: #777777;
160  }
161  </style>
162  </base:head>
163
164    <base:body>
165      <div class="absolutefull" onmousemove="parent.DragDrop.drag(event)" onmouseup="parent.DragDrop.endDrag(event)">
166      <div>
167      <table class="fullform bottomborder outlined">
168      <tr>
169        <th>Path</th>
170        <td><%=getPath(dc, ID, node)%></td>
171      </tr>
172      <%
173      if (item instanceof FileSetMember)
174      {
175        FileSetMember member = null;
176        boolean notFound = false;
177        try
178        { 
179          member = FileSetMember.getById(dc, item.getId());
180        }
181        catch (ItemNotFoundException ex)
182        {
183          notFound = true;
184        }
185        File file = null;
186        DataFileType dft = null;
187        boolean deniedFile = false;
188        boolean deniedFileType = false;
189        if (member != null)
190        {
191          try
192          {
193            file = member.getFile();
194          }
195          catch (PermissionDeniedException ex)
196          {
197            deniedFile = true;
198          }
199          try
200          {
201            dft = member.getDataFileType();
202          }
203          catch (PermissionDeniedException ex)
204          {
205            deniedFileType = true;
206          }
207        }
208        if (dft != null || file != null)
209        {
210          %>
211          <tr>
212            <th><%=dft == null ? "Data file" : HTML.encodeTags(dft.getName())%></th>
213            <td>
214              <%=Base.getLinkedFile(ID, file, deniedFile, true, true, "../../")%>
215            </td>
216          </tr>
217          <%
218        }
219        else
220        {
221          %>
222          <tr>
223          <th><%=HTML.encodeTags(node.getTitle())%></th>
224          <td>
225            <%=notFound ? "<i>- not found -</i>" : "<i>- denied -</i>"%>
226          </td>
227          </tr>
228          <%
229        }
230      }
231      else if (item instanceof AnyToAny)
232      {
233        AnyToAny any = AnyToAny.getById(dc, item.getId());
234        String linkTo = null;
235        try
236        {
237          BasicItem to = any.getTo();
238          String name = to instanceof Nameable ? ((Nameable)to).getName() : to.toString();
239          linkTo = Base.getLink(ID, HTML.encodeTags(name), 
240              to.getType(), to.getId(), to.hasPermission(Permission.WRITE));
241        }
242        catch (PermissionDeniedException ex)
243        {
244          linkTo = any.getToType() + "[id=" + any.getToId() + "] (<i>denied</i>)";
245        }
246        catch (ItemNotFoundException ex)
247        {
248          linkTo = any.getToType() + "[id=" + any.getToId() + "] (<i>missing</i>)";
249        }
250        %>
251        <tr>
252          <th>Any-to-any link</th>
253          <td>
254            <table>
255            <tr>
256              <td><%=Base.getLinkedName(ID, any, false, true) %></td>
257              <td><base:icon image="bullet.png" /></td>
258              <td><%=linkTo%></td>
259            </tr>
260            </table>
261          </td>
262        </tr>
263        <%
264      }
265      else
266      {
267        %>
268        <tr>
269          <th><%=node.getNodeType() == Node.Type.FOLDER ? 
270              "Folder" : item != null ? item.getType().toString() : "Item"%></th>
271          <td>
272            <%
273            if (item != null)
274            {
275              %>
276              <%=Base.getLink(ID, node.getTitle(), item.getType(),item.getId(), item.hasPermission(Permission.WRITE))%>
277              <%
278              if (item instanceof Subtypable)
279              {
280                ItemSubtype subtype = ((Subtypable)item).getItemSubtype();
281                if (subtype != null)
282                {
283                  %>
284                  <span class="itemsubtype">(<%=Base.getLinkedName(ID, subtype, false, true)%>)</span>
285                  <%
286                }
287              }
288            }
289            else
290            {
291              %>
292              <%=HTML.encodeTags(node.getTitle())%>
293              <%
294            }
295            %>
296          </td>
297        </tr>
298        <%
299      }
300      %>
301      <tr>
302        <th>Errors (children)</th>
303        <%
304        if (showFailures)
305        {
306        %>
307          <td><%=node.getNumErrors()+node.getChildErrors()%> (<%=node.getChildErrors()%>)</td>
308        <%
309        }
310        else
311        {       
312        %>
313          <td><i>- n/a -</i></td>
314        <%
315        }
316        %>
317      </tr>
318      <tr>
319        <th>Warnings (children)</th>
320        <%
321        if (showFailures)
322        {
323        %>
324          <td><%=node.getNumWarnings()+node.getChildWarnings()%> (<%=node.getChildWarnings()%>)</td>
325        <%
326        }
327        else
328        {       
329        %>
330          <td><i>- n/a -</i></td>
331        <%
332        }
333        %>
334      </tr>
335      <%
336      if (item instanceof Nameable)
337      {
338        Nameable nameable = (Nameable)item;
339        %>
340        <tr>
341          <th>Description</th>
342          <td><%=HTML.niceFormat(nameable.getDescription())%></td>
343        </tr>
344        <%
345      }
346      %>
347      </table>
348      </div>
349     
350     
351      <%
352      List<AnnotationSnapshot> annotations = new LinkedList<AnnotationSnapshot>();
353      String annotationsTitle = "";
354      Annotatable annotatable = null;
355      if (item instanceof Annotation)
356      {
357        Annotation a = Annotation.getById(dc, item.getId());
358        AnnotationSetSnapshot snapshot = snapshotManager.getSnapshot(dc, a.getAnnotationSet().getId());
359        annotationFilter.setAnnotation(a);
360        annotations.addAll(snapshotManager.findAnnotations(dc, snapshot, annotationFilter, true));
361       
362        // Find the annotatable parent node
363        Node parentNode = node;
364        while (parentNode != null)
365        {
366          BasicItem parentItem = parentNode.getItem();
367          if (parentItem instanceof Annotatable)
368          {
369            annotatable = (Annotatable)parentItem;
370            break;
371          }
372          parentNode = parentNode.getParent();
373        }
374        annotationsTitle = "Annotation values";
375      }
376      else if (item instanceof AnnotationType)
377      {
378        // Find the annotatable parent
379        Node parentNode = node;
380        while (parentNode != null)
381        {
382          BasicItem parentItem = parentNode.getItem();
383          if (parentItem instanceof Annotatable && !(parentItem instanceof Protocol))
384          {
385            annotatable = (Annotatable)parentItem.getType().getById(dc, parentItem.getId());
386            if (annotatable.isAnnotated())
387            {
388              annotationTypeFilter.setAnnotationType((AnnotationType)item);
389              annotations.addAll(snapshotManager.findAnnotations(dc, annotatable, annotationTypeFilter, true));
390            }
391            annotationsTitle = "Annotation values";
392            break;
393          }
394          parentNode = parentNode.getParent();
395        }
396      }
397      else if (item instanceof Annotatable)
398      {
399        annotationsTitle = "Annotations &amp; protocol parameters";
400        annotatable = (Annotatable)item.getType().getById(dc, item.getId());
401        if (annotatable.isAnnotated())
402        {
403          annotations.addAll(snapshotManager.findAnnotations(dc, annotatable, null, true));
404        }
405      }
406      if (annotations != null && annotations.size() > 0)
407      {
408        %>
409        <base:section
410          id="allAnnotations"
411          title="<%="Annotations &amp; parameters (" +  annotations.size() + ")"%>"
412          context="<%=cc %>">
413       
414        <tbl:table id="annotations">
415          <tbl:columndef id="annotation" title="Annotation/parameter" />
416          <tbl:columndef id="owner" title="Owner" />
417          <tbl:columndef id="values" title="Value" />
418          <tbl:columndef id="edit" title="" />
419          <tbl:data>
420            <tbl:headers>
421              <tbl:headerrow>
422                <tbl:columnheaders />
423              </tbl:headerrow>
424            </tbl:headers>
425            <tbl:rows>
426              <%
427              for (AnnotationSnapshot snapshot : annotations)
428              {
429                Annotation a = snapshot.getAnnotation(dc);
430                String unitSymbol = a.hasUnit() ? "&nbsp;" + a.getUnitSymbol(null) : "";
431                AnnotationType at = null;
432                Annotatable annotationOwner = null;
433                try
434                {
435                  at = snapshot.getAnnotationType(dc);
436                }
437                catch (Throwable t)
438                {}
439                try
440                {
441                  annotationOwner = snapshot.getItem(dc);
442                }
443                catch (Throwable t)
444                {}
445                String icon = at != null && at.isProtocolParameter() ? 
446                    "parameter.png" : "joust/annotation.gif";
447                String editLink = null;
448                String editTooltip = null;
449                if (annotatable != null && annotatable.hasPermission(Permission.WRITE) && at != null)
450                {
451                  if (annotatable.equals(annotationOwner))
452                  {
453                    editLink = "editAnnotation('" + annotatable.getType().name() + "', " + annotatable.getId() + ", " + at.getId() + ")";
454                    editTooltip = "Edit the values of this annotation";
455                  }
456                  else
457                  {
458                    editLink = "editInheritedAnnotation('" + annotatable.getType().name() + "', " + annotatable.getId() + ", " + at.getId() + ")";
459                    editTooltip = "Inherit this annotation from another item";
460                  }
461                }
462                %>
463                <tbl:row>
464                  <tbl:cell column="annotation"><base:icon visible="<%=icon != null%>" image="<%=icon%>" />
465                    <%
466                    if (at != null)
467                    {
468                      %>
469                      <%=Base.getLinkedName(ID, at, false, true)%>
470                      <%
471                    }
472                    else
473                    {
474                      %>
475                      <%=a.getValueType() %>
476                      <%
477                    }
478                    %>
479                  </tbl:cell>
480                  <tbl:cell column="owner">
481                    <%
482                    if (annotationOwner != null && !annotationOwner.equals(annotatable))
483                    {
484                      String ownerName = annotationOwner instanceof Nameable ?
485                          ((Nameable)annotationOwner).getName() : annotationOwner.toString();
486                      %>
487                      <%=Base.getLink(ID, ownerName, annotationOwner.getType(), annotationOwner.getId(), annotationOwner.hasPermission(Permission.WRITE)) %>
488                      <%
489                    }
490                    %>
491                  </tbl:cell>
492                  <tbl:cell column="values"><%=Values.getString(a.getValues(null), ", ", true)%><%=unitSymbol%></tbl:cell>
493                  <tbl:cell column="edit"><base:icon image="edit.png" onclick="<%=editLink%>" 
494                    tooltip="<%=editTooltip%>" visible="<%=editLink != null %>"/></tbl:cell>
495                </tbl:row>
496                <%
497              }
498              %>
499            </tbl:rows>
500          </tbl:data>       
501        </tbl:table>
502        </base:section>
503        <%
504      }     
505      if (showFailures)
506      {
507        %>
508        <base:section
509          id="failures"
510          title="<%="Failure details (" + (node.getNumErrors() + node.getNumWarnings()) + ")"%>"
511          context="<%=cc %>"
512          >
513        <table>
514        <%
515        int numFailures = 0;
516        for (Failure failure : failures)
517        {
518          Validator validator = failure.getValidator();
519          Severity severity = options.getSeverity(validator);
520          if (failure.getNode() == node && severity != Severity.IGNORE)
521          {
522            numFailures++;
523            List<Fix> fixes = failure.getFixes();
524            %>
525            <tr>
526              <td><base:icon image="<%=severity == Severity.ERROR ? "error.png" : "warning.png"%>" style="padding-right: 4px;"/></td>
527              <td><b><%=HTML.encodeTags(failure.getMessage())%></b></td>
528            </tr>
529            <tr>
530              <td></td>
531              <td style="padding-bottom: 0.3em;">
532                <%=HTML.encodeTags(validator.getDescription())%><br>
533                <%
534                if (fixes != null && fixes.size() > 0)
535                {
536                  for (Fix fix : fixes)
537                  {
538                    if (fix == null) continue;
539                    BasicItem fixItem = fix.getItem();
540                    boolean enabled = fixItem.hasPermission(Permission.WRITE);
541                    String fixIt = null;
542                    if (enabled)
543                    {
544                      if (fix.isAnnotationFix())
545                      {
546                        AnnotationType at = fix.getAnnotationType();
547                        if (fix.isFromInherited())
548                        {
549                          fixIt = "editInheritedAnnotation('" + fixItem.getType().name() + "', " + 
550                            fixItem.getId() + ", " + at.getId() + ")";
551                        }
552                        else
553                        {
554                          fixIt = "editAnnotation('" + fixItem.getType().name() + "', " + 
555                            fixItem.getId() + ", " + at.getId() + ")";
556                        }
557                      }
558                      else if (fix.isDataFileFix())
559                      {
560                        FileSetMember member = fix.getFileSetMember();
561                        fixIt = "editDataFile('" + fixItem.getType().name() + "', " + 
562                          fixItem.getId() + ")";
563                      }
564                      else
565                      {
566                        fixIt = "editItem('" + fixItem.getType().name() + "', " + 
567                          fixItem.getId() + ")";
568                      }
569                    }
570                    %>
571                    <base:icon image="fixit.png" 
572                      style="padding-bottom: 4px;" 
573                      enabled="<%=enabled %>"
574                    /><% if (enabled)
575                    {
576                      %><a href="javascript:<%=fixIt%>" title="Edit this item to fix the problem"
577                        ><%=HTML.encodeTags(fix.getMessage())%></a><br>
578                      <%
579                    }
580                    else
581                    {
582                      %><span title="You do not have permission to modify this item" 
583                        style="color: #999999;"><%=HTML.encodeTags(fix.getMessage())%></a></span><br>
584                      <%
585                    }
586                  }
587                }
588                %>
589              </td>
590            </tr>
591            <%
592          }
593        }
594        %>
595        </table>
596        <%
597        if (numFailures == 0)
598        {
599          %>
600          <div class="messagecontainer note">
601          No validation failures on this item
602          </div>
603          <%
604        }
605        %>
606        </base:section>
607        <%
608      }
609      %>
610      </div>
611    </base:body>
612  </base:page>
613  <%
614}
615finally
616{
617  if (dc != null) dc.close();
618}
619%>
Note: See TracBrowser for help on using the repository browser.