Index: /trunk/grails-app/controllers/AssetDetailedController.groovy =================================================================== --- /trunk/grails-app/controllers/AssetDetailedController.groovy (revision 285) +++ /trunk/grails-app/controllers/AssetDetailedController.groovy (revision 286) @@ -218,5 +218,9 @@ } } + assetInstance.properties = params + + assetInstance.setAssetSubItemsFromCheckBoxList(params.assetSubItems) + if(!assetInstance.hasErrors() && assetInstance.save(flush: true)) { flash.message = "Asset ${params.id} updated" Index: /trunk/grails-app/domain/Asset.groovy =================================================================== --- /trunk/grails-app/domain/Asset.groovy (revision 285) +++ /trunk/grails-app/domain/Asset.groovy (revision 286) @@ -23,4 +23,16 @@ "${this.name}" } + + // This additional setter is used to convert the checkBoxList string + // of ids selected to the corresponding domain objects. + public void setAssetSubItemsFromCheckBoxList(ids) { + def idList = [] + ids.each() { + if(it.isInteger()) + idList << it.toInteger() + } + this.assetSubItems = idList.collect { AssetSubItem.get( it ) } + } + } Index: /trunk/grails-app/taglib/AssetTreeTagLib.groovy =================================================================== --- /trunk/grails-app/taglib/AssetTreeTagLib.groovy (revision 285) +++ /trunk/grails-app/taglib/AssetTreeTagLib.groovy (revision 286) @@ -1,3 +1,6 @@ - +/** +* Asset Tree tags. +* Specific to gnumims hence the namespace. +*/ class AssetTreeTagLib { static namespace = 'gnumims' Index: /trunk/grails-app/taglib/CustomTagLib.groovy =================================================================== --- /trunk/grails-app/taglib/CustomTagLib.groovy (revision 286) +++ /trunk/grails-app/taglib/CustomTagLib.groovy (revision 286) @@ -0,0 +1,70 @@ + +/** +* General use custom tags. +* Some are taken from http://www.grails.org/Contribute+a+Tag#checkBoxList +*/ +class CustomTagLib { + static namespace = 'custom' + + def resources = { attrs -> + ///@todo: should include our javascript and do setup here. + } + + /** + * Checkbox list that can be used as a more user-friendly alternative to a multiselect list box. + * Usage: + * To map the selected ids to corresponding domain objects, + * an additional set method is required in the containing domain class: + * // This additional setter is used to convert the checkBoxList string + * // of ids selected to the corresponding domain objects. + * public void setAssetSubItemsFromCheckBoxList(ids) { + * def idList = [] + * ids.each() { + * if(it.isInteger()) + * idList << it.toInteger() + * } + * this.assetSubItems = idList.collect { AssetSubItem.get( it ) } + * } + * Then a line in the controller: + * assetInstance.setAssetSubItemsFromCheckBoxList(params.assetSubItems) + */ + def checkBoxList = {attrs, body -> + + def from = attrs.from + def value = attrs.value + def cname = attrs.name + def isChecked, ht, wd, style, html + + // sets the style to override height and/or width if either of them + // is specified, else the default from the CSS is taken + style = "style='" + if(attrs.height) + style += "height:${attrs.height};" + if(attrs.width) + style += "width:${attrs.width};" + if(style.length() == "style='".length()) + style = "" + else + style += "'" // closing single quote + + html = "