Problema com rich:tree + drag'n'drop + context menu

1 resposta
caarlos0

Buenas pessoal =)

aqui no sistema da empresa, sempre tivemos uma rich:tree, com um contextmenu, que de acordo com as permissões que o usuário logado tinha no nó da tree, era renderizado diferente.

Ou seja, tinhamos a tree, um contextmenu (que recebia um rerender sempre que um novo nó era selecionado), e ainda o DnD, que possibilita mover um nó da tree para outro, entre outros..

Ok, o problema até então, era que a tree não selecionava o nó com o botão direito. Então, descobrimos o parametro rightClickSelection="true" da rich:tree, que resolveu este problema..

MAS, gerou mais alguns.

A tree é gerada dinamicamente, e montada na tela do usuario, com switch type ajax (padrão). Depois de ser adicionada essa opção, tivemos que colocar um a4j:support nos nodes da tree, para dar reRender no contextmenu antes de mostrar ele.

Beleza, após isso, o que ocorre é que dependendo das forças aleatórias do universo, as vezes ele perde o id de algum dos nós da trees, geralmente nós que possuem dependencias que são reRenderizadas ao lado.

Exemplo:

Root
-Nó um
--Nó dois (esse tem dependencias que fazem um reRender em um painel lateral)
---Nó três

Eu abro o no um, depois o dois, e o três, e quando fecho o nó dois, o RichFaces me dá um alert bem maneiro, mais ou menos assim:

drop: element with [navegador:formTree:tree:root:0:0::j_id111] ID was not found in the DOM tree. Probaly element has no client ID or client ID hasn't been written. DnD's disable. Check please!

Navegador é a página .xhtml em que está a tree, form tree é um a4j:form, tree é a tree em si, aí tem o root, nó 0, 0, VAZIO, e o j_id111.

O Engraçado, é que se eu verificar com o Firebug os nós da tree antes de voltar (fechar o nó 2), ele tem ID.

Ou seja, no oncollapse do node, ele fode com o ID.

Alguém já viu algo parecido com isso por aí?

<a4j:region id="regionTree">

		<a4j:form id="formTree" ajaxSubmit="true">
		
			<rich:tree id="tree" value="#{meuManaged.tree}" var="node"
				adviseNodeOpened="#{meuManaged.adviseNodeOpenedTreeAreas}"
				adviseNodeSelected="#{meuManaged.adviseNodeSelectedTreeAreas}"
				ajaxSubmitSelection="true" componentState="#{meuManaged.treeAreasState}"
				nodeSelectListener="#{meuManaged.selecionaNode}" nodeFace="#{node.tipo}"
				reRender="panelCaminhoPastaSelecionada, formLista" toggleOnClick="true"
				similarityGroupingId="true" requestDelay="200" rightClickSelection="true" >
				
				<rich:treeNode id="nodeRoot" type="root" icon="#{img.nodeRoot}"
					iconLeaf="#{img.nodeRoot}">
					<h:outputText id="descricaoNoRoot" value="#{node.descricao}" />
					<a4j:support event="oncontextmenu" reRender="menuRoot" oncomplete="contextMenuRoot(event)" />
					<rich:componentControl name="contextMenuRoot" for="menuRoot" operation="show" />
					<rich:dropSupport acceptedTypes="pasta"
						data="#{meuManagedo.mensagemConfirmacao}"
						dropListener="#{meuManaged.processarDropPasta}"
						dropValue="#{node.id}" 
						oncomplete="confirmarMoverPasta(data)"
						reRender="tree, panelCaminhoPastaSelecionada" />
				</rich:treeNode>

				<rich:treeNode id="nodeArea" type="area" icon="#{img.area}"
					dragType="area"
					dragValue="#{node.id}" iconLeaf="#{img.area}">
					<h:outputText id="descricaoNoArea" value="#{node.descricao}" />
					<a4j:support event="oncontextmenu" reRender="menuArea" oncomplete="contextMenuArea(event)" />
					<rich:componentControl name="contextMenuArea" for="menuArea" operation="show" />
					<rich:dropSupport acceptedTypes="area, pasta"
						data="#{meuManaged.mensagemConfirmacao}"
						dropListener="#{meuManaged.processarDropPasta}"
						dropValue="#{node.id}" oncomplete="confirmarMoverPasta(data)"
						reRender="tree, panelCaminhoPastaSelecionada" />
				</rich:treeNode>

				<rich:treeNode id="nodePasta" type="pasta" dragIndicator="indicador"
					dragType="pasta" dragValue="#{node.id}"
					icon="#{img.pasta}" iconLeaf="#{img.pasta}">
					<h:outputText id="descricaoNoPasta" value="#{node.descricao}" />
					<rich:dndParam id="dndParamNodePasta" name="label" value="#{node.descricao}" />
					<a4j:support event="oncontextmenu" reRender="menuPasta" oncomplete="contextMenuPasta(event)" />
					<rich:componentControl name="contextMenuPasta" for="menuPasta" operation="show" />
					<rich:dropSupport acceptedTypes="area, pasta, arquivo"
						data="#{meuManaged.mensagemConfirmacao}"
						dropListener="#{meuManaged.processarDropPasta}"
						dropValue="#{node.id}" oncomplete="confirmarMoverPasta(data)"
						reRender="treeAreas, panelCaminhoPastaSelecionada, listaArquivos" />
				</rich:treeNode>
			</rich:tree>
		</a4j:form>

</a4j:region>

Alguma idéia?

Obrigado desde já, abraço!

1 Resposta

caarlos0

Criado 22 de novembro de 2010
Ultima resposta 25 de nov. de 2010
Respostas 1
Participantes 1