viernes, 30 de octubre de 2009

Usando el Ajax.inPlaceEditor

He creado el taglib que viene en el libro "Grails - The definitive guide" :



class ProductTagLib {

def editInPlace = { attrs, body ->
def rows = attrs.rows ? attrs.rows : 0
def cols = attrs.cols ? attrs.cols : 0
def id = attrs.remove('id')
out << "<span id='productTags${id}'>"
out << body()
out << "</span>"
out << "<script type='text/javascript'>"
out << "new Ajax.InPlaceEditor('productTags${id}', '"
out << createLink(attrs)
out << "',{"
if(rows)
out << "rows:${rows},"
if(cols)
out << "cols:${cols},"
if(attrs.paramName) {
out << "callback: " +
"function(form, value) { " +
"return '${attrs.paramName}=' + encodeURIComponent(value) " +
"}"
}

out << "});"
out << "</script>"
}

}




En el show.jsp he usado el tag (usando también el toString con delimitador de la entrada anterior:



<g:editInPlace id="productTags${productInstance.id}" url="[action:'updateTags',id:productInstance.id]"
rows="1" cols= "40" paramName="tags">${productInstance?.tags?.toString(", ").encodeAsHTML()}</g:editInPlace>



y simplemente queda crear el método en el controller correspondiente



def updateTags = {
def productInstance = Product.get( params.id )
productInstance.parseTags(params.tags,",")
render productInstance.tags.toString(", ")
}


Mejorando el toString de un list

En una parte de mi aplicación estaba invocando al toString del List, con un resultado esperado pero no adecuado:
[tag1, tag2, tag3]
Esto es, el toString del List de toda la vida, y yo queria obtener esta lista sin los corchetes y con otro delimitador.
Lo he conseguido creando un plugin (grails create-plugin MisUtils). Edita el archivo gestor del plugin (Misutils/MisUtilsGrailsPlugin.groovy) y he modificado el método doWithDynamicMethods:


def doWithDynamicMethods = { ctx ->
List.metaClass {
toString { String delim ->
def sb = new StringBuilder()
delegate.each {
sb.append it.toString() + delim
}
sb = (sb.length() > 0 ? sb.substring(0,sb.length()-delim.length()) :sb )
}
}
}


Y lo he probado en un test de integracion


void testToStringDelim() {

def a = ['a','b','c']
println a
println a.toString('/')
assert a.toString('/') == 'a/b/c'
}



Solo queda


grails package-plugin


y en el proyecto destingo


grails install-plugin ../MisUtils/grails-mis-utils-0.1.zip


para poder usarlo