<p:autocomplete> Multiples dropdown="true" relacionados con

Reglas:

cuando utilice autocomplete múltiples debe indicar los metodos

 <p:ajax event="itemSelect" listener="#{calendarioSolicitudController.handleSelect}"
                                update="eventDetails"
                                />
<p:ajax event="itemUnselect"  listener="#{calendarioSolicitudController.handleSelect}"
update="eventDetails"
/>

A veces necesitamos tener autocomplete con dropdown="true" que estén relacionados.

En los métodos del autocomplete verificamos que la lista que se mostrara al usuario no contemple los elementos seleccionados.

  <p:outputLabel  value="#{msg['field.facultad']}" />
                        <p:autoComplete dropdown="true"
                                        multiple="true"
                                        scrollHeight="250"
                                        size="55"
                                        emptyMessage="#{app['info.nohayregistros']}"
                                        value="#{solicitudManualDocenteController.facultadList}"
                                        completeMethod="#{solicitudManualDocenteController.completeFiltradoFacultad}"
                                        var="p"
                                        required="false"


                                        itemLabel="#{p.descripcion}"
                                        itemValue="#{p}" forceSelection="true">
                            <f:converter binding="#{facultadConverter}"/>
                            <f:attribute name="field" value="descripcion"/>
                            <f:attribute name="fromstart" value="false"/>
                            <f:attribute name="fielddropdown" value="false"/>
                            <f:attribute name="fieldquerylenth" value="0"/>
                            <p:ajax event="itemSelect" listener="#{solicitudManualDocenteController.handleSelect}"
                                    update="carrera"     />
                            <p:ajax event="itemUnselect" listener="#{solicitudManualDocenteController.itemUnselect}"
                                    update="carrera"
                                    />
                            <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="true"
                                        id="carrera"
                                        multiple="true"
                                        scrollHeight="250"
                                        size="55"
                                        emptyMessage="#{app['info.nohayregistros']}"
                                        value="#{solicitudManualDocenteController.carreraList}"
                                        completeMethod="#{solicitudManualDocenteController.completeFiltradoCarrera}"
                                        var="p"
                                        required="false"
                                        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="0"/>
                            <p:ajax event="itemSelect" listener="#{solicitudManualDocenteController.handleSelect}"
                                    update=":form:content"
                                    />
                            <p:ajax event="itemUnselect" listener="#{solicitudManualDocenteController.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>

Controller

  public List<Facultad> completeFiltradoFacultad(String query) {

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

            Boolean found = false;
            query = query.trim();

            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>

Otro método

 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;
    }

Método

  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;
    }

Last updated