Ola pessoal,
Estou trabalhando em um projeto com JSF2 + Primefaces 3 (primeira vez que uso primefaces), e estou com uma dúvida na utilização de menus de contexto dentro de tabelas.
Estou tentando utilizar o modelo de tabelas+menu deste exemplo.
Porém, estou reparando que a caixa de diálogo carDialog somente aparece corretamente quando a inicialização da lista carsSmall (utilizada no componente p:dataTable) é feita no método construtor, é isso mesmo? (Fiz testes inclusive baixando os fontes e testando aqui na minha máquina). Não entendi por que deve ser assim, se for o caso.
E, neste cenário, eu estaria com um problema maior: preciso mostrar uma tabela com uma lista de pessoas, na qual seja possível visualizar detalhes (não posso colocar tudo dentro da tabela, pois são muitos dados) e alterar endereço e gerar relatórios para cada pessoa. Tudo isso funciona perfeitamente quando inicializo a lista de pessoas dentro do construtor, mas, não sei como faria isso visto que esta lista deve ser inicializada através de um filtro previamente feito em um formulário.
Um pouco de código ajuda a entender o problema, então, vamos lá :-)
Abaixo segue meu bean de pessoa (a propósito, se eu mudar o escopo para session funciona, mas, não acho esta uma solução decente).
@ManagedBean
@RequestScoped
public class PessoaBean implements Serializable {
private Pessoa pessoaSelecionada;
private String indice;
private List<pessoa> pessoas;
private PessoaDataModel modeloPessoas;
public PessoaBean(){
//Teste
indice = "ABC"; //forçando o preenchimento do indice
pessoas = pessoaService.buscaPessoas(indice); //é um web service, está no ar e funcionando corretamente
modeloPessoas = new pessoaDataModel(pessoas);
}
public String pesquisar(){
pessoas = pessoaService.buscaPessoas(indice); //indice desta vez foi preenchido pelo formulario
modeloPessoas = new pessoaDataModel(pessoas);
return "listaPessoas";
}
//demais metodos de negocio
//getters e setters seguem abaixo
}
(minha classe PessoaDataModel está basicamente igual à do exemplo, CarDataModel, foi copy-and-paste mesmo. Basta trocar "Car" por "Pessoa").
Agora, trecho da minha página inicial, que possui apenas um texto de apresentação, e um formulario para digitar o indice ("indice", apesar do nome, é uma forma de categorizar pessoas... é estranho, mas, o modelo de dados é assim, e os usuários entendem assim).
<h:form>
<table width="100%" border="0" cellspacing="0" cellpadding="4"
class="tableConsulta">
<tr>
<td width="100%">
<fieldset>
<legend>Busca pessoa</legend>
<font size="2" face="Arial">Índice:</font>
<h:inputText id="indice" value="#{pessoaBean.indice}" />
</fieldset>
</td>
</tr>
</table>
<h:panelGroup style="display:block; text-align:center">
<h:commandButton value="Pesquisar" type="submit" action="#{pessoaBean.pesquisar}" />
</h:panelGroup>
</h:form>
E, por fim, tenho o seguinte XHTML para listar as pessoas:
<h:form id="form">
<p:growl id="growl" showDetail="true"/>
<p:dialog header="Detalhes do imóvel" widgetVar="pessoaDialog" resizable="false"
showEffect="explode" hideEffect="explode">
<h:panelGrid id="display" columns="2" cellpadding="4">
<h:outputText value="Indice" />
<h:outputText value="#{pessoaBean.pessoaSelecionada.indice}" />
<h:outputText value="Nome:" />
<h:outputText value="#{pessoaBean.pessoaSelecionada.nome}" />
//demais dados da pessoa
</h:panelGrid>
</p:dialog>
<br /><br /><br />
<p:contextMenu for="tpessoas">
<p:menuitem value="Detalhes" update="display" icon="ui-icon-search" oncomplete="pessoaDialog.show()"/>
<p:menuitem value="Alterar" update="tpessoas" icon="ui-icon-pencil" actionListener="#{pessoaBean.alterar}"/>
<p:menuitem value="Relatorio XYZ" update="tpessoas" icon="ui-icon-note" actionListener="#{pessoaBean.relatorioXYZ}"/>
<p:menuitem value="Relatorio QWE" update="tpessoas" icon="ui-icon-note" actionListener="#{pessoaBean.relatorioQWE}"/>
</p:contextMenu>
<p:dataTable id="tpessoas" var="pessoa" value="#{pessoaBean.modeloPessoas}" paginator="true" rows="10"
selection="#{pessoaBean.pessoaSelecionada}" selectionMode="single">
<f:facet name="header">
Selecione um imóvel
</f:facet>
<p:column headerText="Indice">
#{pessoa.indice}
</p:column>
<p:column headerText="Nome">
#{pessoa.nome}
</p:column>
</p:dataTable>
</h:form>
Como mencionei antes, este código todo funciona, desde que a lista de pessoas modeloPessoas seja inicializada no construtor. Se eu remover aquele código de teste, os dados na caixa de diálogo pessoaDialog não são preenchidos, todos ficam nulos. Mantendo a inicialização do modeloPessoas no construtor, funciona normalmente (sem alterar mais anda no código).
Como posso fazer então para criar esta tabela a partir de um filtro? Eu tentei até usar dois beans diferentes, um para a primeira tela e outro para a lista, usando um @ManagedProperty para o indíce, mas, ele só é inicializado após a criação do bean, então também não funciona.
Por ultimo: eu tentei fazer isto aqui, mas, dá nullpointer, não acha o componente :-(
Obrigada.
