Filtros como campo OBRIGATÓRIO

Dae galera, tudo certo? Bem, estou desenvolvendo uma aplicação ( projeto referente a uma biblioteca) com filtros, cadastros, etc.
Nesta, tenho Relatórios a serem gerados, sendo os mesmos gerados a partir de filtros.
Então, queria saber como eu poderia “bloquear” o relatório se o usuário não selecionar nenhum dos campos para filtrar o relatório. Tentei por required, mas não de certo.
Abaixo, está a tela para gerar o relatório de Boletins.
Desde já, agradeço se alguém puder ajudar.


<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:treap="http://java.sun.com/jsf/composite/treap"
      xmlns:p="http://primefaces.org/ui">

    <body>

        <ui:composition template="./default_layout_with_menu.xhtml">

            <ui:define name="titulo-pagina">
                Boletim
            </ui:define>

            <ui:define name="content">

                <treap:ajaxStatus/>
                <p:tabView id="tab" activeIndex="#{notaJsfBean.indiceAbaSelecionada}" widgetVar="tab1">
                    <p:tab title="Filtros" id="tabList" >
                        <p:panel header="Filtros de Consulta" id="parametros">
                            <treap:msgdica msg="Informe um parâmetro para a consulta. Deixe os campos em branco para exibir todos os registros."/>
                             <p:growl id="grow1" life="4000"/>
                              <p:focus for="escola"/>
                            <table border="0" cellpadding="2" cellspacing="0" style="margin-left: 40px">
                                <tr>
                                    <td align="right">Escola</td>
                                    <td>
                                        <h:selectOneMenu id="escola" value="#{notaJsfBean.escola}" converter="sec" required="true"  requiredMessage="O campo Escola deve ser informado.">
                                            <f:selectItem/>
                                            <f:selectItems value="#{notaJsfBean.escolaList}" var="e" itemLabel="#{e.nomeCompleto}" itemValue="#{e}"/>
                                            <f:ajax render="turma" event="change" listener="#{notaJsfBean.atualizarEscola(event)}" />
                                        </h:selectOneMenu>
                                    </td>
                                </tr>
                                <tr>
                                    <td align="right">Turma</td>
                                    <td>
                                        <h:selectOneMenu id="turma" value="#{notaJsfBean.turma}" converter="sec">
                                            <f:selectItem />
                                            <f:selectItems value="#{notaJsfBean.turmaList}" var="t" itemLabel="#{t.descricao}" itemValue="#{t}"/>
                                            <f:ajax render="aluno" event="change" listener="#{notaJsfBean.atualizarAlunoPorTurma(event)}" />
                                        </h:selectOneMenu>
                                    </td>
                                </tr>
                                <tr>
                                    <td align="right">Aluno</td>
                                    <td>
                                        <h:selectOneMenu id="aluno" value="#{notaJsfBean.aluno}" converter="sec">
                                            <f:selectItem />
                                            <f:selectItems value="#{notaJsfBean.alunoList}" var="a" itemLabel="#{a.nome}" itemValue="#{a}"/>
                                            <f:ajax listener="#{notaJsfBean.aluno}"/>
                                        </h:selectOneMenu>
                                    </td>
                                </tr>
                                <tr>
                                    <td>&nbsp;</td>
                                    <td>
                                        <treap:btnRelatorio metodo="#{notaJsfBean.geraRelatorioBoletimPDF()}" />
                                    </td>
                                </tr>
                            </table>

                            <p:ajaxStatus style="position: fixed; top: 40%; left: 35%; background-color: #ffffff">
                                <f:facet name="start">
                                    <h:graphicImage value="/resources/img/ajaxloadingbar.gif" /><br/>
                                    <p:spacer width="3"/> Processando...
                                </f:facet>
                                <f:facet name="complete">
                                    <h:outputText value="" />
                                </f:facet>
                            </p:ajaxStatus>

                        </p:panel>
                    </p:tab>                   
                </p:tabView>
            </ui:define>
        </ui:composition>

    </body>
</html>

Bom dia Ricardo,

Muito estranho sua afirmação, pois o “required=true” já seria o suficiente, só o campo escola “é necessário?”

Poisé, também estou achando estranho…Com relação ao campo, como tenho ajax em escola, só ele já seria necessário

A única forma que conhece de pular as fases do ciclo de vida JSF é usando o immediate = true.

Faz um teste, no botão que gera o relatório, desabilita o ajax.

Ok, vou fazer aki e já falo oke aconteceu :slight_smile:

Testei aqui e não deu certo =/

Puts!!!

Me diz uma coisa, mesmo vc deixando a “combo” escola sem seleção, ele segue a frente, não dá nenhum aviso??

:?:

Não dá nenhum aviso… além disso, se eu deixar sem seleção, ele gera o relatorio de TODAS AS ESCOLAS, TODAS AS TURMAS E TODOS OS ALUNOS :confused:

Legal,

Adiciona a seguinte linha: <f:selectItem itemValue="" itemLabel=“Selecione” />

&lt;h:selectOneMenu id="escola" value="#{notaJsfBean.escola}" converter="sec" required="true"  requiredMessage="O campo Escola deve ser informado."&gt;&lt;f:selectItem/&gt;  
   &lt;f:selectItem itemValue="" itemLabel="Selecione" /&gt;
   &lt;f:selectItems value="#{notaJsfBean.escolaList}" var="e" itemLabel="#{e.nomeCompleto}" itemValue="#{e}"/&gt;  
   &lt;f:ajax render="turma" event="change" listener="#{notaJsfBean.atualizarEscola(event)}" /&gt;  
&lt;/h:selectOneMenu&gt;  

e testa novamente.

Ok, já posto o resultado :slight_smile:

Novamente não deu cara :confused:

Ricardo,

Só para desencargo, dá um rebuild em seu projeto. Limpa cache dos seu navegador… (vamos apelar para o sobrenatural…rs).

Ok…hehehe… vai que numa dessas é isso né ( mas acho que não) aushaushaushausha

Pior que não é isso…

só uma coisa,

como está desenvolvido esse:

treap:btnRelatorio

normalmente uso assim:

&lt;p:commandButton id="btnSalvar" action="#{matriculaBean.save}" value="#{bundle.btnSalvar}" ajax="false" icon="save"/&gt; 

Caso consiga resolver, posta a solução…fiquei curioso!

Boa sorte ai!

Cara, vou te mandar a ação do botão gerar relatório :slight_smile:
Segue abaixo o código:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:cc="http://java.sun.com/jsf/composite"      
      xmlns:p="http://primefaces.org/ui"
      xmlns:c="http://java.sun.com/jsp/jstl/core"
      xmlns:h="http://java.sun.com/jsf/html">

    <!-- INTERFACE -->
    <cc:interface>
        <cc:attribute name="metodo" method-signature="void action()"/>        
        <cc:attribute name="labelPDF" default="Gerar Relatório em PDF"/>
        <cc:attribute name="labelRTF" default="Gerar Relatório em RTF"/>
        <cc:attribute name="update" default="@none"/>
        <cc:attribute name="process" default="@this"/>
        <cc:attribute name="iconePDF" default="relatorio"/>
        <cc:attribute name="iconeRTF" default="word"/>
        <cc:attribute name="pdf" default="true"/>
        <cc:attribute name="visivel"/>
    </cc:interface>

    <!-- IMPLEMENTATION -->
    <cc:implementation>
        <h:panelGroup rendered="#{cc.attrs.pdf}">
            <p:commandButton actionListener="#{cc.attrs.metodo}" value="#{cc.attrs.labelPDF}" 
                             update="#{cc.attrs.update}" process="#{cc.attrs.process}" 
                             image="#{cc.attrs.iconePDF}" oncomplete="window.location='#{request.contextPath}/relat'"
                             rendered="#{cc.attrs.visivel == null ? true : cc.attrs.visivel}"/>
        </h:panelGroup>
        
        <h:panelGroup rendered="#{not cc.attrs.pdf}">
            <p:commandButton actionListener="#{cc.attrs.metodo}" value="#{cc.attrs.labelRTF}" 
                             update="#{cc.attrs.update}" process="#{cc.attrs.process}" 
                             image="#{cc.attrs.iconeRTF}" oncomplete="window.location='#{request.contextPath}/relat'"
                             rendered="#{cc.attrs.visivel == null ? true : cc.attrs.visivel}"/>
        </h:panelGroup>
    </cc:implementation>
</html>

Essa é a forma que não funciona né? Quando eu pedi para colocar ajax=false foi nesse componente:

&lt;p:commandButton actionListener="#{cc.attrs.metodo}" value="#{cc.attrs.labelRTF}"   
                             update="#{cc.attrs.update}" process="#{cc.attrs.process}"   
                             image="#{cc.attrs.iconeRTF}" oncomplete="window.location='#{request.contextPath}/relat'"  
                             rendered="#{cc.attrs.visivel == null ? true : cc.attrs.visivel}" AJAX=FALSE/&gt;  

que vc colocou?

Sim , coloquei aí, mas mesmo assim não deu certo…
Deve ser algo “simples” que eu não estou me ligando…

cara, a unica diferença que notei, é quando executa a ação, chamo pelo action e não pelo actionlistener, mas acredito que não seja isso!