Hi Here is what it says the renderkit javadoc for javax.faces.Table:
"... Output a "tr" element. Output the value of the "rowClasses" per the attribute description below. For each UIColumn child, if the column component has a "rowHeader" attribute with a value of "true", output a "th" element with a "scope" attribute with the value of "row". Otherwise, if the column component has no "rowHeader" attribute, or its value is false, output a "td" element. In either case attach the value of the "columnClasses" attribute of the UIData component per the attribute description below. Recursively encode each child of each UIColumn child. Close out the "td" or "th" element. When done with the row, close out the "tr" element. When done with all the rows, close out the "tbody" element. ..." I think the javadoc support the change proposed. It is clear it says "For each UIColumn child...", so "columnClasses" should only apply to UIColumn instances. Please create an issue for it. regards, Leonardo Uribe 2013/7/29 Paul Nicolucci <[email protected]>: > Hello Everyone, > > I have come across a issue which I think needs to be solved however I wanted > to get some input from the community before opening up a JIRA issue and > providing a patch. > > Sample JSF page: > > <h:outputStylesheet library="css" name="table-style.css" /> > <h:dataTable value="#{dataTableBean.sampleList}" var="o" > styleClass="order-table" > headerClass="order-table-header" > rowClasses="order-table-odd-row,order-table-even-row" > columnClasses="col0,col1,col2,col3" >> > <f:param id="testParam" value="TESTER" /> > > <h:column> > <f:facet name="header">Column1</f:facet> > #{o.str1} > </h:column> > > <h:column> > <f:facet name="header">Column2</f:facet> > #{o.str2} > </h:column> > > <h:column> > <f:facet name="header">Column3</f:facet> > #{o.str3} > </h:column> > > <h:column> > <f:facet name="header">Column4</f:facet> > #{o.str4} > </h:column> > </h:dataTable> > > Sample CSS: > .order-table{ > border-collapse:collapse; > } > > .order-table-header{ > text-align:center; > } > > .order-table-odd-row{ > text-align:center; > } > > .order-table-even-row{ > text-align:center; > } > > .col0{ > text-align:center; > } > > .col1{ > text-align:center; > } > > .col2{ > text-align:center; > } > > .col3{ > text-align:center; > } > > Problem description: > > The rendered output of one of the rows of the above page is the following: > > <tr class="order-table-odd-row"><td class="col1"> > test1 > </td><td class="col2"> > test2 > </td><td class="col3"> > test3 > </td><td class=""> > test4 > </td></tr> > > As you can see the last column has no definition of a columnClass ( class="" > ). The same page works if we remove the <f:param/> definition from within > the > <h:dataTable/>. If the f:param tag is removed then I see that all of the > columns have a defined class as expected ( the number of columns is less > than or equal to the > defined columnClasses so each of the columns should have a class defined. > From looking over the code quickly I see that the problem most likely is in > the > > HtmlTableRendererBase.encodeInnerHtml(....) method. In this method I see > the following: > > > List children = getChildren(component); > for (int j = 0, size = getChildCount(component); j < size; > j++) > { > UIComponent child = (UIComponent) children.get(j); > if (child.isRendered()) > { > boolean columnRendering = child instanceof UIColumn; > > if (columnRendering) > beforeColumn(facesContext, uiData, j); > > encodeColumnChild(facesContext, writer, uiData, > child, styles, nc * uiData.getChildCount() + j); // The first child is the > f:param and even though this is > // not a UIColumn component the next index that we pass in > // is incremented and that is the reason for the class starting at 1 > rather > // than 0 as it should. I think we need to have an additional > counter that > // only increments when a UIColumn is rendered as to keep the correct > ColumnClasses > > if (columnRendering) > afterColumn(facesContext, uiData, j); > } > } > > I just wanted to reach out and get some input on this one. If I remove the > f:parm tag then everything renders as expected with the class starting at > col0 and going to col3. > > If the community agrees I'll open up a JIRA issue and provide a patch for > this issue. > > Thanks, > > Paul Nicolucci
