Boa tarde galera,
Procurei em todo lugar mas sem sucesso.
Estou fazendo um Dialog para editar um usuario mas não esta dando certo. Passo o objeto com o f:setPropertyActionListene mas ele so traz um unico objeto para todos os usuarios.
ex: tenho 10 usuarios. clico na primeira linha e ele me traz o dialog carregado com as informações do usuario, se eu fechar o dialog e tentar carregar outro usuario ele me traz o primeiro usuario. Não esta mudando de objeto
Segue codigo da view, se alguem puder me falar aonde estou errando.
Obs: Quando eu edito um usuario usando uma pagina.xhtml o objeto e carregado e edita normalmente.
<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!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:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">
<ui:composition template="/templates/interna.xhtml">
<ui:define name="titulo">Pesquisar Usuário</ui:define>
<ui:define name="corpo">
<p:panel id="centro" style="font-size: 13px;">
<h:form id="listagemUsuario">
<p:dataTable id="listagem" var="usuario" value="#{pessoaBean.lista}" scrollable="true" scrollHeight="400">
<p:column headerText="Nome" style=" width: 40%">
#{usuario.nome}
</p:column>
<p:column headerText="Login" style="width: 15%">
#{usuario.login}
</p:column>
<p:column headerText="Permissão" style="text-align: center; width: 15%">
<h:graphicImage library="imagens" name="pessoa_#{usuario.permissao}.png"/>
</p:column>
<p:column headerText="Status" style="text-align: center; width: 5%">
<h:commandLink action="#{pessoaBean.ativar}" >
<h:graphicImage library="imagens" name="pessoa_#{usuario.ativo}.png" />
<f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" />
</h:commandLink>
</p:column>
<!-- Aqui estou tentando editar por um dialog -->
<p:column headerText="Visualizar" style="text-align: center; width: 5%" >
<p:commandLink oncomplete="visualizarDialog.show()" update="@form">
<h:graphicImage library="imagens" name="visualizar_dados.png" />
<f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" />
</p:commandLink>
<p:dialog id="visualizarDialog" header="Dados do Usuário" widgetVar="visualizarDialog" width="400" modal="true" resizable="false">
<h:panelGrid columns="2">
<h:outputLabel value="Código: " />
<h:outputLabel value="#{usuario.codigo}" />
<h:outputLabel value="Nome: " />
<h:inputText value="#{usuario.nome}" />
<h:outputLabel value="Login: " />
<h:inputText value="#{usuario.login}" />
<h:outputLabel value="Status: " />
<h:inputText value="#{usuario.ativo}" />
<h:outputLabel value="Permissão: " />
<h:inputText value="#{usuario.permissao}"/>
<h:outputLabel value="Setor: " />
<h:inputText value="#{usuario.setor}" />
<h:outputLabel value="Cargo: " />
<h:inputText value="#{usuario.cargo}" />
<h:outputLabel value="Data Cadastro: " />
<h:outputText value="#{usuario.dataCadastro}" />
</h:panelGrid>
</p:dialog>
</p:column>
<!-- Assim consigo editar o usuario, mas carregando o objeto em uma pagina xhtml. -->
<p:column headerText="Editar" style="text-align: center; width: 10%">
<h:commandLink action="#{pessoaBean.editar}">
<h:graphicImage library="imagens" name="editar_pessoa.png" />
<f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" />
<f:setPropertyActionListener target="#{pessoaBean.paginaDestino}" value="/restrito/cadastro_usuario" />
</h:commandLink>
</p:column>
</p:dataTable>
</h:form>
</p:panel>
</ui:define>
</ui:composition>
</html>
Bean
@ManagedBean(name="pessoaBean")
@RequestScoped
public class PessoaBean {
private Pessoa pessoa = new Pessoa();
private List<Pessoa> lista;
private String paginaDestino;
public String salvar(){
PessoaRN pessoaRN = new PessoaRN();
this.pessoa.setDataCadastro(new Date());
this.pessoa.setAtivo(true);
pessoaRN.salvar(pessoa);
return this.paginaDestino = "pesquisa_usuario?faces-redirect=true";
}
public String ativar(){
if(this.pessoa.isAtivo())
this.pessoa.setAtivo(false);
else
this.pessoa.setAtivo(true);
PessoaRN pessoaRN = new PessoaRN();
pessoaRN.salvar(this.pessoa);
return null;
}
public Pessoa getVisualizar() {
return visualizar;
}
public void setVisualizar(Pessoa visualizar) {
this.visualizar = visualizar;
}
public List<Pessoa> getLista() {
if(this.lista == null){
PessoaRN pessoaRN = new PessoaRN();
this.lista = pessoaRN.listar();
}
return lista;
}
public void setLista(List<Pessoa> lista) {
this.lista = lista;
}
public Pessoa getPessoa() {
return pessoa;
}
public void setPessoa(Pessoa pessoa) {
this.pessoa = pessoa;
}
public String getPaginaDestino() {
return paginaDestino;
}
public void setPaginaDestino(String paginaDestino) {
this.paginaDestino = paginaDestino;
}
}
Vc deve referenciar seu objeto a partir do seu Bean.
<h:panelGrid columns="2">
<h:outputLabel value="Código: " />
<h:outputLabel value="#{pessoaBean.pessoa.codigo}" />
<h:outputLabel value="Nome: " />
<h:inputText value="#{pessoaBean.pessoa.nome}" />
// segue seu codigo...
</h:panelGrid>
hmsilva
Novembro 19, 2012, 5:32pm
#3
Cara,
Substitui o trecho de código que vc atualiza o form para atualizar o dialog.
<p:commandLink oncomplete="visualizarDialog.show()" update="@form">
<h:graphicImage library="imagens" name="visualizar_dados.png" />
<f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" />
</p:commandLink>
para
<p:commandLink oncomplete="visualizarDialog.show()" update="visualizarDialog">
<h:graphicImage library="imagens" name="visualizar_dados.png" />
<f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" />
</p:commandLink>
Fiz uma POC tentanto estar o mais proximo possivel do seu código.
[code]public class Pessoa {
private String nome;
private String login;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
}[/code]
[code]
@ManagedBean (name=“pessoaBean”)
@RequestScoped
public class PessoaBean {
private Pessoa pessoa;
private List<Pessoa> lista;
public PessoaBean(){
lista = new ArrayList<Pessoa>();
criarDadosFake();
}
private void criarDadosFake(){
Pessoa p = new Pessoa();
for (int i = 0; i < 10; i++) {
p.setLogin("login"+i);
p.setNome("nome"+i);
lista.add(p);
p = new Pessoa();
}
}
public List<Pessoa> getLista() {
return lista;
}
public void setLista(List<Pessoa> lista) {
this.lista = lista;
}
public Pessoa getPessoa() {
return pessoa;
}
public void setPessoa(Pessoa pessoa) {
this.pessoa = pessoa;
}
}[/code]
[code]
<h:head>
Pessoa
</h:head>
<h:body>
<h:form id=“listagemUsuario”>
<p:dataTable id=“listagem” var=“usuario” value="#{pessoaBean.lista}" scrollable=“true” scrollHeight=“400”>
<p:column headerText=“Nome” style=" width: 40%">#{usuario.nome}</p:column>
<p:column headerText=“Login” style=“width: 15%”>#{usuario.login}</p:column>
<p:column headerText="Visualizar" style="text-align: center; width: 5%">
<p:commandLink oncomplete="visualizarDialog.show()" update="visualizarDialog">
<h:outputLabel value="link" />
<f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" />
</p:commandLink>
<p:dialog id="visualizarDialog" header="Dados do Usuário" widgetVar="visualizarDialog" width="400" modal="true" resizable="false">
<h:panelGrid columns="2">
<h:outputLabel value="Nome: "/>
<h:inputText value="#{usuario.nome}"/>
<h:outputLabel value="Login: "/>
<h:inputText value="#{usuario.login}"/>
</h:panelGrid>
</p:dialog>
</p:column>
</p:dataTable>
</h:form>
</h:body>
[/code]
Espero que tenha te ajudado…
hmsilva
Novembro 19, 2012, 6:12pm
#4
Segue uma forma mais elegante de se aplicar a seleção em tabelas usando PrimeFaces.
Pojo:
[code]public class Pessoa {
private String nome;
private String login;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
}[/code]
DataModel:
[code]public class PessoaDataModel extends ListDataModel implements SelectableDataModel{
public PessoaDataModel(){}
public PessoaDataModel(List<Pessoa> data){
super(data);
}
@Override
public Pessoa getRowData(String rowKey) {
List<Pessoa> pessoas = (List<Pessoa>) getWrappedData();
for (Pessoa pessoa : pessoas) {
String key = pessoa.getLogin() + pessoa.getNome();
if(key.equals(rowKey)){
return pessoa;
}
}
return null;
}
@Override
public Object getRowKey(Pessoa pessoa) {
return (pessoa.getLogin()+pessoa.getNome());
}
}[/code]
Bean:
[code]
@ManagedBean (name=“pessoaBean”)
@SessionScoped
public class PessoaBean {
private Pessoa pessoa;
private List<Pessoa> lista;
private PessoaDataModel dataModel;
public PessoaBean(){
lista = new ArrayList<Pessoa>();
criarDadosFake();
dataModel = new PessoaDataModel(lista);
}
private void criarDadosFake(){
Pessoa p = new Pessoa();
for (int i = 0; i < 10; i++) {
p.setLogin("login"+i);
p.setNome("nome"+i);
lista.add(p);
p = new Pessoa();
}
}
public void aoSelecionar(SelectEvent event) {
FacesMessage msg = new FacesMessage("Car Selected", ((Pessoa) event.getObject()).getNome());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public List<Pessoa> getLista() {
return lista;
}
public void setLista(List<Pessoa> lista) {
this.lista = lista;
}
public Pessoa getPessoa() {
return pessoa;
}
public void setPessoa(Pessoa pessoa) {
this.pessoa = pessoa;
}
public PessoaDataModel getDataModel() {
return dataModel;
}
public void setDataModel(PessoaDataModel dataModel) {
this.dataModel = dataModel;
}
}[/code]
XHTML:
[code]
<h:head>
Pessoa
</h:head>
<h:body>
<h:form id=“listagemUsuario”>
<p:growl id=“growl” showDetail=“true”/>
<p:dataTable id="listagem" var="usuario" value="#{pessoaBean.dataModel}" paginator="true" rows="10" selection="#{pessoaBean.pessoa}" selectionMode="single">
<p:ajax event="rowSelect" listener="#{pessoaBean.aoSelecionar}" update=":listagemUsuario:visualizarDialog :listagemUsuario:growl" oncomplete="visualizarDialog.show()" />
<p:column headerText="Nome" style=" width: 40%">#{usuario.nome}</p:column>
<p:column headerText="Login" style="width: 15%">#{usuario.login}</p:column>
</p:dataTable>
<p:dialog id="visualizarDialog" header="Dados do Usuário" widgetVar="visualizarDialog" width="400" modal="true" resizable="false">
<h:panelGrid columns="2">
<h:outputLabel value="Nome: "/>
<h:inputText value="#{pessoaBean.pessoa.nome}"/>
<h:outputLabel value="Login: "/>
<h:inputText value="#{pessoaBean.pessoa.login}"/>
</h:panelGrid>
</p:dialog>
</h:form>
</h:body>
[/code]
Fala adi_silva, tranquilo?
O problema no seu caso é que você não está fazendo um update do dialog a cada seleção, então o conteúdo exibido na view permanece com os dados do primeiro usuário selecionado. Trabalhando com o primefaces, eu sempre deixo um <p:ajax> dentro do dataTable, para que assim que uma linha seja selecionada, o panel seja re-renderizado com os valores do novo usuário
Aqui eu resolvi da seguinte forma:
<p:dataTable
id="tableFuncionario"
widgetVar="tableFuncionario"
var="func"
value="#{permissionController.userList}"
styleClass="centralizado"
style="width: 60%"
emptyMessage="Nenhum registro encontrado"
paginator="true"
paginatorAlwaysVisible="false"
rowKey="#{func.userName}"
selectionMode="single"
selection="#{permissionController.selectedUser}"
rows="15">
<p:ajax
event="rowSelect"
process="@this"
update=":form:dialogPermissao"
oncomplete="dialogPermissao.show()" />
<f:facet name="header">
<h:outputText value="Pesquisa de funcionários" />
</f:facet>
<p:column
style="width: 15%"
headerText="Login"
sortBy="#{func.userName}"
styleClass="column">
<h:outputText value="#{func.userName}" />
</p:column>
<p:column
style="width: 55%"
headerText="Nome completo"
sortBy="#{func.fullName}"
styleClass="column">
<h:outputText value="#{func.fullName}" />
</p:column>
<p:column
style="width: 30%"
headerText="E-mail:"
sortBy="#{func.mail}"
styleClass="column">
<h:outputText value="#{func.mail}" />
</p:column>
<f:facet name="footer">
<h:outputText value="Clique em um funcionário para gerenciar a permissão" />
</f:facet>
</p:dataTable>
<p:spacer
width="100%"
height="25" />
<p:dialog
id="dialogPermissao"
modal="true"
widgetVar="dialogPermissao"
header="Gerenciar permissão"
closable="true"
draggable="false"
resizable="false"
styleClass="centralizado"
width="340"
onHide="tableFuncionario.unselectAllRows();">
<h:panelGrid
columns="2"
styleClass="centralizado">
<h:outputText
styleClass="label"
value="Nome: " />
<h:outputText value="#{permissionController.selectedUser.fullName}" />
<h:outputText
styleClass="label"
value="Login: " />
<h:outputText value="#{permissionController.selectedUser.userName}" />
<h:outputText
styleClass="label"
value="E-mail: " />
<h:outputText value="#{permissionController.selectedUser.mail}" />
</h:panelGrid>
<p:spacer
width="100%"
height="5" />
<p:commandButton
id="btnConceder"
value="Conceder permissão"
icon="ui-icon-check"
styleClass="centralizado"
action="#{permissionController.grantPermission}"
process="@this"
oncomplete="tableFuncionario.unselectAllRows(); dialogPermissao.hide()" />
<p:spacer width="5" />
<p:commandButton
id="btnRevogar"
value="Revogar permissão"
icon="ui-icon-close"
styleClass="centralizado"
action="#{permissionController.revokePermission}"
process="@this"
oncomplete="tableFuncionario.unselectAllRows(); dialogPermissao.hide()" />
</p:dialog>
Dessa forma o dialog sempre é exibido quando se clica em uma linha do dataTable, e os dados do funcionário são carregados.
Lembre-se que é preciso criar uma propriedade no seu controller para armazenar o usuário selecionado da lista ok?
Valeo galera resolvido.
Usei a dica do nosso amigo hmsilva troquei o @form pelo nome do Dialog.
Ficou assim.
<p:commandLink oncomplete="visualizarDialog.show()" update="visualizarDialog">
<h:graphicImage library="imagens" name="visualizar_dados.png" />
<f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" />
</p:commandLink>
<!-- Dialog -->
<p:dialog id="visualizarDialog" header="Dados do Usuário" widgetVar="visualizarDialog" width="400" modal="true" resizable="false">
<h:panelGrid columns="2">
<h:outputLabel value="Código: " />
<h:outputLabel value="#{usuario.codigo}" />
<h:outputLabel value="Nome: " />
<h:inputText value="#{usuario.nome}" />
<h:outputLabel value="Login: " />
<h:inputText value="#{usuario.login}" />
<h:outputLabel value="Status: " />
<h:inputText value="#{usuario.ativo}" />
<h:outputLabel value="Permissão: " />
<h:inputText value="#{usuario.permissao}"/>
<h:outputLabel value="Setor: " />
<h:inputText value="#{usuario.setor}" />
<h:outputLabel value="Cargo: " />
<h:inputText value="#{usuario.cargo}" />
<h:outputLabel value="Data Cadastro: " />
<h:outputText value="#{usuario.dataCadastro}" />
</h:panelGrid>
</p:dialog>
Grato pela ajuda de todos
hmsilva
Novembro 20, 2012, 1:57pm
#7
Opa, Tamo injetado, compilado e executado…