%{ // Eval fields tags def fieldsHandler = [:] if(_body) { _body.setProperty('fieldsHandler', fieldsHandler); }% #{doBody as:'skip' /} %{ } }% %{ if(_fields) { }% %{ _fields.each() { }% %{ } }% %{ } else { }% %{ } }% %{ _caller.objects.eachWithIndex() { object, k -> }% %{ if(_fields) { }% %{ _fields.eachWithIndex() { field, i -> }% %{ } }% %{ } else { }% %{ if(fieldsHandler['default']) { }% %{ def handler = fieldsHandler['default']; handler.setProperty('object', object); }% #{doBody body:handler /} %{ } else { }% %{ } }% %{ } }% %{ } }%
%{ if(!_sort || _sort.contains(it)) { }% &{it} %{ } else { }% &{it} %{ } }% &{_caller.type.name}
%{ if(fieldsHandler[field]) { }% %{ def handler = fieldsHandler[field]; handler.setProperty('object', object); }% #{doBody body:handler /} %{ handler.setProperty('object', null); }% %{ } else { }% %{ if(i == 0) { }% ${object[field]?.toString()?.escape()?.raw() ?: '(no value)'} %{ } else { }% %{ if(_caller.type.getField(field).type == 'file') { }% %{ if(object[field]) { }% ${object[field].filename} (${object[field].get().size().formatSize()}) %{ } else { }% %{ } }% %{ } else { }% ${object[field]?.escape()?.raw()} %{ } }% %{ } }% %{ } }% ${object.toString()?.escape()?.raw() ?: '(no value)'}