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?