From: Artur Signell Date: Mon, 10 Oct 2016 19:15:16 +0000 (+0300) Subject: Add Grid.refreshRows to allow refreshing individual rows (#16765) X-Git-Tag: 7.7.4~29 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=b3022c7f95ddca0a90ecfd8b9593941847a82998;p=vaadin-framework.git Add Grid.refreshRows to allow refreshing individual rows (#16765) Change-Id: I554d7b6ca60840bab3a032daa4847e7271086e27 --- diff --git a/server/src/main/java/com/vaadin/ui/Grid.java b/server/src/main/java/com/vaadin/ui/Grid.java index e7eed7725f..34826bf6ee 100644 --- a/server/src/main/java/com/vaadin/ui/Grid.java +++ b/server/src/main/java/com/vaadin/ui/Grid.java @@ -6670,6 +6670,22 @@ public class Grid extends AbstractFocusable implements SelectionNotifier, return itemId; } + /** + * Refreshes, i.e. causes the client side to re-render the rows with the + * given item ids. + *

+ * Calling this for a row which is not currently rendered on the client side + * has no effect. + * + * @param itemIds + * the item id(s) of the row to refresh. + */ + public void refreshRows(Object... itemIds) { + for (Object itemId : itemIds) { + datasourceExtension.updateRowData(itemId); + } + } + private static Logger getLogger() { return Logger.getLogger(Grid.class.getName()); } diff --git a/uitest/src/main/java/com/vaadin/tests/components/grid/GridRefreshRow.java b/uitest/src/main/java/com/vaadin/tests/components/grid/GridRefreshRow.java new file mode 100644 index 0000000000..0084e33360 --- /dev/null +++ b/uitest/src/main/java/com/vaadin/tests/components/grid/GridRefreshRow.java @@ -0,0 +1,118 @@ +package com.vaadin.tests.components.grid; + +import com.vaadin.annotations.Theme; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUIWithLog; +import com.vaadin.tests.util.Person; +import com.vaadin.tests.util.PersonContainer; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.CheckBox; +import com.vaadin.ui.Component; +import com.vaadin.ui.Grid; +import com.vaadin.ui.Grid.CellReference; +import com.vaadin.ui.Grid.CellStyleGenerator; +import com.vaadin.ui.Grid.RowReference; +import com.vaadin.ui.Grid.RowStyleGenerator; +import com.vaadin.ui.HorizontalLayout; + +@Theme("valo") +public class GridRefreshRow extends AbstractTestUIWithLog { + + private PersonContainer container; + private Grid grid; + + private boolean styles[] = new boolean[] { false, false, false }; + + @Override + protected void setup(VaadinRequest request) { + getPage().getStyles() + .add(".rowstyle td {background-color: lightgreen !important;}"); + getPage().getStyles() + .add("td.cellstyle {background-color: lightblue !important;}"); + container = PersonContainer.createWithTestData(100); + container.addNestedContainerBean("address"); + grid = new Grid(container); + grid.setWidth("800px"); + grid.setRowStyleGenerator(new RowStyleGenerator() { + @Override + public String getStyle(RowReference row) { + int index = container.indexOfId(row.getItemId()); + if (index < 3 && styles[index]) { + return "rowstyle"; + } + + return null; + } + }); + grid.setCellStyleGenerator(new CellStyleGenerator() { + @Override + public String getStyle(CellReference cell) { + int index = container.indexOfId(cell.getItemId()); + if (index < 3 && styles[index] + && "email".equals(cell.getPropertyId())) { + return "cellstyle"; + } + + return null; + } + }); + addComponent(grid); + + addComponents(new HorizontalLayout(update(0), update(1), update(2))); + Button refresh10 = new Button("Refresh 0-9", new ClickListener() { + @Override + public void buttonClick(ClickEvent event) { + grid.refreshRows(container.getItemIds(0, 9).toArray()); + } + }); + refresh10.setId("refresh10"); + addComponents(new HorizontalLayout(refresh(0), refresh(1), refresh(2), + new Button("Refresh non-existant", new ClickListener() { + @Override + public void buttonClick(ClickEvent event) { + grid.refreshRows("foobar"); + } + })), refresh10); + addComponents(new HorizontalLayout(style(0), style(1), style(2))); + } + + private Component style(final int i) { + final CheckBox checkBox = new CheckBox("Style for " + i); + checkBox.addValueChangeListener(new ValueChangeListener() { + @Override + public void valueChange(ValueChangeEvent event) { + styles[i] = checkBox.getValue(); + } + }); + checkBox.setId("style" + i); + return checkBox; + } + + private Component update(final int i) { + Button button = new Button("Update " + i, new ClickListener() { + @Override + public void buttonClick(ClickEvent event) { + Person p = container.getIdByIndex(i); + p.setFirstName("!" + p.getFirstName()); + } + }); + button.setId("update" + i); + return button; + } + + protected Component refresh(final int i) { + Button button = new Button("Refresh row " + i, new ClickListener() { + @Override + public void buttonClick(ClickEvent event) { + grid.refreshRows(container.getIdByIndex(i)); + } + }); + button.setId("refresh" + i); + return button; + } + +} diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/GridRefreshRowTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/GridRefreshRowTest.java new file mode 100644 index 0000000000..3b1e2b9c88 --- /dev/null +++ b/uitest/src/test/java/com/vaadin/tests/components/grid/GridRefreshRowTest.java @@ -0,0 +1,73 @@ +package com.vaadin.tests.components.grid; + +import org.junit.Assert; +import org.junit.Test; + +import com.vaadin.testbench.elements.ButtonElement; +import com.vaadin.testbench.elements.CheckBoxElement; +import com.vaadin.testbench.elements.GridElement; +import com.vaadin.tests.tb3.SingleBrowserTest; + +public class GridRefreshRowTest extends SingleBrowserTest { + + private GridElement grid; + + @Test + public void refreshRow() { + openTestURL(); + grid = $(GridElement.class).first(); + update(0); + update(1); + update(2); + style(1); + style(2); + + Assert.assertEquals("Lisa", grid.getCell(0, 1).getText()); + Assert.assertEquals("Joshua", grid.getCell(1, 1).getText()); + Assert.assertEquals("Marge", grid.getCell(2, 1).getText()); + + Assert.assertFalse(hasCssClass(grid.getRow(0), "rowstyle")); + Assert.assertFalse(hasCssClass(grid.getRow(1), "rowstyle")); + Assert.assertFalse(hasCssClass(grid.getRow(2), "rowstyle")); + Assert.assertFalse(hasCssClass(grid.getCell(0, 0), "cellstyle")); + Assert.assertFalse(hasCssClass(grid.getCell(1, 0), "cellstyle")); + Assert.assertFalse(hasCssClass(grid.getCell(2, 0), "cellstyle")); + + refresh(1); + Assert.assertEquals("Lisa", grid.getCell(0, 1).getText()); + Assert.assertEquals("!Joshua", grid.getCell(1, 1).getText()); + Assert.assertEquals("Marge", grid.getCell(2, 1).getText()); + + Assert.assertFalse(hasCssClass(grid.getRow(0), "rowstyle")); + Assert.assertTrue(hasCssClass(grid.getRow(1), "rowstyle")); + Assert.assertFalse(hasCssClass(grid.getRow(2), "rowstyle")); + Assert.assertFalse(hasCssClass(grid.getCell(0, 0), "cellstyle")); + Assert.assertTrue(hasCssClass(grid.getCell(1, 0), "cellstyle")); + Assert.assertFalse(hasCssClass(grid.getCell(2, 0), "cellstyle")); + + // Assert refreshing works many times and for many rows at the same time + update(0); + update(1); + update(2); + refresh10First(); + Assert.assertEquals("!!Lisa", grid.getCell(0, 1).getText()); + Assert.assertEquals("!!Joshua", grid.getCell(1, 1).getText()); + Assert.assertEquals("!!Marge", grid.getCell(2, 1).getText()); + } + + private void refresh10First() { + $(ButtonElement.class).id("refresh10").click(); + } + + private void update(int i) { + $(ButtonElement.class).id("update" + i).click(); + } + + private void style(int i) { + $(CheckBoxElement.class).id("style" + i).click(); + } + + private void refresh(int i) { + $(ButtonElement.class).id("refresh" + i).click(); + } +}