rich:tree reRender of tree does not repopulate tree
grundor Apr 4, 2008 3:02 PMI have a page that allows a user to manipulate a tree control via a set of toolbar buttons (add top level node, add child node, delete node, etc).
The tree is properly re-drawn when I delete nodes and when I edit nodes (for example edit the node text). But I can't seem to force the tree to display newly added nodes.
I have tried using both ajax reRender on the parent panel containing the tree control, on the tree control itself, and even tried doing a redirect back to the page. A page refresh also does not force the rendering of new nodes.
But leaving the page entirely and coming back in through an external link does of course cause the tree to be correctly displayed. So the nodes are definitely there in my underlying data model.
Hoping someone can point me in right direction.
I am using latest Seam and Rich Faces 3.2.0.
Thanks to devs for latest update - fixed one problem I was having when last node in tree was deleted.
The relevant code is below.
-Mark
Here is the page:
<rich:panel id="pagetree"> <f:facet name="header">#{messages['com.leagueunited.admin.pages']}</f:facet> <h:form> <rich:toolBar id="treetb" height="26" itemSeparator="line"> <rich:toolBarGroup> <h:commandLink action="#{webPageTreeAction.addMenutab}"> <h:graphicImage styleclass="toolbarimg" value="img/newtab.png" alt="Create Tab" /> </h:commandLink> </rich:toolBarGroup> </rich:toolBar> <rich:tree switchType="client" ajaxSubmitSelection="true" reRender="treetb, pageeditor, globalMessages"> <rich:treeNodesAdaptor id="tab" nodes="#{sport.menutabs}" var="_tab"> <rich:treeNode data="#{_tab.menutabId}" nodeSelectListener="#{webPageTreeAction.processMenutabSelection}"> <h:outputText value="#{_tab.menutabCaption}" /> </rich:treeNode> <rich:recursiveTreeNodesAdaptor id="page" var="_page" roots="#{_tab.menupages}" includedRoot="#{_page.topPage}" nodes="#{_page.subMenupages}"> <rich:treeNode data="#{_page.menupageId}" nodeSelectListener="#{webPageTreeAction.processMenupageSelection}"> <h:outputText value="#{_page.menupageCaption}" /> </rich:treeNode> </rich:recursiveTreeNodesAdaptor> </rich:treeNodesAdaptor> </rich:tree> </h:form> </rich:panel>
And here is the bean:
@Name("webPageTreeAction") @Scope(ScopeType.EVENT) public class WebPageTreeActionBean { @Logger private Log log; @In @Out protected MenutabHome menutabHome; @In @Out protected MenupageHome menupageHome; @In protected SportHome sportHome; @In protected FacesMessages facesMessages; public boolean isPageSelected() { return (menupageHome.isManaged()); } public boolean isTabSelected() { return (!menupageHome.isManaged() && menutabHome.isManaged()); } public void addMenutab() { Menutab tab = new Menutab(sportHome.getInstance(), "New Tab", (byte) 0); tab.setMenutabType(MenutabType.MENUTAB_CUSTOM); menutabHome.setInstance(tab); menutabHome.persist(); } public void processMenutabSelection(NodeSelectedEvent event) { UITreeNode treeNode = (UITreeNode) event.getComponent(); Integer menutabId = (Integer) treeNode.getData(); log.info("processMenutabSelection Called!!!!!!! " + menutabId.toString()); menutabHome.setId(menutabId); menutabHome.wire(); menupageHome.clearInstance(); log.info("menutab Caption: " + menutabHome.getInstance().getMenutabCaption()); facesMessages.clear(); } public void processMenupageSelection(NodeSelectedEvent event) { UITreeNode treeNode = (UITreeNode) event.getComponent(); Integer menupageId = (Integer) treeNode.getData(); log.info("processMenupageSelection Called!!!!!!! " + menupageId.toString()); menupageHome.setId(menupageId); menutabHome.setId(menupageHome.getInstance().getMenutab().getMenutabId()); menutabHome.wire(); menupageHome.wire(); log.info("menupage Caption: " + menupageHome.getInstance().getMenupageCaption()); }