Modal sempre com valor fixo. RICHFACES

11 respostas
lazaropj

Boa tarde galera.

Estou com uma situação complicada até de procurar no google.

tenho um dataTable que representa uma lista de intimações… e para cada intimação dessa lista, eu criei uma modal para listar as pendências dela.

Aí dentro desse dataTable, tenho outro dataTable para percorrer as pendências dessa tal intimação…

Essa lista de pendências está dentro de uma modal…

Quando eu clico para ver as pendências da primeira intimação, a modal abre certinha…

O problema é quando eu tento ver as pendências da segunda intimação… Daí abre a modal com as pendências da primeira intimação e não da segunda que eu acabei de clicar…

Alguem pode me dar um help??

<rich:dataTable id="listaDeFiscalizacoes"
				                var="_fiscalizacao"
				                value="#{fiscalizacaoAction.listaDeFiscalizacoes}"
				                rendered="#{not empty fiscalizacaoAction.listaDeFiscalizacoes}">			                
				  
			        <rich:column style="text-align: center">
			            <f:facet name="header">
			            	<ui:include src="/layout/sort.xhtml">
				                    <ui:param name="propertyLabel" value="Nome Imóvel"/>
			                </ui:include>
		            	</f:facet>
			            <h:outputText value="#{_fiscalizacao.imovel.nome}" />
			        </rich:column>	        
			        
			        <rich:column>
			        	<rich:dataTable value="#{_fiscalizacao.processoFiscalSnit.intimacaos.toArray()}" var="_intimacao">				        	
							
														
							<rich:column style="text-align: center" >
				            	<f:facet name="header">
				            		<ui:include src="/layout/sort.xhtml">
					                    <ui:param name="propertyLabel" value="Pendências"/>
					                </ui:include>
				            	</f:facet>					            
					            <a4j:commandButton onclick="Richfaces.showModalPanel('modalDePendencias');"
						            				image="/img/ico_detalhar.gif"
						            				id="pendencias"
						            				title="Pendências"
						            				style="border:none"
						            				reRender="modalDePendencias" />
									<rich:modalPanel id="modalDePendencias" >						      
											<f:facet name="header">
		            							<f:facet name="header">
									            	<ui:include src="/layout/sort.xhtml">
										                    <ui:param name="propertyLabel" value="Lista de Pendências"/>
									                </ui:include>
								            	</f:facet>
											</f:facet>
											<f:facet name="controls">
										 		<h:panelGroup>				 		       					
						       						<h:graphicImage value="/img/close.png" onclick="Richfaces.hideModalPanel('modalDePendencias')" style="cursor:pointer" >
						       							<a4j:support reRender="modalDePendencias" event="onClick" /> 
						       						</h:graphicImage>
						       					</h:panelGroup>
						 					</f:facet>
											<rich:dataTable value="#{_intimacao.tipoIntimacao.toArray()}" var="tipo">
									            <rich:column>								            		
									            	<h:outputText value="#{tipo.deIntimacao}" />
									        	</rich:column>
											</rich:dataTable>      
								    </rich:modalPanel>
			        		</rich:column>
			        		
		        		</rich:dataTable>
			        </rich:column>      	        
			        			        
				</rich:dataTable>

11 Respostas

alias

hm, eu faria um pouco diferente do que voce fez, mas tentemos resolver do jeito que tá. tente mudar o seu “showModalPanel” aí do evento onclick do botão para o oncomplete

lazaropj

alias:
hm, eu faria um pouco diferente do que voce fez, mas tentemos resolver do jeito que tá. tente mudar o seu “showModalPanel” aí do evento onclick do botão para o oncomplete

eu coloquei assim:

<a4j:commandButton oncomplete="Richfaces.showModalPanel('modalDePendencias');"
						            				image="/img/ico_detalhar.gif"
						            				id="pendencias"
						            				title="Pendências"
						            				style="border:none"
						            				reRender="modalDePendencias" />

Ele agora está aparecendo os valores de cada linha do meu dataTable, mas só na ordem…
Por exemplo… a intimação 1 tem 3 pendências. Daí seu clico nela ela abre certo…
Daí a 2º intimação tem 4 pendências… daí tbm ele abre certo…
Mas se eu clico na 5º intimação ele da erro… mas eu seu continuar e clicar na 3º, ele não aparece nada… Mas a 3º tem 5 pendências…

é tipo uma parada muito sem noção…

alias

Cara, eu faria (e faço) diferente da maneira como você fez.

Nesse tipo de cenário eu costumo colocar o modal fora do datatable, e ao clicar no botao/link, eu defino uma propriedade do managed-bean que é utilizada dentro do modal, e faço o reRender, como você fez.

Dessa forma que você fez, eu certa vez fiz mais ou menos assim (nao lembro direito…). Uma vez que o seu modal tem um id e ele está dentro do datatable, repare que o div renderizado pelo RichFaces tem como id “modalDePendencias1”, “modalDePendencias2”…ou algo assim (verifique no html gerado). Você tambem pode no seu evento click fazer da seguinte forma (do jeito que está aí):

<rich:datatable value="..." var="..." rowKeyVar="xpto">
    <a4j:commandLink value="clique!" onclick="Richfaces.showModalPanel('modalpendencias' + #{xpto})"
    <rich:modalpanel id="modalpendencias">
       <!--codigo do modal aqui-->
    </rich:modalpanel>
</rich:datatable>

Particularmente prefiro a primeira abordagem, mas se desejar tente dessa segunda maneira, já que o seu modal está dentro do datatable…acho que funciona :lol: , se não dou uma procurada aqui

lazaropj

alias:
Cara, eu faria (e faço) diferente da maneira como você fez.

Nesse tipo de cenário eu costumo colocar o modal fora do datatable, e ao clicar no botao/link, eu defino uma propriedade do managed-bean que é utilizada dentro do modal, e faço o reRender, como você fez.

Dessa forma que você fez, eu certa vez fiz mais ou menos assim (nao lembro direito…). Uma vez que o seu modal tem um id e ele está dentro do datatable, repare que o div renderizado pelo RichFaces tem como id “modalDePendencias1”, “modalDePendencias2”…ou algo assim (verifique no html gerado). Você tambem pode no seu evento click fazer da seguinte forma (do jeito que está aí):

<rich:datatable value="..." var="..." rowKeyVar="xpto">
    <a4j:commandLink value="clique!" onclick="Richfaces.showModalPanel('modalpendencias' + #{xpto})"
    <rich:modalpanel id="modalpendencias">
       <!--codigo do modal aqui-->
    </rich:modalpanel>
</rich:datatable>

Particularmente prefiro a primeira abordagem, mas se desejar tente dessa segunda maneira, já que o seu modal está dentro do datatable…acho que funciona :lol: , se não dou uma procurada aqui

Agora tenho reunião… Mas quando voltar vou tentar…
Só uma duvida nessa segunda abordagem q vc postou… o nome da modal tem vai ter q ter essa concatenação né?
vai ficar <rich:modalpanel id=“modalpendencias + #{xpto}”>
é isso ?

alias

lazaropj:

Só uma duvida nessa segunda abordagem q vc postou… o nome da modal tem vai ter q ter essa concatenação né?
vai ficar <rich:modalpanel id=“modalpendencias + #{xpto}”>
é isso ?

entao, acho que a propria renderizacao da tabela vai gerar isso, pq voce colocou o modal dentro do datatable. confirme no html gerado. A idéia é que no onclick voce passe para cada link o id do modal correspondente àquela linha da tabela.

lazaropj

Cara… tentei fazer do jeito q vc falou, mas aí ele nem abriu a modal…
eu fiz assim:
No dataTable eu fiz assim:

<rich:dataTable value="#{_fiscalizacao.processoFiscalSnit.intimacaos.toArray()}" var="_intimacao"  rowKeyVar="xpto">

no botão que chama a modal ficou assim:

<a4j:commandButton oncomplete="Richfaces.showModalPanel('modalDePendencias + #{xpto}');" image="/img/ico_detalhar.gif" id="pendencias" title="Pendências" style="border:none" reRender="modalDePendencias" />

Tem algo de errado aí?

alias

verifique no HTML GERADO na pagina como está o id do div do modal. aí basta seguir o mesmo padrão na chamada do javascript (showModalPanel(…))

lazaropj

Entendi oq vc quer dizer… Mas não sei como reproduzir isso…
o html gerado da DIV é esse aqui:

<div class="rich-mp-container" id="intimacaoSearch:listaDeFiscalizacoes:0:j_id133:1:modalDePendenciasCDiv" style="position: absolute; z-index: 9; left: 523px; top: 232px; ">
alias

Putz, hehe. Bom, voltando ao que tinha dito, eu acho que a melhor abordagem seria você manter esse modal fora do datatable, e ir re-renderizando ele conforme o que fosse clicado.
É claro que o escopo do seu bean teria que sobreviver ao fim da request e tal…não sei se é o seu caso aí mas pense nisso: você vai renderizar esse modal para todas as linhas da tabela,
mas você não sabe qual linha da tabela será clicada. Então será gerado HTML que talvez não veja a ser exibido…enfim. É um jeito.

O outro é colocar o modal dentro do table o que gera essas chateações aí. Fiz um testezinho aqui pra você entender a minha sugestão.

Veja essa página:

<a4j:form prependId="false">
		<rich:dataTable id="table" value="#{teste.lista}" var="item" rowKeyVar="linha">
			<h:column>
				<h:outputText value="#{item.teste}" />
			</h:column>
			<h:column>
				<rich:dataTable id="table2" value="#{item.lista}" var="item2" rowKeyVar="linha2">
					<h:column>
						<a4j:commandLink value="Clique!" onclick="Richfaces.showModalPanel('table:#{linha}:table2:#{linha2}:modal');" />
						<rich:modalPanel id="modal" autosized="true">
							<h:outputText value="#{item.teste} e #{item2}" />
						</rich:modalPanel>
					</h:column>
				</rich:dataTable>
			</h:column>
	</rich:dataTable>
</a4j:form>

É o que você tem aí, correto? Um datatable e dentro dele outro datatable, e dentro desse segundo está o modal. Olhe como o id do modal foi renderizado:

<div id="table:0:table2:0:modal">
</div>

O que foi gerado: id_da_tabela:linha_da_tabela:id_da_segunda_tabela:linha_da_segunda_tabela:id_do_modal (eu coloquei no form lá encima o atributo prependId=false.
Por padrão o JSF concatena o id do formulário com os ids dos campos, setando esse atributo para false isso não ocorre. Se nao fosse o caso o id do modal, e dos outros elementos,
teria o id do form na frente)

Bom, aí pra exibir o modal, eu coloquei o mesmo padrão na chamada do javascript:

Richfaces.showModalPanel('table:#{linha}:table2:#{linha2}:modal');

Isso casa com esse padrão: id_da_tabela:linha_da_tabela:id_da_segunda_tabela:linha_da_segunda_tabela:id_do_modal. O atributo rowKeyVar retorna o índice corrente da iteração. E se não tivesse o prependId no form lá encima o id do form precisaria vir aqui também.

É isso. Qualquer coisa poste aí.

alias

E ai mano, resolveu o xabu?

lazaropj

Mano, tive q ir para outro projeto… =(
Depois eu continuo fazendo isso aí…
valew pela ajuda.

Criado 13 de março de 2012
Ultima resposta 16 de mar. de 2012
Respostas 11
Participantes 2