[Resolvido] JSF habilitar e desabilitar campos no formulario

5 respostas Resolvido
jsfprimefacesjava
M

Boa tarde,

Estou criando uma aplicação JSF, em uma tela de criar usuários tenho vários perfis ,para escolher o perfil eu uso um p:selectonemenu, em um perfil especifico ele tem um campo a mais (também selectonemenu), gostaria de saber como eu desabilito esse campo para os outros perfis e só renderize quando eu escolher um perfil especifico. Obrigado.

5 Respostas

D

Há vários caminhos, vou te apontar dois deles:
1 - Com javascript;
2 - Com a propriedade rendered do selectonemenu, ao alterar o primeiro, disparando um evento ajax, cujo reRender seja o selectonemenu que deseja ocultar.

M

blz, vou tentar a segunda opção.

R

Infelizmente o selectItem não aceita o atributo rendered, o que facilitaria bastante. Porém, este componente tem acesso ao atributo itemDisabled que recebe um boolean como valor ao qual define se a option gerada no HTML terá o disabled=“disabled” como atributo. Sabendo disto, podemos fazer a seguinte abordagem:

<p:selectOneMenu .... panelStyleClass="hideDisabled">
         <f:selectItem itemLabel="Xbox One" itemValue="Xbox One" />
         <f:selectItem itemLabel="PS4" itemValue="PS4" itemDisabled="#{alguma.condicao}" />
    </p:selectOneMenu>

Agora tratamos o CSS para esconder as options desabilitadas do select que tenha a classe hideDisabled utilizando as próprias classes do primefaces.

.ui-selectonemenu-panel.hideDisabled .ui-selectonemenu-item.ui-state-disabled {
    display: none;
}
M

Boa noite, ainda não consegui resolver esse problemas, já vi vários casos parecidos aqui no GUJ, mas nenhum deu certo para mim, aqui está o pedaço do meu código:

<!-- Primeiro SelectOneMenu -->
                <p:outputLabel for="hole" value="#{labels.user_role}: " />
                <p:selectOneMenu id="hole" 
                    value="#{userAddEditMB.user.role}" style="width:125px">
                    <f:selectItem itemLabel="Selecione" itemValue="" />
                    <f:selectItem itemLabel="Teste" itemValue="ROLE_USER" />
                    <f:selectItem itemLabel="Administrador" itemValue="admin" />
                    <f:selectItem itemLabel="Supervisor" itemValue="super" />
                    <f:selectItem itemLabel="Atendente" itemValue="atend" />
                    <f:selectItem itemLabel="Pronta Resposta" itemValue="pront" />
                    <p:ajax event="change" update="displayTeam" process="@this" />
                </p:selectOneMenu>
                
                <!-- se escolher o itemValue="pront" habilitar esse segundo select  -->
                <p:outputLabel value="#{labels.user_team}:" />
                    <p:outputPanel id="displayTeam">
                        <p:panel rendered="#{userAddEditMB.user.role} = pront">
                            <p:selectOneMenu id="team" value="#{userAddEditMB.user.idequipe}">
                                <f:selectItem itemLabel="Selecione" itemValue="" />
                                <f:selectItems value="#{teamMB.teams}" var="team"
                                    itemLabel="#{team.nome}" itemValue="#{team.id}" />
                            </p:selectOneMenu>
                        </p:panel>
                    </p:outputPanel>

Eu tenho primeiro select, no caso se eu escolho o perfil Pronta Resposta que o itemValue é “pront” ele tem que habilitar o segundo select …

M
Solucao aceita

Ok, consegui, o problema esta nessa linha:

<p:panel rendered="#{userAddEditMB.user.role} = pront">

Primeiro colocar a comparação dentro das chaves:

<p:panel rendered="#{userAddEditMB.user.role = pront}">

Segundo para comparação o sinal não é = e sim == erro tosco:

<p:panel rendered="#{userAddEditMB.user.role == pront}">

Terceiro como estou comprarando string tem que colocar dentro de aspas simples:

<p:panel rendered="#{userAddEditMB.user.role == 'pront'}">

Assim funcionou, mas dai ficou meio feio na tela, o que eu fiz, removi esse p:panel e coloquei o rendered direto no p:selectOneMenu.

Obrigado.

Criado 24 de outubro de 2016
Ultima resposta 3 de nov. de 2016
Respostas 5
Participantes 3