Problema com Dialog Primefaces

8 respostas
A

Boa noite, estou com um problema usando uma dialog modal no primefaces, a dialog não está chamando o actionlistener no bean.

<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:p="http://primefaces.org/ui">
<ui:composition template="/pages/templates/default.xhtml">
	<ui:define name="conteudo">
		<f:view>
			<h:form id="formDocumento">
				<p:toolbar id="bar">
					<p:toolbarGroup id="superior">
						<p:commandButton title="Visualizar"
							actionListener="#{homeBean.edita}" styleClass="botao"
							disabled="#{homeBean.editDisabled}"
							icon="ui-icon ui-icon-document" ajax="false" />
						<p:commandButton title="Enviar ao Professor"
							icon="ui-icon ui-icon-mail-closed" styleClass="botao"
							disabled="#{homeBean.emailDisabled}" ajax="false"
							actionListener="#{homeBean.enviaDocumento}" />
						<p:commandButton title="Compartilhar"
							icon="ui-icon ui-icon-comment" styleClass="botao"
							disabled="#{homeBean.disabled}" onclick="dlgShare.show();" />
						<p:commandButton title="Excluir" icon="ui-icon ui-icon-trash"
							disabled="#{homeBean.disabled}" styleClass="botao"
							onclick="confirmation.show()" />
					</p:toolbarGroup>
				</p:toolbar>				
				<p:confirmDialog id="confirmDialog" appendToBody="true"
					message="Tem certeza que deseja excluir os itens selecionados?"
					header="Exclusão de documento" severity="alert"
					widgetVar="confirmation">

					<p:commandButton id="confirm" value="Sim"
						actionListener="#{homeBean.excluiDocumentos}" update=":messages"
						oncomplete="confirmation.hide()" />
					<p:commandButton id="decline" value="Não"
						onclick="confirmation.hide()" />
				</p:confirmDialog>
				<p:dialog id="shareDialog" appendToBody="true"
					header="Compartilhar Documento" widgetVar="dlgShare" modal="true"
					height="155" width="550" draggable="false" resizable="false">
					<h:panelGrid id="grid" columns="2" cellpadding="5" cellspacing="5">

						<h:outputText value="Endereços" />
						<p:inputText value="#{homeBean.emailCompartilhamento}"
							style="width:300" required="true"
							requiredMessage="O email é obrigatório" />
						<p:selectBooleanCheckbox value="#{homeBean.permiteEscrita}"
							disabled="#{homeBean.permiteEscritaDisabled}"
							itemLabel="Permite Escrita" />
						<p:selectBooleanCheckbox value="#{homeBean.publico}"
							itemLabel="Público" update="formDlg">
							<p:ajax update="grid" listener="#{homeBean.checkBoxChange}" />
						</p:selectBooleanCheckbox>
					</h:panelGrid>
					<h:panelGrid columns="2" cellpadding="5">
						<p:commandButton value="OK" style="width:50px"
							actionListener="#{homeBean.compartilha}" ajax="false"
							oncomplete="dlgShare.hide()" />
						<p:commandButton value="Cancelar" onclick="dlgShare.hide()"
							immediate="true" />
					</h:panelGrid>
				</p:dialog>
			</h:form>
		</f:view>
	</ui:define>
</ui:composition>
</html>

Já tentei fechando o form principal e abrindo outro apenas para o dialog, e também abrindo um form dentro da dialog.
Alguém já passou por isso?

8 Respostas

G

Existe um parâmetro do tipo ActionEvent no método em questão, por exemplo:

public String gravarSoja(ActionEvent actionEvent) { this.dadosSisgappeFacade.save(this.soja); soja = new Soja(); return "/consulta_plantacao_soja"; }
[]'s

A

Existe o evento sim, consegui fazer ele chamar o evento deixando ajax habilitado, porém assim surge outro problema, o bean está como @ViewScoped, então ele não seta os atributos no bean

G

Amigo, se conter qualquer tipo de erro na página, o listener não eh acionado. No meu caso, por exemplo, ele não chamava por que eu tinha campos required, existem outros motivos, veja isso: http://stackoverflow.com/questions/2118656/hcommandlink-hcommandbutton-is-not-being-invoked, eh chatinho.

[]'s

A

Na verdade se o commandbutton está com ajax=“false” ele não gera nenhuma exceção, simplesmente não chama o listener, porém se está habilitado o ajax ele não seta o valor do bean, daí quando vou tentar acessar o valor da um NullPointerException

G

Posta o código completo: view, controller, quem sabe surge uma luz.

[]'s

A
<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:p="http://primefaces.org/ui">
<ui:composition template="/pages/templates/default.xhtml">

	<ui:define name="conteudo">
		<f:view>
			<h:form id="formDocumento">

				<p:toolbar id="bar">
					<p:toolbarGroup id="superior" align="left">
						<p:commandButton title="Visualizar"
							actionListener="#{homeBean.edita}" styleClass="botao"
							disabled="#{homeBean.editDisabled}"
							icon="ui-icon ui-icon-document" ajax="false" />
						<p:commandButton title="Enviar ao Professor"
							icon="ui-icon ui-icon-mail-closed" styleClass="botao"
							disabled="#{homeBean.emailDisabled}" ajax="false"
							actionListener="#{homeBean.enviaDocumento}" />
						<p:commandButton title="Compartilhar"
							icon="ui-icon ui-icon-comment" styleClass="botao"
							disabled="#{homeBean.disabled}" onclick="dlgShare.show();" />
						<p:commandButton title="Excluir" icon="ui-icon ui-icon-trash"
							disabled="#{homeBean.disabled}" styleClass="botao"
							onclick="confirmation.show()" />
					</p:toolbarGroup>
				</p:toolbar>
				<p:dataTable id="documentos" var="doc"
					value="#{homeBean.documentos}"
					selection="#{homeBean.documentosSelecionados}"
					widgetVar="docsTable" emptyMessage="Nenhum Documento Encontrado">
					<f:facet name="header">
						<p:outputPanel>
							<h:outputText value="Pesquisa:" />
							<h:inputText id="globalFilter" onkeyup="docsTable.filter()" />
						</p:outputPanel>
					</f:facet>

					<p:ajax event="rowSelect" listener="#{homeBean.onRowSelect}"
						update=":messages :geral:formDocumento:bar" />

					<p:ajax event="rowUnselect" listener="#{homeBean.onRowUnselect}"
						update=":messages :geral:formDocumento:bar" />

					<p:ajax event="toggleSelect" listener="#{homeBean.atualizaEnabled}"
						update=":messages :geral:formDocumento:bar" />

					<p:column selectionMode="multiple" style="width:18px" />

					<p:column headerText="Título" sortBy="#{doc.titulo}"
						id="colunaTitulo" filterBy="#{doc.titulo}"
						filterStyle="display:none">
							#{doc.titulo}
					</p:column>
					<p:column headerText="Dono" sortBy="#{doc.dono.nome}"
						filterBy="#{doc.dono.nome}" filterStyle="display:none"
						style="width:250px">
							#{doc.dono.nome}
						</p:column>
					<p:column headerText="Última modificação" style="width:180px"
						sortBy="#{doc.dataAlteracao}">
						<h:outputText value="#{doc.dataAlteracao}">
							<f:convertDateTime pattern="dd/MM/yyyy hh:mm a" />
						</h:outputText>
					</p:column>
					<p:column sortBy="#{doc.palavrasChave}"
						filterBy="#{doc.palavrasChave}" rendered="false">
							#{doc.palavrasChave}
						</p:column>
				</p:dataTable>
			</h:form>
			<p:dialog id="shareDialog" appendToBody="true"
				header="Compartilhar Documento" widgetVar="dlgShare" modal="true"
				height="155" width="550" draggable="false" resizable="false">
				<h:panelGrid id="grid" columns="2" cellpadding="5" cellspacing="5">

					<h:outputText value="Endereços" />
					<p:inputText var="compartilha" value="#{homeBean.emailCompartilhamento}"
						style="width:300" required="true"
						requiredMessage="O email é obrigatório" />
					<p:selectBooleanCheckbox value="#{homeBean.permiteEscrita}"
						disabled="#{homeBean.permiteEscritaDisabled}"
						itemLabel="Permite Escrita" />
					<p:selectBooleanCheckbox value="#{homeBean.publico}"
						itemLabel="Público" update="formDlg">
						<p:ajax update="grid" listener="#{homeBean.checkBoxChange}" />
					</p:selectBooleanCheckbox>
				</h:panelGrid>
				<h:panelGrid columns="2" cellpadding="5">
					<p:commandButton value="OK" style="width:50px"
						actionListener="#{homeBean.compartilha}"
						oncomplete="dlgShare.hide()">
							
					</p:commandButton>

					<p:commandButton value="Cancelar" onclick="dlgShare.hide()"
						immediate="true" />
				</h:panelGrid>
			</p:dialog>
			<p:confirmDialog id="confirmDialog" appendToBody="true"
				message="Tem certeza que deseja excluir os itens selecionados?"
				header="Exclusão de documento" severity="alert"
				widgetVar="confirmation">

				<p:commandButton id="confirm" value="Sim"
					actionListener="#{homeBean.excluiDocumentos}" update=":messages"
					oncomplete="confirmation.hide()" />
				<p:commandButton id="decline" value="Não"
					onclick="confirmation.hide()" />
			</p:confirmDialog>
		</f:view>
	</ui:define>
</ui:composition>
</html>
package br.unisul.prolinear.view;

import java.io.Serializable;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import javax.faces.event.SystemEvent;
import javax.faces.model.ListDataModel;
import javax.mail.MessagingException;

import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

import br.unisul.prolinear.dao.DocumentoDaoImp;
import br.unisul.prolinear.dao.UsuarioDaoImp;
import br.unisul.prolinear.model.Aluno;
import br.unisul.prolinear.model.Documento;
import br.unisul.prolinear.utils.SendMail;
import br.unisul.prolinear.utils.Util;

@ManagedBean
@ViewScoped
@SuppressWarnings("unchecked")
public class HomeBean extends Bean implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private DocumentoDataModel documentos;
	private Documento[] documentosSelecionados;
	private String emailCompartilhamento;
	private List<Documento> listDocs;
	private Integer tipo;
	private boolean permiteEscrita;
	private boolean publico;
	private boolean permiteEscritaDisabled;
	private DocumentoDaoImp documentoDAO;
	private boolean editDisabled;
	private boolean disabled ;
	private boolean emailDisabled;
	private UsuarioDaoImp usuarioDAO;

	public HomeBean() {
		super();
		usuarioDAO = new UsuarioDaoImp();		
		disabled = true;
		editDisabled = true;
		emailDisabled = true;	
		atualizaListDocumentos();
		
	}	

	public void onRowSelect(SelectEvent event) {
		atualizaEnabled();
	}
	public void onRowUnselect(UnselectEvent event){
		atualizaEnabled();
	}

	public void compartilha(ActionEvent actionEvent){
		UsuarioDaoImp dao = new UsuarioDaoImp();
		DocumentoDaoImp docDao = new DocumentoDaoImp();
		String[] s = emailCompartilhamento.split(";");
		for(Documento doc:documentosSelecionados){
			for(String email:s){
				Aluno destino = (Aluno)dao.get("email", email);
				if(destino!= null){
						docDao.compartilhar(doc, destino, false);
						SendMail send = new SendMail();
						send.enviaConfirmacaoCompartilhamento(doc, destino);
				}else{
					Util.erro("Usuário não cadastrado.");
				}
			}
		}
	}


	public void checkBoxChange(){
		permiteEscritaDisabled = publico;
		if(publico){
			permiteEscrita = false;
		}
	}

	public void alteraCadastro(ActionEvent actionEvent){
		Util.redirect("../cadastro.jsf?id="+usuario.getId());
	}


	public void atualizaEnabled(){
		editDisabled = documentosSelecionados.length != 1;
		disabled = documentosSelecionados.length == 0;
		emailDisabled = disabled || aluno == null || aluno.getEmailProfessor().isEmpty();
	}

	public void atualiza(SystemEvent event){
		atualizaListDocumentos();
	}

	public void excluiDocumentos(ActionEvent action){
		for(Documento doc:documentosSelecionados){
			if(documentoDAO == null){
				documentoDAO = new DocumentoDaoImp();
			}
			documentoDAO.delete(doc);
		}		
		atualizaListDocumentos();
	}

	public void enviaDocumento(ActionEvent actionEvent){		
		try {
			SendMail sender = new SendMail();
			sender.enviaDocumentosProfessor(documentosSelecionados);
			Util.msg("Documento(s) enviado(s)");
		} catch (MessagingException e) {
			Util.erro(e.getMessage());
			e.printStackTrace();
		}
	}

	public void edita(ActionEvent actionEvent){
		Util.redirect("documento.jsf?id="+documentosSelecionados[0].getId());
	}

	
	
	private void atualizaListDocumentos(){
		setUsuario(usuarioDAO.getById(usuario.getId()));
		String par = Util.getParametro("tipo");
		listDocs = null;
		tipo = null;
		if(usuario instanceof Aluno ){
			if(par != null)
				tipo = Integer.parseInt(par);
			if(tipo == null || tipo == 1){
				listDocs  =  aluno.getDocumentos();
			}else if(tipo == 2){
				listDocs = aluno.getDocumentosCompartilhados();
			}else if(tipo == 3){
				listDocs = aluno.getDocumentosPublicos();
			}else {
				listDocs = Util.appendLists(aluno.getDocumentos(), aluno.getDocumentosCompartilhados(),aluno.getDocumentosPublicos());
			}
		}else{
			listDocs =  admnistrador.getDocumentos();
		}
		documentos = new DocumentoDataModel(listDocs);
	}
//getters e setters
}
A

ninguém mais passou por isso?

G

Cara, eh chato mesmo, quanto ao problema do não acionameto do listener, deixa a sua pagina limpa, adicione componente por componente, assim voce consegue identificar onde tah o problema, voce leu o artigo do Stack? Olha direito ai.

[]'s

Criado 27 de abril de 2012
Ultima resposta 1 de mai. de 2012
Respostas 8
Participantes 2