<p:autocomplete> Usuarios por multiples Roles
Aveces necesitamos mostrar los usuarios en autocomplete basados en el rol que poseen.
Aveces 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
Creamos un componente
<?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>
Para usarlo en el formulario
- Indicamos el parametro rolValue con el valor del idrol que deseamos filtrar
- De esta manera usamos el mismo componente para todos los roles.
exit: Ctrl + ↩
<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"
/>
En UsuarioServices
-
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
Comments