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.
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.
blz, vou tentar a segunda opção.
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;
}
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 …
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.