Carregar lista de acordo com item selecionado no selectOneMenu

6 respostas
J

Pessoal,

Estou querendo fazer o seguinte: carregar a lista de permissões para cada tipo de usuário do meu sistema, de acordo com o tipo de usuário selecionado no meu selectOneMenu.

Eu consigo carregar a lista de tipos de usuários no meu selectOneMenu, mas não consigo carregar a lista de permissão, de acordo com a seleção.
Já tentei com valueChangeListener e nada acontece e não sei porque o NetBeans não está deixando eu depurar o projeto, está dando erro, então não estou conseguindo descobrir se o objeto selecionado está indo mesmo para o DAO

XHTML:

<p:selectOneMenu id="listaTipoUsuario" value="#{permissaoController.permissao.tipoUsuario}"
                                     valueChangeListener="#{permissaoController.carregaPermissoesPorTipoDeUsuario(event)}"
                                     required="true"
                                     requiredMessage="Por favor, selecione o tipo de usu&aacute;rio.">
                        <f:selectItem itemLabel="Selecione..."/>
                        <f:selectItems value="#{tipoUsuarioController.listaDeTiposDeUsuarioParaCombobox}"/>                      
                    </p:selectOneMenu>                                       
                    
                    <h:outputLabel for="permissoesTipoUsuario" value="Permiss&otilde;es:"
                                   styleClass="labelNegrito"/>
                                      
                    <p:selectManyCheckbox layout="pageDirection">  
                        <f:selectItems value="#{permissaoController.listaDePermissoesPorTipoDeUsuario}"/>
                    </p:selectManyCheckbox>

MB:

public void carregaPermissoesPorTipoDeUsuario(ValueChangeEvent event) {
        
        if (event.getNewValue() != event.getOldValue()) {
                        
            listaDePermissoesPorTipoDeUsuario = new ArrayList<SelectItem>();
            
            TipoUsuario tipoUsuario = new TipoUsuario();
            tipoUsuario = (TipoUsuario) event.getNewValue();
            
            /*TipoUsuario tipoUsuario = new TipoUsuario();
            TipoUsuarioDao dao = new TipoUsuarioDaoImp();
            tipoUsuario = dao.getTipoUsuario(1);*/
            
            List<Permissao> lista = permissaoDao.listarPermissoesPorTipoDeUsuario(tipoUsuario);                       
            
            for (Permissao p : lista) {
                listaDePermissoesPorTipoDeUsuario.add(new SelectItem(p, p.getMenu().getItem()));
            }
        }
    }

DAO:

@Override
    public List<Permissao> listarPermissoesPorTipoDeUsuario(TipoUsuario tipo) {
        
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.clear();
        
        Transaction t = session.beginTransaction();   
        
        Criteria criteria = session.createCriteria(Permissao.class);
        
        criteria.add(Restrictions.eq("tipoUsuario", tipo));
        
        /*TipoUsuario tipoUsuario = new TipoUsuario();
        TipoUsuarioDao tipoUsuarioDao = new TipoUsuarioDaoImp();
        
        tipoUsuario = tipoUsuarioDao.getTipoUsuario(4);
        
        criteria.add(Restrictions.eq("tipoUsuario", tipoUsuario));*/

        List lista = criteria.list();
                        
        t.commit();
        
        return lista;
    }

6 Respostas

LeoCBS

Opa, blz?

tenta usar a tag <p:ajax

http://www.primefaces.org/showcase-labs/ui/pprSelect.jsf

abraço!

J

Fiz com o componente indicado e não consegui evolução nenhuma.

XHTML ficou assim:

<h:outputLabel for="tipoUsuario" value="Tipo de usu&aacute;rio:"
                                   styleClass="labelNegrito"/>
                    
                    <p:selectOneMenu id="tipoUsuario" value="#{permissaoController.tipoUsuario}"                                     
                                     immediate="true"
                                     required="true"
                                     requiredMessage="Por favor, selecione o tipo de usu&aacute;rio.">
                        <f:selectItem itemLabel="Selecione..." itemValue=""/>
                        <f:selectItems value="#{tipoUsuarioController.listaDeTiposDeUsuarioParaCombobox}"/>                                                                     
                        
                        <p:ajax update="permissoes"
                                listener="#{permissaoController.carregaPermissoesPorTipoDeUsuario}"/>
                    </p:selectOneMenu> 
                    
                    <h:outputLabel for="permissoesTipoUsuario" value="Permiss&otilde;es:"
                                   styleClass="labelNegrito"/>
                    
                    <p:selectOneMenu id="permissoes">                                     
                        <f:selectItem itemLabel="Selecione..." itemValue=""/>
                        <f:selectItems value="#{permissaoController.listaDePermissoesPorTipoDeUsuario}"/>                                                                                             
                    </p:selectOneMenu>

TipoUsuarioController:

public final void carregarListaDeTipoDeUsuariosParaCombobox() {
        listaDeTiposDeUsuarioParaCombobox = new ArrayList<SelectItem>();

        List<TipoUsuario> lista = tipoUsuarioDao.listarAtivos();

        for (TipoUsuario tu : lista) {
            listaDeTiposDeUsuarioParaCombobox.add(new SelectItem(tu, tu.getTipo()));
        }
    }

PermissaoController:

public void carregaPermissoesPorTipoDeUsuario() {
        listaDePermissoesPorTipoDeUsuario = new ArrayList<SelectItem>();

        /*TipoUsuario tipo = new TipoUsuario();
        TipoUsuarioDao dao = new TipoUsuarioDaoImp();
        tipo = dao.getTipoUsuario(4);*/
        
        List<Permissao> lista = permissaoDao.
                listarPermissoesPorTipoDeUsuario(this.tipoUsuario);

        for (Permissao p : lista) {
            listaDePermissoesPorTipoDeUsuario.add(new SelectItem(p, p.getMenu().getItem()));
        }
    }

Fiz o teste, setando o tipo de usuario na mão, como dá pra ver no comentário do método carregaPermissoesPorTipoDeUsuario(), e funcionou. Então o erro está nesse método. Pelo que percebi o tipo de usuário (objeto) selecionado no selectOneMenu não está sendo enviado para esse metodo. Como posso resolver isso? Deixo a lista como SelectItem mesmo, ou mudo para List?

LeoCBS

this.tipoUsuario está null?

seu MBean está com qual escopo? tenta mudar para @SessionScoped

J

Não consigo afirmar se o this.tipoUsuario está null, provavelmente está. Na hora que tento debugar o NetBeans não roda o projeto, fica doido, mas acredito que esteja sim, porque quando eu carrego na mão o tipo de usuário, funciona.

Com relação ao escopo já testei com o Session, mas vou tentar de novo e posto aqui o resultado.

J

Mesma coisa com SessionScoped - nada acontece

J

Pessoal,

Consegui fazer com que ao clicar no selectOneMenu o outro selectOneMenu mudasse os itens automaticamente. O problema é que isso era só um teste, o que quero mesmo, é que os itens do selectManyCheckBox sejam atualizados, ficando marcados, de acordo com a escolha no meu selectOneMenu. Achei que seria mais fácil fazer isso, por isso criei esse tópico, achando que se conseguisse atualizar um selectOneMenu a partir de outro, também conseguiria atualizar um selectManyCheckBox, mas não estou conseguindo. Por isso, criei outro tópico e estou colocando este aqui como RESOLVIDO.

Obrigado pela ajuda de todos e conto com a ajuda de vocês agora no novo tópico:

http://www.guj.com.br/java/270569-selectmanycheckbox-com-itens-selecionados#1419402

Criado 13 de abril de 2012
Ultima resposta 18 de abr. de 2012
Respostas 6
Participantes 2