Rich Faces tabPanel socorro

12 respostas
M

Galera, eu to a mais de uma semana procurando sobre isso na net e nao acho nada, entao decidi recorer ao forum, peço q por favor, se alguem solber como fazer, me ajude.

O problema é um seguinte. Eu tenho um tabPanel do rich faces, e eu gostaria de adicionar uma nova tab via ajax com o ajax4jsf. Essa tab sera criada no momento q eu clicar em um link dentro de uma outra tab ja existente. A questao nao é criar a tab, pois se eu criar o componente dinamicamente e der um rerender no tabpanel, ela aparece. A questao é q se eu der um rerender no tabPanel, todo conteudo de forms e campos de um tab ja existente, eh apagado, ou seja, ele eh redenrizado novamente sem os valores q eu digitei. O q eu gostaria era de saber como posso adicionar uma tab via ajax sem redenrizar as ja existentes. Eu ja tentei de varias formas, ate gambiarra com javascript ja fiz, so q devido a isso surge varios problemas de duplicate id. Ah, e o conteudo q ficará nessas tabs criadas, seram paginas incluidas. Galera se alguem poder me da uma luz sobre o assunto ja agradeço. Vlw.

12 Respostas

as.velasco

Man estava com um problema parecido espero que seja isso que esteja querendo.
Na minha tela estava usando cinco suggestionbox e dois fileupload e sempre que carregava uma outra suggestion ele limpava a anterior a mesma coisa com as imagens e arquivos que estava carregando em minha pagina o problema foi resolvido quando usei tambem aconselho você a dar uma olhada na documentação do rich-faces e esquece javascript usado hoje em dia para fazer ganb espero que tenha ajudado.

a4j:region

</a4j:region>

EX.

<a>a4j:region</a>

<s:decorate template="/layout/edit.xhtml" id=“paisDecorate”>

<ui:define name=“label”>

#{msgCadastroProfissionais.idPais}

</ui:define>

<h:inputText value="#{profissionalBean.paisSuggestion}" id=“pais” required=“true” requiredMessage="#{msg.obrigatorio}"></h:inputText>

<rich:suggestionbox for=“pais” width=“150” height=“200”	minChars=“2” suggestionAction="#{profissionalBean.listarPaisSuggestion}" var=“itemPais”>

<a>rich:column</a>

#{itemPais.txPais}

</rich:column>

<a4j:support event=“onselect”>

<f:setPropertyActionListener value="#{itemPais}" target="#{profissionalBean.profissional.pais}" />

</a4j:support>

</rich:suggestionbox>

</s:decorate>

</a4j:region>
M

Opa amigo, vlw por responder.
Bom, eu ja tentei esse a4j region em varios locais, eu vou postar o codigo pra vc entender melhor meu problema:

<rich:tabPanel id=“tab” switchType=“client”>			

<rich:tab id=“centro” label=“Itens”>

<t:div id="_centro">	

<a4j:keepAlive ajaxOnly=“true” beanName=“indexBack”></a4j:keepAlive> 				

<h:form id=“ctitens”>					

<rich:dataTable rendered="#{!empty indexBack.itens}" var=“itens”

value="#{indexBack.itens}" width=“94%” border=“0” align=“center”

cellpadding=“3” cellspacing=“1” bgcolor="#9D9BB3"

onRowMouseOver=“this.style.backgroundColor=’#F8F8F8’”

onRowMouseOut=“this.style.backgroundColor=’#FFFFFF’”>

<rich:column style=“width:5%”>

<t:outputText value=“Icon” />

</rich:column>

<rich:column style=“width:80%”>							

<a4j:commandLink binding="#{indexBack.cmd}" action="#{indexBack.addTab}"

value="#{itens.nome}">

<a4j:actionparam name=“nomemod” value="#{itens.nmsubmod}"

assignTo="#{indexBack.activeTab.nomeMod}" />

<a4j:actionparam name=“labelm” value="#{itens.nome}"

assignTo="#{indexBack.activeTab.label}" />

</a4j:commandLink>

</rich:column>

<rich:column style=“width:15%”>

<h:outputText value="#{itens.nmsubmod}" />

</rich:column>

</rich:dataTable>

</h:form>	

<h:outputText rendered="#{empty indexBack.itens}"

value=“Nenhum item cadastrado” />					

</t:div>

</rich:tab>

</rich:tabPanel>

Veja q eu tenho esse commandLink <a4j:commandLink binding="#{indexBack.cmd}" action="#{indexBack.addTab}" value="#{itens.nome}">

O q eu quero é q quando eu clicar nele(vai ser um link pra cada item da lista), ele crie uma aba e inclua uma pagina nessa aba. De forma q se eu clicar em outro link, ele abra outra aba e inclua outra pagina, porem nao mecha nas abas ja criadas. O q acontece eh q se eu crio uma aba, adiciono ao tabpanel, e do um rerender, as abas ja criadas tbm vao ser redenrizadas, reincluindo os conteudos e apagando os dados digitados. Uma forma q eu tinha feito foi deixar N abas já criadas, e entao com uma funcao javascript eu escondia elas, quando clicase no link, ele dava um rerender so na aba livre, e quando terminase, uma funcao javascript exibia ela. Bom isso eh GAMBIARRA, mais funciona, o problema eh q com isso dava muito erro de id duplicado, nao sei pq. Bom a verdade eh q eu nao quero gambiarra, e se puder me ajudar cara, agradeço d++++++++++++++++++, pq ja to doido com isso. Vlw

as.velasco

Man me fale qual servidor de aplicação você está usando pois acho que posso ajudá-lo pois já tive este problema.

M

Apache Tomcat 5.5.25

as.velasco

Escopo dos beans:

Sessão
Request
Aplicação
Conversation
Sem escopo

Eu estou usando o Jboss Seam mas meu problema era que para cada metodo acionado ele criava uma nova conversar ou seja eu adicionei no meu botão um

<fpf:button label="#{msg.btUpload}" managedBean="#{profissionalBean}" method=“uploadFoto”>
<s:conversationPropagation type=“join” />
</fpf:button>

não sei se o apache faz isso

<a4j:commandLink binding="#{indexBack.cmd}" action="#{indexBack.addTab}" value="#{itens.nome}">
<s:conversationPropagation type=“join” />
</a4j:commadLink>

ele mantem a mesma conversa ele não vai criar uma nova em teoria ele funcionaria na pratica e diferente estavamos tendo varios problemas com os componentes ajax e em alguns casos tivemos que controlar a conversa manualmente.

M

<s:conversationPropagation type=“join” />

o q isso faria??

as.velasco

Man não sei se o apache da suporte para manter a conversa teria que pesquisar esse <s:conversationPropagation type=“join” /> é para manter vc em uma mesma conversa com seus objetos todos dentro delas, acho melhor vc usar sessão para cada tabcriada ele quarda as informações da anterior numa sessão assim quando chegar no final ele vai ter mantido todos seus objetos nesta sessão e acho bom tbm vc por tudo esses componentes ajax dentro de uma
a4j:outputPanel
a4j:region

</a4j:region>
</a4j:outputPanel> pois ele vai submeter na ação do metodo save o que está acontecendo é que quando vc vai para o proximo tabpanel ele renderisa a pagina ou seja ele não mantem as informações contidas nos seus campos para isso vc vai ter que usar o a4j:region para manter os objetos.

M

Mano, deixa ver se entendi, o ajax region mantem o estado de tudo q ta dentro apos uma rerender eh isso? E o q eu deveria por dentro do outputpanel e region? Entao tu ta dizendo pra mim criar a tab via codigo, adiciono ela dentro de um region eh isso? ai quando eu dar um rerender no tabpanel ele nao vai redenrizar as outras? Bom eu nao to entendendo eu acho ehhehe. Se tu me mostrase de forma simples mesmo, como eu poderia clicar no commandlink, ai uma aba ser criada com um campo de inputext, e quando eu clica pra criar outra aba, o conteudo desse inputtext nao ser apagado. Se tu me desse esse exemplinho simples pra mim ja era tudo ehhehe. Vlw

as.velasco

Man mas simples experimenta usar switchType=“client”
mantem as paginas no cliente
ocultadas soh por div

M

Ja ta switch client. A questao eh q o conteudo contido dentro das tabs sao paginas incluidas, e elas precisam ser mudados. Ai quando do um rerender em uma determinada tab pelo id dela, da duplicate id.

M

Mano eu entendi o q tu quis dizer com o region agora ^^
testei aqui e realmente funciona eehhehe, so q veja bem,os campos tem q estar dentro do form q foi submetido, e esse form tem q ta num region. A questao eh q se eu ponho todo o tabpanel dentro de um form, nao vai da problema com os forms das paginas incluidas nao?? Ou seja, o conteudo das paginas incluidas vao se manter??

rpfragoso

Mizael, estou precisando arrumar um jeito de criar abas dinamicamente. Se você pudesse mostrar o código que faz isso ou um pequeno exemplo eu agradeceria muto.

Criado 18 de janeiro de 2008
Ultima resposta 6 de out. de 2008
Respostas 12
Participantes 3