Desafio: LazyDataModel com filterBy

7 respostas
N

Fala Tropa! ao utilizar a versão 3.1M1 do prime faces pra frente current (3.4-SNAPSHOT ), notei uma certa dificuldade em realizar aquele filtro padrão do p:dataTable do primefaces, alguem sabe onde esta meu erro? vou postalo aqui…

Visualização Material

<p:dataTable  id="tabelaMaterial" emptyMessage="Sem registros" var="material" value="#{materialBean.materiaisLazy}" 
                              paginator="true" rows="10" lazy="true" 
                              rowsPerPageTemplate="10,15,30" rowKey="#{material.id}"
                              rowStyleClass="#{material.gerado == true ? 'color':null or material.statusOPEC == 'Reprovado' ? 'colorY' : null or material.statusEng == 'Reprovado' ? 'colorY':null or material.statusEng == 'Ap. Ressalva' ? 'colorZ' : null or material.statusOPEC == 'Rep. Cliente' ? 'colorZ' : null }">

                    <f:facet name="header">

                        <p:outputPanel style="position: static;text-align:  left">
                            <h:outputLabel value="Buscar Material por unidade: "/>
                            <h:selectOneMenu id="escolheUnidade" value="#{materialBean.unidadeBusca}">
                                <f:selectItem id="a" itemLabel="TODOS" itemValue="todos" />
                                <f:selectItems id="b" value="#{materialBean.unidades}" var="uni" itemValue="#{uni.unidade}" itemLabel="#{uni.unidade}"/>
                                <f:ajax event="change" render="tabelaMaterial" listener="#{materialBean.buscarMaterialUnidade}"/>
                            </h:selectOneMenu>
                        </p:outputPanel>
                    </f:facet>


                    <p:column style="font-size: x-small;width: 3%">
                        <p:commandButton id="obsRelevantes" icon="ui-icon-extlink" disabled="#{material.observacaoOpeRep !=null or material.observacaoCli != null or material.observacaoOpe != null ? false:true}" oncomplete="obsMaterial.show()" update=":formObsMaterial" title="Informações relevantes da engenharia sobre o material: #{material.titulo}">
                            <f:setPropertyActionListener value="#{material}" target="#{materialBean.material}"/>
                        </p:commandButton>
                    </p:column>  


                    <p:column headerText="Titulo" filterBy="#{material.titulo}"  filterMatchMode="contains" filterStyle="width:100%;"  style="font-size: x-small">
                        <h:outputText value="#{material.titulo}"/>
                    </p:column>

                    <p:column headerText="Tempo" filterBy="#{material.duracao}" filterMatchMode="contains" filterStyle="width:70%;"  style="font-size: x-small;width: 4em">
                        <h:outputText value="#{material.duracao}"/>
                    </p:column>

                    <p:column headerText="Cliente" filterBy="#{material.cliente.cliente}" filterMatchMode="contains" filterStyle="width:70%;" >
                        <h:outputText value="#{material.cliente.cliente}"/>
                    </p:column>

                    <p:column headerText="Data Material" style="font-size: x-small">
                        <h:outputText value="#{material.dataMaterial}">
                            <f:convertDateTime pattern="dd/MM/yyyy HH:mm" timeZone="America/Sao_Paulo"/>
                        </h:outputText>
                    </p:column>


                    <p:column headerText="Usuario Opec">
                        <h:outputText value="#{material.operador}"/>
                    </p:column>


                    <p:column headerText="Stat. Opec" style="width: 4em">
                        <h:outputText value="#{material.statusOPEC}"/>
                    </p:column>


                    <p:column headerText="Stat. Eng." style="width: 4em">
                        <h:outputText value="#{material.statusEng}"/>
                    </p:column>


                    <p:column style="width: 12em" rendered="#{permissoesBean.listaFuncaoADMIN or permissoesBean.listaFuncaoGESTOR or permissoesBean.listaFuncaoOPEC}">
                        <p:commandButton id="reprovaCli"  icon="ui-icon-cancel"  update=":formMaterial :mensageMaterial :reprovarCliente" title="Reprovado Pelo Cliente" onclick="reprovarCli.show();" disabled="#{material.statusEng =='Rep. Cliente' or material.statusOPEC =='Rep. Cliente' ? true:false || login.unidade == material.unidade ? false:true}"> 
                            <f:setPropertyActionListener value="#{material}" target="#{materialBean.material}"/>
                        </p:commandButton>

                        <p:commandButton id="liberar" icon="ui-icon-transferthick-e-w" title="Liberar material para gerar novamente" actionListener="#{materialBean.liberarGerancao}" update=":mensageMaterial :formMaterial" disabled="#{login.unidade == material.unidade and material.gerado == true ? false:true}">
                            <f:attribute name="material" value="#{material}"/>
                            <f:attribute name="geracao" value="#{geracaoBean.geracao}"/>
                        </p:commandButton>

                        <p:commandButton icon="ui-icon-pencil" title="Alterar" disabled="#{login.unidade == material.unidade ? false:true}" actionListener="#{materialBean.alterar}"
                        oncomplete="window.open(href='#{facesContext.externalContext.request.contextPath}/view/opec/materialGerenciador.xhtml','centro')">
                        <f:attribute name="materialAlterar" value="#{material}"/>
                        </p:commandButton>

                        <p:commandButton icon="ui-icon-trash" title="Deletar" onclick="confirmation.show();" disabled="#{login.unidade == material.unidade ? false:true}">
                            <f:setPropertyActionListener value="#{material}" target="#{materialBean.material}"/>
                        </p:commandButton>
                    </p:column>
                </p:dataTable>

meu MaterialBean apenas a parte onde a consulta é chamada

@ManagedBean
@SessionScoped
public class MaterialBean extends EmailUtils implements Serializable {

    private Material material = new Material();
 
    @EJB
    private MaterialFacade materialFacade
    private LazyDataModel<Material> materiaisLazy;
    private List<Material> materiaisAprovados = new ArrayList<Material>();
  
  
   
 

    public MaterialBean() {
        data = new Date();
    }

    @PostConstruct
    public void init() {
        materiaisLazy = new LazyMaterialDataModel(materialFacade.consultaMaterialUnidade(unidadeBusca));
    }

//Getters and Setters

Minha classe LazyDataModel

public class LazyMaterialDataModel extends LazyDataModel<Material> implements Serializable{

    private List<Material> datasource;

    public LazyMaterialDataModel(List<Material> datasource) {
        this.datasource = datasource;
    }


    @Override
    public Material getRowData(String rowKey) {
        for (Material material : datasource) {
            if (material.getId().equals(rowKey)) {
                return material;
            }
        }

        return null;
    }

    @Override
    public Object getRowKey(Material material) {
        return material.getId();
    }

    @Override
    public List<Material> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
        List<Material> data = new ArrayList<Material>();

        //filter  
        for (Material material : datasource) {
            boolean match = true;

            for (Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {
                try {
                    String filterProperty = it.next();
                    String filterValue = filters.get(filterProperty);
                    String fieldValue = String.valueOf(material.getClass().getField(filterProperty).get(material));

                    if (filterValue == null || fieldValue.startsWith(filterValue)) {
                        match = true;
                    } else {
                        match = false;
                        break;
                    }
                } catch (Exception e) {
                    match = false;
                }
            }

            if (match) {
                data.add(material);
            }
        }

//        sort  
//        if (sortField != null) {
//            Collections.sort(data, new LazySorter(sortField, sortOrder));
//        }
        //rowCount  
        int dataSize = data.size();
        this.setRowCount(dataSize);

        //paginate  
        if (dataSize > pageSize) {
            try {
                return data.subList(first, first + pageSize);
            } catch (IndexOutOfBoundsException e) {
                return data.subList(first, first + (dataSize % pageSize));
            }
        } else {
            return data;
        }
    }
}

Por fim minha consulta Criteria…

public List<Material> consultaMaterialUnidade(String unidade) {
        Session session;

        if (em.getDelegate() instanceof EntityManagerImpl) {
            EntityManagerImpl entityManagerImpl = (EntityManagerImpl) em.getDelegate();
            session = entityManagerImpl.getSession();
        } else {
            session = (Session) em.getDelegate();
        }
        List<Material> materiais = new ArrayList<Material>();
        Criteria crit = session.createCriteria(Material.class);
        crit.createAlias("unidade", "u");
        crit.add(Restrictions.eq("u.unidade", unidade));
        crit.addOrder(Order.desc("dataMaterial"));
        return crit.list();
    }

NOTA: ALGUEM ME AJUDA!!!

7 Respostas

ErickRAR

Se você postar qual é o erro, ajudaria mais. Não seleciona? Não filtra? Não carrega?

N

Opa mil desculpas… ele não faz a função de FilterBy ou seja… não filtra, as demais funções (Excluir,Alterar, Listar, Paginar, Lazy, Selecionar) tudo funciona, menos o filtro

N

alguem?

D

tenta fazer sua classe material implementar Serializable.

N

Não sei se você notou meu caro, mais ela ja está implementada com o java.io.Serializable…

N

ninguem?

N

vamoo povo alguem me de uma luz!

Criado 3 de julho de 2012
Ultima resposta 3 de jul. de 2012
Respostas 7
Participantes 3