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

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

References #1655: GUI improvements

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