Tenho um rich:modalPanel que contém um a4j:form com campos h:inputText com o atributo required setado como true.
Abaixo dos campos, tenho dois botões:
-
“Cadastrar”: se houver mensagens de erro por causa dos required’s, o modalPanel continua aberto e o a4j:form é reRenderizado para aparecer as mensagens; se não, o método para cadastrar do meu managed-bean é chamado e, ao completar a requisição, o modalPanel é fechado.
-
“Cancelar”: é immediate=“true” e chama um método do managed-bean que instancia um novo objeto da entidade deste CRUD para que os campos sejam limpos. Ao completar essa requisição, o modalPanel é fechado.
Até aí, funciona perfeitamente. Só está ocorrendo problemas quando sigo a seguinte ordem de ações:
- Não completo todos os campos obrigatórios do a4j:form
- Clico em “Cadastrar” (como esperado, aparece as mensagens de erro sem fechar o modalPanel para que o usuário continue até completar)
- Ao invés de completar o formulário, resolvo clicar em “Cancelar” (como esperado, o modalPanel fecha e a instância do objeto é renovada - verifiquei isso no debug)
- Quando clico no link que abre o modalPanel (e este link também chama o método para renovar a instância), os dados que preenchi quando tentei cadastrar no passo 1 aparecem nos inputs. Este é o problema! Esses dados deveriam estar limpos na view.
Aparentemente os reRenders estão todos OK. Parece ser algum processamento do lado cliente, não sei…
Aí vai o código:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!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:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:rich="http://richfaces.org/rich"
xmlns:a4j="http://richfaces.org/a4j">
<ui:composition template="../../template.xhtml">
<ui:define name="menu">
<ui:include src="../../blank.xhtml" />
</ui:define>
<ui:define name="main">
<rich:modalPanel id="formModal" width="650" zindex="1000" top="50" autosized="true" onshow="enableEscInModal('formModal')">
<f:facet name="header">
<h:outputText value="#{parametroBean.updateMode ? 'Atualizar Parâmetros' : 'Cadastrar Parâmetros'}" />
</f:facet>
<f:facet name="controls">
<h:panelGroup>
<a4j:form>
<h:graphicImage id="hideFormModal" styleClass="buttonClose" value="/imagem/button_close.gif">
<a4j:support event="onclick" onclick="$j('#buttonCancelar').click()" />
</h:graphicImage>
</a4j:form>
</h:panelGroup>
</f:facet>
<a4j:form id="form" prependId="false">
<script type="text/javascript">
$j(function() {
$j('#form input').keypress(function(event) {
if (event.keyCode == '13') {
event.preventDefault();
}
});
});
</script>
<rich:panel>
<ui:include src="/aplicacao/validationMessages.xhtml" />
<h:panelGrid columns="2">
<h:outputText styleClass="labels" value="Pró-Reitor:" />
<h:inputText value="#{parametroBean.parametro.proReitor}" required="true" requiredMessage="Campo Pró-Reitor não preenchido" size="32" maxlength="32"/>
<h:outputText styleClass="labels" value="Coordenador de Escolaridade:" />
<h:inputText value="#{parametroBean.parametro.coordEscolaridade}" required="true" requiredMessage="Campo Coordenador de Escolaridade não preenchido" size="32" maxlength="32" />
<h:outputText styleClass="labels" value="Subcoordenador(a) da SCCE" />
<h:inputText value="#{parametroBean.parametro.subCoordenadorSCCE}" required="true" requiredMessage="Campo Subcoordenador(a) da SCCE não preenchido" size="32" maxlength="32" />
<h:outputText styleClass="labels" value="Subcoordenador(a) da SCRD" />
<h:inputText value="#{parametroBean.parametro.subCoordenadorSCRD}" required="true" requiredMessage="Campo Subcoordenador(a) da SCRD não preenchido" size="32" maxlength="32" />
<h:outputText styleClass="labels" value="Data de Entrada" />
<rich:calendar id="dataEntrada" datePattern="dd/MM/yyyy" value="#{parametroBean.parametro.dataEntrada}" required="true" requiredMessage="Campo Data de Entrada não preenchido" />
<h:outputText styleClass="labels" value="Atual" />
<h:selectBooleanCheckbox value="#{parametroBean.parametro.ativado}" />
</h:panelGrid>
<div class="botoes">
<a4j:commandButton action="#{parametroBean.cadastrarParametro}" value="Cadastrar" rendered="#{!parametroBean.updateMode}" oncomplete="#{facesContext.maximumSeverity.ordinal > 0 ? 'Richfaces.showModalPanel(\'formModal\');' : 'Richfaces.hideModalPanel(\'formModal\');'}" reRender="#{facesContext.maximumSeverity.ordinal > 0 ? 'form' : 'panelListItens'}" />
<a4j:commandButton action="#{parametroBean.atualizarParametro}" value="Atualizar" rendered="#{parametroBean.updateMode}" oncomplete="#{facesContext.maximumSeverity.ordinal > 0 ? 'Richfaces.showModalPanel(\'formModal\');' : 'Richfaces.hideModalPanel(\'formModal\');'}" reRender="#{facesContext.maximumSeverity.ordinal > 0 ? 'form' : 'panelListItens'}" />
<a4j:commandButton id="buttonCancelar" value="Cancelar" immediate="true">
<a4j:support action="#{parametroBean.renewModel}" event="onclick" ajaxSingle="true" oncomplete="Richfaces.hideModalPanel('formModal');" reRender="form" />
</a4j:commandButton>
</div>
</rich:panel>
</a4j:form>
</rich:modalPanel>
<rich:panel header="Gerenciar Parâmetros" id="panelListItens">
<h:form prependId="false">
<ui:include src="/aplicacao/validationMessages.xhtml" />
<rich:toolBar>
<rich:toolBarGroup>
<h:outputLink styleClass="addItem" value="javascript:void(0)">
<h:outputText value="Novos Parâmetros" />
<a4j:support event="onclick" action="#{parametroBean.sairModoAlteracao}" reRender="formModal, panelListItens" oncomplete="Richfaces.showModalPanel('formModal');" />
</h:outputLink>
</rich:toolBarGroup>
<rich:toolBarGroup location="right">
<h:outputText styleClass="searchItem" value="Busca" />
<h:inputText value="#{parametroBean.pesquisa}" />
<h:commandButton action="#" value="Buscar" reRender="panelListItens" style="margin-right:10px" />
</rich:toolBarGroup>
</rich:toolBar>
</h:form>
<br />
<h:form id="listItens">
<rich:dataTable id="tableList" value="#{parametroBean.parametrosOrdenados}" var="p" rows="100" width="100%">
<f:facet name="header">
<h:outputText value="Listagem de Parâmetros" />
</f:facet>
<rich:column sortBy="#{p.proReitor}">
<f:facet name="header">
<h:outputText value="Pró-Reitor" />
</f:facet>
<h:outputText value="#{p.proReitor}" />
</rich:column>
<rich:column sortBy="#{p.coordEscolaridade}">
<f:facet name="header">
<h:outputText value="Coord. Escol." />
</f:facet>
<h:outputText value="#{p.coordEscolaridade}" />
</rich:column>
<rich:column sortBy="#{p.subCoordenadorSCCE}">
<f:facet name="header">
<h:outputText value="Subcoordenador(a) SCCE" />
</f:facet>
<h:outputText value="#{p.subCoordenadorSCCE}" />
</rich:column>
<rich:column sortBy="#{p.subCoordenadorSCRD}">
<f:facet name="header">
<h:outputText value="Subcoordenador(a) SCRD" />
</f:facet>
<h:outputText value="#{p.subCoordenadorSCRD}" />
</rich:column>
<rich:column sortBy="#{p.dataEntrada}">
<f:facet name="header">
<h:outputText value="Data de Entrada" />
</f:facet>
<h:outputText value="#{p.dataEntrada}" >
<f:convertDateTime type="date" timeStyle="short" />
</h:outputText>
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Atual" />
</f:facet>
<h:outputText value="#{p.ativado ? 'sim' : 'não'}" />
</rich:column>
<rich:column style="text-align:center" width="6%">
<f:facet name="header">
<h:outputText value="Alterar" />
</f:facet>
<a4j:commandButton action="#{parametroBean.editarParametro}" oncomplete="Richfaces.showModalPanel('formModal');" image="../../../imagem/updateIcon.jpg" reRender="#{facesContext.maximumSeverity.ordinal > 0 ? 'formModal' : 'formModal, panelListItens'}">
<f:setPropertyActionListener value="#{p}" target="#{parametroBean.parametro}" />
</a4j:commandButton>
</rich:column>
<rich:column style="text-align:center" width="6%">
<f:facet name="header">
<h:outputText value="Excluir" />
</f:facet>
<a4j:commandButton action="#{parametroBean.removerParametro}" onclick="if(!confirm('Excluir item?')) return false" image="../../../imagem/mini_trash.gif" reRender="formModal, panelListItens">
<f:setPropertyActionListener value="#{p}" target="#{parametroBean.parametro}" />
</a4j:commandButton>
</rich:column>
</rich:dataTable>
<br clear="all" />
<rich:datascroller for="tableList" maxPages="20" />
</h:form>
</rich:panel>
</ui:define>
</ui:composition>
</html>