SIGESA: selectManyMenu hacer que solo se pueda seleccionar un item

    metaPoaEditForm.xhtml

    • Si tenemos este código
    <!--CAMPO-->
                        <p:selectManyMenu id="actividadMejoraSelectManyMenu" 
                                          value="#{metaPoaBean.listaActividadesMejoraSeleccionadas}"
                                          converter="#{actividadMejoraBean.converter}" 
                                          var="am" 
                                          filter="true" 
                                          filterMatchMode="contains" 
                                          showCheckbox="true" 
                                          styleClass="una-selectManyMenu"
                                          rendered="#{metaPoaBean.isPlanOperativoUnidad()}"
                                          >
    
                            <p:ajax process="@this" 
                                    listener="#{metaPoaBean.actualizaActividadesMejoraSeleccionadas}"
                                    update="@this,
                                    :#{p:resolveFirstComponentWithId('actividadRiesgoOutputPanel', view).clientId}"/>
    
                            <f:selectItems value="#{metaPoaBean.listaAllActividadesMejora}" 
                                           var="codAM" 
                                           itemLabel="#{codAM.codigo}"
                                           itemValue="#{codAM}"
                                           >
                            </f:selectItems>
    
                            <p:column>
                                <h:outputText value="#{am.codigo}"/>
                            </p:column>
                            <p:column>
                                <h:outputText value="#{am.descripcion}"/>
                            </p:column>
                        </p:selectManyMenu>
    
    • que muestra
    • Y deseamos que el usuario solo pueda seleccionar una opción
    • Podemos agregarle la siguiente propiedad
    itemDisabled="#{metaPoaBean.actividadMejoraDisabled(codAM)}"
    • Donde llamaría a un metodo llamado actividadMejoraDisabled que determina si debe o no el itema estar habilitado
    • Ahora para la tarea existe la salvedad de que existen 2 selectManyMenu uno de actividades de mejora y otro actividades de respuesta
    • y solo se puede seleccionar uno de ambos selectManyMenu
    • Además existe este código
    <p:ajax process="@this" 
                                    listener="#{metaPoaBean.actualizaActividadesMejoraSeleccionadas}"
                                    update="@this"/>
    • Que escucha el evento «change»
    • Entonces para aplicar la funcionalidad primero agregamos el llamado a metodo que verifica si debe o no estar habilitado el item

    mejora

    • Agregamos dentro de selectItems
    itemDisabled="#{metaPoaBean.actividadMejoraDisabled(codAM)}"
    • Quedando así
    <!-- ***************************************************************************** -->
                    <!-- ***************************************************************************** -->
                    <!-- ACTIVIDAD MEJORA                                                              -->
                    <!-- ***************************************************************************** -->
                    <!-- ***************************************************************************** -->
                    
                    <!--LABEL-->
                    <p:outputLabel  id="actividadMejoraOutputLabel" 
                                    for="actividadMejoraSelectManyMenu" 
                                    value="#{i18n.metaPoa_actividadMejora_header_label}"
                                    rendered="#{metaPoaBean.isPlanOperativoUnidad()}"
                                   />
    
                    
                    <!--PANEL-->
                    <p:outputPanel  id="actividadMejoraOutputPanel" 
                                    rendered="#{metaPoaBean.isPlanOperativoUnidad()}">
            
    
                        <!--CAMPO-->
                        <p:selectManyMenu id="actividadMejoraSelectManyMenu" 
                                          value="#{metaPoaBean.listaActividadesMejoraSeleccionadas}"
                                          converter="#{actividadMejoraBean.converter}" 
                                          var="am" 
                                          filter="true" 
                                          filterMatchMode="contains" 
                                          showCheckbox="true" 
                                          styleClass="una-selectManyMenu"
                                          rendered="#{metaPoaBean.isPlanOperativoUnidad()}"
                                          >
    
                            <p:ajax process="@this" 
                                    listener="#{metaPoaBean.actualizaActividadesMejoraSeleccionadas}"
                                    update="@this,
                                    :#{p:resolveFirstComponentWithId('actividadRiesgoOutputPanel', view).clientId}"/>
    
                            <f:selectItems value="#{metaPoaBean.listaAllActividadesMejora}" 
                                           var="codAM" 
                                           itemLabel="#{codAM.codigo}"
                                           itemValue="#{codAM}"
                                           itemDisabled="#{metaPoaBean.actividadMejoraDisabled(codAM)}">
                            </f:selectItems>
    
                            <p:column>
                                <h:outputText value="#{am.codigo}"/>
                            </p:column>
                            <p:column>
                                <h:outputText value="#{am.descripcion}"/>
                            </p:column>
                        </p:selectManyMenu>
    
                        <!--MENSAJE-->
                        <p:message id="actividadMejoraMessage" 
                                   for="actividadMejoraSelectManyMenu" 
                                   rendered="#{metaPoaBean.isPlanOperativoUnidad()}"/>
    
                    </p:outputPanel>
                    <!-- ***************************************************************************** -->
                    <!-- ***************************************************************************** -->
                    <!-- ***************************************************************************** -->
                    <!-- ***************************************************************************** -->
    • Y modificamos el evento change para que actualice el componete de riesgo
    • quedando así
    <p:ajax process="@this" 
                                    listener="#{metaPoaBean.actualizaActividadesMejoraSeleccionadas}"
                                    update="@this,
                                    :#{p:resolveFirstComponentWithId('actividadRiesgoOutputPanel', view).clientId}"/>

    Riesgo

    • Queda así
    <!-- ***************************************************************************** -->
                    <!-- ***************************************************************************** -->
                    <!-- ACTIVIDAD RIESGO                                                              -->
                    <!-- ***************************************************************************** -->
                    <!-- ***************************************************************************** -->
                    
                    <!--LABEL-->
                    <p:outputLabel  id="actividadRiesgoOutputLabel" 
                                    for="actividadRiesgoSelectManyMenu" 
                                    value="#{i18n.metaPoa_actividadRiesgo_header_label}"
                                    rendered="#{metaPoaBean.isPlanOperativoUnidad()}"
                                   />
                    
                    <!--PANEL-->
                    <p:outputPanel  id="actividadRiesgoOutputPanel" 
                                    rendered="#{metaPoaBean.isPlanOperativoUnidad()}">
    
    
                        <!--CAMPO-->
                        <p:selectManyMenu id="actividadRiesgoSelectManyMenu" 
                                          value="#{metaPoaBean.listaActividadesRiesgoSeleccionadas}"
                                          converter="#{actividadRespuestaRiesgoBean.converter}" 
                                          var="am" 
                                          filter="true" 
                                          filterMatchMode="contains" 
                                          showCheckbox="true" 
                                          styleClass="una-selectManyMenu"
                                          rendered="#{metaPoaBean.isPlanOperativoUnidad()}"
                                          >
    
                            <p:ajax process="@this" 
                                    listener="#{metaPoaBean.actualizaActividadesRiesgoSeleccionadas}"
                                    update="@this,
                                    :#{p:resolveFirstComponentWithId('actividadMejoraOutputPanel', view).clientId}"/>
    
                            <f:selectItems value="#{metaPoaBean.listaAllActividadesRiesgo}" 
                                           var="codARR" 
                                           itemLabel="#{codARR.codigo}"
                                           itemValue="#{codARR}"
                                           itemDisabled="#{metaPoaBean.actividadRiesgoDisabled(codARR)}">
                            </f:selectItems>
    
                            <p:column>
                                <h:outputText value="#{am.codigo}"/>
                            </p:column>
                            <p:column>
                                <h:outputText value="#{am.descripcion}"/>
                            </p:column>
    
                        </p:selectManyMenu>
    
                        <!--MENSAJE-->
                        <p:message id="actividadRiesgoMessage" 
                                   for="actividadRiesgoSelectManyMenu" 
                                   rendered="#{metaPoaBean.isPlanOperativoUnidad()}"/>
    
                    </p:outputPanel>
                    <!-- ***************************************************************************** -->
                    <!-- ***************************************************************************** -->
                    <!-- ***************************************************************************** -->
                    <!-- ***************************************************************************** -->

    MetaPoaBean.java

    • Ahora creamos los metodos que van a aplicar la logica sobre si habilitar o no
    /**
         * Función: Determinar si el item del selectManyMenu de ActividadMejora debe o no estar habilitado
         * @param actividadMejoraSelected
         * @return true = deshabilitado/ false = habilitado
         * @author  Gustavo Matamoros González
         * @issue BTPPI-389
         */
        public boolean actividadMejoraDisabled(ActividadMejora actividadMejoraSelected){
    
            // Si las no hay AM ni ARR seleccionadas esta habilitado
            if( (this.getListaActividadesMejoraSeleccionadas().isEmpty()) && (this.getListaActividadesRiesgoSeleccionadas().isEmpty())){
                return false;
            }
    
            // Si hay ARR esta deshabilitado
            if(!this.getListaActividadesRiesgoSeleccionadas().isEmpty()){
                return true;
            }
    
            //Si es el item enviado igual habilite
            for(ActividadMejora actividadMejora : this.getListaActividadesMejoraSeleccionadas()){
                if(actividadMejora.equals(actividadMejoraSelected)){
                    return false;
                }
            }
    
            // sino deshabilite
            return true;
        }
        
        /**
         * Función: Determinar si el item del selectManyMenu de ActividadMejora debe o no estar habilitado
         * @param actividadMejoraSelected
         * @return true = deshabilitado/ false = habilitado
         * @author  Gustavo Matamoros González
         * @issue BTPPI-389
         */
        public boolean actividadRiesgoDisabled(ActividadRespuestaRiesgo actividadRespuestaRiesgoSelected){
    
            // Si las no hay AM ni ARR esta habilitado
            if( (this.getListaActividadesMejoraSeleccionadas().isEmpty()) && (this.getListaActividadesRiesgoSeleccionadas().isEmpty())){
                return false;
            }
    
            // Si hay AM esta deshabilitado
            if(!this.getListaActividadesMejoraSeleccionadas().isEmpty()){
                return true;
            }
    
            //Si es el item enviado igual habilite
            for(ActividadRespuestaRiesgo actividadRespuestaRiesgo : this.getListaActividadesRiesgoSeleccionadas()){
                if(actividadRespuestaRiesgo.equals(actividadRespuestaRiesgoSelected)){
                    return false;
                }
            }
    
            // sino deshabilite
            return true;
        }
    • Y listo