Tablas rápidas para Grails

Si hay algo odioso cuando hay que hacer una interfaz de administración, es armar la lista para cada modelo del dominio para los AMBs. Esta semana me tocó mejorar el diseño para una aplicación grails, por lo que decidí ver como se podían generar “helpers” o TagLibs en nomenclatura grails.

El siguiente código genera usando bootstrap3 una tabla con paginado, botón de editar y eliminar de forma genérica:

package test

class ResourceTableTagLib {
    /**
     * Creates a bootstrap3 compatible datatable.
* * @emptyTag * * @attr list REQUIRED List of domain models to show * @attr count REQUIRED Total registers (for pagination) * @attr labels REQUIRED Comma-separated values for the columns headers * @attr columns REQUIRED Comma-separated of model attributes to show */ def table_for = { attrs -> def writer = out def list = attrs.list def count = attrs.count def labels = attrs.labels.split(/,/).collect { x -> x.trim() } def columns = attrs.columns.split(/,/).collect { x -> x.trim() } writer << '
' writer << '' writer << '' writer << '' labels.eachWithIndex { a, i -> writer << "" } writer << '' writer << '' writer << '' writer << '' list.eachWithIndex { a, i -> writer << " " writer << " " columns.eachWithIndex { c, j -> if (j != 0) { writer << "" } } writer << ' ' writer << '' } writer << '' writer << '
${a}
" writer << g.link(action: "show", id: a.id, a."${columns[0]}") writer << " ${a."${columns[j]}"}' writer << g.form(url: [resource:a, action:'delete'], method: "DELETE") { writer << g.link(class: "btn btn-default btn-sm", action: "edit", resource: a, "Editar") writer << " " writer << g.actionSubmit(class: "btn btn-danger btn-sm", action: "delete", value: "Eliminar", onclick: "return confirm('¿Eliminar curso?');") } writer << '
' writer << '
' writer << '
' def offset = params.offset as Integer ?: 0 def page_start = offset + 1 def page_end = Math.min(offset+10, count) writer << "
Mostrando ${page_start} a ${page_end} de ${pluralize(count: count, singular: "registro")}
" writer << '
' writer << '
' writer << g.paginate(total: count) writer << '
' writer << '
' writer << '
' } def pluralize = { attrs, body -> def plural = attrs['plural'] ?: attrs['singular'] + "s" out < 1 ? plural : attrs['singular'] ) } }

PD : Seguramente exista forma de sacar el nombre de columna desde el nombre del atributo del modelo, pero todavía no lo encontré.

Para usarlo simplemente basta con agregar en nuestro template :

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s