<p:autocomplete Usuarios por multiples Roles

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

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"
/>

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.

     <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>

Contamos con dos Entitys.

Imaginemos que tenemos una lista de rol

Last updated