primefaces: Datatable: selectAllRows(), unselectAllRows() partly broken

1) Environment

  • PrimeFaces version: 6.2.1
  • Application server + version: Wildfly 11
  • Affected browsers: Firefox (perhaps others)

2) Steps to reproduce

  1. Click on checkbox in header (calls internally selectAllRows()
  2. Unselect one checkbox from one row
  3. Nothing happens, as well as pagination and other ajax stuff is broken.
  4. After waiting and click another time on row or checkbox it will be unselected

–> More entries means more waiting. It is really slow for lists with > 20k entries.

3) Expected behavior

  1. Row will be unselected, and objects in selected list will be minus one.

4) Sample XHTML

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui"
      xmlns:h="http://xmlns.jcp.org/jsf/html">

    <h:head />

    <h:body>
        <h:form id="form">
            <p:dataTable
                    id="myTable"
                    widgetVar="myWidget"
                    var="entry"
                    rowKey="#{entry.name}"
                    selection="#{selectableTable.selected}"
                    rows="5"
                    rowSelectMode="add"
                    paginator="true"
                    value="#{selectableTable.entries}">
                <p:ajax event="rowSelect" listener="#{selectableTable.rowSelectCheckbox}" update=":form:selected" />
                <p:ajax event="rowUnselect" listener="#{selectableTable.rowUnselectCheckbox}" update=":form:selected" />
                <p:ajax event="rowSelectCheckbox" listener="#{selectableTable.rowSelectCheckbox}" update=":form:selected" />
                <p:ajax event="rowUnselectCheckbox" listener="#{selectableTable.rowUnselectCheckbox}" update=":form:selected" />
                <p:ajax event="toggleSelect" listener="#{selectableTable.toggleSelected}" update=":form:selected"/>

                <p:column selectionMode="multiple" />

                <p:column sortBy="#{entry.name}">
                    <f:facet name="header">
                        <h:outputText value="Name"/>
                    </f:facet>

                    <h:outputText value="#{entry.name}"/>
                </p:column>

            </p:dataTable>

            <h:outputText id="selected" value="Selected: #{selectableTable.selected.size()}" />
        </h:form>
    </h:body>

</html>

6) Sample bean

package de.mypackage;

import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;
import org.primefaces.event.ToggleSelectEvent;
import org.primefaces.event.UnselectEvent;

import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@Named
@SessionScoped
public class SelectableTable implements Serializable{
    private static final long serialVersionUID = 4338079192223741443L;

    private List<Entry> entries;

    private List<Entry> selected;

    public class Entry implements Serializable {
        private static final long serialVersionUID = 910001136636503766L;

        private String name;

        Entry() {}
        Entry(String name) { this.name = name; }

        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
    }

    @PostConstruct
    public void init() {
        this.entries = new ArrayList<>();
        this.entries.add(new Entry("Miriam"));
        this.entries.add(new Entry("Dennis"));
        this.entries.add(new Entry("Dexter"));
        this.entries.add(new Entry("Michelle"));
        this.entries.add(new Entry("Frank"));
        this.entries.add(new Entry("Kurt"));
    }

    public void rowSelectCheckbox(SelectEvent se) {}
    public void rowUnselectCheckbox(UnselectEvent use) {}

    public void toggleSelected(ToggleSelectEvent tse) {
        RequestContext rc = RequestContext.getCurrentInstance();

        if(tse.isSelected()) {
            rc.execute("PF('myWidget').selectAllRows();");
            setSelected(new ArrayList<>(getEntries()));
        } else {
            rc.execute("PF('myWidget').unselectAllRows();");
            setSelected(new ArrayList<>());
        }
    }

    public List<Entry> getEntries() { return entries; }
    public void setEntries(List<Entry> entries) { this.entries = entries; }
    public List<Entry> getSelected() { return selected; }
    public void setSelected(List<Entry> selected) { this.selected = selected; }
}

About this issue

  • Original URL
  • State: closed
  • Created 6 years ago
  • Comments: 16 (14 by maintainers)

Commits related to this issue

Most upvoted comments

yep exactly