source: trunk/www/common/annotations/annotate.jsp @ 6947

Last change on this file since 6947 was 6947, checked in by Nicklas Nordborg, 6 years ago

References #1941: Store experimental factor values as part experiments

Implemented support for inheriting new annotations via the "Inherit" button. The 'Inherited annotations' tab has been removed from all dialogs.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 22.2 KB
Line 
1<%-- $Id: annotate.jsp 6947 2015-09-08 12:30:31Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2005 Nicklas Nordborg
4  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg
5  Copyright (C) 2007 Nicklas Nordborg
6
7  This file is part of BASE - BioArray Software Environment.
8  Available at http://base.thep.lu.se/
9
10  BASE is free software; you can redistribute it and/or
11  modify it under the terms of the GNU General Public License
12  as published by the Free Software Foundation; either version 3
13  of the License, or (at your option) any later version.
14
15  BASE is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  GNU General Public License for more details.
19
20  You should have received a copy of the GNU General Public License
21  along with BASE. If not, see <http://www.gnu.org/licenses/>.
22  ------------------------------------------------------------------
23 
24  @author Nicklas
25  @version 2.0
26--%>
27<%@ page pageEncoding="UTF-8" session="false"
28  import="net.sf.basedb.core.SessionControl"
29  import="net.sf.basedb.core.DbControl"
30  import="net.sf.basedb.core.Item"
31  import="net.sf.basedb.core.Type"
32  import="net.sf.basedb.core.BasicItem"
33  import="net.sf.basedb.core.Permission"
34  import="net.sf.basedb.core.Annotatable"
35  import="net.sf.basedb.core.Nameable"
36  import="net.sf.basedb.core.Protocol"
37  import="net.sf.basedb.core.Subtypable"
38  import="net.sf.basedb.core.ItemSubtype"
39  import="net.sf.basedb.core.BioPlateType"
40  import="net.sf.basedb.core.BioPlate"
41  import="net.sf.basedb.core.AnnotationSet"
42  import="net.sf.basedb.core.Annotation"
43  import="net.sf.basedb.core.Unit"
44  import="net.sf.basedb.core.Quantity"
45  import="net.sf.basedb.core.AnnotatableProxy"
46  import="net.sf.basedb.core.ItemQuery"
47  import="net.sf.basedb.core.Include"
48  import="net.sf.basedb.core.ItemResultList"
49  import="net.sf.basedb.core.AnnotationType"
50  import="net.sf.basedb.core.AnnotationTypeCategory"
51  import="net.sf.basedb.core.PermissionDeniedException"
52  import="net.sf.basedb.core.query.Expressions"
53  import="net.sf.basedb.core.query.Restrictions"
54  import="net.sf.basedb.core.query.Hql"
55  import="net.sf.basedb.core.query.Orders"
56  import="net.sf.basedb.util.NameableComparator"
57  import="net.sf.basedb.clients.web.Base"
58  import="net.sf.basedb.clients.web.util.HTML"
59  import="net.sf.basedb.util.formatter.Formatter"
60  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
61  import="net.sf.basedb.clients.web.formatter.FormatterSettings"
62  import="net.sf.basedb.clients.web.AnnotationUtil"
63  import="net.sf.basedb.util.Values"
64  import="org.json.simple.JSONObject"
65  import="org.json.simple.JSONArray"
66  import="java.util.ArrayList"
67  import="java.util.List"
68  import="java.util.Date"
69  import="java.util.Set"
70  import="java.util.HashSet"
71  import="java.util.TreeSet"
72  import="java.util.Map"
73  import="java.util.HashMap"
74%>
75<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
76<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
77<%@ taglib prefix="m" uri="/WEB-INF/menu.tld" %>
78<%
79final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
80final String ID = sc.getId();
81final float scale = Base.getScale(sc);
82final Item itemType = Item.valueOf(request.getParameter("item_type"));
83final int itemId = Values.getInt(request.getParameter("item_id"));
84final int protocolId = Values.getInt(request.getParameter("protocol_id"), -1);
85final int subtypeId = Values.getInt(request.getParameter("subtype_id"), -1);
86final int annotationId = Values.getInt(request.getParameter("annotation_id"));
87int annotationTypeId = Values.getInt(request.getParameter("annotationtype_id"));
88final boolean standalone = Values.getBoolean(request.getParameter("standalone"));
89
90// Parent items may have been submitted by caller
91// Each parameter is ITEMTYPE:ID:ID:...
92String[] parents = request.getParameterValues("parents");
93
94final DbControl dc = sc.newDbControl();
95try
96{
97  // Date and time formats
98  String dateFormat = FormatterSettings.getDateFormat(sc);
99  String htmlDateFormat = HTML.encodeTags(dateFormat);
100  String dateTimeFormat = FormatterSettings.getDateTimeFormat(sc);
101  String htmlDateTimeFormat = HTML.encodeTags(dateTimeFormat);
102 
103  Annotatable item = null;
104 
105  if (annotationId != 0)
106  {
107    Annotation a = Annotation.getById(dc, annotationId);
108    item = a.getAnnotationSet().getItem();
109    annotationTypeId = a.getAnnotationType().getId();
110  }
111  else if (itemId != 0)
112  {
113    item = (Annotatable)itemType.getById(dc, itemId);
114  }
115  final boolean writePermission = item == null ? true : item.hasPermission(Permission.WRITE);
116 
117  // Load the current item and it's protocol
118  // NOTE! User may have selected a different protocol in the form than what is
119  // currently saved so if a protocol_id is sent in the request we use that
120  Protocol protocol = null;
121  boolean readProtocol = true;
122  try
123  {
124    if (protocolId == - 1 && item != null)
125    {
126      protocol = item.getProtocol();
127    }
128    else if (protocolId > 0)
129    {
130      protocol = Protocol.getById(dc, protocolId);
131    }
132  }
133  catch (PermissionDeniedException ex)
134  {
135    readProtocol = false;
136  }
137 
138  // Load the current subtype
139  // NOTE! User may have selected a different subtype in the form than what is
140  // currently saved so if a subtype_id is sent in the request we use that
141  String selectedCategoryName = null;
142  try
143  {
144    ItemSubtype subtype = null;
145    if (subtypeId > 0)
146    {
147      subtype = ItemSubtype.getById(dc, subtypeId);
148    }
149    else if (item instanceof Subtypable)
150    {
151      subtype = ((Subtypable)item).getItemSubtype();
152    }
153    else if (item instanceof BioPlate)
154    {
155      BioPlateType bpt = ((BioPlate)item).getBioPlateType();
156      subtype = bpt.getItemSubtype();
157      if (subtype == null) selectedCategoryName = bpt.getName();
158    }
159    if (subtype != null) selectedCategoryName = subtype.getName();
160  }
161  catch (PermissionDeniedException ex)
162  {}
163 
164  //selectedCategoryName = "Test"; // DEBUG!!
165 
166  if (standalone)
167  {
168    sc.getCurrentContext(itemType).setObject("item", item); 
169  }
170
171  String title = "Annotate " + 
172    HTML.encodeTags((item instanceof Nameable ? ((Nameable)item).getName() : 
173      (item == null ? " new item" : item.toString())));
174
175  // Queries to retrieve annotation types and protocol parameters
176  ItemQuery<AnnotationType> annotationTypeQuery = null;
177  String message = null;
178  if (item instanceof AnnotatableProxy)
179  {
180    AnnotatableProxy proxy = (AnnotatableProxy)item;
181    annotationTypeQuery = Base.getAnnotationTypesQuery(proxy);
182    message = proxy.getAnnotationMessage();
183  }
184  else
185  {
186    annotationTypeQuery = Base.getAnnotationTypesQuery(itemType, false);
187  }
188  final ItemQuery<AnnotationType> parameterQuery = Base.getProtocolParametersQuery(protocol);
189
190  // Holds all categories that we have found
191  final Set<AnnotationTypeCategory> allCategories = 
192    new TreeSet<AnnotationTypeCategory>(new NameableComparator(false));
193 
194  // Load existing annotations
195  AnnotationSet as = null;
196  Map<AnnotationType, Annotation> primary = new HashMap<AnnotationType, Annotation>();
197  List<Annotation> inherited = new ArrayList<Annotation>();
198  if (item != null && item.isAnnotated())
199  {
200    // Load the existing annotations
201    as = item.getAnnotationSet();
202    ItemQuery<Annotation> aQuery = as.getAnnotations(null);
203    aQuery.order(Orders.asc(Hql.property("annotationType.name")));
204    List<Annotation> annotations = aQuery.list(dc);
205    for (Annotation a : annotations)
206    {
207      try
208      {
209        if (a.getSource() == Annotation.Source.PRIMARY)
210        {
211          primary.put(a.getAnnotationType(), a);
212        }
213        else
214        {
215          inherited.add(a);
216        }
217      }
218      catch (PermissionDeniedException ex)
219      {}
220    }
221  }
222 
223  // Load all annotation types that available from multiple sources:
224  // * As defined by the server admin for the current item type
225  // * Existing on the current item
226  // * Defined as protocol parameters for the current protocol
227  Set<AnnotationType> annotationTypes = new TreeSet<AnnotationType>(new NameableComparator(false));
228  Set<AnnotationType> protocolParameters = new HashSet<AnnotationType>();
229  annotationTypes.addAll(annotationTypeQuery.list(dc));
230  annotationTypes.addAll(primary.keySet());
231  if (parameterQuery != null) 
232  {
233    protocolParameters.addAll(parameterQuery.list(dc));
234    annotationTypes.addAll(protocolParameters);
235  }
236
237  // Build JSON objects for all annotation types, the current values and annotation type categories
238  JSONArray jsonAnnotations = new JSONArray();
239  for (AnnotationType at : annotationTypes)
240  {
241    Annotation a = primary.get(at);
242    if (at.isRemoved() && a == null) continue;
243    JSONObject json = AnnotationUtil.createJsonForAnnotationTypeAndAnnotation(dc, at, a, null, protocolParameters.contains(at), allCategories);
244    jsonAnnotations.add(json);
245  }
246  for (Annotation a : inherited)
247  {
248    AnnotationType at = a.getAnnotationType();
249    JSONObject json = AnnotationUtil.createJsonForAnnotationTypeAndAnnotation(dc, at, a, null, false, allCategories);
250    jsonAnnotations.add(json);
251  }
252 
253  // Build JSON for parents submitted via request parameter
254  JSONArray jsonParents = new JSONArray();
255  if (parents != null)
256  {
257    for (String p : parents) jsonParents.add(p);
258  }
259  boolean canInherit = jsonParents.size() > 0;
260  if (!canInherit && item != null)
261  {
262    Set<Annotatable> parentItems = item.getAnnotatableParents();
263    canInherit = parentItems != null && parentItems.size() > 0;
264  }
265  %>
266  <base:page type="<%=standalone ? "popup" : "iframe"%>" title="<%=title%>">
267  <base:head scripts="~annotate.js,menu.js" styles="parameters.css,toolbar.css,menu.css">
268  <style>
269  .first-primary:before
270  {
271    content: '― Primary Annotations ―';
272    font-variant: small-caps;
273    font-size: 80%;
274    font-weight: bold;
275    color: #999999;
276  }
277 
278  .first-inherited:before
279  {
280    content: '― Inherited & Cloned ―';
281    font-variant: small-caps;
282    font-size: 80%;
283    font-weight: bold;
284    color: #999999;
285  }
286 
287 
288  .parameterlist .param
289  {
290    padding-right: 20px;
291  }
292  .parameterlist .param.selected
293  {
294    padding-right: 20px;
295  }
296  .parameterlist .param:hover
297  {
298    padding-right: 18px;
299  }
300 
301  .parameterlist .param input, .parameterlist .check-all
302  {
303    position: absolute;
304    right: 1px;
305    margin-top: 1px;
306  }
307  .parameterlist .check-all
308  {
309    padding-right: 2px;
310  }
311 
312  #selected-name
313  {
314    font-weight: bold;
315  }
316 
317  #selected-description
318  {
319    margin-left: 0px;
320    margin-right: 0px;
321    display: none;
322  }
323 
324  #none-selected
325  {
326    display: none;
327    margin-top: 2em;
328  }
329 
330  #selected-container > div
331  {
332    display: none;
333  }
334 
335  #selected-container.none-selected #none-selected
336  {
337    display: block;
338  }
339  #selected-container.none-selected.no-annotations #none-selected
340  {
341    display: none;
342  }
343 
344  #selected-container.has-selected #info-container
345  {
346    display: block;
347  }
348 
349  #selected-container.has-description #selected-description
350  {
351    display: block;
352  }
353
354  #selected-container.INHERITED #inherited-container,
355  #selected-container.CLONED #inherited-container
356  {
357    display: block;
358    border-left-width: 2px;
359    padding: 2px 5px;
360    margin: 0.5em 0;
361  }
362
363  #selected-container.inherited-missing #inherited-missing
364  {
365    display: block;
366    border-left-width: 2px;
367    padding: 2px 5px;
368    margin: 0.5em 0;
369  }
370  #selected-container.inherited-missing #inherited-container
371  {
372    display: none;
373  }
374 
375  #inherited-item
376  {
377    font-style: italic;
378  }
379 
380  #inherited-modified, #inherited-clone
381  {
382    display: none;
383  }
384
385  #selected-container.modified #inherited-modified
386  {
387    display: inline;
388  }
389 
390  #selected-container.INHERITED #inherited-clone
391  {
392    display: inline;
393  }
394 
395  #selected-container.PRIMARY #input-container,
396  #selected-container.CLONED #input-container
397  {
398    display: block;
399  }
400 
401  #input-container > div
402  {
403    display: none;
404  }
405 
406  #selected-container.ENUM-SINGLE #ENUM-SINGLE
407  {
408    display: block;
409  }
410  #selected-container.ENUM-MULTIPLE #ENUM-MULTIPLE
411  {
412    display: block;
413  }
414  #selected-container.ENUM-RADIO-CHECKBOX #ENUM-RADIO-CHECKBOX
415  {
416    display: block;
417  }
418  #selected-container.STRING #STRING-container
419  {
420    display: block;
421  }
422  #selected-container.TEXT #TEXT-container
423  {
424    display: block;
425  }
426  #selected-container.INT #INT-container
427  {
428    display: block;
429  }
430  #selected-container.LONG #LONG-container
431  {
432    display: block;
433  }
434  #selected-container.FLOAT #FLOAT-container
435  {
436    display: block;
437  }
438  #selected-container.DOUBLE #DOUBLE-container
439  {
440    display: block;
441  }
442  #selected-container.BOOLEAN #BOOLEAN-container
443  {
444    display: block;
445  }
446  #selected-container.DATE #DATE-container
447  {
448    display: block;
449  }
450  #selected-container.TIMESTAMP #TIMESTAMP-container
451  {
452    display: block;
453  }
454  #selected-container.has-unit .numeric
455  {
456    float: left;
457    margin-right: 0.25em;
458  }
459  #selected-container.has-unit #unit-container
460  {
461    display: block;
462  }
463  .not-specified
464  {
465    font-style: italic;
466  }
467  </style>
468  </base:head>
469  <base:body>
470    <%
471    if (standalone)
472    {
473      %>
474      <h1><%=title%> <base:help helpid="annotations.edit" /></h1>
475      <div class="content">
476      <%
477    }
478    %>
479    <div id="page-data" class="datacontainer"
480      data-item-type="<%=itemType.name() %>"
481      data-item-id="<%=itemId %>"
482      data-annotations="<%=HTML.encodeTags(jsonAnnotations.toJSONString()) %>"
483      data-parents="<%=HTML.encodeTags(jsonParents.toJSONString()) %>"
484      data-annotation-type-id="<%=annotationTypeId%>"
485      data-annotation-id="<%=annotationId %>"
486      data-date-format="<%=htmlDateFormat%>"
487      data-datetime-format="<%=htmlDateTimeFormat%>"
488      ></div>
489    <form name="annotations">
490   
491    <m:menu
492      id="more-actions"
493      style="display: none;"> 
494      <m:menuitem id="btnSync" title="Sync" icon="cloned-outofsync.png" 
495        tooltip="Synchronize the selected annotation"
496      />
497      <m:menuitem id="btnClone" title="Clone" icon="cloned.png" 
498        tooltip="Clone the selected annotations"
499      />
500      <m:menuitem id="btnUnclone" title="Unclone" icon="inherited.png" 
501        tooltip="Revert cloned annotations to inherited"
502      />
503    </m:menu>
504   
505   
506    <div class="absolutefull">
507      <div class="absolutefull bg-filled-100 rightborder" style="width: 18em;">
508        <div class="absolutefull" style="height: 2em;">
509          <table style="margin: auto; height: 100%;"><tr><td>
510          <base:icon image="filter.png" />
511          <select name="categories" id="categories" style="width: 15em;">
512          <option value="-1">- all -
513          <%
514          if (protocol != null)
515          {
516            %>
517            <option value="-2">- protocol parameters -
518            <%
519          }
520          %>
521          <option value="0">- uncategorized -
522          <%
523          for (AnnotationTypeCategory category : allCategories)
524          {
525            boolean selected = category.getName().equals(selectedCategoryName);
526            %>
527            <option value="<%=category.getId()%>"
528              title="<%=HTML.encodeTags(category.getDescription())%>"
529              <%=selected ? "selected" : "" %>
530            ><%=HTML.encodeTags(category.getName())%>
531            <%
532          }
533          %>
534          </select>
535          </td></tr></table>
536        </div>
537       
538        <div id="annotation-list" class="absolutefull parameterlist topborder" 
539          style="top: 2em; bottom: 3em;">
540          <tbl:toolbar subclass="bottomborder" visible="<%=canInherit || annotationTypes.size()>0 || inherited.size()>0 %>">
541            <tbl:button id="btnAdd" title="Inherit&hellip;" image="add.png" 
542              tooltip="Inherit more annotations..."
543              disabled="<%=!canInherit%>"
544            />
545            <tbl:button id="btnDelete" title="Delete" image="remove.png" 
546              tooltip="Delete annotations"
547            />
548            <tbl:button id="btnMore" 
549              subclass="auto-init"
550              data-auto-init="menu-anchor"
551              data-menu-id="more-actions"
552              title="<img src=\"../../images/mini_scroll_down.png\">" image="menu.png"
553              tooltip="More actions..."
554              />
555          </tbl:toolbar>
556            <%
557            if (annotationTypes.size() == 0 && inherited.size() == 0)
558            {
559              %>
560              <div class="messagecontainer error">
561                There are no annotation types defined for this kind of item.
562              </div>
563              <%
564            }
565            %>
566          <div id="primary-list">
567            <div class="first-primary">
568              <base:icon id="check-all-primary" image="check_uncheck.png" subclass="check-all" 
569                tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)"
570              />
571            </div>
572          </div>
573          <div id="inherited-list">
574            <div class="first-inherited">
575              <base:icon id="check-all-inherited" image="check_uncheck.png" subclass="check-all" 
576                tooltip="Toggle all (use CTRL, ALT or SHIFT to check/uncheck)"
577              />
578            </div>
579          </div>
580        </div>
581       
582        <div class="absolutefull topborder" style="top: auto; bottom: 0em; height: 3em;">
583          <table style="height: 100%; margin:auto;"><tr><td>
584          <base:icon image="hasvalues.png" /> = has value(s)<br>
585          <base:icon image="parameter.png" /> = protocol parameter
586          </td></tr></table>
587        </div>
588      </div>
589     
590      <div class="absolutefull input100" style="left: 18em; padding: 8px;">
591        <%
592        if (message != null)
593        {
594          %>
595          <div class="messagecontainer help" style="margin-top: 0.2em;"><%=message%></div>
596          <%
597        }
598        if (!writePermission)
599        {
600          %>
601          <div class="messagecontainer error">You do not have permission to change this information</div>
602          <%
603        }
604        %>
605        <div id="valuecontainer" style="display: none;">
606          <b>Values</b> <span id="multiplicity"></span><br>
607          <select name="multi-values" id="multi-values" size="5" style="width: 100%;">
608          </select>
609          <table>
610          <tr>
611            <td><base:button id="btnMultiAdd" title="Add" tooltip="Add a new value" /></td>
612            <td><base:button id="btnMultiRemove" title="Remove" tooltip="Remove the selected values"/></td>
613          </tr>
614          </table>
615        <br>
616        </div>
617       
618        <div id="selected-container">
619          <div id="none-selected" class="messagecontainer note">
620            <base:icon image="goback.png" /> Select an annotation.
621          </div>
622
623          <div id="info-container">
624            <span id="selected-name">Name</span>
625            (<span id="selected-type">type</span>)
626          </div>
627         
628          <div id="inherited-container" class="bg-filled-100">
629            <span id="inherited-item"></span><br>
630            <span id="inherited-values"></span>
631            <span id="inherited-modified">(modified; <span id="sync-modified" class="link" title="Synchronize the annotation values with the parent item">sync</span>)</span>
632            <span id="inherited-clone">(<span id="convert-to-cloned" class="link" title="Clone the annotation values from the parent">clone</span>)</span>
633          </div>
634                   
635          <div id="inherited-missing" class="bg-filled-100">
636            Cloned from an unknown item.
637          </div>
638       
639          <div id="input-container">
640         
641            <div id="ENUM-SINGLE">
642              <select name="ENUM-SINGLE-input" id="ENUM-SINGLE-input" 
643                style="min-width: 5em;">
644              </select>
645            </div>
646             
647            <div id="ENUM-MULTIPLE">
648              <select name="ENUM-MULTIPLE-input" id="ENUM-MULTIPLE-input" 
649                multiple size="10" style="min-width: 5em;">
650              </select>
651            </div>
652             
653            <div id="ENUM-RADIO-CHECKBOX">
654              radios/checkboxes
655            </div>
656       
657            <div id="STRING-container">
658              <input name="STRING-input" id="STRING-input" 
659                type="text" class="text"
660                maxlength="255" value="">
661            </div>
662           
663            <div id="TEXT-container">
664              <table style="width: 100%;">
665              <tr>
666                <td>
667                <textarea name="TEXT-input" id="TEXT-input" 
668                  class="text" rows="5"></textarea>
669                </td>
670                <td style="width: 20px;">
671                  <base:icon
672                    id="TEXT-zoom"
673                    image="zoom.png"
674                    tooltip="Edit in larger window" 
675                  />
676                </td>
677              </tr>
678              </table>
679            </div>
680           
681            <div id="INT-container" class="numeric">
682              <input 
683                name="INT-input" id="INT-input"
684                class="text" type="text" 
685                value="" style="width: 12em;" maxlength="20">
686            </div>
687
688            <div id="LONG-container" class="numeric">
689              <input 
690                name="LONG-input" id="LONG-input"
691                class="text" type="text" 
692                value="" style="width: 12em;" maxlength="20">
693            </div>
694           
695            <div id="FLOAT-container" class="numeric">
696              <input 
697                name="FLOAT-input" id="FLOAT-input"
698                class="text" type="text"
699                value="" style="width: 12em;" maxlength="20">
700            </div>
701
702            <div id="DOUBLE-container" class="numeric">
703              <input 
704                name="DOUBLE-input" id="DOUBLE-input"
705                class="text" type="text" 
706                value="" style="width: 12em;" maxlength="20">
707            </div>
708         
709            <div id="unit-container">
710              <select name="unit" id="unit" style="min-width: 5em;"></select>
711            </div>
712           
713            <div id="DATE-container">
714              <table>
715              <tr>
716              <td>
717                <input 
718                  name="DATE-input" id="DATE-input"
719                  class="text" type="text" 
720                  value="" style="width: 15em;" maxlength="20" 
721                  title="Enter date in format: <%=htmlDateFormat%>">
722              </td>
723              <td>
724                <base:button 
725                  id="DATE-calendar"
726                  image="calendar.png"
727                  title="Calendar&hellip;" 
728                  tooltip="Select a date from a calendar"
729                />
730              </td>
731              </tr>
732              </table>
733            </div>
734           
735            <div id="TIMESTAMP-container">
736              <table>
737              <tr>
738              <td>
739                <input 
740                  name="TIMESTAMP-input" id="TIMESTAMP-input"
741                  class="text" type="text" 
742                  value="" style="width: 15em;" maxlength="20" 
743                  title="Enter date + time in format: <%=htmlDateTimeFormat%>">
744              </td>
745              <td>
746                <base:button 
747                  id="TIMESTAMP-calendar"
748                  image="calendar.png"
749                  title="Calendar&hellip;" 
750                  tooltip="Select date and time from a calendar"
751                />
752              </td>
753              </tr>
754              </table>
755            </div>
756         
757            <div id="BOOLEAN-container">
758              <label class="not-specified"><input type="radio" name="BOOLEAN-input" id="BOOLEAN-input-NULL" 
759                value="" checked>- not specified -</label><br>
760              <label><input type="radio" name="BOOLEAN-input" id="BOOLEAN-input-TRUE" 
761                value="true">true</label><br>
762              <label><input type="radio" name="BOOLEAN-input" id="BOOLEAN-input-FALSE"
763                value="false">false</label>
764            </div>
765          </div>
766         
767          <div id="selected-description" class="messagecontainer help">
768          </div>
769        </div>
770 
771      </div>
772    </div>
773    </form>
774    <%
775    if (standalone)
776    {
777      %>
778      </div>
779      <base:buttongroup subclass="dialogbuttons topborder">
780        <base:button id="btnSave" title="Save" visible="<%=writePermission%>" />
781        <base:button id="close" title="Cancel"  visible="<%=writePermission%>" />
782        <base:button id="close" title="Close" visible="<%=!writePermission%>" />
783      </base:buttongroup>
784      <form name="modified" method="post" action="index.jsp?ID=<%=ID%>">
785        <input type="hidden" name="cmd" value="SaveAnnotations">
786        <input type="hidden" name="item_type" value="<%=itemType.name()%>">
787        <input type="hidden" name="item_id" value="<%=itemId%>">
788      </form>
789      <%
790    }
791    %>
792  </base:body>
793  </base:page>
794  <%
795}
796finally
797{
798  if (dc != null) dc.close();
799}
800%>
Note: See TracBrowser for help on using the repository browser.