Dialog+primefaces

Pessoal tenho um dialog que fecha mesmo sem eu chamar o método hide() do mesmo, quando clico em ok ele esta fechando automaticamente porem quero que ele somente feche se setar uma variavel no servidor para ele fechar, abaixo segue o código:

<h:form id="formCadEquipamento"> <p:dialog header="Cadastrar Equipamento" widgetVar="dlgCadEquipamento" resizable="false" id="dialogCadEquipamento" modal="true"> <p:messages id="msgTelaCadEquipamento"/> <h:panelGrid id="pngCadastrar" columns="4" cellpadding="4" > <h:outputLabel value="Tag:" style="float: right;"/> <p:inputText id="idTag" value="#{gerenciamentoCadastroEquipamentosMB.equipamento.tag}" required="true" requiredMessage="O campo é requerido" disabled="false" style="width: 220px;font-weight:bold; "/> <h:outputLabel value="Potência:" style="float: right;"/> <p:inputText value="#{gerenciamentoCadastroEquipamentosMB.equipamento.potenciaMax}" disabled="false" style="width: 220px;font-weight:bold; "> </p:inputText> <h:outputLabel value="Classificação:" style="float: right;"/> <p:inputText value="#{gerenciamentoCadastroEquipamentosMB.equipamento.classificacao}" disabled="false" style="width: 220px;font-weight:bold; "/> <h:outputLabel value="Alcance:" style="float: right;"/> <p:inputText value="#{gerenciamentoCadastroEquipamentosMB.equipamento.alcance}" disabled="false" style="width: 220px;font-weight:bold; "/> <h:outputLabel value="Antena:" style="float: right;"/> <p:selectOneMenu id="antena" value="#{gerenciamentoCadastroEquipamentosMB.idAntena}" style="width: 230px;"> <f:selectItem itemValue="" itemLabel="--Selecionar Antena--"/> <f:selectItems value="#{gerenciamentoCadastroEquipamentosMB.antenas}" /> </p:selectOneMenu> <h:outputLabel value="Tipo:" style="float: right;"/> <p:selectOneMenu id="tipo" value="#{gerenciamentoCadastroEquipamentosMB.idTipo}" style="width: 230px;font-weight: bold;"> <f:selectItem itemValue="" itemLabel="--Selecionar Tipo--"/> <f:selectItems value="#{gerenciamentoCadastroEquipamentosMB.tipos}" /> </p:selectOneMenu> <h:outputLabel value="modelo:" style="float: right;"/> <p:selectOneMenu id="modelo" value="#{gerenciamentoCadastroEquipamentosMB.idModelo}" style="width: 230px;"> <f:selectItem itemValue="" itemLabel="--Selecionar Modelo--"/> <f:selectItems value="#{gerenciamentoCadastroEquipamentosMB.modelos}" /> </p:selectOneMenu> <h:outputLabel value="Função:" style="float: right;"/> <p:selectOneMenu id="funcao" value="#{gerenciamentoCadastroEquipamentosMB.idFuncao}" style="width: 230px;"> <f:selectItem itemValue="" itemLabel="--Selecionar Função--"/> <f:selectItems value="#{gerenciamentoCadastroEquipamentosMB.funcoes}" /> </p:selectOneMenu> <h:outputLabel value="Localização:" style="float: right;"/> <p:selectOneMenu id="localizacao" value="#{gerenciamentoCadastroEquipamentosMB.idLocalizacao}" style="width: 230px;"> <f:selectItem itemValue="" itemLabel="--Selecionar Localização--"/> <f:selectItems value="#{gerenciamentoCadastroEquipamentosMB.localizacoes}" /> </p:selectOneMenu> <h:outputLabel value="Responsável:" style="float: right;"/> <p:selectOneMenu id="responsavel" value="#{gerenciamentoCadastroEquipamentosMB.idResponsavel}" style="width: 230px;"> <f:selectItem itemValue="" itemLabel="--Selecionar Responsável--"/> <f:selectItems value="#{gerenciamentoCadastroEquipamentosMB.responsaveis}" /> </p:selectOneMenu> </h:panelGrid> <p:separator/> <p:commandButton value="OK" actionListener="#{gerenciamentoCadastroEquipamentosMB.salvar}" update=":formEquipamento:tableEquipamentos :formEquipamento:btnEditar :formEquipamento:btnExcluir :formEquipamento:btnVisualizar :formCadEquipamento:dialogCadEquipamento" /> <p:commandButton value="Cancelar" onclick="dlgCadEquipamento.hide();"/> </p:dialog> <script type="text/javascript"> function verificaSucesso() { var variavel = '#{gerenciamentoCadastroEquipamentosMB.isFechaTela}'; //Aqui pega a variável do Bean alert('Retornou: ' + variavel); if (variavel == true) { alert('Entrou para fechar a tela'); dlgCadEquipamento.hide(); //E aqui verifica se retornou true e pode fechar } alert('Deixa a tela aberta'); } </script> </h:form>

Se alguem souber como resolver isso agradeço.

Olá srmachado,

Chame a dialog através da tag p:commadLink e não da p:commadButton como fez. Acho que isso ajudará!

Aqui mostra como faze: Aplicação Web Completa Tomcat JSF Primefaces JPA Hibernate.

Ou então no site do primefaces na parte que mostra dialog com login.

Como você quer controlar o fechamento de acordo com o que acontece no servidor, vai precisar do RequestContext e talvez do RemoteCommand

Em que parte do seu tutorial você mostra com fazer o que estou precisando?

Em que parte do seu tutorial você mostra com fazer o que estou precisando?[/quote]Página 6 e página do xhtml.

Cara não sei se fiz errado mais não funcionou ele continua fechando:

 <h:form id="formCadEquipamento">
                    <p:dialog header="Cadastrar Equipamento" widgetVar="dlgCadEquipamento" resizable="false" id="dialogCadEquipamento" modal="true">
                        <p:messages id="msgTelaCadEquipamento"/>
                        <h:panelGrid id="pngCadastrar" columns="4" cellpadding="4" >
                            <h:outputLabel value="Tag:" style="float: right;"/>
                            <p:inputText id="idTag" value="#{gerenciamentoCadastroEquipamentosMB.equipamento.tag}" required="true" onkeypress="javascript:test()" requiredMessage="O campo é requerido" disabled="false" style="width: 220px;font-weight:bold; "/>
                            <h:outputLabel value="Potência:" style="float: right;"/>
                            <p:inputText value="#{gerenciamentoCadastroEquipamentosMB.equipamento.potenciaMax}" disabled="false" style="width: 220px;font-weight:bold; ">
                            </p:inputText>
                            <h:outputLabel value="Classificação:" style="float: right;"/>
                            <p:inputText value="#{gerenciamentoCadastroEquipamentosMB.equipamento.classificacao}" disabled="false" style="width: 220px;font-weight:bold; "/>
                            <h:outputLabel value="Alcance:" style="float: right;"/>
                            <p:inputText value="#{gerenciamentoCadastroEquipamentosMB.equipamento.alcance}" disabled="false" style="width: 220px;font-weight:bold; "/>
                            <h:outputLabel value="Antena:" style="float: right;"/>
                            <p:selectOneMenu id="antena" value="#{gerenciamentoCadastroEquipamentosMB.idAntena}" style="width: 230px;">  
                                <f:selectItem itemValue="" itemLabel="--Selecionar Antena--"/>
                                <f:selectItems value="#{gerenciamentoCadastroEquipamentosMB.antenas}" /> 
                            </p:selectOneMenu>
                            <h:outputLabel value="Tipo:" style="float: right;"/>
                            <p:selectOneMenu id="tipo" value="#{gerenciamentoCadastroEquipamentosMB.idTipo}" style="width: 230px;font-weight: bold;">  
                                <f:selectItem itemValue="" itemLabel="--Selecionar Tipo--"/>
                                <f:selectItems value="#{gerenciamentoCadastroEquipamentosMB.tipos}" /> 
                            </p:selectOneMenu>
                            <h:outputLabel value="modelo:" style="float: right;"/>
                            <p:selectOneMenu id="modelo" value="#{gerenciamentoCadastroEquipamentosMB.idModelo}" style="width: 230px;">  
                                <f:selectItem itemValue="" itemLabel="--Selecionar Modelo--"/>
                                <f:selectItems value="#{gerenciamentoCadastroEquipamentosMB.modelos}" /> 
                            </p:selectOneMenu>
                            <h:outputLabel value="Função:" style="float: right;"/>
                            <p:selectOneMenu id="funcao" value="#{gerenciamentoCadastroEquipamentosMB.idFuncao}" style="width: 230px;">  
                                <f:selectItem itemValue="" itemLabel="--Selecionar Função--"/>
                                <f:selectItems value="#{gerenciamentoCadastroEquipamentosMB.funcoes}" /> 
                            </p:selectOneMenu>
                            <h:outputLabel value="Localização:" style="float: right;"/>
                            <p:selectOneMenu id="localizacao" value="#{gerenciamentoCadastroEquipamentosMB.idLocalizacao}" style="width: 230px;">  
                                <f:selectItem itemValue="" itemLabel="--Selecionar Localização--"/>
                                <f:selectItems value="#{gerenciamentoCadastroEquipamentosMB.localizacoes}" /> 
                            </p:selectOneMenu>
                            <h:outputLabel value="Responsável:" style="float: right;"/>
                            <p:selectOneMenu id="responsavel" value="#{gerenciamentoCadastroEquipamentosMB.idResponsavel}" style="width: 230px;">  
                                <f:selectItem itemValue="" itemLabel="--Selecionar Responsável--"/>
                                <f:selectItems value="#{gerenciamentoCadastroEquipamentosMB.responsaveis}" /> 
                            </p:selectOneMenu>
                        </h:panelGrid>
                        <p:separator/>
                        <f:facet name="footer">  
                            <p:commandButton value="OK" actionListener="#{gerenciamentoCadastroEquipamentosMB.salvar}" update=":formEquipamento:tableEquipamentos :formEquipamento:btnEditar :formEquipamento:btnExcluir :formEquipamento:btnVisualizar :formCadEquipamento:dialogCadEquipamento"  oncomplete="handleLoginRequest(xhr, status, args)" />
                            <p:commandButton value="Cancelar" onclick="dlgCadEquipamento.hide();"/>
                        </f:facet>
                    </p:dialog>

                    <script type="text/javascript">
                    function handleLoginRequest(xhr, status, args) {
                    alert(args);
                            if (args.validationFailed || args.FECHAR) {
                                alert('Entrou');
                    jQuery('#dialogCadEquipamento').effect("shake", { times:3 }, 100);
                    } else {
                         alert('Não Entrou');
                    dialogCadEquipamento.hide();
                    }
                    }

                    </script>  
                </h:form>

No server:

  RequestContext contextRequest = RequestContext.getCurrentInstance();  
  contextRequest.addCallbackParam("FECHAR", this.isFechaTela);

srmachado, bom dia!

Como está sua regra de navegação? O que seu método está retornando?

Não esta retornando nada, pois estou usando o actionListener, dai meu método é void, segue meu faces-config:


<?xml version='1.0' encoding='UTF-8'?>

<faces-config version="2.1"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd">
    <application>
        <message-bundle>com.arcelormittal.scer.messagens.messagens</message-bundle>
    </application>
    <navigation-rule>
        <from-view-id>/paginas/principal/principal.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>cadastroFabricantes</from-outcome>
            <to-view-id>/paginas/cadastros/cadastroFabricantes.jsf</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-outcome>cadastroEquipamento</from-outcome>
            <to-view-id>/paginas/cadastros/cadastroEquipamentos.jsf</to-view-id>
        </navigation-case>
    </navigation-rule>
    
    <lifecycle>
        <phase-listener>com.scer.controller.PhaseListener</phase-listener>
    </lifecycle>

A declaração do meu método esta assim:

public void salvar(ActionEvent actionEvent) { }

Faz um teste tentando remover o update do seu commandButton.

Não esta retornando nada, pois estou usando o actionListener, dai meu método é void, segue meu faces-config:

A declaração do meu método esta assim:

public void salvar(ActionEvent actionEvent) { }[/quote]

Passei por algo parecido utilizando o modal do richfaces. Seria muito custoso para você mudar seu método salvar para retornar um valor nulo?

Não esta retornando nada, pois estou usando o actionListener, dai meu método é void, segue meu faces-config:

A declaração do meu método esta assim:

public void salvar(ActionEvent actionEvent) { }[/quote]

Passei por algo parecido utilizando o modal do richfaces. Seria muito custoso para você mudar seu método salvar para retornar um valor nulo?
[/quote]

E ao invés de utilizar o actionListener utilizar o action?

Fiz um teste usando o action achei que ia funcionar mais ainda não estar funcionando, fix meu método de salvamento retornar null e nada :frowning: .

Retirando o update funcionou do jeito que queria, porem preciso atualizar alguns campos se houve sucesso no cadastro.

Deixando o update, ele sempre será executado, independente se você quer ou não e, quando ele é executado, o panel acaba sendo fechado.

Para resolver, a idéia é deixar sem o update no botão e criar um RemoteCommand, que faz o update necessário e você chama ele de dentro da sua função javascript, somente quando o resultado for o desejado.

Sou novo no mundo jsf e nunca usei esse comando por acaso você poderia me explicar melhor como ele funciona o RemoteCommand, o que ele faz e se tiver algum código mostrando o uso do mesmo ficaria grato.

A idéia dele é exportar uma função javascript e que através dela você consiga usar recursos de um commandButton, tais como action, process e update.

Então você cria um RemoteCommand que faz o update nos elementos que você quer e chama ele de dentro do seu JS.

No link que te passei tem um exemplo de código/uso.

Se você não conseguiu fazer igual no primeiro link que eu te passei, olha esse aqui então: http://www.primefaces.org/showcase/ui/dialogLogin.jsf

Simples do mesmo modo que o primeiro.