Changeset 370


Ignore:
Timestamp:
Apr 22, 2010, 9:31:50 AM (7 years ago)
Author:
roberth
Message:

Updated studies list to handle the new data model.
Updated the bootstrap to contain some studies with attached events and persons in order to test the updated studies list
Added fieldExists method to TemplateEntity? to check whether a given field exists or not

Location:
trunk/grails-app
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/conf/BootStrap.groovy

    r367 r370  
    4848                        ).with { if (!validate()) { errors.each { println it} } else save()}
    4949
     50                        // Create a few persons, roles and Affiliations
     51                        println ".adding persons, roles and affiliations"
     52                        def affiliation1 = new PersonAffiliation(
     53                            name: "Science Institute NYC"
     54                        ).save();
     55                        def affiliation2 = new PersonAffiliation(
     56                            name: "InfoStats GmbH, Hamburg"
     57                        ).save();
     58                        def role1 = new PersonRole(
     59                            name: "Principal Investigator"
     60                        ).save();
     61                        def role2 = new PersonRole(
     62                            name: "Statician"
     63                        ).save();
     64                        def person1 = new Person(
     65                            lastName: "Scientist",
     66                            firstName: "John",
     67                            midInitials: "R",
     68                            email: "john@scienceinstitute.com",
     69                            phone: "1-555-3049",
     70                            address: "First street 2,NYC"
     71                        )
     72                        .addToAffiliations( affiliation1 )
     73                        .addToAffiliations( affiliation2 )
     74                        .save();
     75                       
     76                        def person2 = new Person(
     77                            lastName: "Statician",
     78                            firstName: "Jane",
     79                            midInitials: "W",
     80                            email: "jane@statisticalcompany.de",
     81                            phone: "49-555-8291",
     82                            address: "Dritten strasse 38, Hamburg, Germany"
     83                        )
     84                        .addToAffiliations( affiliation2 )
     85                        .save();
    5086
    5187 /*   COMMENTED OUT BECAUSE IT BREAKS EVERYTHING AFTER REFACTORING THE DATAMODEL
     
    223259                        def studyTemplate = new Template(
    224260                                name: 'Academic study', entity: dbnp.studycapturing.Study)
    225                                 .addToFields(new TemplateField(name: 'Description',type: TemplateFieldType.TEXT))
     261                                //.addToFields(new TemplateField(name: 'Description',type: TemplateFieldType.TEXT))
    226262                                .addToFields(new TemplateField(name: 'Study code',type: TemplateFieldType.STRING))
    227263                                .addToFields(new TemplateField(name: 'Objectives',type: TemplateFieldType.TEXT))
     
    303339
    304340                        // Human sample template
    305 /* COMMENTED OUT AS IT BREAKS THE WHOLE LOT
    306341                        def humanSampleTemplate = new Template(
    307342                                name: 'Human tissue sample', entity: dbnp.studycapturing.Sample)
     
    363398
    364399
     400                        // Event template
     401                        def dietTreatmentTemplate = new Template(
     402                                name: 'Diet treatment ', entity: dbnp.studycapturing.Event)
     403                        .addToFields(sampleDescriptionField)
     404                        .addToFields(new TemplateField(
     405                                name: 'Diet', type: TemplateFieldType.STRING))
     406                        .with { if (!validate()) { errors.each { println it} } else save()}
     407
     408                        def boostTreatmentTemplate = new Template(
     409                                name: 'Boost treatment ', entity: dbnp.studycapturing.Event)
     410                        .addToFields(sampleDescriptionField)
     411                        .addToFields(new TemplateField(
     412                                name: 'Compound', type: TemplateFieldType.STRING))
     413                        .with { if (!validate()) { errors.each { println it} } else save()}
     414
     415                        /*
    365416                        //events
    366417                        def eventDiet = new EventDescription(
     
    403454
    404455                        println('Adding PPS3 study...')
    405 
     456                        */
    406457                        // studies
    407458                        def exampleStudy = new Study(
     
    410461                                code:"PPS3_leptin_module",
    411462                                researchQuestion:"Leptin etc.",
    412                                 description:"C57Bl/6 mice were fed a high fat (45 en%) or low fat (10 en%) diet after a four week run-in on low fat diet. After 1 week 10 mice that received a low fat diet were given an IP leptin challenge and 10 mice of the low-fat group received placebo injections. The same procedure was performed with mice that were fed the high-fat diet. After 4 weeks the procedure was repeated. In total 80 mice were culled.",
    413463                                ecCode:"2007117.c",
    414464                                startDate: Date.parse('yyyy-MM-dd','2007-12-11')
    415                         ).with { if (!validate()) { errors.each { println it} } else save()}
     465                        )
     466                        //.setFieldValue( 'Description', "C57Bl/6 mice were fed a high fat (45 en%) or low fat (10 en%) diet after a four week run-in on low fat diet. After 1 week 10 mice that received a low fat diet were given an IP leptin challenge and 10 mice of the low-fat group received placebo injections. The same procedure was performed with mice that were fed the high-fat diet. After 4 weeks the procedure was repeated. In total 80 mice were culled." )
     467                        .with { if (!validate()) { errors.each { println it} } else save()}
    416468
    417469                        def exampleHumanStudy = new Study(
     
    420472                                code:"Human example code",
    421473                                researchQuestion:"Leptin etc.",
    422                                 description:"C57Bl/6 mice were fed a high fat (45 en%) or low fat (10 en%) diet after a four week run-in on low fat diet. After 1 week 10 mice that received a low fat diet were given an IP leptin challenge and 10 mice of the low-fat group received placebo injections. The same procedure was performed with mice that were fed the high-fat diet. After 4 weeks the procedure was repeated. In total 80 mice were culled.",
    423474                                ecCode:"2007117.c",
    424475                                startDate: Date.parse('yyyy-MM-dd','2007-12-11')
    425                         ).with { if (!validate()) { errors.each { println it} } else save()}
     476                        )
     477                        //.setFieldValue( 'Description', "C57Bl/6 mice were fed a high fat (45 en%) or low fat (10 en%) diet after a four week run-in on low fat diet. After 1 week 10 mice that received a low fat diet were given an IP leptin challenge and 10 mice of the low-fat group received placebo injections. The same procedure was performed with mice that were fed the high-fat diet. After 4 weeks the procedure was repeated. In total 80 mice were culled." )
     478                        .with { if (!validate()) { errors.each { println it} } else save()}
    426479
    427480                        def evLF = new Event(
    428481                                startTime: Date.parse('yyyy-MM-dd','2008-01-07'),
    429482                                endTime: Date.parse('yyyy-MM-dd','2008-01-14'),
    430                                 eventDescription: eventDiet,
    431                                 parameterStringValues: ['Diet':'10% fat (palm oil)']
    432                         ).with { if (!validate()) { errors.each { println it} } else save()}
     483                                template: dietTreatmentTemplate
     484                        )
     485                        .setFieldValue( 'Diet','10% fat (palm oil)' )
     486                        .with { if (!validate()) { errors.each { println it} } else save()}
    433487
    434488                        def evHF = new Event(
    435489                                startTime: Date.parse('yyyy-MM-dd','2008-01-07'),
    436490                                endTime: Date.parse('yyyy-MM-dd','2008-01-14'),
    437                                 eventDescription: eventDiet,
    438                                 parameterStringValues: ['Diet':'45% fat (palm oil)']
    439                         ).with { if (!validate()) { errors.each { println it} } else save()}
     491                                template: dietTreatmentTemplate
     492                        )
     493                        .setFieldValue( 'Diet','45% fat (palm oil)' )
     494                        .with { if (!validate()) { errors.each { println it} } else save()}
    440495
    441496                        def evBV = new Event(
    442497                                startTime: Date.parse('yyyy-MM-dd','2008-01-07'),
    443498                                endTime: Date.parse('yyyy-MM-dd','2008-01-14'),
    444                                 eventDescription: eventBoost,
    445                                 parameterStringValues: ['Compound':'Vehicle']
    446                         ).with { if (!validate()) { errors.each { println it} } else save()}
     499                                template: boostTreatmentTemplate
     500                        )
     501                        .setFieldValue( 'Compound','Vehicle' )
     502                        .with { if (!validate()) { errors.each { println it} } else save()}
    447503
    448504                        def evBL = new Event(
    449505                                startTime: Date.parse('yyyy-MM-dd','2008-01-07'),
    450506                                endTime: Date.parse('yyyy-MM-dd','2008-01-14'),
    451                                 eventDescription: eventBoost,
    452                                 parameterStringValues: ['Compound':'Leptin']
    453                         ).with { if (!validate()) { errors.each { println it} } else save()}
    454 
     507                                template: boostTreatmentTemplate
     508                        )
     509                        .setFieldValue( 'Compound','Leptin' )
     510                        .with { if (!validate()) { errors.each { println it} } else save()}
     511
     512                        /*
    455513                        def evLF4 = new Event(
    456514                                startTime: Date.parse('yyyy-MM-dd','2008-01-07'),
     
    494552                                        parameterFloatValues: ['Sample weight':5F]
    495553                        ).with { if (!validate()) { errors.each { println it} } else save()}
     554                        */
    496555
    497556                        // Add events to study
     
    501560                        .addToEvents(evBV)
    502561                        .addToEvents(evBL)
    503                         .addToEvents(evLF4)
     562                        /*
     563                        .addToEvents(evLF4)
    504564                        .addToEvents(evHF4)
    505565                        .addToEvents(evBV4)
     
    507567                        .addToSamplingEvents(evS)
    508568                        .addToSamplingEvents(evS4)
     569                        */
    509570                        .save()
    510571
     
    529590                        .with { if (!validate()) { errors.each { println it} } else save()}
    530591
     592                        /*
    531593                        def LFBV4 = new EventGroup(name:"10% fat + vehicle for 4 weeks")
    532594                        .addToEvents(evLF4)
     
    548610                        .addToEvents(evBL4)
    549611                        .with { if (!validate()) { errors.each { println it} } else save()}
     612                        */
    550613
    551614            // Add subjects and samples and compose EventGroups
    552615
    553616                        def x=1
    554                         80.times {
     617                        40.times {
    555618                                def currentSubject = new Subject(
    556619                                        name: "A" + x++,
     
    559622                                )
    560623                                .setFieldValue("Gender", "Male")
    561                                 .setFieldValue("Genotype", c57bl6Term)
     624                                //.setFieldValue("Genotype", c57bl6Term)
    562625                                .setFieldValue("Age (weeks)", 17)
    563626                                .setFieldValue("Cage", "" + (int)(x/2))
     
    568631
    569632                                // Add subject to appropriate EventGroup
    570                                 if (x > 70) { HFBL4.addToSubjects(currentSubject).save() }
     633                                /*
     634                                if (x > 70) { HFBL4.addToSubjects(currentSubject).save() }
    571635                                else if (x > 60) { HFBV4.addToSubjects(currentSubject).save() }
    572636                                else if (x > 50) { LFBL4.addToSubjects(currentSubject).save() }
     
    576640                                else if (x > 10) { LFBL1.addToSubjects(currentSubject).save() }
    577641                                else             { LFBV1.addToSubjects(currentSubject).save() }
    578 
    579                         }
     642                                */
     643
     644                                if (x > 30) { HFBL1.addToSubjects(currentSubject).save() }
     645                                else if (x > 20) { HFBV1.addToSubjects(currentSubject).save() }
     646                                else if (x > 10) { LFBL1.addToSubjects(currentSubject).save() }
     647                                else             { LFBV1.addToSubjects(currentSubject).save() }
     648
     649                        }
    580650
    581651                        // Add EventGroups to study
     
    585655                        .addToEventGroups(HFBV1)
    586656                        .addToEventGroups(HFBL1)
    587                         .addToEventGroups(LFBV4)
    588                         .addToEventGroups(LFBL4)
    589                         .addToEventGroups(HFBV4)
    590                         .addToEventGroups(HFBL4)
    591                         .save()
    592 
    593                         println 'Adding PPSH study'
     657                        //.addToEventGroups(LFBV4)
     658                        //.addToEventGroups(LFBL4)
     659                        //.addToEventGroups(HFBV4)
     660                        //.addToEventGroups(HFBL4)
     661
     662                        // Add persons to study
     663                        def studyperson1 = new StudyPerson( person: person1, role: role1 ).save();
     664                        def studyperson2 = new StudyPerson( person: person2, role: role2 ).save();
     665
     666                        exampleStudy
     667                        .addToPersons( studyperson1 )
     668                        .addToPersons( studyperson2 )
     669                        .save()
     670
     671                        /*
     672                        println 'Adding PPSH study'
    594673
    595674                        def humanStudy = new Study(
  • trunk/grails-app/domain/dbnp/studycapturing/Event.groovy

    r359 r370  
    8888
    8989        def String toString() {
    90                 return eventDescription ? eventDescription.name : ""
     90                return fieldExists( 'Description' ) ? getFieldValue( 'Description') : ""
    9191        }
    9292
  • trunk/grails-app/domain/dbnp/studycapturing/Study.groovy

    r359 r370  
    6060        }
    6161
     62        /**
     63         * Return the unique Event templates that are used in this study
     64         */
     65        def Set<Template> giveEventTemplates() {
     66                TemplateEntity.giveTemplates(events);
     67        }
    6268
     69        /**
     70         * Return the unique SamplingEvent templates that are used in this study
     71         */
     72        def Set<Template> giveSamplingEventTemplates() {
     73                TemplateEntity.giveTemplates(events);
     74        }
     75       
    6376        /**
    6477         * Returns the template of all subjects in the study
  • trunk/grails-app/domain/dbnp/studycapturing/TemplateEntity.groovy

    r359 r370  
    263263
    264264        /**
     265         * Check whether a given template field exists or not
     266         * @param fieldName The name of the template field
     267         * @return true if the given field exists and false otherwise
     268         */
     269        def fieldExists(String fieldName) {
     270                TemplateFieldType fieldType = template.getFieldType(fieldName)
     271
     272                // If the field is found, a TemplateFieldType is returned
     273                // otherwise null
     274                if (fieldType) {
     275                    return true
     276                } else {
     277                    return false
     278                }
     279        }
     280
     281        /**
    265282         * Set a template/entity field value
    266283         * @param fieldName The name of the template or entity field
  • trunk/grails-app/views/study/list.gsp

    r359 r370  
    7171
    7272        </tr>
     73        <g:if test="${studyInstance.fieldExists( 'Description' )}">
    7374        <tr>
    7475          <td></td>
    7576          <td colspan="3">
    7677            <b>${message(code: 'study.description.label', default: 'Description')} </b>:
    77 ${fieldValue(bean: studyInstance, field: "description")}</td>
     78            ${studyInstance.getFieldValue( 'Description' )}
     79           
     80          </td>
    7881        </tr>
     82        </g:if>
    7983        </table>
    8084      </g:each>
  • trunk/grails-app/views/study/list_extended.gsp

    r359 r370  
    2121  <% def tmpList = [] %>
    2222
     23
    2324  <div class="nav">
    2425    <span class="menuButton"><a class="home" href="${createLink(uri: '/')}">Home</a></span>
     
    4344     <% }} %>
    4445
    45     <% if (selectedStudies.size()>0) {%>
     46      <%
     47        /* Determine all template fields that are available in one or more templates used */
     48        def allTemplateFields = []
     49        selectedStudies.each { println it.giveFields(); allTemplateFields += it.giveFields() }
     50        allTemplateFields = allTemplateFields.unique();
     51      %>
     52     <g:if test="${selectedStudies.size()>0}">
    4653
    4754        <div id="tabs">
     
    4956        <li><a href="#study">Study Information</a></li>
    5057        <li><a href="#subjects">Subjects</a></li>
    51         <li><a href="#groups">Groups</a></li>
    52         <li><a href="#protocols">Protocols</a></li>
    5358        <li><a href="#events">Events</a></li>
    54         <li><a href="#event-description">Event Description</a></li>
    5559        <li><a href="#event-group">Event Groups</a></li>
    5660        <li><a href="#assays">Assays</a></li>
     61        <li><a href="#persons">Persons</a></li>
    5762      </ul>
    5863
     
    7479        </g:each>
    7580      </tr>
    76 
    77       <g:each in="${att_list}" var="att">
    78       <tr>
    79         <td><b>${att[0].toUpperCase()+att.substring(1)}</b></td>
    80         <g:each in="${selectedStudies}" status="k" var="studyIns">
    81 
    82    <g:if test="${att == 'events'}">
    83      <td>
    84   <% def eventList = [] %>
    85              <g:each in="${studyIns.events}" var="s">
    86               <%  eventList.add(s.eventDescription) %>
    87              </g:each>
    88   <g:if test="${eventList.size()==0}">
    89           -
    90          </g:if>
    91         <g:else>
    92            <% def sampEvent = eventList.get(0).name %>
    93            ${sampEvent}
    94          <g:each in="${eventList}" var="event">
    95            <g:if test="${(event.name!=sampEvent)}">
    96             ${event.name}
    97          </g:if>
     81      <tr>
     82        <td><b>Template</b></td>
     83        <g:each in="${selectedStudies}" status="k" var="studyIns">
     84          <td><g:link controller="template" action="show" id="${studyIns.template?.id}">
     85${studyInse?.template?.encodeAsHTML()}</g:link></td>
     86        </g:each>
     87      </tr>
     88
     89      <tr>
     90        <td><b>Title</b></td>
     91        <g:each in="${selectedStudies}" status="k" var="studyIns">
     92          <td>${fieldValue(bean: studyIns, field: "title")}</td>
     93        </g:each>
     94      </tr>
     95      <tr>
     96        <td><b>Start</b></td>
     97        <g:each in="${selectedStudies}" status="k" var="studyIns">
     98          <td><g:formatDate date="${studyIns?.startDate}" /></td>
     99        </g:each>
     100      </tr>
     101     
     102      <tr>
     103        <td><b>Date Created</b></td>
     104        <g:each in="${selectedStudies}" status="k" var="studyIns">
     105          <td><g:formatDate date="${studyIns?.dateCreated}" /></td>
     106        </g:each>
     107      </tr>
     108      <tr>
     109        <td><b>Last updated</b></td>
     110        <g:each in="${selectedStudies}" status="k" var="studyIns">
     111          <td><g:formatDate date="${studyIns?.lastUpdated}" /></td>
     112        </g:each>
     113      </tr>
     114
     115      <tr>
     116        <td><b>Events</b></td>
     117        <g:each in="${selectedStudies}" status="k" var="studyIns">
     118          <td>
     119            <g:if test="${studyIns.giveEventTemplates().size()==0}">
     120              -
     121            </g:if>
     122            <g:else>
     123             ${studyIns.giveEventTemplates().name}
     124            </g:else>
     125          </td>
     126        </g:each>
     127      </tr>
     128      <tr>
     129        <td><b>Sampling Events</b></td>
     130        <g:each in="${selectedStudies}" status="k" var="studyIns">
     131          <td>
     132            <g:if test="${studyIns.giveSamplingEventTemplates().size()==0}">
     133              -
     134            </g:if>
     135            <g:else>
     136             ${studyIns.giveSamplingEventTemplates().name}
     137            </g:else>
     138          </td>
     139        </g:each>
     140      </tr>
     141      <tr>
     142        <td><b>Owner</b></td>
     143        <g:each in="${selectedStudies}" status="k" var="studyIns">
     144          <td>
     145            <g:link controller="user" action="show" id="${studyIns?.owner?.id}">${studyIns?.owner?.encodeAsHTML()}</g:link>
     146          </td>
     147        </g:each>
     148      </tr>
     149
     150      <tr>
     151        <td><b>Readers</b></td>
     152        <g:each in="${selectedStudies}" status="k" var="studyIns">
     153          <td>
     154            <g:if test="${studyIns.readers.size()==0}">
     155              -
     156            </g:if>
     157            <g:else>
     158              <g:each in="${studyIns.readers}" var="r">
     159                <li><g:link controller="user" action="show" id="${r.id}">${r?.encodeAsHTML()}</g:link></li>
     160              </g:each>
     161            </g:else>
     162          </td>
     163        </g:each>
     164      </tr>
     165      <tr>
     166        <td><b>Editors</b></td>
     167        <g:each in="${selectedStudies}" status="k" var="studyIns">
     168          <td>
     169            <g:if test="${studyIns.editors.size()==0}">
     170              -
     171            </g:if>
     172            <g:else>
     173              <g:each in="${studyIns.editors}" var="r">
     174                <li><g:link controller="user" action="show" id="${r.id}">${r?.encodeAsHTML()}</g:link></li>
     175              </g:each>
     176            </g:else>
     177          </td>
     178        </g:each>
     179      </tr>
     180
     181      <!-- All template fields -->
     182      <g:each in="${allTemplateFields}" var="field">
     183        <tr>
     184          <td><b>${field.name}</b></td>
     185          <g:each in="${selectedStudies}" status="k" var="studyIns">
     186            <td>
     187              <g:if test="${studyIns.fieldExists(field.name)}">
     188                ${studyIns.getFieldValue(field.name)}
     189              </g:if>
     190              <g:else>
     191                -
     192              </g:else>
     193            </td>
    98194          </g:each>
    99          </g:else>
    100           </td>
    101         </g:if>
    102 
    103 <g:elseif test="${att == 'samplingEvents'}">
    104      <td>
    105   <% def SampeventList = [] %>
    106              <g:each in="${studyIns.samplingEvents}" var="s">
    107               <%  SampeventList.add(s.eventDescription) %>
    108              </g:each>
    109   <g:if test="${SampeventList.size()==0}">
    110           -
    111          </g:if>
    112         <g:else>
    113            <% def samplEvent = SampeventList.get(0).name %>
    114            ${samplEvent}
    115          <g:each in="${SampeventList}" var="samplingEvent">
    116            <g:if test="${(samplingEvent.name!=samplEvent)}">
    117             ${samplingEvent.name}
    118          </g:if>
    119           </g:each>
    120          </g:else>
    121           </td>
    122 </g:elseif>
    123 
    124           <g:else>
    125 <td>${fieldValue(bean: studyIns, field: att)}</td>
    126           </g:else>
    127         </g:each>
    128       </tr>
     195        </tr>
    129196      </g:each>
    130197
     
    186253      </div>
    187254
    188           <div id="groups">
    189 <table border="2">
    190   <tr>
    191          <g:each in="${selectedStudies}" var="study">
    192            <td width="50%"><center><b>${study.title}</b></center></td>
    193          </g:each>
    194        </tr>
    195          <tr>
    196          <g:each in="${selectedStudies}" var="study">
    197            <td>
    198   <g:if test="${study.groups.size()==0}"> No groups in this study </g:if>
    199   <g:else><center><b>${study.groups}</b></center></g:else>
    200          </td>
    201          </g:each>
    202        </tr>
    203 </table>
    204         </div>
    205 
    206           <div id="protocols">
    207          <table border="2">
    208          <tr>
    209          <g:each in="${selectedStudies}" var="study">
    210            <td width="50%"><center><b>${study.title}</b></center></td>
    211          </g:each>
    212        </tr>
    213 
    214          <tr>
    215          <g:each in="${selectedStudies}" var="stud">
    216              <td>
    217                 <table>
    218           <tr>
    219             <td><b>Id </b></td>
    220             <td><b>Name</b></td>
    221             <td><b>Parameters</b></td>
    222             <td><b>Reference</b></td>
    223           </tr>
    224 
    225           <% def protocol_list = [] %>
    226           <% protocol_list.add(stud.events.eventDescription.protocol.unique()) %>
    227           <% protocol_list.addAll(stud.samplingEvents.eventDescription.protocol.unique()) %>
    228 
    229           <g:each in="${protocol_list}" var="protocol">
    230             <tr>
    231               <td><g:link controller="protocol" action="show" id="${protocol.id}">${protocol.id}</g:link></td>
    232           <td>${protocol.name}</td>
    233           <td>
    234           <g:each in="${protocol.parameters}" var="p"><ul><li>
    235             <g:link controller="protocolParameter" action="show" id="${p.id}">${p.name}</g:link>
    236             </li></ul>
    237           </g:each>
    238           </td>
    239           <td>${protocol.reference}</td>
    240           </tr>
    241           </g:each>
    242              </table>
    243 
    244         </td>
    245            </g:each>
    246          </tr>
    247        </table>
    248        </div>
    249 
    250255          <div id="events">
    251256          <table border="2">
    252          <tr>
    253          <g:each in="${selectedStudies}" var="study">
    254            <td><center><b>${study.title}</b></center></td>
    255          </g:each>
    256        </tr>
    257 
    258          <tr>
    259          <g:each in="${selectedStudies}" var="stud">
    260              <td>
    261 
    262         <table>
    263           <tr>
    264             <td><b>Event Description</b></td>
    265             <td><b>Subject</b></td>
    266             <td><b>Start Time</b></td>
    267             <td><b>Duration</b></td>
    268             <td><b>Sampling Event</b></td>
    269             <td><b>Parameters</b></td>
    270           </tr>
    271 
    272           <g:each in="${stud.events}" var="e">
    273             <tr>
    274               <td><g:link controller="event" action="show" id="${e.id}">  ${e.eventDescription.name}</g:link></td>
    275           <td>?</td>
    276           <td>${e.getPrettyDuration(stud.startDate,e.startTime)}</td>
    277           <td>${e.getPrettyDuration()}</td>
    278            <td><g:checkBox name="event" disabled="${true}" value="${false}"/></td>
    279 
    280            </tr>
    281           </g:each>
    282 
    283           <g:each in="${stud.samplingEvents}" var="e">
    284           <tr>
    285           <td><g:link controller="event" action="show" id="${e.id}">${e.eventDescription.name}</g:link></td>
    286           <td>?</td>
    287           <td>${e.getPrettyDuration(stud.startDate,e.startTime)}</td>
    288           <td>${e.getPrettyDuration()}</td>
    289             <td><g:checkBox name="samplingEvent" disabled="${true}" value="${true}"/></td>
    290 
    291             <g:each in="${e.eventDescription.protocol.parameters}" var="param">
    292           <td>
    293             ${param.name} : ${param.listEntries}
    294           </td>
    295             </g:each>
    296           </tr>
    297           </g:each>
    298 
    299 
    300         </table>
    301         </td>
    302            </g:each>
    303          </tr>
    304        </table>
     257            <tr>
     258              <g:each in="${selectedStudies}" var="study">
     259                <td><center><b>${study.title}</b></center></td>
     260              </g:each>
     261            </tr>
     262
     263            <tr>
     264              <g:each in="${selectedStudies}" var="study">
     265                <td>
     266
     267                  <g:if test="${study.events.size()+study.samplingEvents.size()==0}">
     268                    No events in this study
     269                  </g:if>
     270                  <g:else>
     271                      <table>
     272                        <tr>
     273                          <td><b>Id </b></td>
     274                          <td><b>Start time</b></td>
     275                          <td><b>Duration</b></td>
     276                          <td><b>Type</b></td>
     277                          <td><b>Sampling event</b></td>
     278                          <td><b>Parameters</b></td>
     279                        </tr>
     280
     281                        <g:each in="${study.events + study.samplingEvents}" var="event">
     282                          <tr>
     283                            <td><g:link controller="event" action="show" id="${event.id}">${event.id}</g:link></td>
     284                            <td>${event.getPrettyDuration(study.startDate,event.startTime)}</td>
     285                            <td>${event.getPrettyDuration()}</td>
     286                            <td>${event.template.name}</td>
     287                            <td>
     288                              <g:if test="${event instanceof dbnp.studycapturing.SamplingEvent}">
     289                                <g:checkBox name="samplingEvent" disabled="${true}" value="${true}"/>
     290                              </g:if>
     291                              <g:else>
     292                                <g:checkBox name="event" disabled="${true}" value="${false}" />
     293                              </g:else>
     294                            </td>
     295                            <td>
     296                              <g:set var="fieldCounter" value="${1}" />
     297                              <g:each in="${event.giveFields()}" var="field">
     298                                <g:if test="${event.getFieldValue(field.name)}">
     299                                  <g:if test="${fieldCounter > 1}">, </g:if>
     300                                    ${field.name} = ${event.getFieldValue( field.name )}
     301                                  <g:set var="fieldCounter" value="${fieldCounter + 1}" />
     302                                </g:if>
     303                              </g:each>
     304                            </td>
     305                          </tr>
     306                        </g:each>
     307                      </table>
     308
     309                  </g:else>
     310
     311                </td>
     312              </g:each>
     313            </tr>
     314          </table>
    305315
    306316      </div>
    307          
    308           <div id="event-description">
    309   <table border="2">
    310   <tr>
    311          <g:each in="${selectedStudies}" var="study">
    312           <td><center><b>${study.title}</b></center></td>
    313          </g:each>
    314   </tr>
    315    <tr>
    316          <g:each in="${selectedStudies}" var="stud">
    317            <td>
    318            <table>
    319           <tr>
    320 
    321             <td><b>Event Name</b></td>
    322             <td><b>Parameters </b></td>
    323           </tr>
    324           <tr>
    325             <td><b></b></td>
    326             <td><b>Name</b></td>
    327             <td><b>Description</b></td>
    328             <td><b>Unit</b></td>
    329             <td><b>Reference</b></td>
    330             <td><b>Options</b></td>
    331             <td><b>Type</b></td>
    332           </tr>
    333           <g:each in="${dbnp.studycapturing.EventDescription.list()}" var="e">
    334           <g:if test="${(stud.events.eventDescription.contains(e))}" >
    335             <tr>
    336               <td>${e.name} </td></tr><tr>
    337             <g:each in="${e.protocol.parameters}" var="p">
    338               <td></td>
    339           <td>${p.name}</td>
    340           <td>${p.description}</td>
    341           <td>${p.unit}</td>
    342           <td>${p.reference}</td>
    343           <g:if test="${(p.listEntries.size()==0)}" >
    344           <td>-</td>
    345             </g:if>
    346           <g:else>
    347           <td>${p.listEntries}</td>
    348           </g:else>
    349           <td>${p.type}</td>
    350             </tr>
    351             </g:each>
    352             </g:if>
    353             </g:each>
    354 
    355            <g:each in="${dbnp.studycapturing.EventDescription.list()}" var="e">
    356           <g:if test="${(stud.samplingEvents.eventDescription.contains(e))}" >
    357             <tr>
    358               <td>${e.name} </td></tr><tr>
    359             <g:each in="${e.protocol.parameters}" var="p">
    360               <td></td>
    361           <td>${p.name}</td>
    362           <td>${p.description}</td>
    363           <td>${p.unit}</td>
    364           <td>${p.reference}</td>
    365           <g:if test="${(p.listEntries.size()==0)}" >
    366           <td>-</td>
    367             </g:if>
    368           <g:else>
    369           <td>${p.listEntries}</td>
    370           </g:else>
    371           <td>${p.type}</td>
    372             </tr>
    373             </g:each>
    374             </g:if>
    375             </g:each>
    376 
    377   </table>
    378         </td>
    379            </g:each>
    380          </tr>
    381        </table>
    382 
    383           </div>
    384 
    385           <div id="event-group">
    386           </div>
     317 
     318        <div id="event-group">
     319          <table border="2">
     320            <tr>
     321              <g:each in="${selectedStudies}" var="study">
     322                <td><center><b>${study.title}</b></center></td>
     323              </g:each>
     324            </tr>
     325
     326            <tr>
     327              <g:each in="${selectedStudies}" var="study">
     328
     329                <g:if test="${study.eventGroups.size()==0}">
     330                  No event groups in this study
     331                </g:if>
     332                <g:else>
     333                  <table>
     334                    <tr>
     335                      <td><b>Name</b></td>
     336                      <td colspan="${study.giveEventTemplates().size()}"><b>Events</b></td>
     337                      <td><b>Subjects</b></td>
     338                    </tr>
     339                    <tr>
     340                      <td></td>
     341                      <g:each in="${study.giveEventTemplates()}" var="eventTemplate">
     342                        <td><b>${eventTemplate.name}</b></td>
     343                      </g:each>
     344                      <td></td>
     345                    </tr>
     346                    <g:each in="${study.eventGroups}" var="eventGroup">
     347                      <tr>
     348                        <td>${eventGroup.name}</td>
     349
     350                        <g:each in="${study.giveEventTemplates()}" var="currentEventTemplate">
     351                          <td>
     352                            <g:each in="${eventGroup.events}" var="event">
     353                              <g:if test="${event.template.name==currentEventTemplate.name}">
     354
     355                                <g:set var="fieldCounter" value="${1}" />
     356                                <g:each in="${event.giveFields()}" var="field">
     357                                  <g:if test="${event.getFieldValue(field.name)}">
     358                                    <g:if test="${fieldCounter > 1}">, </g:if>
     359                                      ${field.name} = ${event.getFieldValue( field.name )}
     360                                    <g:set var="fieldCounter" value="${fieldCounter + 1}" />
     361                                  </g:if>
     362                                </g:each>
     363                              </g:if>
     364                            </g:each>
     365                           </td>
     366                        </g:each>
     367                        <td>${eventGroup.subjects.name.join( ', ' )}</td>
     368                      </tr>
     369                    </g:each>
     370                  </table>
     371                </g:else>
     372
     373              </g:each>
     374            </tr>
     375          </table>
     376        </div>
    387377
    388378          <div id="assays">
     
    438428      </div>
    439429
     430
     431      <div id="persons">
     432        <table border="2">
     433          <tr>
     434            <g:each in="${selectedStudies}" var="study">
     435              <td><center><b>${study.title}</b></center></td>
     436            </g:each>
     437          </tr>
     438          <tr>
     439            <g:each in="${selectedStudies}" var="study">
     440              <td>
     441                <g:if test="${study.persons.size()==0}">
     442                No persons involved in this study
     443                </g:if>
     444                <g:else>
     445                  <table>
     446                    <tr>
     447
     448                      <td><b>Name</b></td>
     449                      <td><b>Affiliations</b></td>
     450                      <td><b>Role</b></td>
     451                      <td><b>Phone</b></td>
     452                      <td><b>Email</b></td>
     453                    </tr>
     454                    <g:each in="${study.persons}" var="studyperson">
     455                      <tr>
     456                        <td>${studyperson.person.firstName} ${studyperson.person.midInitials} ${studyperson.person.lastName}</td>
     457                        <td>
     458                          ${studyperson.person.affiliations.name.join(', ')}
     459                        </td>
     460                        <td>${studyperson.role.name}</td>
     461                        <td>${studyperson.person.phone}</td>
     462                        <td>${studyperson.person.email}</td>
     463                      </tr>
     464                    </g:each>
     465                  </table>
     466                </g:else>
     467              </td>
     468           </g:each>
     469         </tr>
     470       </table>
     471
     472      </div>
     473
    440474    </div>
    441475
    442     <% } %>
     476    </g:if>
    443477   
    444      <% if (selectedStudies.size()==0) {%>
     478    <g:if test="${selectedStudies.size()==0}">
    445479    Please select studies to compare.
    446     <% } %>
     480    </g:if>
    447481
    448482    </div>
  • trunk/grails-app/views/study/show.gsp

    r359 r370  
    2929    <div class="dialog">
    3030
    31 <% protocolList = dbnp.studycapturing.Protocol.list() %>
    32 <% def study_eventsDescription = [] %>
    33 <% study_eventsDescription = studyInstance.events.eventDescription.unique() %>
    34 <% study_eventsDescription.addAll(studyInstance.samplingEvents.eventDescription.unique()) %>
    35 <% def study_events = [] %>
    36 <% study_events = studyInstance.events.unique() %>
    37 <% study_events.addAll(studyInstance.samplingEvents.unique()) %>
    38 
    3931      <div id="tabs">
    4032        <ul>
    4133          <li><a href="#study">Study Information</a></li>
    4234          <li><a href="#subjects">Subjects</a></li>
    43           <li><a href="#groups">Groups</a></li>
    44           <li><a href="#protocols">Protocols</a></li>
    4535          <li><a href="#events">Events</a></li>
    46           <li><a href="#event-description">Event Description</a></li>
    4736          <li><a href="#event-group">Event Groups</a></li>
    4837          <li><a href="#assays">Assays</a></li>
     38          <li><a href="#persons">Persons</a></li>
    4939        </ul>
    5040
     
    5545          <b> Start </b>:<g:formatDate date="${studyInstance?.startDate}" /> <br>
    5646          <b> Events </b>:
    57             <g:if test="${studyInstance.events.eventDescription.size()==0}">
     47            <g:if test="${studyInstance.giveEventTemplates().size()==0}">
    5848              -
    5949            </g:if>
    6050            <g:else>
    61             ${studyInstance.events.eventDescription.unique().toString().replaceAll("]"," ").
    62           substring(1,studyInstance.events.eventDescription.unique().toString().size())}
     51             ${studyInstance.giveEventTemplates().name}
    6352            </g:else>
    6453          <br>
    6554          <b>Sampling Events </b>:
    66             <g:if test="${studyInstance.samplingEvents.eventDescription.size()==0}">
     55            <g:if test="${studyInstance.giveSamplingEventTemplates().size()==0}">
    6756             -
    6857            </g:if>
    6958            <g:else>
    70              ${studyInstance.samplingEvents.eventDescription.unique().toString().replaceAll("]"," ").
    71                  substring(1,studyInstance.samplingEvents.eventDescription.unique().toString().size())}
     59              ${studyInstance.giveSamplingEventTemplates().name}
    7260            </g:else>
    7361          <br>
     
    8674          </g:else>
    8775          <br>
    88           <b>Code </b>: ${fieldValue(bean: studyInstance, field: "code")} <br>
     76
     77          <!-- All template fields -->
     78          <g:each in="${studyInstance.giveFields()}" var="field">
     79            <b>${field.name}</b>: ${studyInstance.getFieldValue(field.name)}<br />
     80          </g:each>
     81
    8982          <b>Editors </b>:
    9083          <g:if test="${studyInstance.editors.size()==0}">
     
    9992          </g:else>
    10093          <br>
    101           <b>EC Code </b>: ${fieldValue(bean: studyInstance, field: "ecCode")} <br>
    102           <b>Research Question </b>: ${fieldValue(bean: studyInstance, field: "researchQuestion")} <br>
    10394          <b>Title </b>: ${fieldValue(bean: studyInstance, field: "title")} <br>
    104           <b>Description </b>: ${fieldValue(bean: studyInstance, field: "description")} <br>
    10595          <b>Owner </b>:<g:link controller="user" action="show" id="${studyInstance?.owner?.id}">${studyInstance?.owner?.encodeAsHTML()}</g:link> <br>
    10696          <b>Date Created </b>:<g:formatDate date="${studyInstance?.dateCreated}" /> <br>
     
    129119                <g:each in="${template.fields}" var="g">
    130120                  <td>
    131 <% print s.getFieldValue(g.toString())  %>
     121                  <% print s.getFieldValue(g.toString())  %>
    132122                  </td>
    133123                </g:each>
     
    140130        </div>
    141131
    142         <div id="groups">
    143           <g:if test="${studyInstance.groups.size()==0}">
    144             No groups in this study
    145           </g:if>
    146           <g:else>
    147             <g:each in="${studyInstance.groups}" var="g">
    148 ${g.name}
    149             </g:each>
    150           </g:else>
    151         </div>
    152 
    153         <div id="protocols">
    154 <% def protocol_list = [] %>
    155 <% protocol_list= studyInstance.events.eventDescription.protocol.unique() %>
    156           <g:if test="${protocol_list.size()==0}">
    157             No protocols in this study
    158           </g:if>
    159           <g:else>
    160             <table>
    161             <tr>
    162               <td><b>Id </b></td>
    163               <td><b>Name</b></td>
    164               <td><b>Parameters</b></td>
    165               <td><b>Reference</b></td>
    166             </tr>
    167             <g:each in="${protocol_list}" var="protocol">
    168               <tr>
    169               <td><g:link controller="protocol" action="show" id="${protocol.id}">${protocol.id}</g:link></td>
    170               <td>${protocol.name}</td>
    171               <td>
    172               <g:each in="${protocol.parameters}" var="p">
    173                   <g:link controller="protocolParameter" action="show" id="${p.id}">${p.name}</g:link>
    174               </g:each>
    175               </td>
    176               <td>${protocol.reference}</td>
    177               </tr>
    178 
    179             </g:each>
    180           </table>
    181           </g:else>
    182         </div>
    183132
    184133        <div id="events">
    185           <g:if test="${study_events.size()==0}">
    186            No events in this study
    187           </g:if>
    188           <g:else>
    189           <table>
    190             <tr>
    191               <td><b>Subject</b></td>
    192               <td><b>Start Time</b></td>
    193               <td><b>Duration</b></td>
    194               <td><b>Event Description</b></td>
    195               <td><b>Sampling Event</b></td>
    196               <td><b>Parameters</b></td>
    197             </tr>
    198             <g:each in="${study_events}" var="e">
    199               <tr>
    200                 <td>-</td>
    201                 <td>${e.getPrettyDuration(studyInstance.startDate,e.startTime)}</td>
    202                 <td>${e.getPrettyDuration()}</td>
    203                 <td><g:link controller="event" action="show" id="${e.id}">  ${e.eventDescription.name}</g:link></td>
    204               <td>
    205               <g:if test="${e instanceof dbnp.studycapturing.SamplingEvent}">
    206                 <g:checkBox name="samplingEvent" disabled="${true}" value="${true}"/>
    207               </g:if>
    208               <g:else>
    209                 <g:checkBox name="event" disabled="${true}" value="${false}"/>
    210               </g:else>
    211               </td>
    212               <td>
    213              <g:if test="${e.parameterStringValues.size()>0}">
    214 <% def stringValues = e.parameterStringValues.toString().replaceAll("}"," ") %>
    215 <% print stringValues.substring(1,stringValues.size()) %>
    216               </g:if>
    217               <g:elseif test="${e.parameterIntegerValues.size()>0}">
    218 <% def integerValues = e.parameterInteger.toString().replaceAll("}"," ") %>
    219 <% print integerValues.substring(1,integerValues.size()) %>
    220               </g:elseif>
    221               <g:elseif test="${e.parameterFloatValues.size()>0}">
    222 <% def floatValues = e.parameterFloatValues.toString().replaceAll("}"," ") %>
    223 <% print floatValues.substring(1,floatValues.size()) %>
    224               </g:elseif>
    225               </td>
    226               </tr>
    227             </g:each>
    228           </table>
    229           </g:else>
    230         </div>
    231 
    232         <div id="event-description">
    233           <g:if test="${study_eventsDescription.size()==0}">
    234             No events description in this study
    235           </g:if>
    236           <g:else>
    237             <table>
    238             <tr>
    239               <td><b>Event Name</b></td>
    240               <td><b>Parameters </b></td>
    241             </tr>
    242             <tr>
    243               <td><b></b></td>
    244               <td><b>Name</b></td>
    245               <td><b>Description</b></td>
    246               <td><b>Unit</b></td>
    247               <td><b>Reference</b></td>
    248               <td><b>Options</b></td>
    249               <td><b>Type</b></td>
    250            </tr>
    251             <g:each in="${study_eventsDescription}" var="e">
    252                 <tr>
    253                   <td>${e.name} </td>
    254                 <g:each in="${e.protocol.parameters}" var="p">
    255                   <td>${p.name}</td>
    256                   <td>${p.description}</td>
    257                   <td>${p.unit}</td>
    258                   <td>${p.reference}</td>
    259                   <g:if test="${(p.listEntries.size()==0)}" >
    260                     <td>-</td>
    261                   </g:if>
    262                   <g:else>
    263                     <td>${p.listEntries.toString().replaceAll("]"," ").substring(1,p.listEntries.toString().size())}</td>
    264                   </g:else>
    265                   <td>${p.type}</td>
     134          <g:if test="${studyInstance.events.size()==0}">
     135            No events in this study
     136          </g:if>
     137          <g:else>
     138
     139              <table>
     140                <tr>
     141                  <td><b>Id </b></td>
     142                  <td><b>Start time</b></td>
     143                  <td><b>Duration</b></td>
     144                  <td><b>Type</b></td>
     145                  <td><b>Sampling event</b></td>
     146                  <td><b>Parameters</b></td>
     147                </tr>
     148
     149                <g:each in="${studyInstance.events}" var="event">
     150                  <tr>
     151                    <td><g:link controller="event" action="show" id="${event.id}">${event.id}</g:link></td>
     152                    <td>${event.getPrettyDuration(studyInstance.startDate,event.startTime)}</td>
     153                    <td>${event.getPrettyDuration()}</td>
     154                    <td>${event.template.name}</td>
     155                    <td>
     156                      <g:if test="${event instanceof dbnp.studycapturing.SamplingEvent}">
     157                        <g:checkBox name="samplingEvent" disabled="${true}" value="${true}"/>
     158                      </g:if>
     159                      <g:else>
     160                        <g:checkBox name="event" disabled="${true}" value="${false}" />
     161                      </g:else>
     162                    </td>
     163                    <td>
     164                      <g:set var="fieldCounter" value="${1}" />
     165                      <g:each in="${event.giveFields()}" var="field">
     166                        <g:if test="${event.getFieldValue(field.name)}">
     167                          <g:if test="${fieldCounter > 1}">, </g:if>
     168                            ${field.name} = ${event.getFieldValue( field.name )}
     169                          <g:set var="fieldCounter" value="${fieldCounter + 1}" />
     170                        </g:if>
     171                      </g:each>
     172                    </td>
    266173                  </tr>
    267174                </g:each>
    268             </g:each>
    269           </table>
    270 
    271           <g:form controller="eventDescription" action="create">
    272             <INPUT TYPE=submit name=submit Value="New Event Description">
    273           </g:form>
    274 </g:else>
     175
     176              </table>
     177
     178          </g:else>
    275179        </div>
    276180
     
    280184          </g:if>
    281185          <g:else>
    282           <table>
    283             <tr>
    284               <td><b>Name</b></td>
    285               <td colspan="${study_eventsDescription.size()}"><b>Events</b></td>
    286               <td><b>Subjects</b></td>
    287             </tr>
    288             <tr>
    289               <td></td>
    290                 <g:each in="${study_eventsDescription}" var="list">
    291               <td>
    292                   <b>${list}</b>
    293           </td>
    294                 </g:each>
    295           </tr>
    296             <g:each in="${studyInstance.eventGroups}" var="eventGroup">
    297             <tr>
    298               <td>${eventGroup.name}</td>
    299 
    300                 <g:each in="${study_eventsDescription}" var="des">
    301                   <td>
    302               <g:each in="${eventGroup.events}" var="e">
    303                  <g:if test="${e.eventDescription==des}">
    304                    <g:if test="${e.parameterStringValues.size()>0}">
    305 <% def stringValues = e.parameterStringValues.toString().replaceAll("}"," ") %>
    306 <% print stringValues.substring(1,stringValues.size()) %>
    307               </g:if>
    308               <g:elseif test="${e.parameterIntegerValues.size()>0}">
    309 <% def integerValues = e.parameterInteger.toString().replaceAll("}"," ") %>
    310 <% print integerValues.substring(1,integerValues.size()) %>
    311               </g:elseif>
    312               <g:elseif test="${e.parameterFloatValues.size()>0}">
    313 <% def floatValues = e.parameterFloatValues.toString().replaceAll("}"," ") %>
    314 <% print floatValues.substring(1,floatValues.size()) %>
    315               </g:elseif>
    316                  </g:if>
    317                 </g:each>
    318                  </td>
    319               </g:each>
    320 
    321               <td>${eventGroup.subjects.name.toString().replaceAll("]"," ").
    322     substring(1,eventGroup.subjects.name.toString().size())}</td>
    323           </tr>
    324             </g:each>
    325           </table>
     186            <table>
     187              <tr>
     188                <td><b>Name</b></td>
     189                <td colspan="${studyInstance.giveEventTemplates().size()}"><b>Events</b></td>
     190                <td><b>Subjects</b></td>
     191              </tr>
     192              <tr>
     193                <td></td>
     194                <g:each in="${studyInstance.giveEventTemplates()}" var="eventTemplate">
     195                  <td><b>${eventTemplate.name}</b></td>
     196                </g:each>
     197                <td></td>
     198              </tr>
     199              <g:each in="${studyInstance.eventGroups}" var="eventGroup">
     200                <tr>
     201                  <td>${eventGroup.name}</td>
     202
     203                  <g:each in="${studyInstance.giveEventTemplates()}" var="currentEventTemplate">
     204                    <td>
     205                      <g:each in="${eventGroup.events}" var="event">
     206                        <g:if test="${event.template.name==currentEventTemplate.name}">
     207
     208                          <g:set var="fieldCounter" value="${1}" />
     209                          <g:each in="${event.giveFields()}" var="field">
     210                            <g:if test="${event.getFieldValue(field.name)}">
     211                              <g:if test="${fieldCounter > 1}">, </g:if>
     212                                ${field.name} = ${event.getFieldValue( field.name )}
     213                              <g:set var="fieldCounter" value="${fieldCounter + 1}" />
     214                            </g:if>
     215                          </g:each>
     216                        </g:if>
     217                      </g:each>
     218                     </td>
     219                  </g:each>
     220                  <td>${eventGroup.subjects.name.join( ', ' )}</td>
     221                </tr>
     222              </g:each>
     223            </table>
    326224          </g:else>
    327225        </div>
     
    360258        </div>
    361259
     260        <div id="persons">
     261          <g:if test="${studyInstance.persons.size()==0}">
     262            No persons involved in this study
     263          </g:if>
     264          <g:else>
     265            <table>
     266              <tr>
     267                  <td><b>Name</b></td>
     268                  <td><b>Affiliations</b></td>
     269                  <td><b>Role</b></td>
     270                  <td><b>Phone</b></td>
     271                  <td><b>Email</b></td>
     272              </tr>
     273              <g:each in="${studyInstance.persons}" var="studyperson">
     274                <tr>
     275                  <td>${studyperson.person.firstName} ${studyperson.person.midInitials} ${studyperson.person.lastName}</td>
     276                  <td>
     277                    ${studyperson.person.affiliations.name.join(', ')}
     278                  </td>
     279                  <td>${studyperson.role.name}</td>
     280                  <td>${studyperson.person.phone}</td>
     281                  <td>${studyperson.person.email}</td>
     282                </tr>
     283              </g:each>
     284            </table>
     285          </g:else>
     286        </div>
    362287      </div>
    363288    </div>
Note: See TracChangeset for help on using the changeset viewer.