[ 
https://issues.apache.org/jira/browse/MYFACES-4560?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17688597#comment-17688597
 ] 

Bernd Bohmann edited comment on MYFACES-4560 at 2/14/23 7:55 PM:
-----------------------------------------------------------------

I have a simple test to verify the wrong behavior

 

 
{code:java}
@Test
public void testSelectListAsValue()
{
    List<SelectItem> values = new ArrayList<>();

    values.add(new SelectItem("#1", "D1"));
    values.add(new SelectItem("#2", "D2"));
    values.add(new SelectItem("#3", "D3"));

    UISelectItems selectItems = new UISelectItems();
    selectItems.setValue(values);
    selectItems.getAttributes().put("var", "item");
    ValueExpression itemValue = new MockValueExpression("#{item.label}", 
Object.class);
    ValueExpression itemLabel = new MockValueExpression("#{item.value}", 
Object.class);
    ValueExpression itemDescription = new MockValueExpression("#{item.value}", 
Object.class);

    selectItems.setValueExpression("itemValue", itemValue);
    selectItems.setValueExpression("itemLabel", itemLabel);
    selectItems.setValueExpression("itemDescription", itemLabel);
    UISelectOne selectOne = new UISelectOne();
    selectOne.getChildren().add(selectItems);

    SelectItemsIterator iter = new SelectItemsIterator(selectOne, facesContext);
    List<String> options = new ArrayList<>();
    List<String> labels = new ArrayList<>();
    List<String> descriptions = new ArrayList<>();
    while (iter.hasNext())
    {
        SelectItem next = iter.next();
        options.add((String) next.getValue());
        labels.add(next.getLabel());
        descriptions.add(next.getDescription());
    }
    Assertions.assertAll(
            () -> 
Assertions.assertEquals(values.stream().map(SelectItem::getLabel).collect(Collectors.toList()),
 options),
            () -> 
Assertions.assertEquals(values.stream().map(SelectItem::getValue).collect(Collectors.toList()),
 labels),
            () -> 
Assertions.assertEquals(values.stream().map(SelectItem::getValue).collect(Collectors.toList()),
 descriptions));
}{code}
 

 


was (Author: bommel):
I have a simple test to verify the wrong behavior

 

 
{code:java}
@Test
public void testSelectListAsValue()
{
    List<SelectItem> values = new ArrayList<>();

    values.add(new SelectItem("#1", "D1"));
    values.add(new SelectItem("#2", "D2"));
    values.add(new SelectItem("#3", "D3"));

    UISelectItems selectItems = new UISelectItems();
    selectItems.setValue(values);
    selectItems.getAttributes().put("var", "item");
    ValueExpression itemValue = new MockValueExpression("#{item.label}", 
Object.class);
    ValueExpression itemLabel = new MockValueExpression("#{item.key}", 
Object.class);
    ValueExpression itemDescription = new MockValueExpression("#{item.key}", 
Object.class);

    selectItems.setValueExpression("itemValue", itemValue);
    selectItems.setValueExpression("itemLabel", itemLabel);
    selectItems.setValueExpression("itemDescription", itemLabel);
    UISelectOne selectOne = new UISelectOne();
    selectOne.getChildren().add(selectItems);

    SelectItemsIterator iter = new SelectItemsIterator(selectOne, facesContext);
    List<String> options = new ArrayList<>();
    List<String> labels = new ArrayList<>();
    List<String> descriptions = new ArrayList<>();
    while (iter.hasNext())
    {
        SelectItem next = iter.next();
        options.add((String) next.getValue());
        labels.add(next.getLabel());
        descriptions.add(next.getDescription());
    }
    Assertions.assertAll(
            () -> 
Assertions.assertEquals(values.stream().map(SelectItem::getLabel).collect(Collectors.toList()),
 options),
            () -> 
Assertions.assertEquals(values.stream().map(SelectItem::getValue).collect(Collectors.toList()),
 labels),
            () -> 
Assertions.assertEquals(values.stream().map(SelectItem::getValue).collect(Collectors.toList()),
 descriptions));
}{code}
 

 

> Faces Issue #1791 SelectItems rendering
> ---------------------------------------
>
>                 Key: MYFACES-4560
>                 URL: https://issues.apache.org/jira/browse/MYFACES-4560
>             Project: MyFaces Core
>          Issue Type: Improvement
>    Affects Versions: 2.3.10, 2.3-next-M7, 3.0.2, 4.0.0-RC4
>            Reporter: Melloware
>            Priority: Major
>
> See; [https://github.com/jakartaee/faces/issues/1791]
>  
> The component should render the itemLabel as instructed by the provided EL, 
> even if the backed data type is SelectItem. The default rendering should only 
> be done when the attribute is missing.
> Example:
> {code:java}
>         <h:form id="frmTest">
>             <p:selectOneMenu id="test1">
>                 <f:selectItems value="#{testView.items}" var="i" 
> itemValue="#{i.value}" itemLabel="#{i.value} - #{i.label}" />
>             </p:selectOneMenu>
>             <p:selectOneMenu  id="test2">
>                 <f:selectItems value="#{testView.items2}" var="i" 
> itemValue="#{i.key}" itemLabel="#{i.key} - #{i.value}" />
>             </p:selectOneMenu>
>             <p:selectOneMenu  id="test3">
>                 <f:selectItems value="#{testView.items}" />
>             </p:selectOneMenu>
>             <p:selectOneMenu  id="test4">
>                 <f:selectItems value="#{testView.items2}" />
>             </p:selectOneMenu>
>         </h:form>{code}
> The issue is `id="test1"` the user is expecting it to render 
> `itemLabel="#\{i.key} - #\{i.value}"` but it is ignored and just the 
> underlying Java SelectItem value is rendered.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to