RESOLVIDO - Problema com Dialog e TreeNode do Primefaces

Olá pessoal.

Quero fazer o seguinte:

  • Cadastrar Setores. Onde cada Setor pode Possui um Setor Chefe. Para isso, deve-se informar o nome do Setor e caso haja Setor Chefe, o usuário deverá clicar no Botão “Selecionar” e com isso irá abrir um <p:dialog> e nela tera uma TreeNode listando os Setores e seus SubSetores. Após selecionar, a pessoa fecha a Tela e o Setor selecionado é mostrado na página de cadastro.

Problema:

  • Setor o Setor selecionado na pagina em baixo da Dialog.

Hoje:

  • Atualmente eu consigo fazer o cadastro normalmente se não mostro o setor selecionado na página. Com isso ele abre naturalmente a e seleciono o Setor Chefe.
  • O problema acontece quando quero que apareca. Ae quando fecho a dialog, é dado automaticamente pelo framework tipo um new() no objeto, com isso quando cadastro o Setor o seu SetorChefe fica vazio. Mas aparece na tela num input normal com disabled=true;

O que quero:

  • Quando selecionar o setor, ele atualizar o input mostrando o nodo selecionado na tree. Mas que não perca a referencia.

Código:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <ui:composition template="/WEB-INF/templates/default.xhtml">
        <ui:define name="conteudo">
            <f:view>
                <h:form id="formSetor" >
                    <p:fieldset legend="#{msgs.titSetNew}" style="width: 50%">
                        <h:panelGrid columns="3" id="grid">
                            <h:outputLabel for="txtNome" value="#{msgs.lbSetNome}"/>
                            <p:inputText id="txtNome" value="${setorMNG.nome}"/>
                            <p:message for="txtNome" showDetail="true"/>

                            <h:outputLabel value="#{msgs.lbSetSetorPai}"/>

                            <p:inputText id="txtSetSet" value="${setorMNG.setorSelecionado}" disabled="true"/>
                            <p:commandButton value="Selecionar"
                                             type="button"
                                             onclick="dlg.show()"
                                             image="ui-icon ui-icon-disk" />           
                        </h:panelGrid>
                        <br/>
                        <p:commandButton
                            value="Salvar"
                            action="#{setorMNG.save}"
                            update="grid"/>
                        <p:commandButton value="#{msgs.btClear}"
                                         action="#{setorMNG.clear()}"
                                         process="@none" update="@form" />
                    </p:fieldset>
                    <p:dialog header="Selecione o Setor" widgetVar="dlg" width="400" position="center">
                        <h:form>
                            <h:panelGrid columns="2" style="margin-bottom:10px">
                                <p:tree id="treeSingle" value="#{setorMNG.opcoesMenuTree}" var="node"
                                        Ï selectionMode="single"
                                        selection="#{setorMNG.selectedNode}"
                                        style="border: 0">
                                        <p:ajax event="select" update=":formSetor" listener="#{setorMNG.selecionarSetor}" />
                                    <p:treeNode>
                                        <h:outputText
                                            value="#{node}"
                                            />
                                    </p:treeNode>
                                </p:tree>
                            </h:panelGrid>
                            <p:commandButton value="Fechar" oncomplete="dlg.hide();"/>
                        </h:form>
                    </p:dialog>
                </h:form>
            </f:view>
        </ui:define>
    </ui:composition>
</html>

O Metodo selecionarSetor da linha

tem o seu Java assim:

public void selecionarSetor(NodeSelectEvent event) {
        setorSelecionado(event.getTreeNode().toString());
        System.out.println(">>>>>>>: " + getSetorSelecionado());
    }

Que uso par ver se selecionou mesmo e para setor no form.

Tambem usei o update do <p:ajax:> que quando uso que acontece o erro.

Quando não uso, ele tambem nao atualiza o form a baixo, mas o cadastro funciona normalmente.

PS: Uso primefaces 3.0M2 e meu java está como @requestscope

Alguem tem alguma luz?

Obrigado!

Depois de tentar MUITAS coisas, cheguei ao sucesso.

É o seguinte, como estava utilizando 2 forms, quando dava o update ele limpava o Objeto, entao fiz apenas 1 form e coloquei minha dialog dentro dele.

Eis o código:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <ui:composition template="/WEB-INF/templates/default.xhtml">
        <ui:define name="conteudo">
            <f:view contentType="text/html" encoding="UTF-8">
                <h:form id="formSetor">
                    <p:fieldset legend="#{msgs.titSetNew}" style="width: 50%">
                        <h:panelGrid columns="3" id="grid">
                            <h:outputLabel for="txtNome" value="#{msgs.lbSetNome}"/>
                            <p:inputText id="txtNome" value="#{setorMNG.nome}"/>
                            <p:message for="txtNome" showDetail="true"/>

                            <h:outputLabel value="#{msgs.lbSetSetorPai}"/>
                            <h:outputLabel id="display" value="#{setorMNG.selectedNode.data}" />


                            <p:commandButton value="Selecionar"
                                             type="button"
                                             onclick="dlg.show()"
                                             update=":formDialog"
                                             image="ui-icon ui-icon-disk" />
                        </h:panelGrid>
                        <br/>
                        <p:commandButton
                            value="Salvar"
                            action="#{setorMNG.save}"
                            update="grid"/>
                        <p:commandButton value="#{msgs.btClear}"
                                         action="#{setorMNG.clear()}"
                                         process="@none" update="@form" />
                    </p:fieldset><p:dialog header="Selecione o Setor" widgetVar="dlg" width="400" position="center">

                        <h:panelGrid columns="2" style="margin-bottom:10px">
                            <p:tree id="treeSingle" value="#{setorMNG.opcoesMenuTree}" var="node"
                                    selectionMode="single"
                                    selection="#{setorMNG.selectedNode}"

                                    style="border: 0">
                                <p:treeNode>
                                    <h:outputText
                                        value="#{node}"
                                        />
                                </p:treeNode>
                            </p:tree>
                            <p:commandButton value="Submit" update="display" oncomplete="dlg.hide();"/>
                        </h:panelGrid>
                    </p:dialog>
                </h:form>
            </f:view>
        </ui:define>
    </ui:composition>
</html>

Tomara que ajude alguem que venha a passar pelo mesmo problema que eu