Browse Source

Refresh DataProvider only once when reordering the grid using GridRowDragger (#11981)

Fixes #10844
tags/8.11.0.beta1
Martín López 4 years ago
parent
commit
4786732d33
No account linked to committer's email address

+ 5
- 1
server/src/main/java/com/vaadin/ui/components/grid/GridRowDragger.java View File

@@ -381,7 +381,11 @@ public class GridRowDragger<T> implements Serializable {
}

sourceItems.removeAll(droppedItems);
listDataProvider.refreshAll();

// if reordering the same grid, DataProvider's refresh will be done later
if (getGridDragSource().getGrid() != getGridDropTarget().getGrid()) {
listDataProvider.refreshAll();
}
}

private void handleTargetGridDrop(GridDropEvent<T> event, final int index,

+ 20
- 0
server/src/test/java/com/vaadin/tests/server/component/grid/GridRowDraggerOneGridTest.java View File

@@ -127,6 +127,26 @@ public class GridRowDraggerOneGridTest {
verifyDataProvider("1", "2", "0");
}

@Test
public void listDataProvider_calledOnlyOnce() {

final int[] times = new int[1];

source.setItems("0", "1", "2");

source.getDataProvider().addDataProviderListener(ev -> times[0]++);

dragger.setDropIndexCalculator(event -> {
return Integer.MAX_VALUE;
});

drop("1", DropLocation.ABOVE, "0");

verifyDataProvider("1", "2", "0");

Assert.assertArrayEquals("DataProvider should be invoked only once", new int[] { 1 }, times);
}

@Test
public void noopSourceUpdater() {
source.setItems("0", "1", "2");

Loading…
Cancel
Save