source: trunk/www/common/annotations/list_annotations.jsp @ 6607

Last change on this file since 6607 was 6607, checked in by Nicklas Nordborg, 8 years ago

References #1890: Improve skinnability of BASE

Minor adjustmen to most of the common utility pages.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 16.4 KB
Line 
1<%-- $Id: list_annotations.jsp 6607 2014-11-19 14:52:20Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
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  @author Nicklas
23  @version 2.0
24--%>
25<%@ page pageEncoding="UTF-8" session="false"
26  import="net.sf.basedb.core.SessionControl"
27  import="net.sf.basedb.core.DbControl"
28  import="net.sf.basedb.core.Item"
29  import="net.sf.basedb.core.Permission"
30  import="net.sf.basedb.core.AnnotationType"
31  import="net.sf.basedb.core.Protocol"
32  import="net.sf.basedb.core.AnnotationSet"
33  import="net.sf.basedb.core.Annotation"
34  import="net.sf.basedb.core.Annotatable"
35  import="net.sf.basedb.core.AnnotatableProxy"
36  import="net.sf.basedb.core.Unit"
37  import="net.sf.basedb.core.Nameable"
38  import="net.sf.basedb.core.Subtypable"
39  import="net.sf.basedb.core.ItemSubtype"
40  import="net.sf.basedb.core.BioPlate"
41  import="net.sf.basedb.core.BioPlateType"
42  import="net.sf.basedb.core.ItemQuery"
43  import="net.sf.basedb.core.ItemResultList"
44  import="net.sf.basedb.core.PermissionDeniedException"
45  import="net.sf.basedb.core.query.Orders"
46  import="net.sf.basedb.core.query.Hql"
47  import="net.sf.basedb.core.query.Restrictions"
48  import="net.sf.basedb.core.query.Expressions"
49  import="net.sf.basedb.core.snapshot.AnnotationSetSnapshot"
50  import="net.sf.basedb.core.snapshot.AnnotationSnapshot"
51  import="net.sf.basedb.core.snapshot.SnapshotManager"
52  import="net.sf.basedb.clients.web.Base"
53  import="net.sf.basedb.clients.web.util.HTML"
54  import="net.sf.basedb.util.NameableComparator"
55  import="net.sf.basedb.util.formatter.Formatter"
56  import="net.sf.basedb.util.formatter.PrefixSuffixFormatter"
57  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
58  import="net.sf.basedb.util.Values"
59  import="java.util.ArrayList"
60  import="java.util.List"
61  import="java.util.Set"
62  import="java.util.HashSet"
63  import="java.util.TreeSet"
64  import="java.util.Map"
65  import="java.util.HashMap"
66%>
67<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
68<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
69
70<%
71final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
72final String ID = sc.getId();
73final Item itemType = Item.valueOf(request.getParameter("item_type"));
74final int itemId = Values.getInt(request.getParameter("item_id"));
75final float scale = Base.getScale(sc);
76final DbControl dc = sc.newDbControl();
77
78Set<AnnotationType> annotationTypes = null;
79Set<AnnotationType> protocolParameters = null;
80Map<AnnotationType, AnnotationSnapshot> existing = null;
81
82try
83{
84  final Annotatable item = (Annotatable)itemType.getById(dc, itemId);
85  final boolean writePermission = item.hasPermission(Permission.WRITE);
86  final SnapshotManager manager = new SnapshotManager();
87 
88  ItemQuery<AnnotationType> annotationTypeQuery = null;
89  String message = null;
90  boolean isProxy = item instanceof AnnotatableProxy;
91
92  // Load all annotation types that are possible for this item type
93  if (isProxy)
94  {
95    AnnotatableProxy proxy = (AnnotatableProxy)item;
96    annotationTypeQuery = Base.getAnnotationTypesQuery(proxy);
97    message = proxy.getAnnotationMessage();
98  }
99  else
100  {
101    annotationTypeQuery = Base.getAnnotationTypesQuery(itemType, false);
102  }
103  annotationTypes = new TreeSet<AnnotationType>(new NameableComparator(false));
104  annotationTypes.addAll(annotationTypeQuery.list(dc));
105
106  final AnnotationSetSnapshot snapshot = item.isAnnotated() ? 
107      manager.getSnapshot(dc, item.getAnnotationSet().getId()) : null;
108  List<AnnotationSnapshot> inheritedAnnotations = null;
109  if (snapshot != null)
110  {
111    // Load the existing primary and inherited annotations
112    existing = new HashMap<AnnotationType, AnnotationSnapshot>();
113    inheritedAnnotations = new ArrayList<AnnotationSnapshot>();
114    for (AnnotationSnapshot a : manager.findAnnotations(dc, snapshot, null, true))
115    {
116      AnnotationType at = a.getAnnotationType(dc);
117      if (!a.isInherited())
118      {
119        existing.put(a.getAnnotationType(dc), a);
120      }
121      else
122      {
123        inheritedAnnotations.add(a);
124      }
125    }
126    annotationTypes.addAll(existing.keySet());
127  }
128 
129  // Load the possible protocol parameters
130  Protocol protocol = null;
131  boolean readProtocol = true;
132  try
133  {
134    protocol = item.getProtocol();
135  }
136  catch (PermissionDeniedException ex)
137  {
138    readProtocol = false;
139  }
140  ItemQuery<AnnotationType> parameterQuery = Base.getProtocolParametersQuery(protocol);
141  if (parameterQuery != null)
142  {
143    protocolParameters = new HashSet<AnnotationType>(parameterQuery.list(dc));
144    annotationTypes.removeAll(protocolParameters);
145  }
146  // Load the current subtype
147  // NOTE! User may have selected a different subtype in the form than what is
148  // currently saved so if a subtype_id is sent in the request we use that
149  String selectedCategoryName = null;
150  try
151  {
152    ItemSubtype subtype = null;
153    if (item instanceof Subtypable)
154    {
155      subtype = ((Subtypable)item).getItemSubtype();
156    }
157    else if (item instanceof BioPlate)
158    {
159      BioPlateType bpt = ((BioPlate)item).getBioPlateType();
160      subtype = bpt.getItemSubtype();
161      if (subtype == null) selectedCategoryName = bpt.getName();
162    }
163    if (subtype != null) selectedCategoryName = subtype.getName();
164  }
165  catch (PermissionDeniedException ex)
166  {}
167  Set<AnnotationType> annotationTypesInCategory = new HashSet<AnnotationType>();
168  if (selectedCategoryName != null)
169  {
170    ItemQuery<AnnotationType> query = AnnotationType.getQuery(item.getType());
171    query.join(Hql.innerJoin("categories", "ct"));
172    query.restrict(Restrictions.eq(Hql.property("ct", "name"), Expressions.string(selectedCategoryName)));
173    annotationTypesInCategory.addAll(query.list(dc));
174  }
175  %>
176  <base:page type="iframe" id="list-annotations">
177  <base:head scripts="~list.js" styles="table.css">
178  <style>
179    #annotations-data.all
180    {}
181   
182    #annotations-data.values .novalues
183    {
184      display: none;
185    }
186   
187    #annotations-data.category .nocategory
188    {
189      display: none;
190    }
191  </style>
192  </base:head>
193  <base:body>
194    <%
195    if (message != null)
196    {
197      %>
198      <div class="messagecontainer note"><%=message%></div>
199      <%
200    }
201    %>
202    <base:section
203      id="primaryAnnotations"
204      title="<%="Primary annotations (" + annotationTypes.size() + ")"%>"
205      >
206      <%
207      int allWithValues = 0;
208      int allOfCategory = 0;
209      if (annotationTypes.size() == 0)
210      {
211        %>
212        <div class="messagecontainer note">
213        No annotation types has been defined for this type of item
214        (or you don't have permission to view them).
215        </div>
216        <%
217      }
218      else
219      {
220        %>
221        <tbl:table
222          id="annotations"
223          columns="all"
224          >
225          <tbl:columndef 
226            id="annotation"
227            title="Annotation"
228          />
229          <tbl:columndef 
230            id="values"
231            title="Values"
232          />
233          <tbl:columndef 
234            id="description"
235            title="Description"
236          />
237          <div class="panelgroup topborder leftborder rightborder bg-filled-100">
238            <tbl:panel style="height: auto; padding: 2px;">
239              <b>View:</b> 
240              <%
241              if (selectedCategoryName != null)
242              {
243                %>
244                <label><input type="radio" name="view" id="view_category" value="category" checked>All of <i><%=HTML.encodeTags(selectedCategoryName)%></i> category</label> (<span id="allOfCategory">?</span>)
245                <%
246              }
247              %>
248              <label><input type="radio" name="view" id="view_values" value="values" <%=selectedCategoryName == null ? "checked" : ""%>>All with values</label> (<span id="allWithValues">?</span>)
249              <label><input type="radio" name="view" id="view_all" value="all">All annotations</label> (<%=annotationTypes.size()%>)
250            </tbl:panel>
251          </div>
252          <tbl:data id="annotations-data">
253            <tbl:headers>
254              <tbl:headerrow>
255                <tbl:columnheaders />
256              </tbl:headerrow>
257            </tbl:headers>
258            <tbl:rows>
259            <%
260            for (AnnotationType at : annotationTypes)
261            {
262              AnnotationSnapshot a = existing != null ? existing.get(at) : null;
263              List<?> values = null;
264              Formatter formatter = null;
265              if (a != null)
266              {
267                Annotation ann = a.getAnnotation(dc);
268                values = a.getValues(ann.getUnitConverter(null), ann.getValueType());
269                formatter = FormatterFactory.getAnnotationFormatter(sc, ann, null);
270              }
271              if (values != null || !at.isRemoved())
272              {
273                String rowClass = "";
274                if (values == null || values.size() == 0) 
275                {
276                  rowClass += " novalues";
277                }
278                else
279                {
280                  allWithValues++;
281                }
282                if (!annotationTypesInCategory.contains(at)) 
283                {
284                  rowClass += " nocategory";
285                }
286                else
287                {
288                  allOfCategory++;
289                }
290                %>
291                <tbl:row subclass="<%=rowClass%>">
292                  <tbl:cell column="annotation"><base:icon 
293                    image="deleted.png" 
294                    tooltip="This item has been scheduled for deletion" 
295                    visible="<%=at.isRemoved()%>"
296                  /><%=Base.getLinkedName(ID, at, false, true)%></tbl:cell>
297                  <tbl:cell column="values"><%=values == null || values.size() == 0 ? "<i>- no values -</i>" : Values.getString(values, ", ", true, formatter)%>
298                  <%
299                    if (writePermission)
300                    {
301                      %>: <base:icon image="edit.png" subclass="auto-init link" 
302                        data-auto-init="edit-annotation" data-annotation-type="<%=at.getId()%>"
303                        data-item-type="<%=itemType.name()%>" data-item-id="<%=itemId %>"
304                        tooltip="Modify the values of this annotation" />
305                      <%
306                    }
307                    %>
308                  </tbl:cell>
309                  <tbl:cell column="description"><%=HTML.encodeTags(at.getDescription())%></tbl:cell>
310                </tbl:row>
311                <%
312              }
313            }
314            %>
315            </tbl:rows>
316          </tbl:data>
317        </tbl:table>
318        <%
319      }
320      %>
321      <div id="annotations-stat" class="datacontainer"
322        data-all-with-values="<%=allWithValues %>"
323        data-all-of-category="<%=allOfCategory%>"
324      ></div>
325     
326    </base:section>
327
328    <%
329    if (protocolParameters != null)
330    {
331      %>
332      <base:section 
333        id="parameterSection" 
334        title="<%="Protocol parameters for " + HTML.encodeTags(protocol.getName()) + 
335          " (" + protocolParameters.size() + ")"%>"
336        >
337        <%
338        if (protocolParameters.size() == 0)
339        {
340          %>
341          <div class="messagecontainer note">
342          No protocol parameters has been defined for the protocol
343          <%=Base.getLinkedName(ID, protocol, !readProtocol, true)%> 
344          (or you don't have permission to view them).
345          </div>
346          <%
347        }
348        else
349        {
350          %>
351          <tbl:table
352            id="parameters"
353            columns="all"
354            >
355            <tbl:columndef 
356              id="parameter"
357              title="Parameter"
358            />
359            <tbl:columndef 
360              id="values"
361              title="Values"
362            />
363            <tbl:columndef 
364              id="description"
365              title="Description"
366            />
367            <tbl:data>
368              <tbl:headers>
369                <tbl:headerrow>
370                  <tbl:columnheaders />
371                </tbl:headerrow>
372              </tbl:headers>
373              <tbl:rows>
374              <%
375              for (AnnotationType at : protocolParameters)
376              {
377                AnnotationSnapshot a = existing != null ? existing.get(at) : null;
378                Formatter formatter = null;
379                List<?> values = null;
380                if (a != null)
381                {
382                  Annotation ann = a.getAnnotation(dc);
383                  values = a.getValues(ann.getUnitConverter(null), ann.getValueType());
384                  formatter = FormatterFactory.getAnnotationFormatter(sc, ann, null);
385                }
386                if (values != null || !at.isRemoved())
387                {
388                  %>
389                  <tbl:row>
390                    <tbl:cell column="parameter"><base:icon 
391                      image="deleted.png" 
392                      tooltip="This item has been scheduled for deletion" 
393                      visible="<%=at.isRemoved()%>"
394                    /><%=Base.getLinkedName(ID, at, false, true)%></tbl:cell>
395                    <tbl:cell column="values">
396                      <%=values == null || values.size() == 0 ? "<i>- no values -</i>" : Values.getString(values, ", ", true, formatter)%>
397                      <%
398                      if (writePermission)
399                      {
400                        %>: <base:icon image="edit.png" subclass="auto-init link" 
401                          data-auto-init="edit-annotation" data-annotation-type="<%=at.getId()%>"
402                          data-item-type="<%=itemType.name()%>" data-item-id="<%=itemId %>"
403                          tooltip="Modify the values of this protocol parameter" />
404                        <%
405                      }
406                      %>
407                    </tbl:cell>
408                    <tbl:cell column="description"><%=HTML.encodeTags(at.getDescription())%></tbl:cell>
409                  </tbl:row>
410                  <%
411                }
412              }
413              %>
414              </tbl:rows>
415            </tbl:data>
416          </tbl:table>
417          <%
418        }
419        %>
420      </base:section>
421      <%
422    }
423    %>
424    <%
425    if (!isProxy)
426    {
427      int numInherited = inheritedAnnotations == null ? 0 : inheritedAnnotations.size();
428      %>
429      <base:section 
430        id="inherited"
431        title="<%="Inherited annotations and protocol parameters (" + numInherited + ")"%>"         
432        >
433        <%
434        if (numInherited == 0)
435        {
436          %>
437          <div class="messagecontainer note">
438          No annotations are inherited by this item.
439          (or you don't have permission to view them).
440          </div>
441          <%
442        }
443        else
444        {
445        %>
446        <tbl:table
447          id="inheritedAnnotations"
448          columns="all"
449          >
450          <tbl:columndef 
451            id="annotation"
452            title="Annotation"
453          />
454          <tbl:columndef 
455            id="item"
456            title="From item"
457          />
458          <tbl:columndef 
459            id="values"
460            title="Values"
461          />
462          <tbl:columndef 
463            id="description"
464            title="Description"
465          />
466          <tbl:data>
467            <tbl:headers>
468              <tbl:headerrow>
469                <tbl:columnheaders />
470              </tbl:headerrow>
471            </tbl:headers>
472            <tbl:rows>
473            <%
474            for (AnnotationSnapshot a : inheritedAnnotations)
475            {
476              Annotation ann = a.getAnnotation(dc);
477              AnnotationType at = a.getAnnotationType(dc);
478              String name = HTML.encodeTags(at.getName());
479              String description = HTML.encodeTags(at.getDescription());
480              boolean writeInherited = false;
481              String icon = "annotation.png";
482              if (at.isRemoved())
483              {
484                icon = "deleted.png";
485              }
486              else if (at.isProtocolParameter())
487              {
488                icon = "parameter.png";
489              }
490              List<?> values = a.getValues(ann.getUnitConverter(null), ann.getValueType());
491              Formatter formatter = FormatterFactory.getAnnotationFormatter(sc, ann, null);
492              Nameable aItem = null;
493              String fromType = a.getItemType().toString();
494              try
495              {
496                aItem = (Nameable)a.getItem(dc);
497                writeInherited = aItem.hasPermission(Permission.WRITE);
498              }
499              catch (PermissionDeniedException ex)
500              {}
501              if (aItem instanceof Subtypable)
502              {
503                try
504                {
505                  ItemSubtype subtype = ((Subtypable)aItem).getItemSubtype();
506                  if (subtype != null) fromType = subtype.getName();
507                }
508                catch (PermissionDeniedException ex)
509                {}
510              }             %>
511              <tbl:row>
512                <tbl:cell column="annotation"><base:icon image="<%=icon%>" style="padding-right: 2px;" /><%=Base.getLinkedName(ID, at, at == null, true)%></tbl:cell>
513                <tbl:cell column="item"><%=Base.getLinkedName(ID, aItem, aItem == null, true)%><%=aItem != null ? " <span class=\"itemsubtype\">("+fromType+")</span>" : ""%></tbl:cell>
514                <tbl:cell column="values">
515                  <%=values == null || values.size() == 0 ? 
516                    "<i>- no values -</i>" : Values.getString(values, ", ", true, formatter)%>
517                  <%
518                  if (writeInherited && aItem != null)
519                  {
520                    %>: <base:icon image="edit.png" subclass="auto-init link" 
521                      data-auto-init="edit-annotation" data-annotation-type="<%=at.getId()%>"
522                      data-item-type="<%=aItem.getType().name()%>" data-item-id="<%=aItem.getId() %>"
523                      tooltip="Modify the values of this annotation" />
524                    <%
525                  }
526                  %>
527                </tbl:cell>
528                <tbl:cell column="description"><%=description%></tbl:cell>
529              </tbl:row>
530              <%
531            }
532            %>
533            </tbl:rows>
534          </tbl:data>
535        </tbl:table>
536        <base:icon image="joust/annotation.gif" /> = Annotation,
537        <base:icon image="parameter.png" /> = Protocol parameter
538        <%
539      }
540      %>
541      </base:section>
542      <%
543    }
544    %>
545  </base:body>
546  </base:page>
547  <%
548}
549finally
550{
551  if (dc != null) dc.close();
552}
553
554%>
Note: See TracBrowser for help on using the repository browser.