Changeset 442

Show
Ignore:
Timestamp:
19-05-10 18:12:42 (4 years ago)
Author:
roberth
Message:

Updated studies list and added institute and department properties to person affiliations

Location:
trunk/grails-app
Files:
12 modified

Legend:

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

    r424 r442  
    9090                        println ".adding persons, roles and affiliations" 
    9191                        def affiliation1 = new PersonAffiliation( 
    92                             name: "Science Institute NYC" 
     92                            institute: "Science Institute NYC", 
     93                            department: "Department of Mathematics" 
    9394                        ).save(); 
    9495                        def affiliation2 = new PersonAffiliation( 
    95                             name: "InfoStats GmbH, Hamburg" 
     96                            institute: "InfoStats GmbH, Hamburg", 
     97                            department: "Life Sciences" 
    9698                        ).save(); 
    9799                        def role1 = new PersonRole( 
     
    514516                                // Add subjects and samples and compose EventGroups 
    515517                                def x=1 
    516                                 80.times { 
     518                                20.times { 
    517519                                        def currentSubject = new Subject( 
    518520                                                name: "A" + x++, 
     
    672674                                        ).with { if (!validate()) { errors.each { println it} } else save()} 
    673675                                } 
    674  
     676                                */ 
    675677                                // Add assay to study capture module 
    676678 
     
    685687                                        name: 'Lipid profiling', 
    686688                                        module: clinicalModule, 
    687                                         externalAssayId: lipidAssayInstance.id 
     689                                        externalAssayId: 0 
    688690                                ).with { if (!validate()) { errors.each { println it} } else save()} 
    689691 
     
    695697                                humanStudy.addToAssays(lipidAssayRef); 
    696698                                humanStudy.save() 
    697                                 */ 
    698699                                 
    699700                        } 
  • trunk/grails-app/controllers/dbnp/studycapturing/PersonAffiliationController.groovy

    r397 r442  
    6666        def personAffiliationInstance = new PersonAffiliation(params) 
    6767        if (personAffiliationInstance.save(flush: true)) { 
    68             flash.message = "${message(code: 'default.created.message', args: [message(code: 'personAffiliation.label', default: 'Affiliation'), personAffiliationInstance.name])}" 
     68            flash.message = "${message(code: 'default.created.message', args: [message(code: 'personAffiliation.label', default: 'Affiliation'), personAffiliationInstance])}" 
    6969            redirect(action: "show", id: personAffiliationInstance.id) 
    7070        } 
     
    110110            personAffiliationInstance.properties = params 
    111111            if (!personAffiliationInstance.hasErrors() && personAffiliationInstance.save(flush: true)) { 
    112                 flash.message = "${message(code: 'default.updated.message', args: [message(code: 'personAffiliation.label', default: 'Affiliation'), personAffiliationInstance.name])}" 
     112                flash.message = "${message(code: 'default.updated.message', args: [message(code: 'personAffiliation.label', default: 'Affiliation'), personAffiliationInstance])}" 
    113113                redirect(action: "show", id: personAffiliationInstance.id) 
    114114            } 
     
    126126        def personAffiliationInstance = PersonAffiliation.get(params.id) 
    127127        if (personAffiliationInstance) { 
    128             def affiliationName = personAffiliationInstance.name 
     128            def affiliationName = personAffiliationInstance.toString() 
    129129            try { 
    130130                personAffiliationInstance.delete(flush: true) 
  • trunk/grails-app/domain/dbnp/studycapturing/PersonAffiliation.groovy

    r397 r442  
    4848class PersonAffiliation { 
    4949 
    50     String name 
     50    String institute 
     51    String department 
     52 
     53    String toString() { "${institute} / ${department}" } 
    5154 
    5255    static constraints = { 
  • trunk/grails-app/views/personAffiliation/create.gsp

    r379 r442  
    2626                            <tr class="prop"> 
    2727                                <td valign="top" class="name"> 
    28                                     <label for="name"><g:message code="personAffiliation.name.label" default="Name" /></label> 
     28                                    <label for="name"><g:message code="personAffiliation.institute.label" default="Institute" /></label> 
    2929                                </td> 
    30                                 <td valign="top" class="value ${hasErrors(bean: personAffiliationInstance, field: 'name', 'errors')}"> 
    31                                     <g:textField name="name" value="${personAffiliationInstance?.name}" /> 
     30                                <td valign="top" class="value ${hasErrors(bean: personAffiliationInstance, field: 'institute', 'errors')}"> 
     31                                    <g:textField name="institute" value="${personAffiliationInstance?.institute}" /> 
    3232                                </td> 
    3333                            </tr> 
    3434                         
     35                            <tr class="prop"> 
     36                                <td valign="top" class="name"> 
     37                                    <label for="name"><g:message code="personAffiliation.department.label" default="Department" /></label> 
     38                                </td> 
     39                                <td valign="top" class="value ${hasErrors(bean: personAffiliationInstance, field: 'department', 'errors')}"> 
     40                                    <g:textField name="department" value="${personAffiliationInstance?.department}" /> 
     41                                </td> 
     42                            </tr> 
    3543                        </tbody> 
    3644                    </table> 
  • trunk/grails-app/views/personAffiliation/edit.gsp

    r379 r442  
    2828                            <tr class="prop"> 
    2929                                <td valign="top" class="name"> 
    30                                   <label for="name"><g:message code="personAffiliation.name.label" default="Name" /></label> 
     30                                  <label for="name"><g:message code="personAffiliation.institute.label" default="Institute" /></label> 
    3131                                </td> 
    32                                 <td valign="top" class="value ${hasErrors(bean: personAffiliationInstance, field: 'name', 'errors')}"> 
    33                                     <g:textField name="name" value="${personAffiliationInstance?.name}" /> 
     32                                <td valign="top" class="value ${hasErrors(bean: personAffiliationInstance, field: 'institute', 'errors')}"> 
     33                                    <g:textField name="institute" value="${personAffiliationInstance?.institute}" /> 
    3434                                </td> 
    3535                            </tr> 
    36                          
     36                            <tr class="prop"> 
     37                                <td valign="top" class="name"> 
     38                                  <label for="name"><g:message code="personAffiliation.department.label" default="Department" /></label> 
     39                                </td> 
     40                                <td valign="top" class="value ${hasErrors(bean: personAffiliationInstance, field: 'department', 'errors')}"> 
     41                                    <g:textField name="department" value="${personAffiliationInstance?.department}" /> 
     42                                </td> 
     43                            </tr> 
    3744                        </tbody> 
    3845                    </table> 
  • trunk/grails-app/views/personAffiliation/list.gsp

    r382 r442  
    1919                        <tr> 
    2020                         
    21                             <g:sortableColumn property="name" title="${message(code: 'personAffiliation.name.label', default: 'Name')}" /> 
     21                            <g:sortableColumn property="institute" title="${message(code: 'personAffiliation.institute.label', default: 'Institute')}" /> 
     22                            <g:sortableColumn property="department" title="${message(code: 'personAffiliation.department.label', default: 'Department')}" /> 
    2223                         
    2324                        </tr> 
     
    2728                        <tr class="${(i % 2) == 0 ? 'odd' : 'even'}"> 
    2829                         
    29                             <td><g:link action="show" id="${personAffiliationInstance.id}">${fieldValue(bean: personAffiliationInstance, field: "name")}</g:link></td> 
    30                          
     30                            <td><g:link action="show" id="${personAffiliationInstance.id}">${fieldValue(bean: personAffiliationInstance, field: "institute")}</g:link></td> 
     31                            <td>${fieldValue(bean: personAffiliationInstance, field: "department")}</td> 
    3132                        </tr> 
    3233                    </g:each> 
  • trunk/grails-app/views/personAffiliation/show.gsp

    r379 r442  
    1919 
    2020                        <tr class="prop"> 
    21                             <td valign="top" class="name"><g:message code="personAffiliation.name.label" default="Name" /></td> 
     21                            <td valign="top" class="name"><g:message code="personAffiliation.institute.label" default="Institute" /></td> 
    2222                             
    23                             <td valign="top" class="value">${fieldValue(bean: personAffiliationInstance, field: "name")}</td> 
     23                            <td valign="top" class="value">${fieldValue(bean: personAffiliationInstance, field: "institute")}</td> 
    2424                             
    2525                        </tr> 
    2626                     
     27                        <tr class="prop"> 
     28                            <td valign="top" class="name"><g:message code="personAffiliation.department.label" default="Department" /></td> 
     29 
     30                            <td valign="top" class="value">${fieldValue(bean: personAffiliationInstance, field: "department")}</td> 
     31 
     32                        </tr> 
    2733                    </tbody> 
    2834                </table> 
  • trunk/grails-app/views/person/edit.gsp

    r382 r442  
    132132                                </td> 
    133133                                <td valign="top" class="value ${hasErrors(bean: personInstance, field: 'affiliations', 'errors')}"> 
    134                                     <g:select name="affiliations" from="${dbnp.studycapturing.PersonAffiliation.list()}" multiple="yes" optionKey="id" optionValue="name" size="5" value="${personInstance?.affiliations}" /> 
     134                                    <g:select name="affiliations" from="${dbnp.studycapturing.PersonAffiliation.list()}" multiple="yes" optionKey="id" size="5" value="${personInstance?.affiliations}" /> 
    135135                                </td> 
    136136                            </tr> 
  • trunk/grails-app/views/person/list.gsp

    r382 r442  
    4949                              <g:each in="${personInstance.affiliations}" var="affiliation" status="affiliationNr"> 
    5050                                <g:if test="${affiliationNr>0}">,</g:if> 
    51                                 ${affiliation.name} 
     51                                ${affiliation} 
    5252                              </g:each> 
    5353                            </td> 
  • trunk/grails-app/views/person/show.gsp

    r382 r442  
    9797                                <ul> 
    9898                                <g:each in="${personInstance.affiliations}" var="a"> 
    99                                     <li><g:link controller="personAffiliation" action="show" id="${a.id}">${a?.name.encodeAsHTML()}</g:link></li> 
     99                                    <li><g:link controller="personAffiliation" action="show" id="${a.id}">${a?.encodeAsHTML()}</g:link></li> 
    100100                                </g:each> 
    101101                                </ul> 
  • trunk/grails-app/views/study/list.gsp

    r389 r442  
    55    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    66    <meta name="layout" content="main" /> 
    7   <g:set var="entityName" value="${message(code: 'study.label', default: 'Study')}" /> 
    8   <title><g:message code="default.list.label" args="[entityName]" /></title> 
     7    <g:set var="entityName" value="${message(code: 'study.label', default: 'Study')}" /> 
     8    <title><g:message code="default.list.label" args="[entityName]" /></title> 
    99</head> 
    1010<body> 
     
    1212  <g:form action="list_extended"> 
    1313 
    14   <div class="nav"> 
    15     <span class="menuButton"><a class="home" href="${createLink(uri: '/')}">Home</a></span> 
    16     <span class="menuButton"><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></span> 
    17   </div> 
    1814  <div class="body"> 
    1915    <h1><g:message code="default.list.label" args="[entityName]" /></h1> 
     
    2218    </g:if> 
    2319 
    24       <g:each in="${studyInstanceList}" var="studyInstance"> 
     20    <div class="list"> 
     21      <table> 
     22          <thead> 
     23              <tr> 
     24                  <th></th> 
     25                  <g:sortableColumn property="title" title="${message(code: 'study.title.label', default: 'Title')}" /> 
     26                  <th>Subjects</th> 
     27                  <th>Events</th> 
     28                  <th>Assays</th> 
     29              </tr> 
     30          </thead> 
     31          <tbody> 
     32          <g:each in="${studyInstanceList}" var="studyInstance" status="i" > 
     33              <tr class="${(i % 2) == 0 ? 'odd' : 'even'}"> 
     34 
     35                  <td><input type="checkbox" name="${studyInstance.title}" id="${studyInstance.title}"></td> 
     36 
     37                  <td><g:link action="show" id="${studyInstance.id}">${fieldValue(bean: studyInstance, field: "title")}</g:link></td> 
     38 
     39                  <td> 
     40                    <g:if test="${studyInstance.subjects.species.size()==0}"> 
     41                      - 
     42                    </g:if> 
     43                    <g:else> 
     44                      <g:each in="${studyInstance.subjects.species.unique()}" var="currentSpecies" status="j"> 
     45                        <g:if test="${j > 0}">, </g:if> 
     46                        <%= studyInstance.subjects.findAll { return it.species == currentSpecies; }.size() %> 
     47                        ${currentSpecies} 
     48                      </g:each> 
     49                    </g:else> 
     50                  </td> 
     51 
     52                  <td> 
     53                    <g:if test="${studyInstance.giveEventTemplates().size()==0}"> 
     54                      - 
     55                    </g:if> 
     56                    <g:else> 
     57                      ${studyInstance.giveEventTemplates().name.join( ', ' )} 
     58                    </g:else> 
     59                  </td> 
     60 
     61                  <td> 
     62                    <g:if test="${studyInstance.assays.size()==0}"> 
     63                      - 
     64                    </g:if> 
     65                    <g:else> 
     66                      ${studyInstance.assays.module.platform.unique().join( ', ' )} 
     67                    </g:else> 
     68                  </td> 
     69 
     70              </tr> 
     71          </g:each> 
     72          </tbody> 
     73      </table> 
     74    </div> 
     75    <div class="buttons"> 
     76        <span class="button"><g:link controller="wizard" class="create" action="index"><g:message code="default.new.label" args="[entityName]" /></g:link></span> 
     77    </div> 
     78    <div class="paginateButtons"> 
     79        <g:paginate total="${studyInstanceTotal}" prev="&laquo; Previous" next="&raquo; Next" /> 
    2580        <br> 
    26         <table> 
    27           <tr> 
    28             <td width="50"></td> 
    29             <td colspan="3"> 
    30               <center><b>${studyInstance.title}</b></center> 
    31             </td> 
    32           </tr> 
    33           <tr> 
    34             <td> 
    35  
    36               <input type="checkbox" name="${studyInstance.title}" id="${studyInstance.title}"></td> 
    37  
    38             <td width="150"> 
    39           <g:link action="show" id="${studyInstance.id}"> 
    40 ${message(code: 'study.id.label', default: 'Id')} : 
    41 ${fieldValue(bean: studyInstance, field: "id")}</g:link></td> 
    42  
    43         <td width="300"> 
    44 <b>${message(code: 'study.template.label', default: 'Template')} </b>: 
    45 ${fieldValue(bean: studyInstance, field: "template")}</td> 
    46  
    47 <td > 
    48 <b>${message(code: 'study.subjects.label', default: 'Subjects')} </b>: 
    49 ${studyInstance.subjects.size()} subjects</td> 
    50  
    51         </tr> 
    52         <tr> 
    53           <td></td> 
    54           <td > 
    55 <b>${message(code: 'study.owner.label', default: 'Owner')} </b>: 
    56 ${fieldValue(bean: studyInstance, field: "owner")}</td> 
    57  
    58           <td > 
    59 <b>Assays </b>: 
    60         <g:each in="${studyInstance.assays}" var="assay"> 
    61           ${assay.name} 
    62         </g:each> 
    63           </td> 
    64  
    65           <td><b> Samples </b>: 
    66           <g:each in="${studyInstance.assays.samples}" var="samples"> 
    67           ${samples.name} 
    68           </g:each> 
    69           </td> 
    70  
    71  
    72         </tr> 
    73         <g:if test="${studyInstance.fieldExists( 'Description' )}"> 
    74         <tr> 
    75           <td></td> 
    76           <td colspan="3"> 
    77             <b>${message(code: 'study.description.label', default: 'Description')} </b>: 
    78             ${studyInstance.getFieldValue( 'Description' )} 
    79              
    80           </td> 
    81         </tr> 
    82         </g:if> 
    83         </table> 
    84       </g:each> 
    85     
    86     <div class="paginateButtons"> 
    87       <g:paginate total="${studyInstanceTotal}" /> 
    88       <br> 
    89       <INPUT TYPE=submit name=submit Value="Compare selected studies"> 
     81        <INPUT TYPE=submit name=submit Value="Compare selected studies"> 
    9082    </div> 
    9183  </div> 
  • trunk/grails-app/views/study/show.gsp

    r421 r442  
    1616<body> 
    1717 
    18   <div class="nav"> 
    19     <span class="menuButton"><a class="home" href="${createLink(uri: '/')}">Home</a></span> 
    20     <span class="menuButton"><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></span> 
    21     <span class="menuButton"><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></span> 
    22   </div> 
    23  
    2418  <div class="body"> 
    2519    <h1><g:message code="default.show.label" args="[entityName]" /></h1> 
     
    3731          <li><a href="#assays">Assays</a></li> 
    3832          <li><a href="#persons">Persons</a></li> 
     33          <li><a href="#publications">Publications</a></li> 
    3934        </ul> 
    4035 
    4136        <div id="study"> 
    4237 
    43           <b> Id </b>: ${fieldValue(bean: studyInstance, field: "id")} <br> 
    44           <b>Template </b>:<g:link controller="template" action="show" id="${studyInstance?.template?.id}">${studyInstance?.template?.encodeAsHTML()}</g:link><br> 
    45           <b> Start </b>:<g:formatDate date="${studyInstance?.startDate}" /> <br> 
    46           <b> Events </b>: 
    47             <g:if test="${studyInstance.giveEventTemplates().size()==0}"> 
    48               - 
    49             </g:if> 
    50             <g:else> 
    51              ${studyInstance.giveEventTemplates().name} 
    52             </g:else> 
    53           <br> 
    54           <b>Sampling Events </b>: 
    55             <g:if test="${studyInstance.giveSamplingEventTemplates().size()==0}"> 
    56              - 
    57             </g:if> 
    58             <g:else> 
    59               ${studyInstance.giveSamplingEventTemplates().name} 
    60             </g:else> 
    61           <br> 
    62           <b>Last Updated </b>:<g:formatDate date="${studyInstance?.lastUpdated}" /><br> 
    63           <b>Readers </b>: 
    64  
    65           <g:if test="${studyInstance.readers.size()==0}"> 
    66             - 
    67           </g:if> 
    68           <g:else> 
    69             <ul> 
    70               <g:each in="${studyInstance.readers}" var="r"> 
    71                 <li><g:link controller="user" action="show" id="${r.id}">${r?.encodeAsHTML()}</g:link></li> 
    72               </g:each> 
    73             </ul> 
    74           </g:else> 
    75           <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  
    82           <b>Editors </b>: 
    83           <g:if test="${studyInstance.editors.size()==0}"> 
    84             - 
    85           </g:if> 
    86           <g:else> 
    87             <ul> 
    88               <g:each in="${studyInstance.editors}" var="e"> 
    89                 <li><g:link controller="user" action="show" id="${e.id}">${e?.encodeAsHTML()}</g:link></li> 
    90               </g:each> 
    91             </ul> 
    92           </g:else> 
    93           <br> 
    94           <b>Title </b>: ${fieldValue(bean: studyInstance, field: "title")} <br> 
    95           <b>Owner </b>:<g:link controller="user" action="show" id="${studyInstance?.owner?.id}">${studyInstance?.owner?.encodeAsHTML()}</g:link> <br> 
    96           <b>Date Created </b>:<g:formatDate date="${studyInstance?.dateCreated}" /> <br> 
     38          <table> 
     39            <!-- Show all template and domain fields, if filled --> 
     40            <g:each in="${studyInstance.giveFields()}" var="field"> 
     41              <g:if test="${studyInstance.getFieldValue(field.name)}"> 
     42                <tr> 
     43                  <td>${field}</td> 
     44                  <td>${studyInstance.getFieldValue(field.name)}</td> 
     45                </tr> 
     46              </g:if> 
     47            </g:each> 
     48 
     49            <!-- Add some extra fields --> 
     50            <tr> 
     51              <td>Events</td> 
     52              <td> 
     53                <g:if test="${studyInstance.giveEventTemplates().size()==0}"> 
     54                  - 
     55                </g:if> 
     56                <g:else> 
     57                 ${studyInstance.giveEventTemplates().name.join(", ")} 
     58                </g:else> 
     59              </td> 
     60            </tr> 
     61            <tr> 
     62              <td>Sampling events</td> 
     63              <td> 
     64                <g:if test="${studyInstance.giveSamplingEventTemplates().size()==0}"> 
     65                  - 
     66                </g:if> 
     67                <g:else> 
     68                 ${studyInstance.giveSamplingEventTemplates().name.join(", ")} 
     69                </g:else> 
     70              </td> 
     71            </tr> 
     72            <tr> 
     73              <td>Readers</td> 
     74              <td> 
     75                <g:if test="${studyInstance.readers.size()==0}"> 
     76                  - 
     77                </g:if> 
     78                <g:else> 
     79                  <g:each in="${studyInstance.readers}" var="r" status="i"> 
     80                    <g:if test="${i > 0}">, </g:if> 
     81                    <g:link controller="user" action="show" id="${r.id}">${r?.encodeAsHTML()}</g:link> 
     82                  </g:each> 
     83                </g:else> 
     84              </td> 
     85            </tr> 
     86            <tr> 
     87              <td>Editors</td> 
     88              <td> 
     89                <g:if test="${studyInstance.editors.size()==0}"> 
     90                  - 
     91                </g:if> 
     92                <g:else> 
     93                  <g:each in="${studyInstance.editors}" var="r" status="i"> 
     94                    <g:if test="${i > 0}">, </g:if> 
     95                    <g:link controller="user" action="show" id="${r.id}">${r?.encodeAsHTML()}</g:link> 
     96                  </g:each> 
     97                </g:else> 
     98              </td> 
     99            </tr> 
     100 
     101          </table> 
    97102        </div> 
    98103 
     
    100105          <g:each in="${studyInstance.giveSubjectTemplates()}" var="template"> 
    101106            <table> 
    102               <tr> 
    103                 <td><b>Id </b></td> 
    104                 <td><b>Species</b></td> 
    105                 <td><b>Name</b></td> 
    106               <g:each in="${template.fields}" var="g"> 
    107                 <td><b> 
    108                     <g:link controller="templateField" action="show" id="${g.id}"> 
    109 ${g}</b></td> 
    110                 </g:link> 
    111               </g:each> 
    112               </tr> 
    113  
    114               <g:each in="${studyInstance.subjects.findAll {it.template == template}}" var="s"> 
     107              <thead> 
    115108                <tr> 
    116                   <td><g:link controller="subject" action="show" id="${s.id}">${s.id}</g:link></td> 
    117                 <td>${s.species}</td> 
    118                 <td>${s.name}</td> 
    119                 <g:each in="${template.fields}" var="g"> 
    120                   <td> 
    121                   <% print s.getFieldValue(g.toString())  %> 
    122                   </td> 
     109                  <g:each in="${new dbnp.studycapturing.Subject().giveDomainFields()}" var="field"> 
     110                    <th>${field}</th> 
     111                  </g:each> 
     112                  <g:each in="${template.fields}" var="field"> 
     113                    <th>${field}</th> 
     114                  </g:each> 
     115                </tr> 
     116              </thead> 
     117               
     118              <% 
     119                subjects = studyInstance.subjects.findAll {it.template == template}; 
     120                sortedSubjects = subjects.sort( { a, b -> a.name <=> b.name } as Comparator ) 
     121              %> 
     122              <g:each in="${sortedSubjects}" var="s" status="i"> 
     123                <tr class="${(i % 2) == 0 ? 'odd' : 'even'}"> 
     124                  <g:each in="${s.giveDomainFields()}" var="field"> 
     125                    <td>${s.getFieldValue(field.name)}</td> 
     126                  </g:each> 
     127                  <g:each in="${template.fields}" var="field"> 
     128                    <td> 
     129                      ${s.getFieldValue(field.name)} 
     130                    </td> 
    123131                </g:each> 
    124132                </tr> 
     
    129137          </g:each> 
    130138        </div> 
    131  
    132139 
    133140        <div id="events"> 
     
    138145 
    139146              <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 + studyInstance.samplingEvents}" var="event"> 
     147                <thead> 
    150148                  <tr> 
    151                     <td><g:link controller="event" action="show" id="${event.id}">${event.id}</g:link></td> 
     149                    <th>Start time</th> 
     150                    <th>Duration</th> 
     151                    <th>Type</th> 
     152                    <th>Sampling event</th> 
     153                    <th>Parameters</th> 
     154                  </tr> 
     155                </thead> 
     156 
     157              <% 
     158                // Sort events by starttime and duration 
     159                events = studyInstance.events + studyInstance.samplingEvents; 
     160                sortedEvents = events.sort( { a, b -> 
     161                      a.startTime == b.startTime ? 
     162                        a.getDuration().toMilliseconds() <=> b.getDuration().toMilliseconds() : 
     163                        a.startTime <=> b.startTime 
     164                  } as Comparator ) 
     165              %> 
     166 
     167                <g:each in="${sortedEvents}" var="event" status="i"> 
     168                  <tr class="${(i % 2) == 0 ? 'odd' : 'even'}"> 
    152169                    <td>${event.getPrettyDuration(studyInstance.startDate,event.startTime)}</td> 
    153170                    <td>${event.getPrettyDuration()}</td> 
     
    163180                    <td> 
    164181                      <g:set var="fieldCounter" value="${1}" /> 
    165                       <g:each in="${event.giveFields()}" var="field"> 
     182                      <g:each in="${event.giveTemplateFields()}" var="field"> 
    166183                        <g:if test="${event.getFieldValue(field.name)}"> 
    167184                          <g:if test="${fieldCounter > 1}">, </g:if> 
     
    207224 
    208225                          <g:set var="fieldCounter" value="${1}" /> 
    209                           <g:each in="${event.giveFields()}" var="field"> 
     226                          <g:each in="${event.giveTemplateFields()}" var="field"> 
    210227                            <g:if test="${event.getFieldValue(field.name)}"> 
    211228                              <g:if test="${fieldCounter > 1}">, </g:if> 
     
    218235                     </td> 
    219236                  </g:each> 
    220                   <td>${eventGroup.subjects.name.join( ', ' )}</td> 
     237                  <td> 
     238                    <% sortedGroupSubjects = eventGroup.subjects.sort( { a, b -> a.name <=> b.name } as Comparator )  %> 
     239                    ${sortedGroupSubjects.name.join( ', ' )} 
     240                  </td> 
    221241                </tr> 
    222242              </g:each> 
     
    231251          <g:else> 
    232252            <table> 
    233               <tr> 
    234                 <td width="100"><b>Assay Name</b></td> 
    235                 <td width="100"><b>Module</b></td> 
    236                 <td><b>Type</b></td> 
    237                 <td width="150"><b>Platform</b></td> 
    238                 <td><b>Url</b></td> 
    239                 <td><b>Samples</b></td> 
    240               </tr> 
    241               <g:each in="${studyInstance.assays}" var="assay"> 
     253              <thead> 
    242254                <tr> 
     255                  <th width="100">Assay Name</th> 
     256                  <th width="100">Module</th> 
     257                  <th>Type</th> 
     258                  <th width="150">Platform</th> 
     259                  <th>Url</th> 
     260                  <th>Samples</th> 
     261                </tr> 
     262              </thead> 
     263              <g:each in="${studyInstance.assays}" var="assay" status="i"> 
     264                <tr class="${(i % 2) == 0 ? 'odd' : 'even'}"> 
    243265                  <td>${assay.name}</td> 
    244266                  <td>${assay.module.name}</td> 
     
    247269                  <td>${assay.module.url}</td> 
    248270                  <td> 
    249                 <g:each in="${assay.samples}" var="assaySample"> 
    250 ${assaySample.name}<br> 
    251                 </g:each> 
    252                 </td> 
     271                    <% sortedAssaySamples = assay.samples.sort( { a, b -> a.name <=> b.name } as Comparator )  %> 
     272                    ${sortedAssaySamples.name.join( ', ' )} 
     273                  </td> 
    253274                </tr> 
    254275              </g:each> 
     
    265286            <table> 
    266287              <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> 
     288                <thead> 
     289                  <th>Name</th> 
     290                  <th>Affiliations</th> 
     291                  <th>Role</th> 
     292                  <th>Phone</th> 
     293                  <th>Email</th> 
     294                </thead> 
    272295              </tr> 
    273               <g:each in="${studyInstance.persons}" var="studyperson"> 
    274                 <tr> 
     296              <g:each in="${studyInstance.persons}" var="studyperson" status="i"> 
     297                <tr class="${(i % 2) == 0 ? 'odd' : 'even'}"> 
    275298                  <td>${studyperson.person.firstName} ${studyperson.person.prefix} ${studyperson.person.lastName}</td> 
    276299                  <td> 
    277                     ${studyperson.person.affiliations.name.join(', ')} 
     300                    ${studyperson.person.affiliations.join(', ')} 
    278301                  </td> 
    279302                  <td>${studyperson.role.name}</td> 
     
    285308          </g:else> 
    286309        </div> 
     310 
     311        <div id="publications"> 
     312          <g:if test="${studyInstance.publications.size()==0}"> 
     313            No publications attached to this study 
     314          </g:if> 
     315          <g:else> 
     316            <table> 
     317              <tr> 
     318                <thead> 
     319                  <th>Title</th> 
     320                  <th>Authors</th> 
     321                  <th>Comments</th> 
     322                </thead> 
     323              </tr> 
     324              <g:each in="${studyInstance.publications}" var="publication" status="i"> 
     325                <tr class="${(i % 2) == 0 ? 'odd' : 'even'}"> 
     326                  <td>${publication.title}</td> 
     327                  <td> 
     328                    ${publication.authorlist} 
     329                  </td> 
     330                  <td>${publication.comment}</td> 
     331                </tr> 
     332              </g:each> 
     333            </table> 
     334          </g:else> 
     335        </div> 
     336 
    287337      </div> 
    288338    </div> 
     
    293343        <span class="button"><g:actionSubmit class="edit" action="edit" value="${message(code: 'default.button.edit.label', default: 'Edit')}" /></span> 
    294344        <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> 
     345        <span class="button"><g:link class="backToList" action="list">Back to list</g:link></span> 
    295346      </g:form> 
    296347    </div>