Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Selected multiple com 2 list

Boa tarde,

Preciso fazer uma comparação de 2 listas e marcar como selected as permissões que o usuário possui, as listas, são as seguintes:

1° Lista de roles que vem do banco e é mandado para view e carrega uma combo. 2° Um atributo do tipo List do meu objeto Consultor chamado de roles.

Ao enviar para tela de atualização do Consultor, eu preciso verificar as roles que eu tenho no banco e selecionar aquelas que a lista do meu consultor possui.

Poderiam me ajudar ? Obs: Estou usando Thymeleaf.

Meu método que retorna para a tela de update:


    @ResponseBody    
    @GetMapping(path = "/'{username}'")
    public ModelAndView findByUsername(@PathVariable("username") String username){
        ModelAndView modelAndView = new ModelAndView();

        List<Equipe> equipes = Arrays.asList(Equipe.values());
        List<Filial> filiais = Arrays.asList(Filial.values());
        List<Cargo> cargos = Arrays.asList(Cargo.values());

        modelAndView.addObject("equipes", equipes);
        modelAndView.addObject("filiais", filiais);
        modelAndView.addObject("cargos", cargos);
        modelAndView.addObject("roles", roleServiceImpl.getAll());
        modelAndView.addObject("consultor", consultorServiceImpl.findByUsername(username));

        System.out.println(username);

        modelAndView.setViewName("/consultor/update");

        return modelAndView;

    }

E este é meu select que carrega todas as permissões:


<select  id="select-permissoes" multiple="multiple"     
            name="roles" th:required="required" >
           <option value="" th:disabled="disabled"
                th:selected="selected" >Selecione as permissões
           </option>
          <option 
                th:each="role : ${roles}"
                th:value="${role.nome}"
             th:text="${role.descricao}">
    </option>
</select>
2 respostas

Opa, eu não manjo de thymeleaf, então vou concentrar a ajuda na geração das listas. O que eu faria:

todasAsRoles.stream().filter(role -> !cargos.contains(role)).collect(Collectors.toList());

Isso vai te retornar uma lista com todas as roles que não estão nos cargos.

solução!

Bom dia Alberto,

Eu mandei para view a lista das roles que o consultor não possui e listei todas sem selected, depois eu listei todas as roles que o consultor tem com selected, mesmo não ficando em ordem alfabética, resolveu meu problema.

Obrigado !

modelAndView.addObject("roles", roles.stream().filter(role -> !consultor.getRoles().contains(role)).collect(Collectors.toList()));

Minha View com Thymeleaf:

                        <select  id="select-permissoes" multiple="multiple" name="roles" th:required="required" >
                            <option value="" th:disabled="disabled" th:selected="selected" >Selecione as permissões
                            </option>
                            <option 
                                   th:each="role : ${consultor.roles}"
                                th:value="${role.nome}"
                                th:text="${role.descricao}"
                                th:selected="selected">
                           </option>
                           <option 
                                   th:each="role : ${roles}"
                                th:value="${role.nome}"
                                th:text="${role.descricao}">
                            </option>
                        </select>