summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnna Koskinen <Ansku@users.noreply.github.com>2021-02-26 15:49:47 +0200
committerGitHub <noreply@github.com>2021-02-26 15:49:47 +0200
commitd336bfa5bf20b8187f498a9f41c04d706bbe2a28 (patch)
tree509c4bd77394a71dfa810ba40b3157538cd1fc55
parent551177326f6ae8c4ddd7d5b3ab3bb3311304cc0a (diff)
downloadvaadin-framework-d336bfa5bf20b8187f498a9f41c04d706bbe2a28.tar.gz
vaadin-framework-d336bfa5bf20b8187f498a9f41c04d706bbe2a28.zip
Merged column headers should work within declarative Grid. (#12206)
- null check to prevent NPE from the merged column headers - convert to internal columnIds for merge handling - use correct cell in merge handling - switch away from streams in merge handling for easier readability - regression test Fixes: #10464
-rw-r--r--server/src/main/java/com/vaadin/ui/Grid.java3
-rw-r--r--server/src/main/java/com/vaadin/ui/components/grid/StaticSection.java22
-rw-r--r--uitest/src/main/java/com/vaadin/tests/declarative/DeclarativeGrid.java65
-rw-r--r--uitest/src/test/java/com/vaadin/tests/declarative/DeclarativeGridTest.java19
4 files changed, 99 insertions, 10 deletions
diff --git a/server/src/main/java/com/vaadin/ui/Grid.java b/server/src/main/java/com/vaadin/ui/Grid.java
index 5d7534ae6a..dbde93b558 100644
--- a/server/src/main/java/com/vaadin/ui/Grid.java
+++ b/server/src/main/java/com/vaadin/ui/Grid.java
@@ -4762,7 +4762,8 @@ public class Grid<T> extends AbstractListing<T> implements HasComponents,
for (Column<T, ?> c : getColumns()) {
HeaderCell headerCell = getDefaultHeaderRow().getCell(c);
if (headerCell.getCellType() == GridStaticCellType.TEXT) {
- c.setCaption(headerCell.getText());
+ String text = headerCell.getText();
+ c.setCaption(text == null ? "" : text);
}
}
}
diff --git a/server/src/main/java/com/vaadin/ui/components/grid/StaticSection.java b/server/src/main/java/com/vaadin/ui/components/grid/StaticSection.java
index 29af8bfc6c..96e374253a 100644
--- a/server/src/main/java/com/vaadin/ui/components/grid/StaticSection.java
+++ b/server/src/main/java/com/vaadin/ui/components/grid/StaticSection.java
@@ -290,18 +290,22 @@ public abstract class StaticSection<ROW extends StaticSection.StaticRow<?>>
+ columnIdsString + "'");
}
- Stream.of(columnIds).forEach(this::addCell);
-
- Stream<String> idsStream = Stream.of(columnIds);
+ CELL cell;
if (colspan > 1) {
- CELL newCell = createCell();
- addMergedCell(createCell(),
- idsStream.collect(Collectors.toSet()));
- newCell.readDesign(element, designContext);
+ Set<String> columnGroup = new HashSet<>();
+ for (String columnId : columnIds) {
+ addCell(columnId);
+ // convert the public columnIds into internal columnIds
+ columnGroup.add(getCell(columnId).getColumnId());
+ }
+ cell = createCell();
+ addMergedCell(cell, columnGroup);
} else {
- idsStream.map(this::getCell).forEach(
- cell -> cell.readDesign(element, designContext));
+ String columnId = columnIds[0];
+ addCell(columnId);
+ cell = getCell(columnId);
}
+ cell.readDesign(element, designContext);
}
}
diff --git a/uitest/src/main/java/com/vaadin/tests/declarative/DeclarativeGrid.java b/uitest/src/main/java/com/vaadin/tests/declarative/DeclarativeGrid.java
new file mode 100644
index 0000000000..082d99b309
--- /dev/null
+++ b/uitest/src/main/java/com/vaadin/tests/declarative/DeclarativeGrid.java
@@ -0,0 +1,65 @@
+package com.vaadin.tests.declarative;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.ByteArrayInputStream;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.declarative.Design;
+import com.vaadin.ui.declarative.DesignContext;
+
+public class DeclarativeGrid extends AbstractTestUI {
+
+ private String design = "" + //
+ " <vaadin-grid>\n" + //
+ " <table>\n" + //
+ " <colgroup>\n" + //
+ " <col column-id=\"project\" sortable=\"false\">\n" + //
+ " <col column-id=\"status\" sortable=\"false\">\n" + //
+ " <col column-id=\"date\" sortable=\"false\">\n" + //
+ " </colgroup>\n" + //
+ " <thead>\n" + //
+ " <tr default>\n" + //
+ " <th plain-text column-ids=\"project,status\" " + //
+ " colspan=\"2\">Project and Status</th>\n" + //
+ " <th plain-text column-ids=\"date\">Date</th>\n" + //
+ " </tr>\n" + //
+ " </thead>\n" + //
+ " <tbody>\n" + //
+ " <tr item=\"project1\">\n" + //
+ " <td>Customer Project 1</td>\n" + //
+ " <td>OK</td>\n" + //
+ " <td>2020-12-31</td>\n" + //
+ " </tr>\n" + //
+ " <tr item=\"project2\">\n" + //
+ " <td>Customer Project 2</td>\n" + //
+ " <td>OK</td>\n" + //
+ " <td>2020-07-02</td>\n" + //
+ " </tr>\n" + //
+ " <tr item=\"project3\">\n" + //
+ " <td>Customer Project 3</td>\n" + //
+ " <td>OK</td>\n" + //
+ " <td>2019-10-01</td>\n" + //
+ " </tr>\n" + //
+ " </tbody>\n" + //
+ " </table>\n" + //
+ " </vaadin-grid>";
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ DesignContext dc = Design
+ .read(new ByteArrayInputStream(design.getBytes(UTF_8)), null);
+ addComponent(dc.getRootComponent());
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 10464;
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Merged column header should not cause an exception.";
+ }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/declarative/DeclarativeGridTest.java b/uitest/src/test/java/com/vaadin/tests/declarative/DeclarativeGridTest.java
new file mode 100644
index 0000000000..5babbae75b
--- /dev/null
+++ b/uitest/src/test/java/com/vaadin/tests/declarative/DeclarativeGridTest.java
@@ -0,0 +1,19 @@
+package com.vaadin.tests.declarative;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.GridElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class DeclarativeGridTest extends MultiBrowserTest {
+
+ @Test
+ public void testMergedHeaderCell() {
+ openTestURL();
+ waitForElementPresent(By.className("v-label"));
+ // ensure the grid gets loaded and has the merged header
+ GridElement grid = $(GridElement.class).first();
+ grid.getHeaderCellByCaption("Project and Status");
+ }
+}