Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

p:dialog does not fire ajax close event when using dialog.hide()

I'm using <p:dialog>. After submitting the form therein, I use dialog.hide() and it fires the ajax close event listener method which will update a List<E>. It was working properly, but when I put some required input components and bring the <p:dialog> again if there is some validation error, it doens't fire the method anymore.

The dialog:

<p:outputPanel autoUpdate="true">
    <p:dialog id="dialogComentario" header="Deixe sua avaliação" widgetVar="confirmation" 
        showEffect="fade" hideEffect="fade" height="340" width="500" modal="true" 
        visible="#{not empty facesContext.maximumSeverity}" 
        resizable="false" closable="true" draggable="false">
        <h:form prependId="false">
            ...
            <p:commandLink styleClass="btn btn-primary btenviacoment" 
                oncomplete="if (!args.validationFailed) confirmation.hide();" 
                actionListener="#{comentario.actEnviarComentario}" global="false">
                <i class=" icon-play-circle icon-white"></i>
                <h:outputText value=" Enviar Comentário" />
                <f:param name="codigoplu" value="#{produto.produto.codigoplu}" />
            </p:commandLink>
            ...
            <p:commandLink styleClass="btn" onclick="confirmation.hide();" 
                global="false" immediate="true">
                <h:outputText value=" Cancelar" />
                <i class="icon-off"></i>
            </p:commandLink>
            ...
        </h:form>
        <p:ajax event="close" update=":avaliacoesClientes, :dialogComment" 
            listener="#{produto.atualizarComentarios}" global="false" />
    </p:dialog>
</p:outputPanel>

The action listener method:

public void actEnviarComentario(ActionEvent event) {
    String codigoplu = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("codigoplu");
    PegarDadosCliente();

    try {
        DateFormat f = new SimpleDateFormat("dd/MM/yyyy");
        java.util.Date utildata = new java.util.Date();
        utildata = (java.util.Date) f.parse(String.valueOf(data.getValue()));
        java.sql.Date datasql = new java.sql.Date(utildata.getTime());

        Comentario comentario = new Comentario(Integer.parseInt(usuario.getId()), Integer.parseInt(codigoplu), titulo.getValue().toString(), mensagem.getValue().toString(), datasql, Integer.parseInt(rating.getValue().toString()), new java.sql.Date(new Date().getTime()));
        listavelComentarios.inserirComentario(comentario);

        RequestContext.getCurrentInstance().execute("confirmation.hide();");
    } catch (NamingException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    } catch (ParseException e) {
        e.printStackTrace();
    }
}

I tried to close the dialog with RequestContext as shown in action method, but that won't fire the ajax close event either.

Here's the ajax close event listener method:

public void atualizarComentarios(CloseEvent event) {

    try {
        comentarios = comentario.listarComentarios(codigoplu);

        if (comentarios.size() > 0) {
            msgAvaliacao = "Avaliação do produto.";
            int votos = 0;

            for (Comentario comentario : comentarios) {
                votos += comentario.getAvaliacao();
            }

            rating = votos / comentarios.size();
        }
    } catch (NamingException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
like image 408
Victor Bello Avatar asked Oct 22 '22 19:10

Victor Bello


1 Answers

This problem is not related to validation. Remove all those input components and press the command button/link and you'll see that it's still not fired.

This problem is caused by the unnecessary combination of <p:outputPanel autoUpdate="true"> and visible="#{not empty facesContext.maximumSeverity}". The output panel keeps auto-updating the dialog which apparently forces you to set the visible attribute like that. The dialog is auto-updated right before the oncomplete event is fired. If the dialog visible property is false, then the dialog is already hidden (invisible) before the oncomplete is fired.

So, just get rid of the <p:outputPanel> and the visible attribute. Your oncomplete already does the right job.


Unrelated to the concrete problem, the RequestContext line is unnecessary. You're already hiding it in oncomplete which is perfectly fine. See also Keep p:dialog open when a validation error occurs after submit.

like image 67
BalusC Avatar answered Oct 25 '22 18:10

BalusC