<p:autocomplete> Multiples relacionados

En algunas ocasiones necesitamos utilizar autocomplemente con selecciones múltiples que estén relacionados.

  • Usaremos el compenente <p:autocomplete> de Primefaces estableciendo multiple="true"

  • El autocomplete debemos usar evento <p:ajax> itemSelect se dispara al seleccionar un elemento

  • También usaremos el evento <p:ajax> itemUnselect, que se activara al remover un elemento del autocomplete.

  • Usaremos una base de datos mongodb

  • Implementamos ejbjmoordb

Reglas: cuando utilice autocomplete múltiples debe indicar los metodos

Ejemplo:

  • Seleccionar múltiples facultades

  • Seleccionar las carreras de las facultades seleccionadas solamente

  • Si se elimina una facultad del autocomplete, eliminar automáticamente las carreras de esa facultad que se seleccionaron en el autocomplete Carrera.

Entitys

Entity Carrera.java

public class Carrera {
    @Id
    private Integer idcarrera;
    private String descripcion;
    private String activo;
    @Referenced(documment = "Facultad",
            field = "idfacultad", javatype = "Integer", lazy = false,
            repository = "com.avbravo.commonejb.repository.FacultadRepository")
            Facultad facultad;

          @Embedded
    List<UserInfo> userInfo;

    public Carrera() {
    }
//set/get
}

Facultad.java

public class Facultad {
    @Id
    private Integer idfacultad;
    private String descripcion;
    private String activo;
      @Embedded
    List<UserInfo> userInfo;

    public Facultad() {
    }
    //set/get
  }

Código .xhtml

multiple="true"
<p:ajax event="itemSelect" listener="#{solicitudController.handleSelect}"
update=":form:content" />
<p:ajax event="itemUnselect" listener="#{solicitudController.itemUnselect}"
update=":form:content"
/>
 <p:outputLabel  value="#{msg['field.facultad']}" />
<p:autoComplete dropdown="false"
           multiple="true"
           scrollHeight="250"
           size="15"
           emptyMessage="#{app['info.nohayregistros']}"
           value="#{solicitudController.facultadList}"
           completeMethod="#{solicitudController.completeFiltradoFacultad}"
           var="p"
           required="true"
           itemLabel="#{p.descripcion}"
           itemValue="#{p}" forceSelection="true">
    <f:converter binding="#{facultadConverter}"/>
    <f:attribute name="field" value="descripcion"/>
    <f:attribute name="fielddropdown" value="false"/>
    <f:attribute name="fieldquerylenth" value="1"/>
    <p:ajax event="itemSelect" listener="#{solicitudController.handleSelect}"
            update=":form:content"     />
    <p:ajax event="itemUnselect" listener="#{solicitudController.itemUnselect}"
            update=":form:content"    />
    <f:facet name="itemtip">
        <h:panelGrid columns="1" cellpadding="5">
            <h:outputText value="#{msg['field.descripcion']} #{p.descripcion}" />


        </h:panelGrid>
    </f:facet>

</p:autoComplete>



<p:outputLabel  value="#{msg['field.carrera']}" />
<p:autoComplete dropdown="false"
        id="carrera"
        multiple="true"
        scrollHeight="250"
        size="15"
        emptyMessage="#{app['info.nohayregistros']}"
        value="#{solicitudController.carreraList}"
        completeMethod="#{solicitudController.completeFiltradoCarrera}"
        var="p"
        required="true"
        itemLabel="#{p.descripcion}"
        itemValue="#{p}" forceSelection="true">
    <f:converter binding="#{carreraConverter}"/>
    <f:attribute name="field" value="descripcion"/>
    <f:attribute name="fielddropdown" value="false"/>
    <f:attribute name="fieldquerylenth" value="1"/>
    <p:ajax event="itemSelect" listener="#{solicitudController.handleSelect}"
            update=":form:content"    />
    <p:ajax event="itemUnselect" listener="#{solicitudController.itemUnselect}"
            update=":form:content"    />
    <f:facet name="itemtip">
        <h:panelGrid columns="1" cellpadding="5">
            <h:outputText value="#{msg['field.descripcion']} #{p.descripcion}" />


        </h:panelGrid>
    </f:facet>
avbravo
</p:autoComplete>

SolicitudController.java

  • Definir los List<Entity> para las sugerencias de los autocomplete.

@Named
@ViewScoped
public class SolicitudController implements Serializable, IController {
// <editor-fold defaultstate="collapsed" desc="fields">  

    private static final long serialVersionUID = 1L;
    List<Facultad> suggestionsFacultad = new ArrayList<>();
    List<Carrera> suggestionsCarrera = new ArrayList<>();
    List<Unidad> suggestionsUnidad = new ArrayList<>();

Definir los métodos

  • ```java

    public List completeFiltradoFacultad(String query)

    public List completeFiltradoCarrera(String query)

    private List removeByNotFoundFacultad(List carreraList)

    public void itemUnselect(UnselectEvent event)

    private Boolean foundFacultad(Integer idfacultad)

    private Boolean foundCarrera(Integer idcarrera)

    private Boolean addFacultad(Facultad facultad)

    private Boolean addCarrera(Carrera carrera)

```java
// <editor-fold defaultstate="collapsed" desc="completeFiltradoFacultad(String query)">

    public List<Facultad> completeFiltradoFacultad(String query) {

        suggestionsFacultad = new ArrayList<>();
        List<Facultad> temp = new ArrayList<>();
        try {

            Boolean found = false;
            query = query.trim();
            if (query.length() < 1) {
                return suggestionsFacultad;
            }

            String field = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("field");
            temp = facultadRepository.findRegexInText(field, query, true, new Document(field, 1));
            if (facultadList == null || facultadList.isEmpty()) {

                if (!temp.isEmpty()) {
                    suggestionsFacultad = temp;
                }
            } else {

                if (!temp.isEmpty()) {
                    temp.stream().forEach(f -> addFacultad(f));
                }

            }

        } catch (Exception e) {
            JsfUtil.errorMessage("completeFiltradoFacultad() " + e.getLocalizedMessage());
        }
        return suggestionsFacultad;
    }// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="completeFiltradoCarrera(String query)">
    public List<Carrera> completeFiltradoCarrera(String query) {
        suggestionsCarrera = new ArrayList<>();
        List<Carrera> temp = new ArrayList<>();
        try {
            Boolean found = false;
            query = query.trim();
            if (query.length() < 1) {
                return suggestionsCarrera;
            }
            String field = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("field");
            temp = carreraRepository.findRegexInText(field, query, true, new Document(field, 1));
            temp = removeByNotFoundFacultad(temp);
            if (carreraList == null || carreraList.isEmpty()) {
                if (!temp.isEmpty()) {
                    suggestionsCarrera = temp;
                }
            } else {
                if (!temp.isEmpty()) {
                    temp.stream().forEach(c -> addCarrera(c));

                }
            }
        } catch (Exception e) {
            JsfUtil.errorMessage("completeFiltradoCarrera() " + e.getLocalizedMessage());
        }
        return suggestionsCarrera;
    }// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="removeByNotFoundFacultad(List<Carrera> carreraList)">
    private List<Carrera> removeByNotFoundFacultad(List<Carrera> carreraList) {
        List<Carrera> list = new ArrayList<>();
        try {
            //1.recorre las facultades
            //2.filtra las carreras de esa facultad
            //3.crea una lista
            //4. luego va agregando esa lista a la otra por cada facultad
            if (facultadList == null || facultadList.isEmpty()) {
                return list;
            }
            facultadList.forEach((f) -> {
                List<Carrera> temp = carreraList.stream()
                        .parallel()
                        .filter(p -> p.getFacultad().getIdfacultad().equals(f.getIdfacultad()))
                        .collect(Collectors.toCollection(ArrayList::new));

                temp.forEach((c) -> {
                    list.add(c);
                });
            });

        } catch (Exception e) {
            JsfUtil.errorMessage("removeByNotFoundFacultad() " + e.getLocalizedMessage());
        }
        return list;
    }
// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="itemUnselect">
    public void itemUnselect(UnselectEvent event) {
        try {
            if (carreraList != null && !carreraList.isEmpty()) {
                carreraList = removeByNotFoundFacultad(carreraList);
            }

        } catch (Exception ex) {
            JsfUtil.errorMessage("itemUnselec() " + ex.getLocalizedMessage());
        }
    }// </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="foundFacultad(Integer idfacultad)">
    private Boolean foundFacultad(Integer idfacultad) {
        Boolean _found = true;
        try {
            Facultad facultad = facultadList.stream() // Convert to steam
                    .filter(x -> x.getIdfacultad() == idfacultad) // we want "jack" only
                    .findAny() // If 'findAny' then return found
                    .orElse(null);
            if (facultad == null) {

                _found = false;
            }

        } catch (Exception e) {
            JsfUtil.errorMessage("foundFacultad() " + e.getLocalizedMessage());
        }
        return _found;
    }
    // </editor-fold>
    // <editor-fold defaultstate="collapsed" desc="foundCarrera(Integer idcarrera)">

    private Boolean foundCarrera(Integer idcarrera) {
        Boolean _found = true;
        try {
            Carrera carrera = carreraList.stream()
                    .filter(x -> x.getIdcarrera() == idcarrera)
                    .findAny()
                    .orElse(null);
            if (carrera == null) {
                _found = false;
            }
        } catch (Exception e) {
            JsfUtil.errorMessage("foundCarrera() " + e.getLocalizedMessage());
        }
        return _found;
    }
    // </editor-fold>


    // <editor-fold defaultstate="collapsed" desc="addFacultad(Facultad facultad)">
    private Boolean addFacultad(Facultad facultad) {
        try {
            if (!foundFacultad(facultad.getIdfacultad())) {
                suggestionsFacultad.add(facultad);
            }
        } catch (Exception e) {
            JsfUtil.errorMessage("addFacultad()" + e.getLocalizedMessage());
        }
        return false;
    }

    // </editor-fold>
    // <editor-fold defaultstate="collapsed" desc="addCarrera(Carrera carrera)">
    private Boolean addCarrera(Carrera carrera) {
        try {
            if (!foundCarrera(carrera.getIdcarrera())) {
                suggestionsCarrera.add(carrera);
            }
        } catch (Exception e) {
            JsfUtil.errorMessage("addCarrera()" + e.getLocalizedMessage());
        }
        return false;
    }
    // </editor-fold>

Last updated