<p:autocomplete Usuarios por multiples Roles
Previous<p:autocomplete> Multiples relacionadosNext<p:autocomplete> Multiples dropdown="true" relacionados con
Last updated
Was this helpful?
Last updated
Was this helpful?
A veces necesitamos mostrar los usuarios en autocomplete basados en el rol que poseen.
Por ejemplo un autocomplete para los usuarios que tiene el rol de ENCARGADOBODEGA
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"
/>
<?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="disabled" default="false" />
<composite:attribute name="multiple" default="false" />
<composite:attribute name="dropdown" default="false"/>
<composite:attribute name="minQueryLength" default="1"/>
<composite:attribute name="rolValue" />
<composite:attribute name="itemLabel" />
<composite:attribute name="update" />
<composite:attribute name="rendered"/>
<composite:attribute name="required" default="false" />
<composite:attribute name="field"/>
<composite:attribute name="fromstart" default="true"/>
<composite:attribute name="size" default="25"/>
<composite:attribute name="listener"
method-signature="void handleSelect(org.primefaces.event.SelectEvent)" />
</composite:interface>
<composite:implementation>
<p:autoComplete dropdown="#{cc.attrs.dropdown}"
disabled="#{cc.attrs.disabled}"
scrollHeight="250"
size="#{cc.attrs.size}"
multiple="#{cc.attrs.multiple}"
emptyMessage="#{app['info.nohayregistros']}"
value="#{cc.attrs.value}"
completeMethod="#{usuarioController.usuarioServices.completeByRol}"
var="p"
required="#{cc.attrs.required}"
itemLabel="#{cc.attrs.itemLabel}"
itemValue="#{p}"
forceSelection="true">
<f:converter binding="#{usuarioConverter}"/>
<f:attribute name="field" value="#{cc.attrs.field}"/>
<f:attribute name="rolValue" value="#{cc.attrs.rolValue}"/>
<f:attribute name="fromstart" value="#{cc.attrs.fromstart}"/>
<f:attribute name="fielddropdown" value="#{cc.attrs.dropdown}"/>
<f:attribute name="fieldminquerylength" 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.username']} #{p.username}" />
<h:outputText value="#{msg['field.nombre']} #{p.nombre}" />
<h:outputText value="#{msg['field.apellido']} #{p.apellido}" />
</h:panelGrid>
</f:facet>
</p:autoComplete>
</composite:implementation>
</html>
Indicamos el parametro rolValue con el valor del idrol que deseamos filtrar
De esta manera usamos el mismo componente para todos los roles.
<p:outputLabel value="#{msg['field.encargadobodega']}"/>
<e:autocompleteusuario_rol listener="#{orden.handleSelect}"
value="#{ordenController.encargadobodeda}"
itemLabel=" #{p.nombre}#{p.apellido}"
rolValue="ENCARGADOBODEGA"
field="nombre"
dropdown="true"
required="true"
fromstart="true"
minQueryLength="0"
size="45"
/>
Creamos el método completeByRol() que filtrara por cada rol
Obtenemos el parámetro del atributo rolValue del componente
// <editor-fold defaultstate="collapsed" desc="completeEncargadobodega(String query))">
public List<Usuario> completeByRol(String query) {
List<Usuario> suggestions = new ArrayList<>();
try {
query = query.trim();
String rol = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("rolValue");
List<Usuario> list = new ArrayList<>();
list = repository.complete(query);
if (!list.isEmpty()) {
suggestions = filtrarPorRol(list, rol);
}
} catch (Exception e) {
JsfUtil.errorMessage("completeByRol() " + e.getLocalizedMessage());
}
return suggestions;
}
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="filtrarPorRol(List<Usuario> list, String idrol)">
private List<Usuario> filtrarPorRol(List<Usuario> list, String idrol) {
List<Usuario> suggestions = new ArrayList<>();
try {
Boolean found = false;
if (!list.isEmpty()) {
for (Usuario u : list) {
found = false;
for (Rol r : u.getRol()) {
if (r.getIdrol().equals(idrol)) {
found = true;
break;
}
}
if (found) {
suggestions.add(u);
}
}
}
} catch (Exception e) {
JsfUtil.errorMessage("filtrarPorRol() " + e.getLocalizedMessage());
}
return suggestions;
}
// </editor-fold>
Imaginemos que tenemos una lista de rol