Retornar valor encontrado numa modalPanel para a tela que a chamou?

Criei um modal panel (rich:modalPanel) onde o mesmo desejo fazer sincronia com um uma inputText, a idéia é quando abrir um modal panel, o mesmo apresenta uma caixa de texto, onde o que eu digitar nela ao fechar o modal irá fazer a sincronia com o inputText da tela chamadora.

Essa idéia na prática não irá acontecer no sistema, mas preciso saber como faço esse retorno, pois na verdade a minha tela no modal é uma tela de seleção onde há uma lista de valores e quando eu selecionar um registro, a descrição do mesmo deverá voltar para o inputText.

Fazer o modal eu sei, chamá-lo também, preencher uma dataTable nele também, saber qual registro foi selecionado pelo usuário nessa dataTable também, o problema se encontra no retorno, como irá retornar esse valor para a minha tela chamadora.

Uma prévia do código:

Tela que chamará o panel e apresenta um inputText que receberá o valor

<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" 
          xmlns="http://www.w3.org/1999/xhtml"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:a4j="http://richfaces.org/a4j"
          xmlns:rich="http://richfaces.org/rich"
          version="2.0">
    <ui:composition template="/WEB-INF/templates/templatePrincipal.jspx">
        <ui:define name="body">
            <h:form id="mainForm">
                <rich:panel header="Natureza de Auditoria">
                    <h:outputLabel value="Nome:" for="id"/>
                    <h:inputText id="registroNatureza" size="50" value="#{chamadora.registro.nome}" /> 
                    <a4j:commandButton value="Ajax modal" onclick="javascript:Richfaces.showModalPanel('modal:selNaturezaAuditoria');">
                        <f:setPropertyActionListener target="#{naturezaAuditoriaSel.selecionados}" value="#{chamadora.listaNatureza}"/>
                        <a4j:support action="#{chamadora.atualizarSelecaoNatureza}" event="oncomplete" />
                    </a4j:commandButton>
                </rich:panel>
            </h:form>
            <h:form id="modal">
                <rich:modalPanel id="selNaturezaAuditoria" autosized="true" >
                    <a4j:support event="onhide" reRender="mainForm:registroNatureza"/>
                    <ui:include src="naturezaAuditoriaSEL.jspx"/>
                </rich:modalPanel>
            </h:form>
        </ui:define>
    </ui:composition>
</jsp:root>

código do meu panel que será renderizado na página chamadora, repare que há dados de uma lista (datatable) mas para simplificar e focalizar no problema, preciso saber como devo retornar valor para um input da tela que chamou a modal

<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" 
          xmlns="http://www.w3.org/1999/xhtml"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:a4j="http://richfaces.org/a4j"
          xmlns:rich="http://richfaces.org/rich"
          version="2.0">
    <f:facet name="header">
        <h:panelGroup>
            <h:outputText value="Seleção da Natureza de Auditoria"></h:outputText>
        </h:panelGroup>
    </f:facet>
    <rich:dataTable id="tbl" value="#{naturezaAuditoriaSel.registros}" var="reg" rows="10" width="600"> 
        <f:facet name="header">
            <h:panelGroup >      
                <table border="0" cellpadding="0" cellspacing="0" width="100%">
                    <tr>
                        <td style="text-align:left"><h:outputText style="border-right:solid 0px;border-bottom:solid 0px " styleClass="dr-table-headercell rich-table-headercell" value="Naturezas de Auditoria encontradas(#{naturezaAuditoriaSel.QTRegistros})"/></td> 
                        <td style="width:150px"><rich:datascroller for="tbl" maxPages="4"/></td> 
                    </tr>
                </table>
            </h:panelGroup>                        
        </f:facet>    
        
        <rich:column width="20" style="text-align:center">                        
            <f:facet name="header">
                <h:selectBooleanCheckbox title="Clique para selecionar ou remover a seleção de todos os registros." id="selecaoGeral" value="#{naturezaAuditoriaSel.selecaoGeral}">
                    <a4j:support action="#{naturezaAuditoriaSel.selecionarGeral}" event="onclick" reRender="tbl"/>
                </h:selectBooleanCheckbox>
            </f:facet>
            
            <h:selectBooleanCheckbox value="#{naturezaAuditoriaSel.mapSelecionados[reg.id]}">
                <a4j:support action="#{naturezaAuditoriaSel.selecionarRegistro}" event="onclick"/>
            </h:selectBooleanCheckbox>                    
        </rich:column> 
        <rich:column  sortBy="#{reg.sigla}">
            <f:facet name="header"><h:outputText value="Sigla"/></f:facet>
            <h:outputText value="#{reg.sigla}"/>
        </rich:column>
        <rich:column  sortBy="#{reg.nome}">
            <f:facet name="header"><h:outputText value="Nome"/></f:facet>
            <h:outputText value="#{reg.nome}"/>
        </rich:column>
        
        <f:facet name="footer" >
            <h:panelGroup>
                <table border="0" cellpadding="0" cellspacing="0" width="100%">
                    <tr>
                        <td><h:outputText style="border-right:solid 0px;border-bottom:solid 0px " styleClass="dr-table-footercell rich-table-footercell" value="Operacoes especiais"/></td> 
                        <td style="width:150px"></td> 
                        <td style="width:75px">
                            <a4j:commandButton onclick="javascript:Richfaces.hideModalPanel('modal:selNaturezaAuditoria');"
                                               value="Selecionar">
                            </a4j:commandButton>
                        </td> 
                    </tr>
                </table>
            </h:panelGroup>                  
        </f:facet>
    </rich:dataTable>
</jsp:root>

Qualquer ajuda é válida, já que meu problema atual é justamente no retorno desse registro selecionado. Obrigado a todos.

colega isto é muito simples.

no seu botão de fechar a modal adicione uma action que pega o valor digitado, e deixar o fechar no oncomplete que executa o script após a action:

 <a4j:commandButton action="bean.mudaValor"  oncomplete="javascript:Richfaces.hideModalPanel('modal:selNaturezaAuditoria');"  
                                                value="Selecionar">  
 </a4j:commandButton>

e ai no seu bean

public class Bean{
     
     public void mudaValor(){
           //pegue aqui o valor do input, suponha que ele esteja nesta string abaixo
           String x = "o valor digitado no seu input do modal";
           //agora dê um set no campo da tela chamadora e passe o "x" que é o valor .
           telaChamadora.setSeuCampo(x);
 
      }

}

Valeu jababuntu.

Já descobri um erro que cometi.

no f:setPropertyActionListener o targer DEVE ser para a lista da minha tela chamadora e não a tela que irá ter a modal.

Mesmo assim a questão ainda não está fechada.

Você colocou mudaValor no bean da tela que irá processar o modal, porém o bean dela não pode saber qual o bean da tela que a chamou, isso cria dependência.

[quote=Grinvon]Valeu jababuntu.

Já descobri um erro que cometi.

no f:setPropertyActionListener o targer DEVE ser para a lista da minha tela chamadora e não a tela que irá ter a modal.

Mesmo assim a questão ainda não está fechada.

Você colocou mudaValor no bean da tela que irá processar o modal, porém o bean dela não pode saber qual o bean da tela que a chamou, isso cria dependência.[/quote]

não precisa ser no bean da tela que chamou pode ser em outro local, num outro bean…
e ai você pode passar esse parâmetro pra uma classe de negócio que tenha acesso ao bean, e ai você faz o set…
não precisa criar a dependência, foi só exemplo…

Agora está retornando valor, mas um problema…

Quando eu clico para chamar o modal e não há nada selecionado, automaticamente o JSF executa o método da minha classe chamadora que irá popular o inputText, e eu não quero que isso ocorra nesse momento, quero que ele execute esse método apenas quando for fechada a modal.

Código do botão na tela chamadora

                    <a4j:commandButton value="..." onclick="javascript:Richfaces.showModalPanel('modal:selNaturezaAuditoria');"
                                       actionListener="#{chamadora.atualizarSelecaoNatureza}" reRender="registroNatureza">
                        <f:setPropertyActionListener target="#{chamadora.listaNaturezaSelecao}" 
                                                     value="#{naturezaAuditoriaSel.selecionados}"/>
                    </a4j:commandButton>

[list]
Métodos:

  • chamadora.atualizarSelecaoNatureza

Ele irá popular a minha inputText com um registro da lista.
[/list]

Tentei colocar o a4j:support para fazer isso, no evento “oncomplete” mas não funcionou, ele acaba sempre chamando o método atualiarSelecaoNatureza em todo momento que o botao for clicado.

me esclareça uma dúvidas:

por acaso o seu objetivo real seria:

chamar uma popup modal, neste modal irá fazer uma consulta que irá listar numa tabela, e ai um uma determinada coluna serão links, que ao clicar nesta linha selecionada a popup irá fechar e automaticamente mandar o valor de volta pra outra tela.

seria isso?

Tenho dois beans e duas jspx

Telas:

Chamadora - irá chamar a tela de modal
Modal - irá listar os valores de uma entidade (rich:dataTable)

ao clicar em um botão de chamadora, irá abrir o modal, do qual irá apresentar a lista preenchida.

Nessa dataTable existem checkbox onde posso selecionar os registros, ao selecionar esses registros e apertar em confirmar, essa lista deverá ser passada para a tela chamadora que irá processar o que desejar com esses registros, inclusive mostrar um deles em um input por exemplo.

Nesse caso preciso declarar duas listas em cada bean

Em beans de Chamadora e Modal
List lista = new ArrayList();

essas duas listas ficam em sincronia usando:

                        <f:setPropertyActionListener target="#{chamadora.lista}" 
                                                     value="#{modal.lista}"/>

Essa tag é colocada dentro do botão de ação que chamará a tela modal.

Javabuntu, consegue fazer aqui. E acho que resolverá o problema de muita gente. Não ficou perfeito, mas já é um startup.

Primeiro: Criar o arquivo isolado onde conterá a lógica da tela.

Segundo: Criar um botão na tela que irá chamar a outra, renderizando em forma modal:

Código do botão que irá carregar a modal. Sua única tarefa é chamar a modal, nada mais do que isso.

                    <a4j:commandButton value="..." onclick="javascript:Richfaces.showModalPanel('modal:minhaModal');"
                                       reRender="registroNatureza">
                    </a4j:commandButton>

na tela chamadora, declarar uma área onde será destinada para o rich:modalPanel, a modal está em form modal e nome minhaModal: modal:minhaModal. E terá um ajax support para quando for fechada executar o método da bean chamadora que processará as informações recebidas dela. Essas informações são sincronizadas através de duas listas, uma para cada managed bean.

            <h:form id="modal">
                <rich:modalPanel id="minhaModal" autosized="true">
                    <a4j:support event="onhide" actionListener="#{chamadora.atualizarSelecaoNatureza}" reRender="registroNatureza"/>
                    <ui:include src="naturezaAuditoriaSEL.jspx"/>
                    <a4j:commandButton value="Selecionar" onclick="javascript:Richfaces.hideModalPanel('modal:minhaModal');"
                                       actionListener="#{chamadora.atualizarSelecaoNatureza}" reRender="registroNatureza">
                        <f:setPropertyActionListener target="#{chamadora.lista}" 
                                                     value="#{naturezaAuditoriaSel.lista}"/>                        
                    </a4j:commandButton>
                </rich:modalPanel>
            </h:form>

No bean da tela para a modal, você pode adicionar a lógica de popular uma grid, um campo apenas, uma list, etc, dessa forma a pessoa terá que saber como obter informações desses componentes e popular ele numa ArrayList que no caso é usado para fazer a sincronia entre as telas. No botão da modal é efetuada duas operações: hide na modal e executar o método da classe chamadora que irá processar as informações; Repare que existe um reRender que renderizará nesse meu caso uma h:inputText.

entendi, se resolveu problema blz.

Agora um comentário:

eu uso JSF, mas não coloco lógica nenhuma no bean que está ligado nos componentes, é como se eu tivesse um bean de request onde coloco todas minhas ações e tenho um bean dependendo do caso como session, onde tenho meus atributos… é como se eu tivesse um ModalAction e um ModalBean, e neste último coloco só get e set, e da action eu acesso e faço minhas lógicas…

Criei uma dependência, agora vou tentar tirar isso.

Poderia , postar todo o codigo

vlw