0
votes

I have a problem with the selection model of a Primefaces 5.0 datatable. This selection model does not process deselection properly: Selection of rows adds these roles as expected to the list of selected rows. But a deselection has no influence on this list; deselected rows remains in it. Only deselecting all rows produces an empty list.

The following gives the definition of the datatable (reduced to relevant tags) - the data model is of type org.primefaces.model.LazyDataModel:

<p:dataTable id="cases" 
    widgetVar="cases"
    var="cases"
    value="#{casesController.dataModel}"
    selection="#{casesController.selectedCases}"
    selectionMode="multiple"
    />

There is a Javascript function used in that project which processes clicks on rows to select and deselect the rows.

onRowClick : function(event, rowElement, silent) {
    // Check if rowclick triggered this event not a clickable
    // element in row content
    if ($(event.target).is('td,span:not(.ui-c)')) {
        var row = $(rowElement),
            selected = row.hasClass('ui-state-highlight'),
            metaKey = event.metaKey || event.ctrlKey,
            shiftKey = event.shiftKey;
            mouseBtn = event.which;

        // unselect if already selected on leftClick/touch to enable
        // contextMenu to be shown on rightclick
        if (selected && mouseBtn == 1) {
            this.originRowIndex = row.index();
            this.cursorIndex = null;
            this.unselectRow(row, silent);
        } else {
            // unselect previous selection if this is single
            // selection or multiple one with no keys
            if (this.isSingleSelection()
                    || (this.isMultipleSelection() && event
                            && !metaKey && !shiftKey && this.cfg.rowSelectMode === 'new')) {
                this.unselectAllRows();
            }

            // range selection with shift key
            if (this.isMultipleSelection() && event && event.shiftKey) {
                this.selectRowsInRange(row);
            }
            // select current row
            else {
                this.originRowIndex = row.index();
                this.cursorIndex = null;
                this.selectRow(row, silent);
            }
        }
        PrimeFaces.clearSelection();
    }
}

Debugging this script shows that the branches are passed as expected. But it seems to me, that unSelectRow() is not the opposite of selectRow().

Adding a comment around the javascript function to use the original Primefaces function has no effect on my problem.

1
Debugging the GUI shows that to this point everything works as expected: $('#cases_selection').val() contains only the ids of selected row data and is refreshed also on deselecting. But why it is not send correctly to the backing bean?AnnetteC

1 Answers

0
votes

I finally found the solution. They had extended PrimeFaces implemenation and incompletely implemented some methods. The following thread helped me in solving the problem: p:dataTable selections are lost after paginating a LazyDataModel