Boa tarde pessoal.
Tenho uma pequena aplicação onde em um data table eu posso clica em uma linha para abrir um dialog e, assim, editar aquele registro, ou, clicar no botão novo abaixo e inserir um novo registro.
Acontece que o selection do datatable aponta para a mesma variavel que o dialog usa no momento de inserir um novo registro. Então a lógica que usei é a seguinte: Se o usuário clicar em novo eu chamo uma função que instancia um novo objeto e então renderizo o dialog para a inserção dos dados. Acontece que não consigo chamar a função e abrir o dialog ao mesmo tempo. Sempre que consigo abrir o dialog, a chamada ao metodo não funciona e sempre que consigo chamar a função o dialog não abre.
Meus codigos estão abaixo:
matricula.xhtml
<!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:p="http://primefaces.org/ui">
<ui:composition template="/_template.xhtml">
<ui:define name="corpo">
<h:form id="formulario">
<h:messages styleClass="erros" />
<h2>Matrículas</h2>
<fieldset>
<legend>Listagem</legend>
<p:dataTable id="matriculas" var="matriculas"
value="#{matriculaBean.matriculas}"
emptyMessage="Nenhuma matrícula encontrada." selectionMode="single"
selection="#{matriculaBean.matricula}" rowKey="#{matriculas.id}"
dblClickSelect="true">
<p:ajax event="rowSelect" update=":formulario"
oncomplete="matriculaDialogo.show();" />
<p:column id="nome" filterBy="#{matriculas.nome}" headerText="Nome">
<h:outputText value="#{matriculas.nome}" />
</p:column>
<p:column id="apelido" filterBy="#{matriculas.apelido}"
headerText="Apelido">
<h:outputText value="#{matriculas.apelido}" />
</p:column>
<p:column id="cpf" filterBy="#{matriculas.cpf}" headerText="CPF">
<h:outputText value="#{matriculas.cpf}" />
</p:column>
<f:facet name="footer">
<p:commandButton id="novo" value="Novo"
actionListener="#{matriculaBean.novo}" ajax="false" >
<p:ajax event="click"
oncomplete="matriculaDialogo.show();" />
</p:commandButton>
</f:facet>
</p:dataTable>
<p:dialog id="formularioMatricula" header="Detalhes da Matrícula"
widgetVar="matriculaDialogo" dynamic="true" >
<fieldset>
<legend>Nova Matricula</legend>
<h:panelGrid columns="2">
<h:outputLabel value="Nome:" />
<p:inputText value="#{matriculaBean.matricula.nome}" size="50" />
<h:outputLabel value="Apelido:" />
<p:inputText value="#{matriculaBean.matricula.apelido}" />
<h:outputLabel value="Email:" />
<p:inputText value="#{matriculaBean.matricula.email}" />
</h:panelGrid>
<h:panelGrid columns="4">
<h:outputLabel value="Telefone 1:" />
<p:inputMask mask="(99)9999-9999"
value="#{matriculaBean.matricula.telefone1}" />
<h:outputLabel value="Telefone 2:" />
<p:inputMask mask="(99)9999-9999"
value="#{matriculaBean.matricula.telefone2}" />
<h:outputLabel value="Celular 1:" />
<p:inputMask mask="(99)9999-9999"
value="#{matriculaBean.matricula.celular1}" />
<h:outputLabel value="Celular 2:" />
<p:inputMask mask="(99)9999-9999"
value="#{matriculaBean.matricula.celular2}" />
<h:outputLabel value="C.P.F:" />
<p:inputMask mask="999.999.999-99"
value="#{matriculaBean.matricula.cpf}" />
</h:panelGrid>
<h:panelGrid columns="5">
<h:outputLabel value="Identidade:" />
<p:inputText value="#{matriculaBean.matricula.identidade}" />
<h:outputLabel value="Orgão Expeditor:" />
<p:inputText value="#{matriculaBean.matricula.orgaoExpeditor}" />
</h:panelGrid>
<h:panelGrid columns="2">
<h:outputLabel value="Data Expedição:" />
<p:calendar value="#{matriculaBean.matricula.dataExpedicao}"
pattern="dd/MM/yyyy" />
<h:outputLabel value="Estado Civil:" />
<p:selectOneMenu value="#{matriculaBean.idEstadoCivil}">
<f:selectItems value="#{estadoCivilBean.estadosCivis}"
var="estadocivil" itemValue="#{estadocivil.id}"
itemLabel="#{estadocivil.descricao}" />
</p:selectOneMenu>
<h:outputLabel value="Nome da Mãe: " />
<p:inputText value="#{matriculaBean.matricula.nomeMae}" size="50" />
<h:outputLabel value="Nome do Pai: " />
<p:inputText value="#{matriculaBean.matricula.nomePai}" size="50" />
<p:commandButton value="Salvar" action="#{matriculaBean.salvar}"
ajax="false" />
<p:commandButton value="Cancelar"
action="#{matriculaBean.cancelar}" ajax="false" />
</h:panelGrid>
</fieldset>
</p:dialog>
</fieldset>
</h:form>
</ui:define>
</ui:composition>
</html>
E aqui meu MatriculaBean
package br.com.enterprisestoq.bean;
import java.io.Serializable;
import java.util.GregorianCalendar;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import br.com.enterprisestoq.dao.DAO;
import br.com.enterprisestoq.dao.MatriculaDAO;
import br.com.enterprisestoq.modelos.EstadoCivil;
import br.com.enterprisestoq.modelos.Matricula;
@ManagedBean
@ViewScoped
public class MatriculaBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private List<Matricula> matriculas;
private Matricula matricula = new Matricula();
private Matricula novaMatricula = new Matricula();
private Long idEstadoCivil;
private DAO<Matricula> dao = new MatriculaDAO();
public void novo(ActionEvent event){
System.out.println("instanciando novo objeto matricula....");
this.matricula = new Matricula();
}
public String salvar() {
System.out.println("Salvando objeto...");
EstadoCivil estadoCivil = new DAO<EstadoCivil>(EstadoCivil.class)
.buscaPorId(idEstadoCivil);
this.matricula.setEstadoCivil(estadoCivil);
if(this.matricula.getId() == null){
this.matricula.setDataInclusao(new GregorianCalendar().getTime());
dao.adiciona(this.matricula);
} else {
dao.atualiza(this.matricula);
}
this.matricula = new Matricula();
return "matricula";
}
public String cancelar() {
this.matricula = new Matricula();
return "matricula";
}
public String cancelarNovo() {
this.matricula = new Matricula();
return "matricula";
}
public String cancelarSelecao() {
this.novaMatricula = new Matricula();
return "matricula";
}
public String editar() {
dao.atualiza(this.novaMatricula);
this.novaMatricula = new Matricula();
return "matricula";
}
public List<Matricula> getMatriculas() {
this.matriculas = dao.listaTodos();
return matriculas;
}
public void setMatriculas(List<Matricula> matriculas) {
this.matriculas = matriculas;
}
public Matricula getMatricula() {
return this.matricula;
}
public void setMatricula(Matricula matricula) {
this.matricula = matricula;
}
public Long getIdEstadoCivil() {
return idEstadoCivil;
}
public void setIdEstadoCivil(Long idEstadoCivil) {
this.idEstadoCivil = idEstadoCivil;
}
public Matricula getNovaMatricula() {
return novaMatricula;
}
public void setNovaMatricula(Matricula matriculaSelecionada) {
this.novaMatricula = matriculaSelecionada;
}
}
Da forma que esta consigo chamar o metodo do bean, porem, o dialog não abre. Se eu colocar type=“button” e retirar o codigo ajax o dialog renderiza, porem, o metodo bean não eh chamado.
Estou com muitas dificuldades com isso.
Muito obrigado