3 Replies Latest reply on Feb 3, 2014 4:13 PM by Brian Leathem

    rich:autocomplete issues

    ATUL JOSHI Newbie

      We are upgrading from jsf 1.2 to jsf 2.

      We are using apache myfaces 2.1 and rich faces 4.3.

       

      We are facing very strange issue with  <rich:autocomplete>. Below is the xhtml code.

       

       

            <rich:autocomplete mode="cachedAjax" minChars="2" autocompleteMethod="#{bean.getData}"
                              var="result" value="#{bean.inputData}">
                                          <h:column>
                                          <h:outputText value="#{result}" />
                                      </h:column>
            </rich:autocomple
      te>
      The above autoComplete component gets included through ui include tag as below
      <ui:include src="panel1.xhtml">
          <ui:param name="bean" value="#{userBean}"/>
      </ui:include>
      

       

      Following is the scenario , when an input is entered in an autocomplete input box , suggetions are shown - that is bean.getData method is called.

      Surprisingly , after any of the suggestion is selected , bean.getData method is called again with chosen option value , which I believe is not the correct behaviour

      since user has selected an option and not typed any input.

       

      I don't want the bean.getData method to be called again. Is there any alternative ?

      In addition to above issue , it seems that there is no "nothing label" attribute for rich:autocomplete which was present for rich:suggestionBox which comes into picture when there is no result found.

      This issue alongwith above issue is really making a difficult job to get this component working same as rich:suggestionBox

       

      I understand that once prefix for search is changed , suggestions are evaluated again ,but here i am not changing the prefix but selecting the entire suggestion value.

      Following is the detailed code for the issue

       

      When autoCompleted method is called , it populates a hashMap with all the suggestions with CustomUserObject as the value.

      Below is the code for this :

       

      public List<String> getData(FacesContext context, UIComponent component, String input) {
      
              Map<String, CustomUserObject> userMap = new HashMap<String, CustomUserObject>();
              //get users from db
             List<CustomUserObject> users = bean.fetchUserList(input);
      
          //put users in map
              for (CustomUserObject user : users) {
                  userMap.put(user.id, user) ;
              }
      
              List<String> userList = new ArrayList<String>();
      
              //convert the list to List<String>
              if(userList != null && !userList.isEmpty()){
      
                  //convert the List<CustomUserObject> to List<String>
              }
              return userList;
      
      
      
      
      

          }

       

      Now because of the issue mentioned in the question , getData is called again and corrupts userMap.

      This map is used to retrieve correct CustomUserObject by comparing it with selected Suggestion like below :

       

        if(userMap != null && !userMap.isEmpty()){
                      for(CustomUserObject user : userMap.values()){
                   
                   
                          if(selectedSuggestion != null && selectedSuggestion.equals(user.name)){
                              //match is found
                          //set variables to update ui at re-render
      
                          }
                          //no match found
                      //set variables to update ui at re-render
            
                      }
                  }