Zerar pagina de indexação + rich:faces + rich:datascroller[RESOLVIDO]

Olá, pessoal tenho o seguinte código:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
    xmlns:rich="http://richfaces.org/rich" xmlns:a4j="http://richfaces.org/a4j"
    template="../../template.xhtml">

    <ui:define name="content">
        <h:form>

            <h:column>
                <h:outputText styleClass="TextoTipoP1" value="Pesquisa:  " />
                <h:inputText valueChangeListener="#{funcionarioBean.mudarValorListener}"
                    id="nomePesquisa" value="#{funcionarioBean.nomePesquisa}" required="true"
                    requiredMessage="*Campo obrigatorio" size="30">
                </h:inputText>

            </h:column>


            <h:column>
                <h:commandButton image="../../img/find.png" style="width: 20"
                    action="#{funcionarioBean.pesquisar}"/>
            </h:column>



            <rich:dataTable  id="funcionariosList" value="#{funcionarioBean.funcionarios}" var="f"
                onRowMouseOver="this.style.backgroundColor='#F1F1F1'"
                onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'"
                rows="10" rendered="#{not empty funcionarioBean.funcionarios}">
                <rich:column>
                    <f:facet name="header">
                        <h:outputText value="Nome"></h:outputText>
                    </f:facet>
                    <h:outputText value="#{f.nome}" />

                </rich:column>

                <rich:column>
                    <f:facet name="header">
                        <h:outputText value="Login"></h:outputText>
                    </f:facet>

                    <h:outputText value="#{f.login}" />

                </rich:column>


                <rich:column>
                    <f:facet name="header">
                        <h:outputText value="Editar"></h:outputText>
                    </f:facet>


                    <a4j:commandLink value="(editar)" action="#{funcionarioBean.prepareEditar}"
                        immediate="true">
                        <f:setPropertyActionListener value="#{f}"
                            target="#{funcionarioBean.funcionario}" />

                    </a4j:commandLink>

                </rich:column>
                <f:facet name="footer">
                    <rich:datascroller maxPages="10" binding="#{funcionarioBean.scroller}"
                        actionListener="#{funcionarioBean.pesquisarActionListener}" />

                </f:facet>
                </rich:dataTable>
        </h:form>

    </ui:define>

</ui:composition>

E no meu ManagedBean esta assim

public class FuncionarioBean {
	
	private Funcionario funcionario;
	private List<Funcionario> funcionarios=new ArrayList<Funcionario>();
	private String nomePesquisa;
  	private int page;
	private HtmlDatascroller scroller;
	
	
	
	public FuncionarioBean() {
		funcionario=new Funcionario();
	}
	

		
	
	public int getPage() {
		return page;
	}




	

	

	public HtmlDatascroller getScroller() {
		return scroller;
	}

	public void setScroller(HtmlDatascroller scroller) {
		this.scroller = scroller;
	}

	public void setPage(int page) {
		this.page = page;
	}
	public List<Funcionario> getFuncionarios() {
		return funcionarios;
	}
	public void setFuncionarios(List<Funcionario> funcionarios) {
		this.funcionarios = funcionarios;
	}
	public Funcionario getFuncionario() {
		return funcionario;
	}
	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}
	public String getNomePesquisa() {
		return nomePesquisa;
	}
	public void setNomePesquisa(String nomePesquisa) {
		this.nomePesquisa = nomePesquisa;
	}

	
	/**
	 * Pesquisa funcionario por nome
	 */
	public void pesquisar(){
		int min=0;
		int max=0;
		
		if(page<=0){
			max=10;
		}else{
			min=(page * 10) -10;
			max=page * 10;
		}
		
		FuncionarioDao dao=new DaoFactory().getFuncionarioDao();
		this.funcionarios=dao.findByName(nomePesquisa,min,max);
	}
	
	public void mudarValorListener(ValueChangeEvent event){
		if(event.getOldValue()!=null && 
		  (!event.getOldValue().equals(event.getNewValue())) ){
			page=1;
			limparPesquisa();

		}
				
	}
	
	private void limparPesquisa() {
		scroller.setPage(1);  //Essa parte do código não funciona
			
	
	}

	public void pesquisarActionListener(ActionEvent event){
		DataScrollerEvent dEvent=(DataScrollerEvent) event;
		page=dEvent.getPage();
		pesquisar();	 
	}
	

O que acontece e o seguinte, quando pesquiso um nome qualquer, ele faz a pesquisa corretamente, ai clico por exemplo na pagina 5, mas quando refaço a pesquisa ele volta para a pagina 5 ,e as vezes a segunda pesquisa não tem 5 páginas ficando vazia, gostaria de resetar a pagina para 1 a cada nova pesquisa.
Para isso criei um component-binding e no momento correto seto a page para 1, o problema é que a page sempre vem null, e quando seto para 1 não funciona.

Existe outra forma de fazer isso, como vcs fazem atulamente.

Obs;Lembrando que a paginação é sob demanda!

Cara, não sei ao certo oque pode ser isso, nunca pesquisei a fundo mas consegui achar oque acredito se ruma POG e que resolve, eu estava justamente com o mesmo problema e resolvi dessa forma:

public void refresh() {

		
		FacesContext context = FacesContext.getCurrentInstance();
		
		Application application = context.getApplication();
		
	    ViewHandler viewHandler = application.getViewHandler();
	    
	    UIViewRoot viewRoot = viewHandler.createView(context, context.getViewRoot().getViewId());
	    
	    context.setViewRoot(viewRoot);
	    
	    context.renderResponse();
	    
}

É só colocar chamar este método antes de realizar a pesquisa.

[quote=alpharagga]Cara, não sei ao certo oque pode ser isso, nunca pesquisei a fundo mas consegui achar oque acredito se ruma POG e que resolve, eu estava justamente com o mesmo problema e resolvi dessa forma:

public void refresh() {

		
		FacesContext context = FacesContext.getCurrentInstance();
		
		Application application = context.getApplication();
		
	    ViewHandler viewHandler = application.getViewHandler();
	    
	    UIViewRoot viewRoot = viewHandler.createView(context, context.getViewRoot().getViewId());
	    
	    context.setViewRoot(viewRoot);
	    
	    context.renderResponse();
	    
}

É só colocar chamar este método antes de realizar a pesquisa.
[/quote]

Olá, pelo visto acho que vou ter que fazer desse jeito. O engraçad kra é que se por exemplo seto outras propriedades como por exemplo:

scroller.setMaxPages(5);

Ele funciona perfeitamente, o problema é realmente a pagina atual do scroller, que vem null, sempre!

Valeu, vou tentar esse codigo!

cara, ja passei por isso e solucionei assim:

Primeiro, usei um binding do meu rich:dataTable e nao do rich:datascroller.

private transient HtmlDataTable tabelaBind = new HtmlDataTable();

no meu xhtml

<rich:dataTable var="historico" value="#{bean.lista}" 
										rows="5" id="idList"
			 							border="0" width="100%" styleClass="tableHV"  cellspacing="0" 
			 							rendered="#{! empty bean.lista}"
			 							headerClass="textCellBorderHeaderRight" rowClasses="tableRowOdd,tableRowEven" style="align: right"
			 							binding="#{bean.tabelaBind}">

ai no meu metodo de busca a primeira coisa que faço é

tabelaBind = new HtmlDataTable();

Fazendo isso parece que vc “força” o componente a re-renderizar sua tabela… e como seu scroller esta linkado a sua tabela na sua pagina ele sera atualizado com o numero de paginas da pesquisa atual.

[quote=pdioniziofilho]cara, ja passei por isso e solucionei assim:

Primeiro, usei um binding do meu rich:dataTable e nao do rich:datascroller.

private transient HtmlDataTable tabelaBind = new HtmlDataTable();

no meu xhtml

<rich:dataTable var="historico" value="#{bean.lista}" 
										rows="5" id="idList"
			 							border="0" width="100%" styleClass="tableHV"  cellspacing="0" 
			 							rendered="#{! empty bean.lista}"
			 							headerClass="textCellBorderHeaderRight" rowClasses="tableRowOdd,tableRowEven" style="align: right"
			 							binding="#{bean.tabelaBind}">

ai no meu metodo de busca a primeira coisa que faço é

tabelaBind = new HtmlDataTable();

Fazendo isso parece que vc “força” o componente a re-renderizar sua tabela… e como seu scroller esta linkado a sua tabela na sua pagina ele sera atualizado com o numero de paginas da pesquisa atual.
[/quote]

Olá, kra testei o exemplo mas não funcionou, nem o codigo acima de resetar o FacesCOntext funciona. Não sei mais como resolver este problema, já estou 2 dias quebrando cabeça com isso!

Olá, pessoal para quem tiver o mesmo problema, fica aqui a solução que encontrei.

    &lt;rich:datascroller maxPages="10" page="#{funcionarioBean.scrollerPage}" actionListener="#{funcionarioBean.pesquisarActionListener}"/&gt;

E no managed bean, tem um atributo do tipo int, que na hora que o usuario realiza outra pesquisa
faço:

scrollerPage=1;

Funciona perfeitamente!

Obrigado a todos!

Oi pessoal,

tive o mesmo problema aqui mas o que acontecia no meu caso era que eu usava o rendered para fazer o scrollDataTable sumir quando a quantidade de dados nao ultrapassava uma pagina.

aí se o usuario fizesse uma consulta, paginasse e depois consultava de novo e o resultado nao ultrapassava uma pagina, era como se o meu dataTable ficasse naquela paginação antes da 2a consulta e nao mostrava os dados.

tirando o rendered ele funcionou numa boa… claro q fica aquele scroll sem pagina nenhuma, mas melhor assim q nao mostrar os dados
:smiley:

de qualquer jeito obrigada pela ajuda, me livraram de fazer um upgrade na versão e perder dias ajustando as incompatibilidades ehehehehe

beijos

Depois de muito procurar e não encontrar uma maneira eficiente, resolvi fazer com javascript.

function atualizarPaginacao(){

componente = jQuery('div[id*=paginacaoDataScroller]');

Event.fire(componente[0], 'rich:datascroller:onscroll', {'page': 'first'});

}

Você chama a função js no onclick do botão de pesquisa, ou em outro meio utilizado para efetuar a busca.

lembrando que “paginacaoDataScroller” deve ser o id do seu rich:datascroller e você deve importar os arquivos necessários para utilizar jQuery na sua página.

Espero ter ajudado!

Abraço a todos.

[quote=MaYaRa_SaN]Oi pessoal,

tive o mesmo problema aqui mas o que acontecia no meu caso era que eu usava o rendered para fazer o scrollDataTable sumir quando a quantidade de dados nao ultrapassava uma pagina.

aí se o usuario fizesse uma consulta, paginasse e depois consultava de novo e o resultado nao ultrapassava uma pagina, era como se o meu dataTable ficasse naquela paginação antes da 2a consulta e nao mostrava os dados.

tirando o rendered ele funcionou numa boa… claro q fica aquele scroll sem pagina nenhuma, mas melhor assim q nao mostrar os dados
:smiley:

de qualquer jeito obrigada pela ajuda, me livraram de fazer um upgrade na versão e perder dias ajustando as incompatibilidades ehehehehe

beijos[/quote]

MaYaRa_SaN, obrigado pela dica, de todas as formas que tentei esta foi a que deu resultado. Estou usando a rich:extendedDataTable do Richfaces 4.1.0.

A solução que pra mim funcionou foi a do “danielbussade”

Muito Bom pessoal. great job.