quarta-feira, 6 de fevereiro de 2013

Custom Paginator in Grails

Salve galera,

Nesse poste irei disponibilizar o código de uma TagLib de paginação customizada, que fiz para suprir minhas necessidades. O código está comentado e é de facil customização.

Obs: Para esse exemplo usei o framework de css fundation. Link http://foundation.zurb.com

Essa é a tag lib:


package br.com.mobilemind

class PaginatorTagLib{
 
 private static final log = org.apache.commons.logging.LogFactory.getLog(this)

 def paginator = { attrs, body -> 


  def max = request['max'] ?: 10
  def offset = request['offset'] ?: 0
  def totalCount = request['totalCount'] ?: 0
  def url = request.forwardURI + "?uuid=$params.uuid" + "&max=$max"


  if(totalCount > max){ // exibe apenas se tiver mais que uma página
   def html = "
" html += "
    " if(offset == 0){ //back link html += '
  • «
  • ' }else{ def backUrl = url + "&offset=" + (offset - max) html += "
  • «
  • " } int rows = totalCount / max // contagem de paginas def mod = totalCount % max // resto da contagem paginas def begin = false, end = false //se unavailable já foi inserido no fim ou no início def availableMax = 5 // maximo de paginas exibida. Se exceder, é mostrado ...(unavailable) if(mod > 0){ rows++ } for(c in (0.. availableMax){ if(currentOffset > (offset + (max * availableMax))) { if(!end){ html += '
  • ' } end = true continue } if(currentOffset < (offset - (max * availableMax))) { if(!begin){ html += '
  • ' } begin = true continue } } def currentUrl = url + "&offset=$currentOffset" if(currentOffset == offset){ html += "
  • ${c}
  • " }else{ html += "
  • ${c}
  • " } } if((offset + max) >= totalCount){ // next link html += '
  • »
  • ' }else{ def nextUrl = url + "&offset=" + (offset + max) html += "
  • »
  • " } html += "
" html += "
" out << html } } }

Para usar:

    

O controller deve retornar os parametros para a taglib, como:



def list(){
   def max = params.int('max') ?: 10
   def offset = params.int('offset') ?: 0
   def items = Produto.findAll([max: max, offset: offset])
   def totalCount = items.totalCount
   [items: items, max: max, offset: offset, totalCount: totalCount]
}

Espero que seja útil para alguém como foi pra mim.

Até a próxima!

Nenhum comentário:

Postar um comentário