Changeset 2237


Ignore:
Timestamp:
May 29, 2012, 4:24:52 PM (5 years ago)
Author:
work@…
Message:
  • improved initial study compare page gives visual feedback
Location:
trunk
Files:
6 edited

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
Note: See TracChangeset for help on using the changeset viewer.