How to retain selection list and check boxes after pagination while lazy loading in prime faces data table?

I implemented lazy loading at prime faces data table. It is working fine but when page is changed the selection is cleared. How to retain the selection at some other pages when page is changed and return back to the page. I found one related question here.

This answer helped me to keep the selected objects but failed to keep check boxes at table when come back to the page.

using Prime Faces version 6.2

Upvotes: 2

Views: 1096

Answers (2)

I got the solution with the help of 2 answers

  1. From this
  2. thanks to melloware above anser

.xhtml

<p:dataTable selection="#{myBean.selectedRows}" ... >
   <p:ajax event="rowSelectCheckbox" process="@this" listener="#{myBean.onSelectRow}" />
   <p:ajax event="rowUnselectCheckbox" process="@this" listener="#{myBean.onUnselectRow}" />
<p:ajax event="page" process="@this" listener="#{myBean.onPagination}" />
<p:ajax event="toggleSelect" process="@this" listener="#{myBean.onToggle}" />
   <p:column selectionMode="multiple" ... />
    ...
 </p:dataTable>

.java

    private List<MyRowClass> selectedRows;
    private List<MyRowClass> selectedRowsSaved;

    ...

    public void onSelectRow(SelectEvent event){
        selectedRowsSaved.add((MyRowClass) event.getObject());
    }

    public void onUnselectRow(UnselectEvent event){
        selectedRowsSaved.remove((MyRowClass) event.getObject());
    }
    
    public void onToggle(ToggleSelectEvent event){
    List<Object> completeListOfCurrentPage = (List<Object>) compteLazyDataModel.getWrappedData();
        if(event.isSelected()) {
            selectedRowsSaved.addAll(comptesListOfCurrentPage);
        } else {
            selectedRowsSaved.removeAll(comptesListOfCurrentPage);
        }
    }

    public void onPagination(){
        if(selectedRowsSaved!=null && selectedRowsSaved.isEmpty()}{
            selectedRows.addAll(selectedRowsSaved);
        }
    }
    public List<MyRowClass> getSelectedRows(){
        return selectedRowsSaved;
    }

    public void setSelectedRows(List<MyRowClass> selectedRows){
        this.selectedRows = selectedRows;
    }

Upvotes: 1

Melloware
Melloware

Reputation: 12019

Since OP doesn't want to upgrade above 6.2 the solution is a workaround listed here: https://forum.primefaces.org/viewtopic.php?f=3&t=47224

Add an AJAX toggleSelect event

<p:ajax event="toggleSelect" 
global="false" 
immediate="true"  
update=":usersManagerForm:usersTable:usersActions" 
listener="#{usersManagerBean.onToggleSelect}" />

And backing bean method:

public void onToggleSelect(ToggleSelectEvent event) {
        List<Compte> comptesListOfCurrentPage = (List<Compte>) compteLazyDataModel.getWrappedData();
        if(event.isSelected()) {
            selectedComptesList.addAll(comptesListOfCurrentPage);
        } else {
            selectedComptesList.removeAll(comptesListOfCurrentPage);
        }
    }

Upvotes: 1

Related Questions