2 Replies Latest reply on Nov 15, 2012 5:44 PM by fericit.bostan

    h:selectManyCheckbox inside rich:popupPanel not performing assignments

    fericit.bostan

      I'm attempting to use the h:selectManyCheckbox to assign a limited number of objects to a parent object.  ( User -> Items) I'm able to get the popupPanel to render correctly and display the current assigned values as selected. The problem is that when I select additional items they do not get assigned to the parent object prior to the invocation of the save action.

       

      I have a converter defined but it never gets invoked. I've also defined a valueChangeListener on the selectManyCheckbox but no values get passed in. The result is an empty array.

       

      
              <rich:popupPanel id="user-items" modal="true" autosized="true" resizeable="false" zindex="1002"
                  styleClass="ui-dialog ui-widget ui-widget-content ui-corner-all ui-draggable" moveable="true">
                  <f:facet name="header">
                      <h:outputText value="#{msg['usermgmt.label.edit.user.items']}" />
                  </f:facet>
                  <f:facet name="controls">
                      <h:outputLink value="#" onclick="#{rich:component('user-items')}.hide(); return false;">
                          X
                      </h:outputLink>
                  </f:facet>
      
                  <a4j:region id="items-edit" styleClass="region">
                      <h:panelGroup styleClass="region">
                          <h2>
                              <h:outputFormat id="user-items-title" value="#{msg['usermgmt.edit.user.items.title']}">
                                  <f:param value="#{userListController.selectedUser.name}"></f:param>
                              </h:outputFormat>
                          </h2>
                          <richext:spacer height="10" />
      
                          <h:panelGroup layout="block" styleClass="items">
                              <h:selectManyCheckbox id="user-items-checkbox" value="#{userListController.selectedItems}"
                                  converter="#{itemsConverter}" valueChangeListener="#{userListController.processValueChange}" >
                                  <f:selectItems value="#{userListController.items}" />
                              </h:selectManyCheckbox>
                          </h:panelGroup>
      
                          <richext:spacer height="20" />
      
                          <h:panelGroup layout="block" styleClass="actions">
                              <h:panelGroup layout="block" styleClass="button">
                                  <a4j:commandButton value="#{msg['user.label.update']}" execute="@region"
                                      onclick="saveItems(); return false;" />
                              </h:panelGroup>
                              <h:panelGroup layout="block" styleClass="button">
                                  <a4j:commandButton value="#{msg['delete.cancel']}"
                                      onclick="#{rich:component('user-items')}.hide(); return false;" />
                              </h:panelGroup>
                          </h:panelGroup>
                      </h:panelGroup>
                  </a4j:region>
              </rich:popupPanel>
      
              <a4j:jsFunction name="saveItems" action="#{userListController.saveItems}" render="userTable" execute="@form"
                  oncomplete="#{rich:component('user-items')}.hide();" />
      
      

       

      The entire page is composed inside of a single <h:form> element, including the popupPanel.

       

      The user is correctly assigned when the Edit Items button is selected. The backing bean is invoked and the selected user is assigned correctly.

       

       

                          <rich:column rendered="#{request.isUserInRole('ROLE_ADMIN')}">
                              <a4j:region>
                                  <a4j:commandButton styleClass="item-button" value="#{msg['usermgmt.label.edit.items']}"
                                      action="#{userListController.setSelectedUser(currentUser)}"
                                      oncomplete="#{rich:component('user-items')}.show();"
                                      render="user-items-title user=item-checkbox" />
                              </a4j:region>
                          </rich:column>
      
      
      

       

      My backing bean has the following defined:

       

       

      @ManagedBean
      @ViewScoped
      public class UserListController implements Serializable, ValueChangeListener {
      
      
          private User selectedUser;
         
          private List<Market> selectedItems;
      
      
          private List<SelectItem> items;
      
      
          
           @PostConstruct
           private void postConstruct() {
              items = new ArrayList<SelectItem>();
              
              for (Item item : getItemService().findAll()) {
                  items.add(new SelectItem(item, item.getName()));
              }
          }
      
      
      
      

       

       

      So what am I missing? Why isn't my itemConverter invoked and the assignment performed? I've spent a good amount of time trying to figure this out to no avail, so any help you can provide is greatly appreciated.

       

      Thanks in advance...