Filtro na List.gsp com Checkbox + Jquery
15/10/2012 23:38
0
Comunidade,

Estou fazendo um pequeno sistema para gerenciar os chamados na área que trabalho (suporte) e está ficando legal...

A dificuldade da vez é em fazer filtros nos chamados com base no Status (podendo filtrar mais de um por vez).

Grosseiramente falando, o sistema está assim: (Parte relevante)

Model Chamado:

Date dataAbertura
Date dataEncerramento
String solicitacao
Solicitante solicitante
Contato contato
Situacao status // esse é o cara que quero filtrar
TipoChamado tipoChamado


Model Situacao:

String nome // esse é o cara que será o checkbox
String descricao


Gerou o crud belezinha.. consegui fazer uns combos aninhados com solicitante -> contato... e talz...

O problema agora é "listar os chamados com situação pendente e expirado". Se fosse filtrar um status por vez eu acho que até conseguiria, mas esse tá fo**

Aqui começa minha insegurança:
Logo no comecinho de <body> da list.gsp da classe chamado, inseri as linhas abaixo:

<g:each in="${Situacao.list()}" var="i">
<g:checkBox class="chk" name="check" value="${i.id}" checked="${false}"></g:checkBox> ${i.nome} <br>
</g:each>


Queria fazer com jQuery, então terei algo parecido com isso (também acho que não está certo desse jeito)


<g:javascript>
$(document).ready(function() {
$(".chk").change(function() {
$.ajax({
url: "ajaxFiltroCheckBox",
data: "id=" + this.value, // isso não vai fazer ele sempre assumir o último filtro???
cache: false,
success: function(html) {
$("#temporaria").html(html);
}
});
});
});
</g:javascript>


No meu controller de chamado eu acho que vai ter alguma coisa com o "contains", mas não sei nem como escrever:

def ajaxFiltroCheckBox ={
def filtros = params.list("check")
// e agoraaa??

}


faço um template ou posso usar as gsps que são geradas pelo scaffold?

Estou muuuuuuuito longe de conseguir fazer isso funcionar?

Alguem tem um link que é abordada essa situação sem prototype e poderia compartilhar?

Muito obrigado!
Tags: checkbox filtro ajax jquery


0
Acho que estou começando a achar o caminho

Javascript pra passar os checkboxs selecionados



<g:javascript>
$(document).ready(function() {
$(".chk").change(function() {

var data = { 'situacao_ids[]' : []};
$(":checked").each(function() {
data['situacao_ids[]'].push($(this).val());
});

$.ajax({
url: "ajaxFiltroCheckBox",
data: data,
cache: false,
success: function(html) {
$("#temporaria").html(html);
}
});
});
});
</g:javascript>


Não se atentem ainda no "sucess"...

Agora vou trabalhar (tentar) no controlador
16/10/2012 00:58


0
Fala Brother blz?

Se entendi bem seu problema eu poderia fazer de duas maneiras.

1ª Retornaria todos os Chamados e criaria dois checks um pendente e outro expirado, pecorreria todos Chamados com o $.each e dependendo do check escolhido, por exemplo pendente, daria um $.show() (Se não estão sendo apresentados) em todos que são pendentes e um $.hide() para todos que são expirados.

2ª Usando o ajax pegaria o valor do check escolhido e retornaria só os Chamados cuja a Situacao seja a que tenha o valor igual ao do check passado, retornaria um JSON e trataria creio que no success mesmo e toda vez que mudar de check os dados são removidos e é feito uma nova busca.

Qualquer dúvidas estamos aê!




0
Gabriel, boa tarde!

A ideia é fazer do jeito 2

"Usando o ajax pegaria o valor do check escolhido e retornaria só os Chamados cuja a Situacao seja a que tenha o valor igual ao do check passado, retornaria um JSON e trataria creio que no success mesmo e toda vez que mudar de check os dados são removidos e é feito uma nova busca."


Eu consegui, com muito esforço, passar toda vez que o um checkbox é alterado uma lista dos ids com o código javascript abaixo:



$(document).ready(function() {
$(".chk").change(function() {

var data = { 'situacao_ids[]' : []};
$(":checked").each(function() {
data['situacao_ids[]'].push($(this).val());
});

$.ajax({
url: "ajaxFiltroCheckBox",
data: data,
cache: false,
success: function(html) {
$("#temporaria").html(html);
}
});
});
});



Lá no meu controller eu estou recebendo um "params.lista_ids = [1,2,4]" mas não estou sabendo o que fazer com isso para devolver uma listagem filtrada

eu tinha tentado fazer algo como o código abaixo para testar, mas nem deu
def ajaxFiltroCheckBox = {
def filtros = params.list("lista_ids")
def retorno = Chamado.findAll("from Chamado as c where c.situacao = ?", filtros)
println retorno
}

tenho que saber como tratar essa informação pra depois pensar em um template

pode me dar uma força nessa tarefa?!

Muito obrigado
16/10/2012 15:29


0
Então brother pq vc ñ faz assim!

$(document).ready(function() {
$(".chk").change(function() {
var $status = $(this).val();
$.ajax({
url: "ajaxFiltroCheckBox/?status=" + $status,
cache: false,
success: function(data) {
//Remover os dados da última pesquisa
//e vc tratar o retorno do json no caso "data"
}
});
});
});


No caso eu adicionei um parametro status... que vc vai receber na action ajaxFiltroCheckBox... então vc pode fazer desse jeito

def ajaxFiltroCheckBox = {
def filtro = params.status
def retorno = Chamado.findAllByStatus(filtro)
render retorno as JSON
}


Brother não testei.. provavelmente vai dar uns erros.. mas creio que o caminho é por ai! Abraço!


0
Gabriel, obrigado mais uma vez pelo retorno.

Desse jeito eu não estaria filtrando apenas um status por vez?



$(".chk").change(function() {
var $status = $(this).val();
$.ajax({
url: "ajaxFiltroCheckBox/?status=" + $status,



Não preciso passar (e trabalhar) uma lista dos status que estão checkados?
16/10/2012 17:22


1
Tinha entendido errado! achava que filtrava por apenas um status! Me tira uma dúvida então! Vai ser uma lista que será toda baixada e depois será filtrada?

Pq vejo o seguinte 2 checks pendentes e outro expirados... se os dois estiverem desmarcados... todos os dados são apresentados.... se um ou os dois estiverem marcados mostra os dados filtrados. Então pra isso pegaria os checks e passaria como parametro. Ex:


String pendente = params.pendente
String expirado = params.expirado
List<Chamado> chamados = []

if(pendente || expirado){
chamados = Chamado.withCriteria {
situacao {
eq("status", pendente)
or {
eq("status", expirado)
}
}
}
} else {
chamados = Chamados.list()
}

return chamados as JSON


Brother não tah testado! e eu tô meio sem tempo! :) veja se ficou claro o código... qualquer coisa tamos aê!



0
Gabriel!

ACho que o caminho é esse mesmo!

Estou no serviço e não tenho como testar no momento também, mas assim que estiver em casa vou tentar colocar na prática.

Quanto a "não ter testado" não é problema... eu acho que entendi o espírito da coisa!

Muito obrigado e qualquer novidade eu volto a postar aqui!!

Abs!
16/10/2012 19:56


0
Acho que estou chegando próximo do final!

O problema agora está na múltipla seleção dos checkbox's

Estava dando erro de conversão dos arquivos e eu andei lendo em outros posts que todo "params" é do tipo String e precisa ser convertido para long - mas e quando é lista?!

o javascript está assim:

<g:javascript>
$(document).ready(function() {
$(".chk").change(function() {

var data = { 'situacao_ids[]' : []};
$(":checked").each(function() {
data['situacao_ids[]'].push($(this).val());
});

$.ajax({
url: "ajaxFiltroCheckBox",
data: data,
cache: false,
success: function(html) {
$("#temporaria").html(html);
}
});
});
});
</g:javascript>


E o meu controller está assim:

def ajaxFiltroCheckBox ={
def chks = params.long("situacao_ids[]")
println chks

def criteria = Chamado.withCriteria(){
situacao{
eq("id",chks)
}
}

println criteria

}

No momento estou apenas focado em testar o resultado e por isso o "println".

Repare que eu faço a conversão para long
def chks = params.long("situacao_ids[]")


E isso faz com que o filtro funcione quando eu marco apenas um checkbox. Quando marco mais de um, o retorno é null

Eu tentei substituir por
param.list("situacao_ids[]")

Mas não deu certo não. Eu tinha visto em um outro post que desse jeito obrigaria a ser uma lista mesmo se só tivesse um dado vindo no params.

Como eu preciso passar minha lista de situacao_ids ou como eu tenho que receber esse dado no meu controlador para que o filtro por criteria funcione com uma lista de parâmetros.

def ajaxFiltroCheckBox ={
def chks = params.long("situacao_ids[]")
println chks

def criteria = Chamado.withCriteria(){
situacao{
eq("id",chks)
}
}


Estou tentando fazê-lo meio "dinâmico"...

Obrigado!
16/10/2012 21:40


1
Fala brother! Creio que isso resolve seu problema!

List<String> strIdList = params?.sua_lista_de_ids

List<Long> ids = strIdList*.toLong()


Simples assim! Groovy/Grails nessa parte é f*da!

Abraços!


0
Iaaahuuuuuuuu!!

Funfou!!!!

Muito obrigado pelo help, Gabriel!! Muuuuuuuuuuito mesmo!!
17/10/2012 01:42


0
Falouuu Brother!! que bom que funcionou! estamos as ordens! abraço!



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto