source: trunk/grails-app/views/study/show.gsp @ 522

Last change on this file since 522 was 522, checked in by roberth, 12 years ago

Fixed IE7 issues with studies and publications, including bug #85

  • Property svn:keywords set to Date Author Rev
File size: 28.4 KB
Line 
1
2<%@ page import="dbnp.studycapturing.Study" %>
3<%@ page import="dbnp.studycapturing.RelTime" %>
4<html>
5  <head>
6    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
7    <meta name="layout" content="main" />
8    <g:set var="entityName" value="${message(code: 'study.label', default: 'Study')}" />
9    <title><g:message code="default.show.label" args="[entityName]" /></title>
10    <script type="text/javascript">
11      // Flag whether the timelines have been loaded
12      var timelineloaded = false;
13     
14      // Number of timelines that should be loaded
15      var numTimelines = ${studyList.size()};
16     
17      // This method is called on the event body.onLoad
18      $(function() {
19              $("#tabs").tabs({
20                show: function(event, ui) {
21                  // If the events tab is shown, the timeline should be redrawn
22                  if( ui.tab.hash == '#events' && !timelineloaded ) {
23                    loadTimeline( 'eventstimeline', 'eventtitles', 0 );
24                    timelineloaded = true;
25                  }
26                }
27              });
28      });
29    </script>
30    <link rel="stylesheet" type="text/css" href="${resource(dir: 'css', file: 'studies.css')}"/>
31
32    <!-- Include scripts for the SIMILE timeline. See http://simile-widgets.org/wiki/ -->
33    <script type="text/javascript">
34      Timeline_ajax_url="${resource(dir: 'js', file: 'timeline-simile/timeline_ajax/simile-ajax-api.js')}";
35      Timeline_urlPrefix='${resource(dir: 'js', file: 'timeline-simile/')}';
36      Timeline_parameters='bundle=true';
37    </script>
38    <script src="${resource(dir: 'js', file: 'timeline-simile/timeline-api.js')}" type="text/javascript"></script>
39    <script src="${resource(dir: 'js', file: 'timeline-simile/custom-timeline.js')}" type="text/javascript"></script>
40    <script src="${resource(dir: 'js', file: 'jquery-callback-1.2.js')}" type="text/javascript"></script>
41
42    <!-- Create the JSON objects for the timeline with events -->
43    <script type="text/javascript">
44         /*
45          * Creates timeline bands for displaying different timelines
46          *
47          * @returns array with BandInfo objects, as described on http://simile-widgets.org/wiki/Timeline_GettingStarted
48          */
49        function createTimelineBands( timelineNr ) {
50          var bandInfos = [];
51          var eventSources = [];
52          var overviewEventSource = new Timeline.DefaultEventSource();
53
54          // The way the timeline should look. See http://www.linuxjournal.com/article/9301
55          var theme = Timeline.ClassicTheme.create();
56          var emptyEtherPainter = new Timeline.EmptyEtherPainter( { theme: theme } )
57
58          // Now create the bands for all studies, and add them to one timeline
59          // Multiple timeline on one page do not seem to work
60          <g:set var="bandNr" value="${0}" />
61          <g:each in="${studyList}" var="study" status="timelineNr">
62              // The date that the timeline should start on
63              var dateStr = "<g:formatDate format="yyyy/MM/dd HH:mm:ss" date="${study.startDate}"/>";
64              firstDate = new Date ( dateStr );
65
66              //------------- Eventgroup overview ---------------
67
68              <g:set var="datesBandNr" value="${bandNr}" />
69              // Add an empty band to show the dates
70              bandInfos[${bandNr}] =
71                     Timeline.createBandInfo({
72                        width:          40,
73                        intervalUnit:   Timeline.DateTime.DAY,
74                        intervalPixels: 40,
75                        showEventText:  false,
76                        date:           firstDate,
77                        timeZone:       +1,
78                        layout:         'original',
79                        theme:          theme
80                     });
81              bandTitleInfo[ timelineNr ][ ${bandNr} ] = {
82                title: "${study.title}",
83                subjects: "",
84                className: "studytitle"
85              };
86
87              <g:set var="bandNr" value="${bandNr+1}" />
88
89              <g:each in="${study.eventGroups}" var="eventGroup" status="i">
90
91                //------------- Eventgroup ${bandNr} ---------------
92
93                // Create an eventsource for all events
94                eventSources[${bandNr}] = new Timeline.DefaultEventSource();
95
96                // Load events for this eventsource (using jquery)
97                var event_url = '${createLink(controller:'study', action:'events', id:eventGroup.id, params: [startDate: study.startDate.getTime() ])}';
98                $.getJSON(event_url, $.callback( _loadJSONEvents, [0, ${bandNr}, eventSources[${bandNr}], overviewEventSource, event_url] ) );
99
100                // Create a new timeline band
101                bandInfos[${bandNr}] =
102                       Timeline.createBandInfo({
103                           eventSource:    eventSources[${bandNr}],
104                           width:          30,
105                           intervalUnit:   Timeline.DateTime.DAY,
106                           intervalPixels: 40,
107                           date:           firstDate,
108                           timeZone:       +1,
109                           syncWith:       1,
110                           layout:         'original',
111                           theme:          theme
112                       });
113
114                // Make sure the date isn't printed by using the empty ether painter
115                bandInfos[${bandNr}].etherPainter = emptyEtherPainter;
116
117                // Add a title to the bandinfo
118                <%
119                  sortedGroupSubjects = eventGroup.subjects.sort( { a, b -> a.name <=> b.name } as Comparator );
120                  def simpleSubjects = sortedGroupSubjects.name.join( ', ' );
121
122                  // We can only show appr. 30 characters per line and as many lines as there are events
123                  def charsPerLine = 30;
124                  def numEvents = eventGroup.events.size();
125                  def maxChars = numEvents * charsPerLine;
126
127                  // If the subjects will fit, show them all
128                  if( simpleSubjects.size() < maxChars ) {
129                    showSubjects = simpleSubjects;
130                  } else {
131                    // Always add the first name
132                    def subjectNames = sortedGroupSubjects[0]?.name;
133
134                    // Continue adding names until the length is to long
135                    id = 0;
136                    sortedGroupSubjects.each { subject ->
137                      if( id > 0 ) {
138                        println( "ID: " + id + " - " + subjectNames.size() + " - " + subject.name.size() + " - " + maxChars );
139                        if( subjectNames.size() + subject.name.size() < maxChars - 15 ) {
140                          subjectNames += ", " + subject.name;
141                        } else {
142                          return;
143                        }
144                      }
145                      id++;
146                    }
147
148                    // Add a postfix
149                    subjectNames += " and " + ( sortedGroupSubjects.size() - id ) + " more";
150
151                    showSubjects = subjectNames;
152                  }
153
154
155                %>
156                bandTitleInfo[ timelineNr ][ ${bandNr} ] = {
157                  title: "${eventGroup.name}",
158                  subjects: "${showSubjects}"
159                };
160
161                <g:set var="bandNr" value="${bandNr+1}" />
162              </g:each>
163
164              // Synchronize all bands
165              <g:each in="${study.eventGroups}" var="eventGroup" status="i">
166                bandInfos[${i + datesBandNr +1}].syncWith = ${datesBandNr};
167              </g:each>
168
169          </g:each>
170
171          return bandInfos;
172        }
173     </script>
174</head>
175<body>
176
177  <div class="body" id="studies">
178    <h1><g:message code="default.show.label" args="[entityName]" /></h1>
179    <g:if test="${flash.message}">
180      <div class="message">${flash.message}</div>
181    </g:if>
182    <div class="dialog">
183      <div id="tabs">
184        <ul>
185          <li><a href="#study">Study Information</a></li>
186          <li><a href="#subjects">Subjects</a></li>
187          <li><a href="#events">Events</a></li>
188          <li><a href="#event-group">Event Groups</a></li>
189          <li><a href="#assays">Assays</a></li>
190          <li><a href="#persons">Persons</a></li>
191          <li><a href="#publications">Publications</a></li>
192        </ul>
193
194        <div id="study">
195          <table>
196            <!-- only show the head section if there are multiple studies -->
197            <g:if test="${multipleStudies}">
198              <thead>
199                <tr>
200                  <th></th>
201                  <g:each in="${studyList}" var="studyInstance">
202                    <th>${studyInstance.title}</th>
203                  </g:each>
204                </tr>
205              </thead>
206            </g:if>
207            <%
208              // Determine a union of the fields from all studies, in order
209              // to show a proper list. We want every field to appear just once,
210              // so the list is filtered for unique values
211              studyFields = studyList[0].giveDomainFields() + studyList*.giveTemplateFields().flatten().unique()
212            %>
213            <!-- Show all template and domain fields, if filled -->
214            <g:each in="${studyFields}" var="field">
215              <%
216                // If a value is not set for any of the selected studies, the
217                // field should not appear in the list
218                showField = true in studyList.collect { it.fieldExists( field.name ) && it.getFieldValue( field.name ) != null }.flatten()
219              %>
220              <g:if test="${showField}">
221                <tr>
222                  <td>${field}</td>
223                  <g:each in="${studyList}" var="studyInstance">
224                    <td>${studyInstance.getFieldValue(field.name)}</td>
225                  </g:each>
226                </tr>
227              </g:if>
228            </g:each>
229
230            <!-- Add some extra fields -->
231            <tr>
232              <td>Events</td>
233              <g:each in="${studyList}" var="studyInstance">
234                <td>
235                  <g:if test="${studyInstance.giveEventTemplates().size()==0}">
236                    -
237                  </g:if>
238                  <g:else>
239                   ${studyInstance.giveEventTemplates().name.join(", ")}
240                  </g:else>
241                </td>
242              </g:each>
243            </tr>
244            <tr>
245              <td>Sampling events</td>
246              <g:each in="${studyList}" var="studyInstance">
247                <td>
248                  <g:if test="${studyInstance.giveSamplingEventTemplates().size()==0}">
249                    -
250                  </g:if>
251                  <g:else>
252                   ${studyInstance.giveSamplingEventTemplates().name.join(", ")}
253                  </g:else>
254                </td>
255              </g:each>
256            </tr>
257            <tr>
258              <td>Readers</td>
259              <g:each in="${studyList}" var="studyInstance">
260                <td>
261                  <g:if test="${studyInstance.readers.size()==0}">
262                    -
263                  </g:if>
264                  <g:else>
265                    <g:each in="${studyInstance.readers}" var="r" status="i">
266                      <g:if test="${i > 0}">, </g:if>
267                      <g:link controller="user" action="show" id="${r.id}">${r?.encodeAsHTML()}</g:link>
268                    </g:each>
269                  </g:else>
270                </td>
271              </g:each>
272            </tr>
273            <tr>
274              <td>Editors</td>
275              <g:each in="${studyList}" var="studyInstance">
276                <td>
277                  <g:if test="${studyInstance.editors.size()==0}">
278                    -
279                  </g:if>
280                  <g:else>
281                    <g:each in="${studyInstance.editors}" var="r" status="i">
282                      <g:if test="${i > 0}">, </g:if>
283                      <g:link controller="user" action="show" id="${r.id}">${r?.encodeAsHTML()}</g:link>
284                    </g:each>
285                  </g:else>
286                </td>
287              </g:each>
288            </tr>
289
290          </table>
291        </div>
292
293        <div id="subjects">
294
295          <g:if test="${studyList*.subjects.flatten().size()==0}">
296            No subjects in the selected studies
297          </g:if>
298          <g:else>
299            <table>
300              <thead>
301                <tr>
302                  <g:if test="${multipleStudies}">
303                    <th></th>
304                  </g:if>
305                  <g:each in="${new dbnp.studycapturing.Subject().giveDomainFields()}" var="field">
306                    <th>${field}</th>
307                  </g:each>
308
309                  <%
310                    // Determine a union of the fields for all different
311                    // subjects in all studies. In order to show a proper list.
312                    // We want every field to appear just once,
313                    // so the list is filtered for unique values
314                    subjectTemplates = studyList*.giveSubjectTemplates().flatten().unique()
315                    subjectFields = subjectTemplates*.fields.flatten().unique()
316
317                    showSubjectFields = subjectFields
318
319                    /*
320                     * These lines are rewritten because
321                     * performance sucked
322                     *
323                     *   // These took about 9 seconds (for 31 subjects and
324                     *   allSubjects = studyList*.subjects.flatten()
325                     *
326                     *   subjectFields = subjectFields.findAll { subjectField ->
327                     *     ( true in allSubjects.collect { subject -> subject.fieldExists( subjectField.name ) && subject.getFieldValue( subjectField.name ) != null }.flatten() )
328                     *   }
329                     */
330
331                    // Filter out all fields that are left blank for all subjects
332                    allSubjects = studyList*.subjects.flatten()
333
334                    showSubjectFields = []
335                    subjectFields.each { subjectField ->
336                      for( subject in allSubjects )
337                      {
338                        // If the field is filled for this subject, we have to
339                        // show the field and should not check any other
340                        // subjects (hence the break)
341                        if( subject.fieldExists( subjectField.name ) && subject.getFieldValue( subjectField.name ) ) {
342                          showSubjectFields << subjectField;
343                          break;
344                        }
345                      }
346                    }
347                  %>
348
349                  <g:each in="${showSubjectFields}" var="field">
350                    <th>${field}</th>
351                  </g:each>
352
353                </tr>
354              </thead>
355
356              <g:set var="i" value="${1}" />
357
358              <g:each in="${studyList}" var="studyInstance">
359                <%
360                  // Sort subjects by name
361                  subjects = studyInstance.subjects;
362                  sortedSubjects = subjects.sort( { a, b -> a.name <=> b.name } as Comparator )
363                %>
364
365                <g:each in="${sortedSubjects}" var="subject" status="j">
366                  <tr class="${(i % 2) == 0 ? 'odd' : 'even'}">
367                    <g:if test="${multipleStudies && j==0}">
368                      <td class="studytitle" rowspan="${sortedSubjects.size()}">
369                        ${studyInstance.title}
370                      </td>
371                    </g:if>
372                    <g:each in="${subject.giveDomainFields()}" var="field">
373                      <td>${subject.getFieldValue(field.name)}</td>
374                    </g:each>
375                 
376                    <g:each in="${showSubjectFields}" var="field">
377                      <td>
378                        <g:if test="${subject.fieldExists(field.name)}">
379                          ${subject.getFieldValue(field.name)}
380                        </g:if>
381                        <g:else>
382                          N/A
383                        </g:else>
384                      </td>
385                    </g:each>
386
387                  </tr>
388                  <g:set var="i" value="${i + 1}" />
389                </g:each>
390              </g:each>
391            </table>
392          </g:else>
393        </div>
394
395        <div id="events">
396          <g:if test="${studyList*.events.flatten().size()==0 && studyInstance*.samplingEvents.flatten().size()==0 }">
397            No events in these studies
398          </g:if>
399          <g:else>
400            <g:each in="${studyList}" var="study" status="i">
401              <div style="margin: 10px; ">
402                <div class="eventtitles" id="eventtitles-${i}"></div>
403                <div class="eventstimeline" id="eventstimeline-${i}"></div>
404              </div>
405            </g:each>
406            <noscript>
407              <table>
408                <thead>
409                  <tr>
410                    <g:if test="${multipleStudies}">
411                      <th></th>
412                    </g:if>
413                    <th>Start time</th>
414                    <th>Duration</th>
415                    <th>Type</th>
416                    <th>Sampling event</th>
417                    <th>Parameters</th>
418                  </tr>
419                </thead>
420
421                <g:set var="i" value="${1}" />
422
423                <g:each in="${studyList}" var="studyInstance">
424                  <%
425                    // Sort events by starttime and duration
426                    events = studyInstance.events + studyInstance.samplingEvents;
427                    sortedEvents = events.sort( { a, b ->
428                          a.startTime == b.startTime ?
429                            a.getDuration().getValue() <=> b.getDuration().getValue() :
430                            a.startTime <=> b.startTime
431                      } as Comparator )
432                  %>
433
434                  <g:each in="${sortedEvents}" var="event" status="j">
435                    <tr class="${(i % 2) == 0 ? 'odd' : 'even'}">
436                      <g:if test="${multipleStudies && j==0}">
437                        <td class="studytitle" rowspan="${sortedEvents.size()}">
438                          ${studyInstance.title}
439                        </td>
440                      </g:if>
441                      <td>${new RelTime(event.startTime).toPrettyString()}</td>
442                      <td>${event.getPrettyDuration()}</td>
443                      <td>${event.template.name}</td>
444                      <td>
445                        <g:if test="${event instanceof dbnp.studycapturing.SamplingEvent}">
446                          <g:checkBox name="samplingEvent" disabled="${true}" value="${true}"/>
447                        </g:if>
448                        <g:else>
449                          <g:checkBox name="event" disabled="${true}" value="${false}" />
450                        </g:else>
451                      </td>
452                      <td>
453                        <g:set var="fieldCounter" value="${1}" />
454                        <g:each in="${event.giveTemplateFields()}" var="field">
455                          <g:if test="${event.getFieldValue(field.name)}">
456                            <g:if test="${fieldCounter > 1}">, </g:if>
457                              ${field.name} = ${event.getFieldValue( field.name )}
458                            <g:set var="fieldCounter" value="${fieldCounter + 1}" />
459                          </g:if>
460                        </g:each>
461                      </td>
462                    </tr>
463
464                    <g:set var="i" value="${i + 1}" />
465                  </g:each>
466                </g:each>
467              </table>
468
469            </noscript>
470
471          </g:else>
472        </div>
473
474        <div id="event-group">
475          <g:if test="${studyList*.eventGroups.flatten().size()==0}">
476            No event groups in this study
477          </g:if>
478          <g:else>
479            <%
480              // Determine a union of the event templates for all different
481              // eventgroups in all studies, in order to show a proper list.
482              // We want every field to appear just once,
483              // so the list is filtered for unique values
484              groupTemplates = studyList*.giveAllEventTemplates().flatten().unique()
485              subjectFields = subjectTemplates*.fields.flatten().unique()
486            %>
487            <table>
488              <thead>
489                <tr>
490                  <g:if test="${multipleStudies}">
491                    <th></th>
492                  </g:if>
493                  <th>Name</th>
494                  <th colspan="${groupTemplates.size()}">Events</th>
495                  <th>Subjects</th>
496                </tr>
497                <tr>
498                  <g:if test="${multipleStudies}">
499                    <th></th>
500                  </g:if>
501                  <th></th>
502                  <g:each in="${groupTemplates}" var="eventTemplate">
503                    <th>${eventTemplate.name}</th>
504                  </g:each>
505                  <th></th>
506                </tr>
507              </thead>
508
509              <g:set var="i" value="${1}" />
510
511              <g:each in="${studyList}" var="studyInstance">
512
513                <g:each in="${studyInstance.eventGroups}" var="eventGroup" status="j">
514                  <tr class="${(i % 2) == 0 ? 'odd' : 'even'}">
515                    <g:if test="${multipleStudies && j==0}">
516                      <td class="studytitle" rowspan="${studyInstance.eventGroups.size()}">
517                        ${studyInstance.title}
518                      </td>
519                    </g:if>
520                    <td>${eventGroup.name}</td>
521
522                    <g:each in="${groupTemplates}" var="currentEventTemplate">
523                      <td>
524                        <g:each in="${eventGroup.events}" var="event">
525                          <g:if test="${event.template.name==currentEventTemplate.name}">
526
527                            <g:set var="fieldCounter" value="${1}" />
528                            <g:each in="${event.giveTemplateFields()}" var="field">
529                              <g:if test="${event.getFieldValue(field.name)}">
530                                <g:if test="${fieldCounter > 1}">, </g:if>
531                                  ${field.name} = ${event.getFieldValue( field.name )}
532                                <g:set var="fieldCounter" value="${fieldCounter + 1}" />
533                              </g:if>
534                            </g:each>
535                          </g:if>
536                        </g:each>
537                      </td>
538                    </g:each>
539                    <td>
540                      <% sortedGroupSubjects = eventGroup.subjects.sort( { a, b -> a.name <=> b.name } as Comparator )  %>
541                      ${sortedGroupSubjects.name.join( ', ' )}
542                    </td>
543                  </tr>
544
545                  <g:set var="i" value="${i + 1}" />
546                </g:each>
547
548              </g:each>
549
550            </table>
551          </g:else>
552        </div>
553
554        <div id="assays">
555          <g:if test="${studyList*.assays.flatten().size()==0}">
556            No assays in these studies
557          </g:if>
558          <g:else>
559            <table>
560              <thead>
561                <tr>
562                  <g:if test="${multipleStudies}">
563                    <th></th>
564                  </g:if>
565                  <th width="100">Assay Name</th>
566                  <th width="100">Module</th>
567                  <th>Type</th>
568                  <th width="150">Platform</th>
569                  <th>Url</th>
570                  <th>Samples</th>
571                </tr>
572              </thead>
573              <g:set var="i" value="${1}" />
574
575              <g:each in="${studyList}" var="studyInstance">
576                <g:each in="${studyInstance.assays}" var="assay" status="j">
577                  <tr class="${(i % 2) == 0 ? 'odd' : 'even'}">
578                    <g:if test="${multipleStudies && j==0}">
579                      <td class="studytitle" rowspan="${studyInstance.assays.size()}">
580                        ${studyInstance.title}
581                      </td>
582                    </g:if>
583                    <td>${assay.name}</td>
584                    <td>${assay.module.name}</td>
585                    <td>${assay.module.type}</td>
586                    <td>${assay.module.platform}</td>
587                    <td>${assay.module.url}</td>
588                    <td>
589                      <% sortedAssaySamples = assay.samples.sort( { a, b -> a.name <=> b.name } as Comparator )  %>
590                      ${sortedAssaySamples.name.join( ', ' )}
591                    </td>
592                  </tr>
593                  <g:set var="i" value="${i + 1}" />
594
595                </g:each>
596              </g:each>
597            </table>
598          </g:else>
599        </div>
600
601        <div id="persons">
602          <%
603            // Determine a list of all persons
604            allPersons = studyList*.persons*.person.flatten().unique()
605          %>
606          <g:if test="${allPersons.size()==0}">
607            No persons involved in these studies
608          </g:if>
609          <g:else>
610            <table>
611              <tr>
612                <thead>
613                  <th>Name</th>
614                  <th>Affiliations</th>
615                  <th>Phone</th>
616                  <th>Email</th>
617                  <g:if test="${multipleStudies}">
618                    <g:each in="${studyList}" var="studyInstance">
619                      <th>${studyInstance.title}</th>
620                    </g:each>
621                  </g:if>
622                  <g:else>
623                    <th>Role</th>
624                  </g:else>
625                </thead>
626              </tr>
627              <g:each in="${allPersons}" var="person" status="i">
628                <tr class="${(i % 2) == 0 ? 'odd' : 'even'}">
629                  <td>${person.firstName} ${person.prefix} ${person.lastName}</td>
630                  <td>
631                    ${person.affiliations.join(', ')}
632                  </td>
633                  <td>${person.phone}</td>
634                  <td>${person.email}</td>
635                  <g:each in="${studyList}" var="studyInstance">
636                    <%
637                      studyperson = studyInstance.persons.find { it.person == person }
638                    %>
639                    <td>
640                      <g:if test="${studyperson}">
641                        ${studyperson.role.name}
642                      </g:if>
643                     </td>
644                  </g:each>
645
646                </tr>
647              </g:each>
648            </table>
649          </g:else>
650        </div>
651
652        <div id="publications">
653          <%
654            // Determine a list of all persons
655            allPublications = studyList*.publications.flatten().unique()
656          %>
657          <g:if test="${allPublications.size()==0}">
658            No publications attached to these studies
659          </g:if>
660          <g:else>
661            <table>
662              <tr>
663                <thead>
664                  <th>Title</th>
665                  <th>Authors</th>
666                  <th>Comments</th>
667
668                  <g:if test="${multipleStudies}">
669                    <g:each in="${studyList}" var="studyInstance">
670                      <th>${studyInstance.title}</th>
671                    </g:each>
672                  </g:if>
673                </thead>
674              </tr>
675              <g:each in="${allPublications}" var="publication" status="i">
676                <tr class="${(i % 2) == 0 ? 'odd' : 'even'}">
677                  <td>${publication.title}</td>
678                  <td>
679                    ${publication.authorsList}
680                  </td>
681                  <td>${publication.comments}</td>
682                  <g:if test="${multipleStudies}">
683                    <g:each in="${studyList}" var="studyInstance">
684                      <td>
685                        <g:if test="${publication in studyInstance.publications}">
686                          x
687                        </g:if>
688                      </td>
689                    </g:each>
690                  </g:if>
691                </tr>
692              </g:each>
693            </table>
694          </g:else>
695        </div>
696
697      </div>
698    </div>
699    <br>
700    <div class="buttons">
701      <g:form>
702        <g:if test="${studyList.size() == 1}">
703          <g:set var="studyInstance" value="${studyList[0]}" />
704          <g:hiddenField name="id" value="${studyInstance?.id}" />
705          <span class="button"><g:actionSubmit class="edit" action="edit" value="${message(code: 'default.button.edit.label', default: 'Edit')}" /></span>
706          <span class="button"><g:actionSubmit class="delete" action="delete" value="${message(code: 'default.button.delete.label', default: 'Delete')}" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" /></span>
707        </g:if>
708        <span class="button"><g:link class="backToList" action="list">Back to list</g:link></span>
709      </g:form>
710    </div>
711
712  </div>
713</body>
714</html>
Note: See TracBrowser for help on using the repository browser.