Changeset 2237

Show
Ignore:
Timestamp:
29-05-12 16:24:52 (23 months ago)
Author:
work@…
Message:

- improved initial study compare page gives visual feedback

Location:
trunk
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/controllers/generic/AjaxController.groovy

    r2170 r2237  
    1616import dbnp.studycapturing.* 
    1717import grails.converters.JSON 
     18import org.dbnp.gdt.AssayModule 
    1819 
    1920class AjaxController { 
     
    9899        } 
    99100 
     101    /** 
     102     * Get all modules 
     103     */ 
     104    def modules = { 
     105        def result = AssayModule.list() 
     106 
     107        // set output header to json 
     108        response.contentType = 'application/json' 
     109 
     110        // render result 
     111        if (params.callback) { 
     112            render "${params.callback}(${result as JSON})" 
     113        } else { 
     114            render result as JSON 
     115        } 
     116    } 
     117 
    100118        /** 
    101119         * return the number of studies the user can read based on criteria 
     
    124142         */ 
    125143        def studies = { 
    126                 def studies = ajaxService.getStudiesByCriteriaForCurrentUser(params) 
     144        def user        = authenticationService.getLoggedInUser() 
     145        def total       = Study.giveReadableStudies(user).size() 
     146        def studies = ajaxService.getStudiesByCriteriaForCurrentUser(params) 
    127147 
    128                 // define json result 
    129                 def result = ['studies':studies.collect{ it.title }] 
     148        // find unique properties for these studies 
     149        def species = [] 
     150        def uniqueSpecies = [:] 
     151        def eventTemplates = [] 
     152        def uniqueEventTemplateNames = [:] 
     153        def samplingEventTemplates = [] 
     154        def uniqueSamplingEventTemplateNames = [:] 
     155        def modules = [] 
     156        def uniqueModules = [:] 
     157 
     158        // iterate through studies to temporarily remember properties 
     159        studies.each { 
     160            species                 = species + it.uniqueSpecies() 
     161            eventTemplates          = eventTemplates + it.uniqueEventTemplates() 
     162            samplingEventTemplates  = samplingEventTemplates + it.uniqueSamplingEventTemplates() 
     163            modules                 = modules + it.uniqueAssayModules() 
     164        } 
     165 
     166        // fetch unique properties 
     167        species.unique().each { uniqueSpecies[ it.id ] = it.name } 
     168        eventTemplates.unique().each { uniqueEventTemplateNames[ it.id ] = it.name } 
     169        samplingEventTemplates.unique().each { uniqueSamplingEventTemplateNames[ it.id ] = it.name } 
     170        modules.unique().each { uniqueModules[ it.id ] = it.name } 
     171 
     172        // define json result 
     173                def result = [ 
     174                'studies':studies.collect{ it.title }, 
     175                'total':total, 
     176                'matched':studies.size(), 
     177                'uniqueSpecies':uniqueSpecies, 
     178                'uniqueEventTemplateNames':uniqueEventTemplateNames, 
     179                'uniqueSamplingEventTemplateNames':uniqueSamplingEventTemplateNames, 
     180                'modules':uniqueModules 
     181        ] 
    130182 
    131183                // set output header to json 
  • trunk/grails-app/domain/dbnp/studycapturing/Study.groovy

    r2220 r2237  
    772772        } 
    773773        } 
     774 
     775    /** 
     776     * return the unique species 
     777     * @see dbnp.query.StudyCompareController 
     778     */ 
     779    def uniqueSpecies = { 
     780        return subjects.collect{ it.species }.unique() 
     781    } 
     782 
     783    /** 
     784     * return the unique event templates 
     785     * @see dbnp.query.StudyCompareController 
     786     */ 
     787    def uniqueEventTemplates = { 
     788        return events.collect{ it.template }.unique() 
     789    } 
     790 
     791    /** 
     792     * return the unique sampling event templates 
     793     * @see dbnp.query.StudyCompareController 
     794     */ 
     795    def uniqueSamplingEventTemplates = { 
     796        return samplingEvents.collect{ it.template }.unique() 
     797    } 
     798 
     799    /** 
     800     * return the unique assay modules 
     801     * @see dbnp.query.StudyCompareController 
     802     */ 
     803    def uniqueAssayModules = { 
     804        return assays.collect{ it.module }.unique() 
     805    } 
    774806} 
  • trunk/grails-app/services/dbnp/generic/AjaxService.groovy

    r2160 r2237  
    5151                def uniqueEventTemplateNames = (params.containsKey('uniqueEventTemplateNames[]')) ? getAsArray(params['uniqueEventTemplateNames[]']) : [] 
    5252                def uniqueSamplingEventTemplateNames = (params.containsKey('uniqueSamplingEventTemplateNames[]')) ? getAsArray(params['uniqueSamplingEventTemplateNames[]']) : [] 
     53        def modules = (params.containsKey('modules[]')) ? getAsArray(params['modules[]']) : [] 
    5354 
    5455                // iterate through readable studies for this user 
     
    6364                        // 3. if any samplingEventTemplateNames were selected, see if this study contains any of these 
    6465                        matched = (matched && (!uniqueSamplingEventTemplateNames.size() || study.samplingEvents.find{uniqueSamplingEventTemplateNames.contains(it.template.id)})) ? true : false; 
     66            // 4. if any modules were selected, see if this study contains any of these 
     67            matched = (matched && (!modules.size() || study.assays.find{modules.contains(it.module.id)})) ? true : false; 
    6568 
    6669                        // if criteria are met, add this study to the matchedStudies array 
  • trunk/grails-app/views/studyCompare/common/_on_page.gsp

    r2174 r2237  
    3535                                var options = '<h2>'+that.getAttribute('name')+'</h2>'; 
    3636                                for (var i=0;i<data.length;i++) { 
    37                                         options += '<input type="checkbox" name="species[]" value="'+data[i].id+'"/>'+data[i].name+'<br/>'; 
     37                                        options += '<li><input type="checkbox" name="'+elementId+'[]" value="'+data[i].id+'" id="'+elementId+'-'+data[i].id+'" /><label for="'+elementId+'-'+data[i].id+'">'+data[i].name+'</label></li>'; 
    3838                                } 
     39 
    3940                                element.removeClass('waitForLoad').html(options); 
    4041 
  • trunk/grails-app/views/studyCompare/pages/_page_one.gsp

    r2170 r2237  
    2121        var check = $(event); 
    2222        var value = check.attr('value'); 
    23         var parent = check.parent(); 
     23        var parent = check.parent().parent(); 
    2424        var parentId = parent.attr('id'); 
    2525 
     
    3333        } 
    3434 
    35         // count number of matches 
    36         $('#matchedStudies').html('').addClass('waitForLoad'); 
    37         $.getJSON( 
    38                 baseUrl + "/ajax/studyCount", 
    39                 criteria, 
    40                 function(data) { 
    41                         $('#matchedStudies').html(data.matched+' of '+data.total+' readable studies matched your criteria').removeClass('waitForLoad'); 
    42                 } 
    43         ); 
    44  
    4535        // fetch matched studies 
    46         $('#studyOverview').html('').addClass('waitForLoad').removeClass('waitForLoad'); 
    47         $.getJSON( 
     36        $('#studyOverview').html('').addClass('waitForLoad');//.removeClass('waitForLoad'); 
     37    $('#matchedStudies').html('').addClass('waitForLoad'); 
     38    $.getJSON( 
    4839                baseUrl + "/ajax/studies", 
    4940                criteria, 
    5041                function(data) { 
     42            // update matched study feedback 
     43            $('#matchedStudies').html(data.matched+' of '+data.total+' readable studies matched your criteria').removeClass('waitForLoad'); 
     44 
     45            // show matching studies 
    5146                        var studies = ''; 
    5247                        for (var i=0; i<data.studies.length; i++) { 
    5348                                studies = studies + data.studies[i] + '<br/>'; 
    5449                        } 
    55                         $('#studyOverview').html(studies); 
     50                        $('#studyOverview').removeClass('waitForLoad').html(studies); 
     51 
     52            // (un)mark property checkboxes 
     53            $.each(['uniqueSpecies','uniqueEventTemplateNames','uniqueSamplingEventTemplateNames','modules'],function(index,property) { 
     54                $('input:checkbox[name="'+property+'[]"]').each(function() { 
     55                    element = $(this); 
     56                    if (data[property][ element.val() ]) { 
     57                        element.parent().removeClass('dimmed'); 
     58                    } else { 
     59                        element.parent().addClass('dimmed'); 
     60                    } 
     61                }); 
     62            }); 
    5663                } 
    5764        ); 
     
    6370        <div name="event templates" id="uniqueEventTemplateNames" class="ajax"></div> 
    6471        <div name="sampling event templates" id="uniqueSamplingEventTemplateNames" class="ajax"></div> 
     72    <div name="modules" id="modules" class="ajax"></div> 
    6573</div> 
    6674<div id="matchedStudies"></div> 
  • trunk/web-app/css/studyCompare.css

    r2174 r2237  
    88        margin-top: -20px; 
    99} 
     10 
    1011.selector .ajax { 
    1112        display: inline-block; 
    1213        vertical-align: top; 
    1314} 
     15 
    1416.selector .ajax .label { 
    1517        background-color: blue; 
    1618        display: block; 
     19} 
     20 
     21.selector li { 
     22    list-style-type: none; 
     23    padding: 0px; 
     24    margin: 0px; 
     25} 
     26 
     27.selector li:not(.dimmed) > input + label { 
     28    color: #000; 
     29} 
     30 
     31.selector li.dimmed > input + label { 
     32    color: #c4c4c4; 
    1733} 
    1834