I am trying to use selectOneRadio with layout="custom" with p:dataGrid twice on page as shown in the following source code:
Code: Select all
<p:selectOneRadio id="select1" value="#{testModel.selectedText1}" layout="custom" >
<f:selectItems value="#{testModel.texts1}" />
</p:selectOneRadio>
<p:dataGrid value="#{testModel.texts1}" columns="4" rowIndexVar="index" var="insuranceVar">
<h:outputText value="#{insuranceVar}"/>
<p:radioButton for="testForm:select1" itemIndex="#{index}"/>
<h:outputText value="#{insuranceVar}"/>
<h:outputText value="#{index}"/>
</p:dataGrid>
<p:selectOneRadio id="select2" value="#{testModel.selectedText2}" layout="custom">
<f:selectItems value="#{testModel.texts2}" />
</p:selectOneRadio>
<p:dataGrid value="#{testModel.texts2}" columns="4" rowIndexVar="index" var="insuranceVar">
<h:outputText value="#{insuranceVar}"/>
<p:radioButton for="testForm:select2" itemIndex="#{index}"/>
<h:outputText value="#{insuranceVar}"/>
<h:outputText value="#{index}"/>
</p:dataGrid>
(CLASSIC S, CLASSIC FAMILY S, EXTRA S, EXTRA FAMILY S)
(CLASSIC L, CLASSIC FAMILY L, EXTRA L, EXTRA FAMILY L)
The problem is, that in generated HTML the data-itemindex of hidden input is always "0" for the radios in second datagrid (see below). Interesting thing is, that the #{insuranceVar} is resolved in second datagrid only before the p:radioButton, as you can see on screenshot (see below).
HTML output:
Code: Select all
HTML from first datagrid:
<div id="testForm:j_idt145" class="ui-datagrid ui-widget">
<div id="testForm:j_idt145_content" class="ui-datagrid-content ui-widget-content">
<table class="ui-datagrid-data">
<tbody>
<tr class="ui-datagrid-row">
<td class="ui-datagrid-column">CLASSIC S
<div id="testForm:j_idt145:0:j_idt151" class="ui-radiobutton ui-widget">
<div class="ui-helper-hidden-accessible">
<input id="testForm:select1:0_clone" name="testForm:select1" type="radio" class="ui-radio-clone" data-itemindex="0" value=""></div>
<div class="ui-radiobutton-box ui-widget ui-corner-all ui-state-default">
<span class="ui-radiobutton-icon ui-icon ui-icon-blank ui-c"></span>
</div>
</div>CLASSIC S, iteration 0</td>
<td class="ui-datagrid-column">CLASSIC FAMILY S
<div id="testForm:j_idt145:1:j_idt151" class="ui-radiobutton ui-widget">
<div class="ui-helper-hidden-accessible">
<input id="testForm:select1:1_clone" name="testForm:select1" type="radio" class="ui-radio-clone" data-itemindex="1" value=""></div>
<div class="ui-radiobutton-box ui-widget ui-corner-all ui-state-default">
<span class="ui-radiobutton-icon ui-icon ui-icon-blank ui-c"></span>
</div>
</div>CLASSIC FAMILY S, iteration 1</td>
<td class="ui-datagrid-column">EXTRA S
<div id="testForm:j_idt145:2:j_idt151" class="ui-radiobutton ui-widget">
<div class="ui-helper-hidden-accessible">
<input id="testForm:select1:2_clone" name="testForm:select1" type="radio" class="ui-radio-clone" data-itemindex="2" value=""></div>
<div class="ui-radiobutton-box ui-widget ui-corner-all ui-state-default">
<span class="ui-radiobutton-icon ui-icon ui-icon-blank ui-c"></span>
</div>
</div>EXTRA S, iteration 2</td>
<td class="ui-datagrid-column">EXTRA FAMILY S
<div id="testForm:j_idt145:3:j_idt151" class="ui-radiobutton ui-widget">
<div class="ui-helper-hidden-accessible">
<input id="testForm:select1:3_clone" name="testForm:select1" type="radio" class="ui-radio-clone" data-itemindex="3" value=""></div>
<div class="ui-radiobutton-box ui-widget ui-corner-all ui-state-default">
<span class="ui-radiobutton-icon ui-icon ui-icon-blank ui-c"></span>
</div>
</div>EXTRA FAMILY S, iteration 3</td>
</tr>
</tbody>
</table>
</div>
</div>
HTML from second datagrid:
<div id="testForm:j_idt230" class="ui-datagrid ui-widget">
<div id="testForm:j_idt230_content" class="ui-datagrid-content ui-widget-content">
<table class="ui-datagrid-data">
<tbody>
<tr class="ui-datagrid-row">
<td class="ui-datagrid-column">CLASSIC L
<div id="testForm:j_idt230:0:j_idt300" class="ui-radiobutton ui-widget">
<div class="ui-helper-hidden-accessible">
<input id="testForm:select2:0_clone" name="testForm:select2" type="radio" class="ui-radio-clone" data-itemindex="0" value=""></div>
<div class="ui-radiobutton-box ui-widget ui-corner-all ui-state-default">
<span class="ui-radiobutton-icon ui-icon ui-icon-blank ui-c"></span>
</div>
</div>, iteration</td>
<td class="ui-datagrid-column">CLASSIC FAMILY L
<div id="testForm:j_idt230:1:j_idt300" class="ui-radiobutton ui-widget">
<div class="ui-helper-hidden-accessible">
<input id="testForm:select2:1_clone" name="testForm:select2" type="radio" class="ui-radio-clone" data-itemindex="0" value=""></div>
<div class="ui-radiobutton-box ui-widget ui-corner-all ui-state-default">
<span class="ui-radiobutton-icon ui-icon ui-icon-blank ui-c"></span>
</div>
</div>, iteration</td>
<td class="ui-datagrid-column">EXTRA L
<div id="testForm:j_idt230:2:j_idt300" class="ui-radiobutton ui-widget">
<div class="ui-helper-hidden-accessible">
<input id="testForm:select2:2_clone" name="testForm:select2" type="radio" class="ui-radio-clone" data-itemindex="0" value=""></div>
<div class="ui-radiobutton-box ui-widget ui-corner-all ui-state-default">
<span class="ui-radiobutton-icon ui-icon ui-icon-blank ui-c"></span>
</div>
</div>, iteration</td>
<td class="ui-datagrid-column">EXTRA FAMILY L
<div id="testForm:j_idt230:3:j_idt300" class="ui-radiobutton ui-widget">
<div class="ui-helper-hidden-accessible">
<input id="testForm:select2:3_clone" name="testForm:select2" type="radio" class="ui-radio-clone" data-itemindex="0" value=""></div>
<div class="ui-radiobutton-box ui-widget ui-corner-all ui-state-default">
<span class="ui-radiobutton-icon ui-icon ui-icon-blank ui-c"></span>
</div>
</div>, iteration</td>
</tr>
</tbody>
</table>
</div>
</div>
When I refactor this code to use ui:repeat, it works:
Code: Select all
<p:selectOneRadio id="select1" value="#{testModel.selectedText1}" layout="custom" >
<f:selectItems value="#{testModel.texts1}" />
</p:selectOneRadio>
<ui:repeat var="insuranceVar" value="#{testModel.texts1}" varStatus="status">
<p:panel>
<h:outputText value="#{insuranceVar}"/>
<p:radioButton for="testForm:select1" itemIndex="#{status.index}"/>
<h:outputText value="#{insuranceVar}"/>
<h:outputText value=", iteration #{status.index}"/>
</p:panel>
</ui:repeat>
<p:selectOneRadio id="select2" value="#{testModel.selectedText2}" layout="custom">
<f:selectItems value="#{testModel.texts2}" />
</p:selectOneRadio>
<ui:repeat var="insuranceVar" value="#{testModel.texts2}" varStatus="status">
<p:panel>
<h:outputText value="#{insuranceVar}"/>
<p:radioButton for="testForm:select2" itemIndex="#{status.index}"/>
<h:outputText value="#{insuranceVar}"/>
<h:outputText value=", iteration #{status.index}"/>
</p:panel>
</ui:repeat>
Observations:
- I tried also p:dataTable and h:datatable with a same result as with p:dataGrid (not working properly)
- When i comment out the p:radioButton inside dataGrid, then the second <h:outputText value="#{insuranceVar}"/> prints value as well as <h:outputText value=", iteration #{status.index}"/> :
- When I change rowIndexVar and insuranceVar identifiers to be unique, it starts working (I cannot do this in real world - the p:selectOneRadio with p:dataGrid is supposed to be included via ui:include multiple times in the page)
Thank in advance you for your time!
Martin
Primefaces version: 6.1.2 (tested with 6.2-SNAPSHOT too)
JSF version: Mojarra 2.2.13
Server: Tomcat v8