View Source

h2. Overview
_Since 3.3_

The ace:selectMenu component is an advanced selection component that behaves similarly to the {{<select>}} HTML element and provides a number of additional advantages like ajax support, ARIA support, label positions, Themeroller support and more flexibility in rendering the list. Option items are defined either by {{<f:selectItem>}} and {{<f:selectItems>}} tags or by using a custom facet to define a custom way of rendering the options, which can contain graphics and additional text, while separating that from the actual value of the option item.

{tip}See the ICEfaces Showcase [Live Demo|http://icefaces-showcase.icesoft.org/showcase.jsf?grp=aceMenu&exp=selectMenuBean] of this component, complete with source code.{tip}


h2. Getting Started

In its simplest form, an ace:selectMenu component only requires to have some options defined and to bind its value to a property in a backing bean.
{panel}
{code:xml|borderStyle=dashed}
<ace:selectMenu value="#{bean.category}">
<f:selectItem itemValue="a" itemLabel="Category A" />
<f:selectItem itemValue="b" itemLabel="Category B" />
<f:selectItem itemValue="c" itemLabel="Category C" />
<ace:ajax />
</ace:selectMenu>
{code}
{panel}

It is also possible to define how the list is to be rendered and to include arbitrary components in it. In order to do this, the {{listValue}}, {{listVar}} and {{itemValue}} attributes must be defined, as well as a facet named 'row', which will define the way the list is rendered.
{panel}
{code:xml|borderStyle=dashed}
<ace:selectMenu value="#{bean.color}" listValue="#{bean.colors}" listVar="color" itemValue="#{color.hexValue}">
<f:facet name="row">
<h:graphicImage value="#{color.imgPath}" />
<h:outputText value="#{color.name}" />
</f:facet>
<ace:ajax />
</ace:selectMenu>
{code}
{panel}

{tip}*ace:comboBox vs. ace:selectMenu.* The main difference between the ace:comboBox and the ace:selectMenu components is the autocomplete functionality of ace:comboBox. Use ace:selectMenu when the set of possible inputs is small and well-defined. Use ace:comboBox when you don't want to restrict the user from entering arbitrary input, but you still want to provide or suggest some common or expected pre-defined values for quickly selecting them.{tip}

{tip}*ace:selectMenu vs. ace:simpleSelectOneMenu.* The ace:selectMenu and the ace:simpleSelectOneMenu components have the exact same use cases. The main difference is that ace:simpleSelectOneMenu uses the native <select> input of the browser, while the ace:selectMenu component builds the menu using divs, spans, and more advanced styling and javascript, so it has a more consistent look and behaviour across browsers. Therefore, ace:simpleSelectOneMenu is lighter and could be better suited for big tables or iterative containers that need to render hundreds or thousands of menus in the same page. It was introduced to be used in place of h:selectOneMenu, because the rendering technique of the latter is not compatible with the delta submit functionality.{tip}

{tip}*Topmost option item not selected by default.* Another key difference between ace:selectMenu and ace:simpleSelectOneMenu (and h:selectOneMenu) is that ace:selectMenu doesn't select its topmost option item automatically upon loading. Because of this, ace:selectMenu can trigger validation errors if the form is submitted without the user having interacted with the component, whether 'required' is true or not. This is so because ace:selectMenu has the same validation logic as the other components, in which the submitted value has to match one of the f:selectItem options provided. If this behaviour is not desired, it can be avoided by simply adding an f:selectItem with an empty string value (<f:selectItem itemValue="" itemLabel="" />) as a child of the component. This can be done in addition to any other f:selectItem or f:selectItems tags already inside the component. Alternatively, the application could preselect one of the valid option values as a default value.{tip}

h2. Attributes

{tip:title=TagLib Documentation}This section covers attributes involved in the typical use-cases for this component. For reference, the complete taglib documentation for this component is available [here|http://www.icefaces.org/docs/v4_latest/ace/tld/ace/selectMenu.html].{tip}

{panel}
The {{value}} specifies a bean property to which the value of this component is bound to.
{panel}

{panel}
The {{listVar}} attribute specifies a variable name to use for referencing each data object in the list when the rendering is done via a facet.
{panel}

{panel}
The {{listValue}} attribute specifies the list of data objects that contains all possible options when the rendering is done via a facet.
{panel}

{panel}
The {{itemValue}} attribute is a ValueExpression that specifies the property of the data object to use as the value of the item for this component if it gets selected. This only applies when listvar is used and the rendering is done by means of a facet.
{panel}

h2. Client Behavior Events

| valueChange | Fired when the value of the menu changes. |
| blur | Fired when the menu loses focus. |

h2. JavaScript APIs

h4. ICEfaces 3.x

The client side component object is exposed through the global variable name specified in the *widgetVar* attribute.

h4. ICEfaces 4+

The "widgetVar" attribute on the ACE components has been removed in ICEfaces 4 and in its place a new "ice.ace.instance()" client JavaScript object lookup API has been introduced. The reason for this change is to enable lazy-initialization of the ACE component JavaScript objects to improve runtime performance and reduce browser memory use.

{code}var widget = ice.ace.instance('frm:componentId);{code}

{tip}The _ice.ace.instance_ function requires the _full_ client id of the component to be specified, such as "j_idt77:componentId" instead of just "componentId". To reduce the complexity of working with complete IDs with this function it may be preferable in some cases to use {{prependId="false"}} in the enclosing form (e.g. _<h:form prependId="false">_).{tip}

{info}This component doesn't have a client-side API made specifically to be used by application developers. However, the component's internal methods and variables can be accessed in this way, including the underlying jQuery object and objects from underlying Javascript libraries (if applicable), and can be used for whatever purpose a developer might have in mind.
{info}

h2. Keyboard and ARIA Support

Full ARIA support. Arrow keys supported to navigate options up and down. Keyboard acceleration supported (after typing a character the first item that starts with such character is highlighted).

The following ARIA roles are supported: select, option.

h2. Facet Rendering

It is possible to customize the way in which the option items are displayed by means of the 'row' facet. You can add any arbitrary content, and if some of that content is only there for presentation purposes and is not part of the value string, you can use the {{ui-selectmenu-item-ignore}} CSS class to ignore that text. In the example below, a color box is created with CSS, and an underscore character is used only to give some width to the box; since this character is not part of the value string, we add the {{ui-selectmenu-item-ignore}} CSS class to it.

{code:xml|borderStyle=dashed}
<ace:selectMenu id="selectTextColor" value="#{selectMenuFacetBean.textColor}" listVar="color" listValue="#{selectMenuFacetBean.textColors}" itemValue="#{color.hexValue}" label="Select text color: " labelPosition="top">
<f:facet name="row">
<h:panelGrid columns="3" width="100%" columnClasses="col50,col25,col25">
<h:outputText value="#{color.name}" />
<h:outputText value="" />
<!-- color box -->
<h:outputText value="_" style="display:inline-block;width:20px;color:#{color.hexValue};background-color:#{color.hexValue};border:1px #000 solid;" styleClass="ui-selectmenu-item-ignore"/>
</h:panelGrid>
</f:facet>
<ace:ajax execute="@this" render="@all" />
</ace:selectMenu>
{code}

h2. Labels

This component supports built-in labels. The text specified in the {{label}} attribute will be rendered next to the main input field of this component. The position specified by {{labelPosition}} will determine where this label is going to be rendered; the possible values are left, right, top, bottom, none and inField (to render the label in the field itself).

h2. Required Indicator

The {{requiredIndicator}} attribute specifies the text to be displayed next to the main input field when this component is marked as {{required}}. When, this component is not marked as {{required}}, then the text specified in the {{optionalIndicator}} is going to be rendered. The {{indicatorPosition}} attribute determines where this indicator text is going to the rendered; the possible values are left, right, top, bottom, labelLeft, labelRight, and none.

h2. Required Styling

Then this component is marked as {{required}}, the main input field receives the CSS class {{ui-state-required}}, otherwise, it receives the CSS class {{ui-state-optional}}. When this component is marked as invalid by the app, it will be rendered with the CSS class {{ui-state-error}}. These CSS classes can be used to add custom styling to this component, in order indicate its current state in a more visual way.

h2. CSS Classes

The following markup represents the basic HTML structure of the component and the CSS classes it uses.

{code:xml}
<!-- Root container -->
<div class="ui-selectmenu ui-widget [user defined classes]">
<!-- Value area -->
<a class="ui-widget-content ui-corner-all ui-selectmenu-value ">
<!-- Selected value display area -->
<span class="ui-inputfield ui-widget-content ui-corner-left ui-state-optional" style="[user defined styles]"></span>
<!-- Down arrow button -->
<div class="ui-state-default ui-corner-right ui-selectmenu-button">
<div></div>
<div class="ui-icon ui-icon-triangle-1-s"></div>
</div>
</a>
<!-- List of options -->
<div class="ui-selectmenu-list">
<div>
<div class="ui-widget-content">
<!-- Option label, visible to user -->
<span class="ui-selectmenu-item-label">Option label</span>
<!-- Actual option value (hidden) -->
<span class="ui-selectmenu-item-value">Option value</span>
</div>
</div>
</div>
</div>
{code}

Additionally, the {{ui-selectmenu-item-ignore}} class name can be added when using the component in facet mode to components and elements that are rendered for display purposes but that are not part of the value that is submitted to the server.

h2. Known Issues

None.