Navigation from treeTable fails if rootNodeRendered="false"
-----------------------------------------------------------
Key: TRINIDAD-1055
URL: https://issues.apache.org/jira/browse/TRINIDAD-1055
Project: MyFaces Trinidad
Issue Type: Bug
Affects Versions: 1.0.7-core
Environment: Observed with Windows XP, IE6 or Firefox 2.0.0.14, Apache
MyFaces Core 1.1.5 and Trinidad 1.0.7.
Reporter: Dirk Krummacker
I have a simple JSP page with only a commandButton and a treeTable. The
commandButton is wired to an action listener method that populates a list with
nodes and places it into page flow scope. This node list serves as the
treeTable's model. There is a column in the treeTable displaying a commandLink,
clicking on this link causes an action that is navigating to a second page. The
backing bean is in request scope.
When I use the default rootNodeRendered="true", this page works as expected:
First the treeTable is empty. Clicking the button fills it, and now I can open
and close all nodes. If I click on a commandLink in the treeTable, I am taken
to the correct page. Everything is fine.
However if I now set the treeTable's attribute rootNodeRendered="false" (and
change nothing otherwise), the commandLink navigation stops working. I still
can open/close nodes, but any click on a commandLink just causes the page to
refresh.
What is more, if I now click on "Expand all", the commandLinks suddenly start
working again, just as if this "Expand All" click
"repaired" the treetable. Also, if I specify initiallyExpanded="true" in the
JSP it works even if the root node is hidden.
There is no change in behavior if the action method is specified on the bean
instead of the row object.
----- treeTable.jsp -----
<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://myfaces.apache.org/trinidad" prefix="tr"%>
<%@ taglib uri="http://myfaces.apache.org/trinidad/html" prefix="trh"%>
<f:view>
<trh:html>
<trh:head title="TreeTable" />
<trh:body>
<tr:form>
<tr:commandButton text="Populate"
actionListener="#{treeTableBean.actionListener}"
/>
<tr:treeTable value="#{treeTableBean.treeModel}"
var="node"
rootNodeRendered="false">
<f:facet name="nodeStamp">
<tr:column sortable="true">
<f:facet name="header">
<tr:outputText
value="Name" />
</f:facet>
<tr:commandLink
text="#{node.name}" action="#{node.navigate}" />
</tr:column>
</f:facet>
</tr:treeTable>
</tr:form>
</trh:body>
</trh:html>
</f:view>
----- TreeTableBean.java -----
public class TreeTableBean {
public TreeModel getTreeModel() {
RequestContext requestContext = RequestContext.getCurrentInstance();
Map<String, Object> pageFlowScope = requestContext.getPageFlowScope();
List<Node> contents = (List<Node>) pageFlowScope.get("contents");
if (contents == null) {
contents = Collections.emptyList();
pageFlowScope.put("contents", contents);
}
return new ChildPropertyTreeModel(contents, "children");
}
public void actionListener(ActionEvent event) {
List<Node> noChildren = Collections.emptyList();
List<Node> childrenOfRoot = new ArrayList<Node>();
List<Node> childrenOfA = new ArrayList<Node>();
childrenOfA.add(new Node("aa", noChildren));
childrenOfA.add(new Node("ab", noChildren));
childrenOfA.add(new Node("ac", noChildren));
childrenOfRoot.add(new Node("a", childrenOfA));
List<Node> childrenOfB = new ArrayList<Node>();
childrenOfB.add(new Node("ba", noChildren));
childrenOfB.add(new Node("bb", noChildren));
childrenOfB.add(new Node("bc", noChildren));
childrenOfRoot.add(new Node("b", childrenOfB));
Node root = new Node("root", childrenOfRoot);
List<Node> contents = new ArrayList<Node>();
contents.add(root);
RequestContext requestContext = RequestContext.getCurrentInstance();
Map<String, Object> pageFlowScope = requestContext.getPageFlowScope();
pageFlowScope.put("contents", contents);
}
public static class Node implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private List<Node> children;
public Node(String name, List<Node> children) {
this.name = name;
this.children = children;
}
public String getName() {
return name;
}
public List<Node> getChildren() {
return children;
}
public String navigate() {
return "target";
}
}
}
----- faces-config.xml -----
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
"http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
<application>
<default-render-kit-id>org.apache.myfaces.trinidad.core</default-render-kit-id>
</application>
<managed-bean>
<managed-bean-name>treeTableBean</managed-bean-name>
<managed-bean-class>TreeTableBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<display-name>treeTable</display-name>
<from-view-id>/treeTable.jsp</from-view-id>
<navigation-case>
<from-outcome>target</from-outcome>
<to-view-id>/target.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
----- end -----
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.