Search code examples
primefacesjsf-2

set page on p:datatable


I've a datatable in primefaces and I want, when I add a row in it, view the last page of the datatable.

My .xhtml page is:

<h:form id=...>
...
<p:dataTable var="webTemplate" id="templateTable" widgetVar="tbl1"/>
...
</h:form>

<h:form id=...>
...
<p:inputText id="txt_description" value="#{templateController.templateDescription}" label="templateDescription">
               <f:validateLength for="txt_name" minimum="1"/>
               <p:ajax event="change"
                     listener="#{calculatePageTable.setPageTableTemplate}"  onsuccess="setTabIndexTT()"/>
               </p:inputText>
...
</h:form>
<script type="text/javascript">
      function setTabIndexTT(){
                    tbl1.getPaginator().setPage(#{calculatePageTable.pageTableTemplate});
                }
      </script>

bean:

@ManagedBean
@SessionScoped
public class CalculatePageTable {

   private int pageTableTemplate = 0;
   private int pageTableField = 0;

   public void setPageTableTemplate() {

      final DataTable d = (DataTable) FacesContext.getCurrentInstance().getViewRoot()
            .findComponent("form:templateTable");
      pageTableTemplate = d.getPageCount() - 1;

   }

   public int getPageTableTemplate() {
      return pageTableTemplate;
   }

   public void setPageTemplateField() {

      final DataTable d = (DataTable) FacesContext.getCurrentInstance().getViewRoot()
            .findComponent("detailsTable:webTemplateUpdateTable");
      pageTableField = (d.getPageCount() - 1);
   }

   public int getPageTableField() {
      return pageTableField;
   }

}

But the js function setTabIndexTT() is never called by onsuccess ajax...

How do I can set last page of my datatable when adding a row?

Primefaces version is 3.1.1


Solution

  • In your managed bean you can try this code:

    public void setPageDataTable() {
        final DataTable d = (DataTable) FacesContext.getCurrentInstance().getViewRoot()
            .findComponent("form:templateTable");
        int first = 1;
        if (d.getRowCount() % ROWS_DATATABLE == 0) {
            first = (d.getRowCount() - ROWS_DATATABLE);
        }
        else 
        {
            first = (d.getRowCount()/ROWS_DATATABLE)*ROWS_DATATABLE;
        }
        d.setFirst(first);
    }
    

    Call this method when you add a new row