<p:autocomplete> Multiples dropdown="true" relacionados con
Last updated
Was this helpful?
Last updated
Was this helpful?
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>
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;
}