Skip to content

Commit 7da1246

Browse files
committed
fix #910 SelectionPlugin: MultiSelectHeader checkbox should get unchecked if not all table entries are checked
1 parent 4335c72 commit 7da1246

File tree

1 file changed

+24
-15
lines changed

1 file changed

+24
-15
lines changed

domino-ui/src/main/java/org/dominokit/domino/ui/datatable/plugins/selection/SelectionPlugin.java

+24-15
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import static java.util.Objects.nonNull;
2222
import static org.dominokit.domino.ui.datatable.DataTableStyles.dui_datatable_row_selected;
2323
import static org.dominokit.domino.ui.forms.FormsStyles.dui_form_select_check_box;
24-
import static org.dominokit.domino.ui.utils.Domino.*;
2524

2625
import elemental2.dom.Element;
2726
import elemental2.dom.HTMLElement;
@@ -34,6 +33,7 @@
3433
import jsinterop.base.Js;
3534
import org.dominokit.domino.ui.datatable.*;
3635
import org.dominokit.domino.ui.datatable.events.OnBeforeDataChangeEvent;
36+
import org.dominokit.domino.ui.datatable.events.TableDataUpdatedEvent;
3737
import org.dominokit.domino.ui.datatable.events.TableEvent;
3838
import org.dominokit.domino.ui.datatable.plugins.DataTablePlugin;
3939
import org.dominokit.domino.ui.forms.CheckBox;
@@ -58,6 +58,7 @@ public class SelectionPlugin<T> implements DataTablePlugin<T> {
5858
private DataTable<T> datatable;
5959
private List<T> oldSelection = new ArrayList<>();
6060
private boolean retainSelectionOnDataChange = false;
61+
private CheckBox headerCheckBox;
6162

6263
/** Creates a new `SelectionPlugin` with default settings. */
6364
public SelectionPlugin() {}
@@ -300,8 +301,8 @@ private void deselectRow(DataTable<T> dataTable, TableRow<T> tableRow) {
300301
* @return The selection indicator element for a multi-selection header.
301302
*/
302303
private HTMLElement createMultiSelectHeader(DataTable<T> dataTable) {
303-
CheckBox checkBox = createCheckBox(Optional.empty());
304-
checkBox.addChangeListener(
304+
headerCheckBox = createCheckBox(Optional.empty());
305+
headerCheckBox.addChangeListener(
305306
(oldValue, checked) -> {
306307
if (checked) {
307308
dataTable.selectAll(selectionCondition);
@@ -312,20 +313,24 @@ private HTMLElement createMultiSelectHeader(DataTable<T> dataTable) {
312313

313314
dataTable.addSelectionDeselectionListener(
314315
(source, selectedRows) -> {
315-
long selectableCount =
316-
dataTable.getRows().stream()
317-
.filter(tableRow -> selectionCondition.isAllowSelection(dataTable, tableRow))
318-
.count();
319-
if (selectedRows.size() > 0 && selectedRows.size() < selectableCount) {
320-
checkBox.indeterminate();
321-
} else if (selectedRows.size() == selectableCount) {
322-
checkBox.check(true);
323-
} else if (selectedRows.isEmpty()) {
324-
checkBox.uncheck(true);
325-
}
316+
updateHeaderCheckBox(selectedRows);
326317
});
327318

328-
return checkBox.element();
319+
return headerCheckBox.element();
320+
}
321+
322+
private void updateHeaderCheckBox(List<TableRow<T>> selectedRows) {
323+
long selectableCount =
324+
this.datatable.getRows().stream()
325+
.filter(tableRow -> selectionCondition.isAllowSelection(this.datatable, tableRow))
326+
.count();
327+
if (selectedRows.size() > 0 && selectedRows.size() < selectableCount) {
328+
headerCheckBox.indeterminate();
329+
} else if (selectedRows.size() == selectableCount) {
330+
headerCheckBox.check(true);
331+
} else if (selectedRows.isEmpty()) {
332+
headerCheckBox.uncheck(true);
333+
}
329334
}
330335

331336
/**
@@ -402,6 +407,10 @@ public void handleEvent(TableEvent event) {
402407
this.oldSelection = this.datatable.getSelectedRecords();
403408
}
404409
}
410+
411+
if (TableDataUpdatedEvent.DATA_UPDATED.equals(event.getType())) {
412+
updateHeaderCheckBox(this.datatable.getSelectedItems());
413+
}
405414
}
406415

407416
/**

0 commit comments

Comments
 (0)