Opção para selecionar "TODOS" em um selectOneMenu do primefaces

8 respostas
jsfprimefaces
F

Preciso mostrar as despesas por contrato presentes no banco de dados banco, mas queria também adicionar uma opção para mostrar todas as despesas de todos os contratos no “SelectOneMenu” do prime face. Meu código está assim

<h:outputLabel value=“Contrato: " for=“contrato”/>

<h:selectOneMenu id=“contrato” value=”#{despesasController.contrato}" required=“true”>



<f:selectItems value="#{despesasController.listaContrato}" />

</h:selectOneMenu>

<p:commandButton value=“Filtrar” icon=“fa fa-filter” action="#{despesasController.selecionaDespesas}" update=“dataTable”/>

Já tentei passar como item um valor nulo para a variável contrato, mas não faz nada… Simplesmente não faz nada.

O método para mostrar as despeses segue abaixo:

public String selecionaDespesas() {

if (contrato==null) {

List list = ejbFacade.findAll();    //Retornaria todas despesas

setLazyModel(new LazyDespesasModel(list));

} else {

List list = ejbFacade.findDespesasToContract(contrato);    //Retorna as depesas de acordo com o contrato

setLazyModel(new LazyDespesasModel(list));

}

return null;

}

Desde já agradeço!

8 Respostas

M

Voce tem que mudar de selectOneMenu para selectManyMenu

https://www.primefaces.org/showcase/ui/input/manyMenu.xhtml

F

Acho que não expliquei direito. No SelectOneMenu eu mostro uma lista de objetos do tipo Contrato, e eu queria adicionar no Select um item do tipo “null” com Label “todos”, pois quando verificar qual objeto do tipo contrato foi selecionado no Select lá no método, eu passar o “null” e mostrar todas as despesas…

Tipo assim:
<p:selectOneMenu id=“contrato” value="#{despesasController.contrato}" required=“true”>
<f:selectItem itemValue="#{null}" itemLabel=“Todos” noSelectionOption=“false”/>
<f:selectItems value="#{despesasController.listaContrato}" />
</p:selectOneMenu>

De qualquer forma Obrigado!

M

Não funciona?

Da um algum erro?

F

Simplesmente não passa… quando seleciono a opção todos no select, a aplicação não faz nada…

M

O erro para no converter, se você passar null no itemValue, o converter vai pegar o valor de itemLabel

selectItem:

<f:selectItem itemValue="#{null}" itemLabel=Todos />

No seu converter vc faz mais ou menos assim:

@Override
	public Object getAsObject(FacesContext context, UIComponent component, String value) {
		if(value != null)
		{
			System.out.println("value: " + value);
			if(value.equals("Todos"))
			{
				return null;
			}
			
			return o que vc normalmente retorna;
		}
		return null;
	}
F

@FacesConverter(forClass = Despesas.class)
public static class DespesasControllerConverter implements Converter {

@Override
    public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
        System.out.println("+++++++++" + value);
        if (value == null || value.length() == 0) {

            System.out.println("value: " + value);
            if (value.equals("Todos")) {
                return null;
            }

        }
        DespesasController controller = (DespesasController) facesContext.getApplication().getELResolver().
                getValue(facesContext.getELContext(), null, "despesasController");
        return controller.getDespesas(getKey(value));
    }

    java.lang.Integer getKey(String value) {
        java.lang.Integer key;
        key = Integer.valueOf(value);
        return key;
    }

    String getStringKey(java.lang.Integer value) {
        StringBuilder sb = new StringBuilder();
        sb.append(value);
        return sb.toString();
    }

    @Override
    public String getAsString(FacesContext facesContext, UIComponent component, Object object) {

        if (object == null) {
            return null;
        }
        if (object instanceof Despesas) {
            Despesas o = (Despesas) object;
            return getStringKey(o.getId());
        } else {
            throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + Despesas.class.getName());
        }
    }

}

Está assim o meu converter e mesmo assim não foi, só que é o seguinte, eu mando um objeto do tipo contrato para o Bean de Despesas… quanto a isso td bem né?

M

muda pra
if(value != null)
Quando você passa #{null} no itemValue, o converter pega o valor de itemLabel

M

Se baseia nesse meu exemplo

@FacesConverter("minhaClasseConverter")
public class MinhaClasseConverterConverter implements Converter{

	@Inject
	private MeuService meuService;
	
	@Override
	public Object getAsObject(FacesContext context, UIComponent component, String value) {
		if(value != null)
		{
			System.out.println("value: " + value);
			if(value.equals("Todos"))
			{
				return null;
			}
			else
			{
				return meuService.find(Long.parseLong(value));
			}
		}
		return null;
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component, Object value) {
		if(value != null)
		{
			MinhaClasse meuObjeto = (MinhaClasse) value;
			if(meuObjeto.getId() != null)
			{
				return meuObjeto.getId().toString();
			}
		}
		return null;
	}

}
<p:selectOneMenu value="#{testeBean.objeto}" converter="minhaClasseConverter">
				<f:selectItem itemLabel="Todos" itemValue="#{null}"/>
				<f:selectItems value="#{testeBean.listaObjetos}" var="obj" itemLabel="#{obj.nome}" itemValue="#{obj}"></f:selectItems>
public void metodoDoForm()
{
	if(meuObjeto != null)
	{
		System.out.println("Não ta nulo");
	}
	else
    {
	    System.out.println("Ta nulo! Sucesso!");
    }
}

A saída é: "Ta nulo! Sucesso!"
Qualquer coisa só postar :+1:

Criado 10 de abril de 2018
Ultima resposta 11 de abr. de 2018
Respostas 8
Participantes 2