Changeset 1200

Show
Ignore:
Timestamp:
25-11-10 13:56:54 (3 years ago)
Author:
robert@…
Message:

Improved study overview of events according to ticket #199

Location:
trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/views/study/show.gsp

    r1188 r1200  
    522522              // We want every field to appear just once, 
    523523              // so the list is filtered for unique values 
    524               groupTemplates = studyList*.giveAllEventTemplates()?.flatten().unique() 
     524              def groupTemplates = studyList*.giveAllEventTemplates()?.flatten().unique() 
     525                          def showTemplates = groupTemplates; 
     526 
     527                          def showProperties = [:]; 
     528                          def allEvents = studyList*.events.flatten() + studyList*.samplingEvents.flatten(); 
     529                          def eventColumns = 0; 
     530 
     531                          showTemplates.each { template -> 
     532                                // We want to show all properties only once. If the properties are never filled 
     533                                // we shouldn't show them at all. 
     534                                def showFields = [] 
     535                                template.fields.each { field -> 
     536                                  for( def event: allEvents.findAll { it.template == template } ) { 
     537                                        if( event.getFieldValue( field.name ) ) { 
     538                                          showFields << field; 
     539                                          break; 
     540                                        } 
     541                                  } 
     542                                } 
     543 
     544                                showProperties[ template.name ] = showFields; 
     545 
     546                                // Compute the total number of columns under 'Events' (the +1 is 
     547                                // because of the 'start time' column) 
     548                                eventColumns += [ 1, showFields.size() + 1 ].max(); 
     549                          } 
     550 
    525551            %> 
    526552            <table> 
     
    531557                  </g:if> 
    532558                  <th>Name</th> 
    533                   <th colspan="${groupTemplates?.size()}">Events</th> 
     559                  <th colspan="${eventColumns}">Events</th> 
    534560                  <th>Subjects</th> 
    535561                </tr> 
     
    539565                  </g:if> 
    540566                  <th></th> 
    541                   <g:each in="${groupTemplates}" var="eventTemplate"> 
    542                     <th>${eventTemplate.name}</th> 
     567                  <g:each in="${showTemplates}" var="eventTemplate"> 
     568                    <th colspan="${[1, showProperties[ eventTemplate.name ].size() ].max() + 1}">${eventTemplate.name}</th> 
     569                  </g:each> 
     570                  <th></th> 
     571                </tr> 
     572                <tr class="templateFields"> 
     573                  <g:if test="${multipleStudies}"> 
     574                    <th></th> 
     575                  </g:if> 
     576                  <th></th> 
     577                  <g:each in="${showTemplates}" var="eventTemplate"> 
     578                                        <th>start time</th> 
     579                                        <g:if test="${showProperties[ eventTemplate.name ].size() > 0}"> 
     580                                          <g:each in="${showProperties[ eventTemplate.name ]}" var="field"> 
     581                                                <th>${field.name}</th> 
     582                                          </g:each> 
     583                                        </g:if> 
    543584                  </g:each> 
    544585                  <th></th> 
     
    550591              <g:each in="${studyList}" var="studyInstance"> 
    551592                <% 
    552                   def sortedEventGroups = studyInstance.eventGroups.sort( { a, b -> 
     593                  // Sort the groups by name 
     594                                  def sortedEventGroups = studyInstance.eventGroups.sort( { a, b -> 
    553595                      return a.name <=> b.name; 
    554596                  }  as Comparator ); 
     597 
     598                                  // Determine the number of rows per group (depending on the max 
     599                                  // number of events per template in a group) 
     600                                  def maxNumberEventsPerTemplate = [:]; 
     601                                  def rowsPerStudy = 0; 
     602                                  sortedEventGroups.each { group -> 
     603                                        def max = 1; 
     604                                        showTemplates.each { template -> 
     605                                          def num = ( group.events + group.samplingEvents ).findAll { it.template == template }.size(); 
     606                                          if( num > max ) 
     607                                                max = num; 
     608                                        } 
     609                                        maxNumberEventsPerTemplate[group.name] = max; 
     610                                        rowsPerStudy += max; 
     611                                  } 
    555612 
    556613                  def orphans = studyInstance.getOrphanEvents(); 
     
    563620                    )); 
    564621                  } 
    565  
    566622                %> 
    567623                <g:each in="${sortedEventGroups}" var="eventGroup" status="j"> 
    568                   <tr class="${(i % 2) == 0 ? 'odd' : 'even'}"> 
    569                     <g:if test="${multipleStudies && j==0}"> 
    570                       <td class="studytitle" rowspan="${sortedEventGroups?.size()}"> 
    571                         ${studyInstance.title} 
    572                       </td> 
    573                     </g:if> 
    574                     <td>${eventGroup.name}</td> 
    575  
    576                     <g:each in="${groupTemplates}" var="currentEventTemplate"> 
    577                       <td> 
    578                         <g:each in="${eventGroup.events}" var="event"> 
    579                           <g:if test="${event.template.name==currentEventTemplate.name}"> 
    580  
    581                             <g:set var="fieldCounter" value="${1}" /> 
    582                             <g:each in="${event.giveTemplateFields()}" var="field"> 
    583                               <g:if test="${event.getFieldValue(field.name)}"> 
    584                                 <g:if test="${fieldCounter > 1}">, </g:if> 
    585                                   ${field.name} = <wizard:showTemplateField field="${field}" entity="${event}" /> 
    586                                 <g:set var="fieldCounter" value="${fieldCounter + 1}" /> 
    587                               </g:if> 
    588                             </g:each> 
    589                           </g:if> 
    590                         </g:each> 
    591                       </td> 
    592                     </g:each> 
    593                     <td> 
    594                       <% sortedGroupSubjects = eventGroup.subjects.sort( { a, b -> a.name <=> b.name } as Comparator )  %> 
    595                       ${sortedGroupSubjects.name.join( ', ' )} 
    596                     </td> 
    597                   </tr> 
     624                                  <g:set var="n" value="${1}" /> 
     625                  <g:while test="${n <= maxNumberEventsPerTemplate[ eventGroup.name ]}"> 
     626 
     627                                        <tr class="${(i % 2) == 0 ? 'odd' : 'even'}"> 
     628                                          <g:if test="${n == 1}"> 
     629                                                <g:if test="${multipleStudies && j==0}"> 
     630                                                  <td class="studytitle" rowspan="${rowsPerStudy}"> 
     631                                                        ${studyInstance.title} 
     632                                                  </td> 
     633                                                </g:if> 
     634                                                <td rowspan="${maxNumberEventsPerTemplate[ eventGroup.name ]}">${eventGroup.name}</td> 
     635                                          </g:if> 
     636                                         
     637                                          <g:each in="${showTemplates}" var="currentEventTemplate"> 
     638                                                <g:if test="${showProperties[ currentEventTemplate.name ].size() == 0}"> 
     639                                                  <td>&nbsp;</td> 
     640                                                </g:if> 
     641                                                <g:else> 
     642                                                  <% 
     643                                                        def templateEvents = (eventGroup.events + eventGroup.samplingEvents).findAll { it.template == currentEventTemplate }.sort { a, b -> a.startTime <=> b.startTime }.asType(List) 
     644                                                        def event = templateEvents.size() >= n ? templateEvents[ n - 1 ] : null; 
     645                                                  %> 
     646                                                  <td class="templateFieldValue"><g:if test="${event}">${new RelTime( event.startTime ).toString()}</g:if></td> 
     647                                                  <g:each in="${showProperties[ currentEventTemplate.name ]}" var="field"> 
     648                                                        <td class="templateFieldValue"><wizard:showTemplateField field="${field}" entity="${event}" /></td> 
     649                                                  </g:each> 
     650                                                </g:else> 
     651                                          </g:each> 
     652                                         
     653                                          <g:if test="${n == 1}"> 
     654                                                <td rowspan="${maxNumberEventsPerTemplate[ eventGroup.name ]}"> 
     655                                                  <% sortedGroupSubjects = eventGroup.subjects.sort( { a, b -> a.name <=> b.name } as Comparator )  %> 
     656                                                  ${sortedGroupSubjects.name.join( ', ' )} 
     657                                                </td> 
     658                                          </g:if> 
     659                                        </tr> 
     660 
     661 
     662                                        <g:set var="n" value="${n+1}" /> 
     663                                  </g:while> 
    598664 
    599665                  <g:set var="i" value="${i + 1}" /> 
  • trunk/web-app/css/studies.css

    r959 r1200  
    2424    vertical-align: center; 
    2525} 
     26 
     27.templateFields th { font-weight: normal; font-size: 0.8em; } 
     28.templateFieldValue { font-size: 0.9em;} 
    2629 
    2730/*