Solucionado (ver solução)
Solucionado
(ver solução)
15
respostas

Filtro selectOneMenu no dataTable

Estou utilizando o showcase do primeface como parametro para poder fazer funcionar o filtro de selectOneMenu em um dataTable.. mas não esta aparecendo os valores da lista para fazer o filtro.

Segue o trecho do codigo

<p:dataTable id="tabelaDeferimentoDemanda" widgetVar="tabelaDeferimentoDemanda" filteredValue="#{solicitarDemandaManager.listaAgenciaSolicitarDemandasTeste}" var="item" value="#{solicitarDemandaManager.listaAgenciaSolicitarDemandas}" emptyMessage="Não há solicitação de demanda" scrollable="true" scrollHeight="450" style="text-align:center">

<p:column headerText="Tipo" style="text-align:center; width: 130px" filterBy="#{item.tipoDemanda}" filterMatchMode="contains">
                                 <f:facet name="filter">
                                    <p:selectOneMenu onchange="PF('tabelaDeferimentoDemanda').filter()" value="#{item.tipoDemanda}" >
                                        <f:selectItem itemLabel="Selecionar" itemValue="#{null}" noSelectionOption="true" />
                                        <f:selectItems value="#{solicitarDemandaManagerTeste.tipoDemanda}" />
                                    </p:selectOneMenu>
                                </f:facet>
                                <h:outputText title="#{item.tipoDemanda}" value="#{item.tipoDemanda}" />
                            </p:column>

Alguem poderia me ajudar?

15 respostas

Oi Diego,

desculpe a demora. compartilhe conosco o seu codigo para podermos ajudar melhor.

abs

nao entendi pra que serve esse filteredValue.

Quando eu utilizo uma lista dos resultados meu select vem com todos os dados da lista. Um amigo meu disse que tenho que fazer uma outra lista tratando do banco apenas os tipos que quero e tirando as redundâncias. Confere? e para eu fazer o filtro funcionar como seria? Eu utilizei o sortBy e o filterBy conforme ensinou nas videos aulas e funcionou perfeitamente. Mas o meu sistema necessita desse filtro selectOneMenu. Pois eu tenho 3 tipos de demandas.. e gostaria que qd selecionado um tipo ele me mostre tds as demandas com o tipo selecionado.

Estou utilizando igual o trecho do código que envie na pergunta.

Mas se quiser pode utilizar um exemplo simples para utilizar como referencia.

Oi Diego,

me dá mais um tempinho para responder!

preciso testar isso direitinho e isso toma um pouco de tempo.

abs

Ok, sem problemas. Muito obrigado pelo suporte.

Oi Diego,

testei agora o showcase do primefaces para entender melhor.

1) O atributo filteredValue aponta para uma lista que guarda temporariamente os elementos filtrados. Ou seja, os atributos value e filteredValue definem através da EL uma lista, só que o primeiro é a lista completa (que vc popula) e o segundo é a listaFiltrada (filtrada através dos seus filtros)

2) Dentro do seu selectOneMenu você está usando a tag:

<f:selectItems value="#{solicitarDemandaManagerTeste.tipoDemanda}" />

tipoDemanda deve ser uma lista com os tipos. O que o método getTipoDemanda() devolve?

3) Se pudesse compartilhar também o seu bean, ficaria grato. Assim podemos ver melhor onde realmente estar o problema.

abs

Ola Nico,

Andei fazendo umas pesquisas e consegui fazer funcionar.

Segue o codigo.

    <p:column headerText="Tipo" style="text-align:center; width: 160px" filterBy="#{item.tipoDemanda}" filterMatchMode="exact">
                                 <f:facet name="filter">
                                    <p:selectOneMenu onchange="PF('tabelaDeferimentoDemanda').filter()" style="width: 130px">
                                        <f:selectItem itemLabel="Selecionar" itemValue="" noSelectionOption="true" />
                                        <f:selectItem itemLabel="novo desenvolvimento" itemValue="novo desenvolvimento" />
                                        <f:selectItem itemLabel="melhoria" itemValue="melhoria" />
                                        <f:selectItem itemLabel="manutenção" itemValue="manutenção" />
                                    </p:selectOneMenu>
                                </f:facet>
                                <h:outputText title="#{item.tipoDemanda}" value="#{item.tipoDemanda}" />
                            </p:column>

Pelo o que eu entendi o items teria que ter uma lista já tratada com os dados que preciso fazer o filtro da tabela. Então no meu caso em especifico percebi que a melhor forma seria eu colocar direto os 3 tipos no selectOneMenu. Funcionou normal dessa vez. Mas provavelmente na minha aplicação, futuramente necessitarei utilizar com uma lista.

Então no filteredValue eu devo passar uma lista em branco para o jsf utilizar temporariamente para fazer o filtro e no items passar a lista dos elementos que quero filtrar ? Entendi certo? rsrs..

Muito obrigado pela ajuda e atenção!

<p:column headerText="Tipo" style="text-align:center; width: 160px" filterBy="#{item.tipoDemanda}" filterMatchMode="exact">
                                 <f:facet name="filter">
                                    <p:selectOneMenu onchange="PF('tabelaDeferimentoDemanda').filter()" style="width: 130px">
                                        <f:selectItem itemLabel="Selecionar" itemValue="" noSelectionOption="true" />
                                        <f:selectItem itemLabel="novo desenvolvimento" itemValue="novo desenvolvimento" />
                                        <f:selectItem itemLabel="melhoria" itemValue="melhoria" />
                                        <f:selectItem itemLabel="manutenção" itemValue="manutenção" />
                                    </p:selectOneMenu>
                                </f:facet>
                                <h:outputText title="#{item.tipoDemanda}" value="#{item.tipoDemanda}" />
                            </p:column>
<p:column headerText="Tipo" style="text-align:center; width: 160px" filterBy="#{item.tipoDemanda}" filterMatchMode="exact">
                                 <f:facet name="filter">
                                    <p:selectOneMenu onchange="PF('tabelaDeferimentoDemanda').filter()" style="width: 130px">
                                        <f:selectItem itemLabel="Selecionar" itemValue="" noSelectionOption="true" />
                                        <f:selectItem itemLabel="novo desenvolvimento" itemValue="novo desenvolvimento" />
                                        <f:selectItem itemLabel="melhoria" itemValue="melhoria" />
                                        <f:selectItem itemLabel="manutenção" itemValue="manutenção" />
                                    </p:selectOneMenu>
                                </f:facet>
                                <h:outputText title="#{item.tipoDemanda}" value="#{item.tipoDemanda}" />
                            </p:column>

Nico,

Não estou conseguindo colocar os códigos. Ele aparece na parte de edição mas após eu colocar responder ele esta saindo em branco.

Oi Diego,

conseguiu resolver! Ótimo então :)

Tbm já criamos mais um exercício no curso JSF que usa um combobox na dataTable. Espero que ajude os próximos alunos.

Sobre o código: Ele foi salvo, só faltou usar o ```, no inicio e fim para escapar as tags.

abs

Ah desculpa, a pagina atualizo e agora apareceu todas as vezes que postei o código.. rs antes estava aparecendo em branco para mim, então pensei que não estava enviando.

Legal, qual parte que esta esse exercício? pode me informar? esses elementos são essenciais para aplicações, se posteriormente houver um vídeo com esses principais elementos de form, acho que ajudará muita gente.

Vlw Nico!.

solução!

Oi Diego,

é esse exercicio aqui:

https://cursos.alura.com.br/course/jsf-primefaces/section/5/exercise/10

abs

Ficou muito bom! Obrigado Nico!