Autocomplete
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"
/>
Componentes que permiten buscar registros de una colección mediante expresiones regulares.
Se muestran ejemplos con ejbjmoordb y JPA
Son mas eficientes para la búsqueda en grandes datos
Se basan en las búsquedas mediante expresiones regulares
Un componente para generar autocomplete con atributos, se guardan en la carpeta extensions dentro de resources
<f:attribute name="field" value="#{cc.attrs.field}"/>
<f:attribute name="fielddropdown" value="#{cc.attrs.dropdown}"/>
<f:attribute name="fieldquerylenth" value="#{cc.attrs.minQueryLength}"/>
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<composite:interface >
<composite:attribute name="value" />
<composite:attribute name="itemLabel" />
<composite:attribute name="dropdown" default="false"/>
<composite:attribute name="minQueryLength" default="1"/>
<composite:attribute name="multiple" default="false" />
<composite:attribute name="update" />
<composite:attribute name="rendered"/>
<composite:attribute name="field"/>
<composite:attribute name="size" default="25"/>
<composite:attribute name="required" default="false" />
<composite:attribute name="listener"
method-signature="void handleSelect(org.primefaces.event.SelectEvent)" />
</composite:interface>
<composite:implementation>
<p:autoComplete dropdown="#{cc.attrs.dropdown}"
scrollHeight="250"
size="#{cc.attrs.size}"
multiple="#{cc.attrs.multiple}"
emptyMessage="#{app['info.nohayregistros']}"
value="#{cc.attrs.value}"
completeMethod="#{agenteController.agenteServices.complete}"
var="p"
required="#{cc.attrs.required}"
itemLabel="#{cc.attrs.itemLabel}"
itemValue="#{p}" forceSelection="true">
<f:converter binding="#{agenteConverter}"/>
<f:attribute name="field" value="#{cc.attrs.field}"/>
<f:attribute name="fielddropdown" value="#{cc.attrs.dropdown}"/>
<f:attribute name="fieldquerylenth" value="#{cc.attrs.minQueryLength}"/>
<p:ajax event="itemSelect" listener="#{cc.attrs.listener}"
update="#{cc.attrs.update}" />
<f:facet name="itemtip">
<h:panelGrid columns="1" cellpadding="5">
<h:outputText value="#{msg['field.idagente']} #{p.idagente}" />
<h:outputText value="#{msg['field.nombre']} #{p.nombre}" />
</h:panelGrid>
</f:facet>
</p:autoComplete>
</composite:implementation>
</html>
Services se verifican los atributos
public List<Agente> complete(String query) {
List<Agente> suggestions = new ArrayList<>();
try {
query = query.trim();
String field = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("field");
String fielddropdown = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("fielddropdown");
String fieldquerylenth = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("fieldquerylenth");
if (fielddropdown.equals("false")) {
if (query.length() < Integer.parseInt(fieldquerylenth)) {
return suggestions;
}
suggestions = agenteRepository.findRegex(field, query, true, new Document(field, 1));
} else {
suggestions = agenteRepository.findRegexInText(field, query, true, new Document(field, 1));
}
} catch (Exception e) {
JsfUtil.errorMessage("complete() " + e.getLocalizedMessage());
}
return suggestions;
}
Last updated
Was this helpful?