From b1eda576a4e66e799b1fd14c7c74748a1ab20808 Mon Sep 17 00:00:00 2001 From: Tudor Malene Date: Tue, 11 Mar 2014 20:07:35 +0200 Subject: [PATCH] fixed https://github.com/tudor-malene/Easygrid/issues/44 fixed small jqgrid multiple sort moved the securityProvider to EasygridConfig --- grails-app/conf/DefaultEasygridConfig.groovy | 18 ---------- .../datasource/GormDatasourceService.groovy | 27 +++++++-------- .../easygrid/grids/JqueryGridService.groovy | 14 ++++---- scripts/EasygridSetup.groovy | 21 ++++++++++++ .../easygrid/GormDatasourceServiceSpec.groovy | 34 ++++++++++++++++--- 5 files changed, 72 insertions(+), 42 deletions(-) diff --git a/grails-app/conf/DefaultEasygridConfig.groovy b/grails-app/conf/DefaultEasygridConfig.groovy index c6fd640..694e596 100644 --- a/grails-app/conf/DefaultEasygridConfig.groovy +++ b/grails-app/conf/DefaultEasygridConfig.groovy @@ -115,24 +115,6 @@ easygrid { pageSize = 10 } - // default security provider - securityProvider = { grid, oper -> - return true -/* - if (!grid.roles) { - return true - } - def grantedRoles - if (Map.isAssignableFrom(grid.roles.getClass())) { - grantedRoles = grid.roles.findAll { op, role -> oper == op }.collect { op, role -> role } - } else if (List.isAssignableFrom(grid.roles.getClass())) { - grantedRoles = grid.roles - } else { - grantedRoles = [grid.roles] - } - SpringSecurityUtils.ifAllGranted(grantedRoles.inject('') { roles, role -> "${roles},${role}" }) -*/ - } //default autocomplete settings autocomplete { diff --git a/grails-app/services/org/grails/plugin/easygrid/datasource/GormDatasourceService.groovy b/grails-app/services/org/grails/plugin/easygrid/datasource/GormDatasourceService.groovy index 44603a1..cbf6316 100644 --- a/grails-app/services/org/grails/plugin/easygrid/datasource/GormDatasourceService.groovy +++ b/grails-app/services/org/grails/plugin/easygrid/datasource/GormDatasourceService.groovy @@ -6,6 +6,7 @@ import org.codehaus.groovy.grails.commons.GrailsDomainClass import org.codehaus.groovy.grails.commons.GrailsDomainClassProperty import org.codehaus.groovy.grails.scaffolding.DomainClassPropertyComparator import org.grails.datastore.mapping.query.Query +import org.grails.datastore.mapping.query.api.Criteria import org.grails.plugin.easygrid.ColumnConfig import org.grails.plugin.easygrid.Filter import org.grails.plugin.easygrid.GridConfig @@ -197,19 +198,17 @@ class GormDatasourceService { * @param filters - map of filter closures * @return */ - DetachedCriteria createWhereQuery(gridConfig, filters) { - def initial = new DetachedCriteria(gridConfig.domainClass) - DetachedCriteria result = filters.inject(gridConfig.initialCriteria ? initial.build(gridConfig.initialCriteria) : initial) { DetachedCriteria criteria, Filter filter -> - def filterCriteria = getCriteria(filter); - if (filterCriteria instanceof Closure) { - criteria.and(filterCriteria) - } else { - //todo filterCriteria - filterCriteria.criteria.criteria.each { Query.Criterion criterion -> criteria.add(criterion) } - criteria - } + Criteria createWhereQuery(GridConfig gridConfig, List filters) { + DetachedCriteria baseCriteria = new DetachedCriteria(gridConfig.domainClass) + if (gridConfig.initialCriteria) { + baseCriteria = baseCriteria.build(gridConfig.initialCriteria) } + filters.collect { getCriteria(it) }.each { Closure filterCriteria -> + filterCriteria.resolveStrategy = Closure.DELEGATE_FIRST + filterCriteria.delegate = baseCriteria + filterCriteria(baseCriteria) + } // add the filterpane stuff -if supported /* @@ -217,10 +216,10 @@ class GormDatasourceService { filterPaneService.addFiltersToCriteria(result, params, gridConfig.domainClass) } */ - result + return baseCriteria } - + //todo - move to filter def getCriteria(Filter filter) { assert filter.searchFilter instanceof Closure assert filter.searchFilter.parameterTypes.size() == 1 @@ -229,7 +228,7 @@ class GormDatasourceService { filter.searchFilter.curry(filter.global ? params : filter) } - DetachedCriteria addOrderBy(DetachedCriteria criteria, List orderBy) { + Criteria addOrderBy(Criteria criteria, List orderBy) { orderBy.each { criteria.order(it.sort, it.order) } diff --git a/grails-app/services/org/grails/plugin/easygrid/grids/JqueryGridService.groovy b/grails-app/services/org/grails/plugin/easygrid/grids/JqueryGridService.groovy index e4e9dff..3908eb7 100644 --- a/grails-app/services/org/grails/plugin/easygrid/grids/JqueryGridService.groovy +++ b/grails-app/services/org/grails/plugin/easygrid/grids/JqueryGridService.groovy @@ -51,12 +51,14 @@ class JqueryGridService { if (gridConfig.jqgrid?.multiSort) { //In case when the data is obtained from the server the sidx parameter contain the order clause. It is a comma separated string in format field1 asc, field2 desc …, fieldN. Note that the last field does not not have asc or desc. It should be obtained from sord parameter // When the option is true the behavior is a s follow - result.multiSort = params.sidx?.split(',')?.collect { String token -> - String[] tokens = token.trim().split(' ') - if (tokens.size() == 2) { - return [sort: tokens[0], order: tokens[1]] - } else { - return [sort: tokens[0], order: params.sord] + if(params.sidx){ + result.multiSort = params.sidx.split(',')?.collect { String token -> + String[] tokens = token.trim().split(' ') + if (tokens.size() == 2) { + return [sort: tokens[0], order: tokens[1]] + } else { + return [sort: tokens[0], order: params.sord] + } } } diff --git a/scripts/EasygridSetup.groovy b/scripts/EasygridSetup.groovy index 7b46870..18e825e 100644 --- a/scripts/EasygridSetup.groovy +++ b/scripts/EasygridSetup.groovy @@ -7,7 +7,28 @@ target(easygridSetup: "The description of the script goes here!") { configFile.createNewFile() configFile << """ easygrid{ + defaults{ + //un-comment if you use spring security or implement your own with your framework + securityProvider = { grid, oper -> + return true +/* + if (!grid.roles) { + return true + } + def grantedRoles + if (Map.isAssignableFrom(grid.roles.getClass())) { + grantedRoles = grid.roles.findAll { op, role -> oper == op }.collect { op, role -> role } + } else if (List.isAssignableFrom(grid.roles.getClass())) { + grantedRoles = grid.roles + } else { + grantedRoles = [grid.roles] + } + SpringSecurityUtils.ifAllGranted(grantedRoles.inject('') { roles, role -> "\${roles},\${role}" }) +*/ + } + + } } """.stripIndent() } diff --git a/test/unit/org/grails/plugin/easygrid/GormDatasourceServiceSpec.groovy b/test/unit/org/grails/plugin/easygrid/GormDatasourceServiceSpec.groovy index ed590f0..2b4ca3f 100644 --- a/test/unit/org/grails/plugin/easygrid/GormDatasourceServiceSpec.groovy +++ b/test/unit/org/grails/plugin/easygrid/GormDatasourceServiceSpec.groovy @@ -103,7 +103,9 @@ class GormDatasourceServiceSpec extends Specification { //test criteria search when: domainRows = service.list(criteriaGridConfig, [maxRows: 10, rowOffset: 0], - [new Filter({ between("testIntProperty", 31, 80) }, '1')] + [new Filter( + { between("testIntProperty", 31, 80) } + , '1')] ) then: 10 == domainRows.size() @@ -133,7 +135,13 @@ class GormDatasourceServiceSpec extends Specification { //test criteria search when: - domainRows = service.list(domainGridConfig, [maxRows: 10, rowOffset: 10], [new Filter({ filter -> between("testIntProperty", 31, 80) })]) + domainRows = service.list(domainGridConfig, [maxRows: 10, rowOffset: 10], + [new Filter( + { filter -> + between("testIntProperty", 31, 80) + } + )] + ) then: 10 == domainRows.size() 41 == domainRows[0].testIntProperty @@ -318,7 +326,7 @@ class GormDatasourceServiceSpec extends Specification { when: - def query = service.createWhereQuery([domainClass: PetTest], [ + def query = service.createWhereQuery([domainClass: PetTest] as GridConfig, [ new Filter( { Filter filter -> if (filter.paramValue.size() > 2) { @@ -348,7 +356,7 @@ class GormDatasourceServiceSpec extends Specification { when: - def query = service.createWhereQuery([domainClass: OwnerTest], [ + def query = service.createWhereQuery([domainClass: OwnerTest] as GridConfig, [ new Filter( { Filter filter -> if (filter.paramValue.size() == 2) { @@ -398,6 +406,11 @@ class GormDatasourceServiceSpec extends Specification { // name 'o.name' // property 'owner.name' enableFilter true + filterClosure { Filter filter -> + owner { + eq('name', 'John') + } + } jqgrid { } } @@ -420,6 +433,19 @@ class GormDatasourceServiceSpec extends Specification { then: 5 == data.size() 'Bonkers' == data[0].name + + when: + data = service.list(petsGridConfig, [:], [new Filter(petsGridConfig.columns['owner.name'])]) + then: + 2 == data.size() + 'Bonkers' == data[0].name + 'tommy' == data[1].name + + when: + int cnt = service.countRows(petsGridConfig, [new Filter(petsGridConfig.columns['owner.name'])]) + then: + 2 == cnt + } def "test order by multiple fields"() {