Autocomplete con findRegex() Expresiones Regulares

Services

import com.avbravo.ejbspard.repository.PaisRepository;
import com.avbravo.avbravoutils.JsfUtil;
import com.avbravo.ejbspard.entity.*;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import org.bson.Document;

/**
 *
 * @authoravbravo
 */
@Stateless
public class PaisServices {

    @Inject
    PaisRepository paisRepository;

    public List<Pais> complete(String query) {
        List<Pais> suggestions = new ArrayList<>();
           try {
               String field = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("field");               
               query = query.trim();
               if (query.length() < 1) {
                   return suggestions;
               }   
               suggestions=  paisRepository.findRegex(field, query,true,new Document(field,1));

           } catch (Exception e) {
                    JsfUtil.errorMessage("complete() " + e.getLocalizedMessage());
           }
           return suggestions;
    }

}

En el Controller

Inyectar el Services, agregar el handleSelect(SelectEvent event).

 @Inject
    PaisServices paisServices;

    Pais paisSelected;




     public PaisServices getPaisServices() {
        return paisServices;
    }

    public void setPaisServices(PaisServices paisServices) {
        this.paisServices = paisServices;
    }

     public Pais getPaisSelected() {
        return paisSelected;
    }

    public void setPaisSelected(Pais paisSelected) {
        this.paisSelected = paisSelected;
    }




     public void handleSelect(SelectEvent event) {
        try {
            paisList.removeAll(paisList);
            paisList.add(paisSelected);
            paisFiltered = paisList;
            paisDataModel = new PaisDataModel(paisList);
        } catch (Exception ex) {
            JsfUtil.errorMessage("handleSelect() " + ex.getLocalizedMessage());
        }
    }}

En la página xhtml

Pasamos el parametro field con el nombre del atributo del entity por el que deseamos buscar

  <f:attribute name="field" value="idpais" />
 <p:outputLabel value="#{app['info.by']} #{msg['field.idpais']}"/>
 <p:autoComplete  scrollHeight="250"   dropdown="false"   
                  emptyMessage="#{app['info.nohayregistros']}"                                                 
                  value="#{paisController.paisSelected}"  
                  completeMethod="#{paisController.paisServices.complete}"  
                  var="p"
                 itemLabel="#{p.idpais} "
                 itemValue="#{p}" forceSelection="true"> 
                 <f:converter binding="#{paisConverter}"/>
                 <f:attribute name="field" value="idpais" />

                            <f:attribute name="fielddropdown" value="false"/>
                            <f:attribute name="fieldquerylenth" value="1"/>
                 <p:ajax event="itemSelect" listener="#{paisController.handleSelect}"
                  update=" :form:msgs,:form:dataTable" />  
                       <f:facet name="itemtip">
                                        <h:panelGrid columns="1" cellpadding="5">
                                            <h:outputText value="#{msg['field.idpais']} #{p.idpais}" />
                                            <h:outputText value="#{msg['field.pais']} #{p.pais}" />
                                        </h:panelGrid>
                                    </f:facet>
                                </p:autoComplete> <p:outputLabel value="#{app['info.by']} #{msg['field.idpais']}"/>
                                <p:autoComplete  scrollHeight="250"   dropdown="false"   
                                                 emptyMessage="#{app['info.nohayregistros']}"                                                 
                                                 value="#{paisController.paisSelected}"  
                                                 completeMethod="#{paisController.paisServices.complete}"  
                                                 var="p"
                                                 itemLabel="#{p.idpais} "
                                                 itemValue="#{p}" forceSelection="true"> 
                                    <f:converter binding="#{paisConverter}"/>
                                       <f:attribute name="field" value="idpais" />

                                    <p:ajax event="itemSelect" listener="#{paisController.handleSelect}"
                                            update=" :form:msgs,:form:dataTable" />  
                                    <f:facet name="itemtip">
                                        <h:panelGrid columns="1" cellpadding="5">
                                            <h:outputText value="#{msg['field.idpais']} #{p.idpais}" />
                                            <h:outputText value="#{msg['field.pais']} #{p.pais}" />
                                        </h:panelGrid>
                                    </f:facet>
                                </p:autoComplete>

Resultado

Last updated