/* * Copyright 2000-2016 Vaadin Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.vaadin.v7.tests.server.component.grid.declarative; import org.jsoup.nodes.Element; import org.jsoup.parser.Tag; import org.junit.Assert; import org.junit.Test; import com.vaadin.shared.ui.ContentMode; import com.vaadin.ui.Label; import com.vaadin.ui.declarative.DesignContext; import com.vaadin.v7.ui.Grid; import com.vaadin.v7.ui.Grid.Column; import com.vaadin.v7.ui.Grid.FooterRow; import com.vaadin.v7.ui.Grid.HeaderRow; public class GridHeaderFooterDeclarativeTest extends GridDeclarativeTestBase { @Test public void testSingleDefaultHeader() { //@formatter:off String design = "<vaadin7-grid><table>" + "<colgroup>" + " <col sortable property-id='Column1'>" + " <col sortable property-id='Column2'>" + " <col sortable property-id='Column3'>" + "</colgroup>" + "<thead>" + " <tr default><th plain-text>Column1<th plain-text>Column2<th plain-text>Column3</tr>" + "</thead>" + "</table></vaadin7-grid>"; //@formatter:on Grid grid = new Grid(); grid.addColumn("Column1", String.class); grid.addColumn("Column2", String.class); grid.addColumn("Column3", String.class); testWrite(design, grid); testRead(design, grid, true); } @Test public void testSingleDefaultHTMLHeader() { //@formatter:off String design = "<vaadin7-grid><table>" + "<colgroup>" + " <col sortable property-id='Column1'>" + " <col sortable property-id='Column2'>" + " <col sortable property-id='Column3'>" + "</colgroup>" + "<thead>" + " <tr default><th>Column1<th>Column2<th>Column3</tr>" + "</thead>" + "</table></vaadin7-grid>"; //@formatter:on Grid grid = new Grid(); grid.addColumn("Column1", String.class); grid.addColumn("Column2", String.class); grid.addColumn("Column3", String.class); HeaderRow row = grid.getDefaultHeaderRow(); for (Column c : grid.getColumns()) { row.getCell(c.getPropertyId()).setHtml(c.getHeaderCaption()); } testWrite(design, grid); testRead(design, grid, true); } @Test public void testNoHeaderRows() { //@formatter:off String design = "<vaadin7-grid><table>" + "<colgroup>" + " <col sortable property-id='Column1'>" + "</colgroup>" + "<thead />" + "</table></vaadin7-grid>"; //@formatter:on Grid grid = new Grid(); grid.addColumn("Column1", String.class); grid.removeHeaderRow(grid.getDefaultHeaderRow()); testWrite(design, grid); testRead(design, grid, true); } @Test public void testMultipleHeadersWithColSpans() { //@formatter:off String design = "<vaadin7-grid><table>" + "<colgroup>" + " <col sortable property-id='Column1'>" + " <col sortable property-id='Column2'>" + " <col sortable property-id='Column3'>" + "</colgroup>" + "<thead>" + " <tr><th colspan=3>Baz</tr>" + " <tr default><th>Column1<th>Column2<th>Column3</tr>" + " <tr><th>Foo<th colspan=2>Bar</tr>" + "</thead>" + "</table></vaadin7-grid>"; //@formatter:on Grid grid = new Grid(); grid.addColumn("Column1", String.class); grid.addColumn("Column2", String.class); grid.addColumn("Column3", String.class); HeaderRow row = grid.getDefaultHeaderRow(); for (Column c : grid.getColumns()) { row.getCell(c.getPropertyId()).setHtml(c.getHeaderCaption()); } grid.prependHeaderRow().join("Column1", "Column2", "Column3") .setHtml("Baz"); row = grid.appendHeaderRow(); row.getCell("Column1").setHtml("Foo"); row.join("Column2", "Column3").setHtml("Bar"); testWrite(design, grid); testRead(design, grid, true); } @Test public void testSingleDefaultFooter() { //@formatter:off String design = "<vaadin7-grid><table>" + "<colgroup>" + " <col sortable property-id='Column1'>" + " <col sortable property-id='Column2'>" + " <col sortable property-id='Column3'>" + "</colgroup>" + "<thead />" // No headers read or written + "<tfoot>" + " <tr><td plain-text>Column1<td plain-text>Column2<td plain-text>Column3</tr>" + "</tfoot>" + "</table></vaadin7-grid>"; //@formatter:on Grid grid = new Grid(); grid.addColumn("Column1", String.class); grid.addColumn("Column2", String.class); grid.addColumn("Column3", String.class); FooterRow row = grid.appendFooterRow(); for (Column c : grid.getColumns()) { row.getCell(c.getPropertyId()).setText(c.getHeaderCaption()); } grid.removeHeaderRow(grid.getDefaultHeaderRow()); testWrite(design, grid); testRead(design, grid, true); } @Test public void testSingleDefaultHTMLFooter() { //@formatter:off String design = "<vaadin7-grid><table>" + "<colgroup>" + " <col sortable property-id='Column1'>" + " <col sortable property-id='Column2'>" + " <col sortable property-id='Column3'>" + "</colgroup>" + "<thead />" // No headers read or written + "<tfoot>" + " <tr><td>Column1<td>Column2<td>Column3</tr>" + "</tfoot>" + "</table></vaadin7-grid>"; //@formatter:on Grid grid = new Grid(); grid.addColumn("Column1", String.class); grid.addColumn("Column2", String.class); grid.addColumn("Column3", String.class); FooterRow row = grid.appendFooterRow(); for (Column c : grid.getColumns()) { row.getCell(c.getPropertyId()).setHtml(c.getHeaderCaption()); } grid.removeHeaderRow(grid.getDefaultHeaderRow()); testWrite(design, grid); testRead(design, grid, true); } @Test public void testMultipleFootersWithColSpans() { //@formatter:off String design = "<vaadin7-grid><table>" + "<colgroup>" + " <col sortable property-id='Column1'>" + " <col sortable property-id='Column2'>" + " <col sortable property-id='Column3'>" + "</colgroup>" + "<thead />" // No headers read or written. + "<tfoot>" + " <tr><td colspan=3>Baz</tr>" + " <tr><td>Column1<td>Column2<td>Column3</tr>" + " <tr><td>Foo<td colspan=2>Bar</tr>" + "</tfoot>" + "</table></vaadin7-grid>"; //@formatter:on Grid grid = new Grid(); grid.addColumn("Column1", String.class); grid.addColumn("Column2", String.class); grid.addColumn("Column3", String.class); FooterRow row = grid.appendFooterRow(); for (Column c : grid.getColumns()) { row.getCell(c.getPropertyId()).setHtml(c.getHeaderCaption()); } grid.prependFooterRow().join("Column1", "Column2", "Column3") .setHtml("Baz"); row = grid.appendFooterRow(); row.getCell("Column1").setHtml("Foo"); row.join("Column2", "Column3").setHtml("Bar"); grid.removeHeaderRow(grid.getDefaultHeaderRow()); testWrite(design, grid); testRead(design, grid, true); } @Test public void testComponentInGridHeader() { //@formatter:off String design = "<vaadin7-grid><table>" + "<colgroup>" + " <col sortable property-id='Column1'>" + "</colgroup>" + "<thead>" + "<tr default><th><vaadin-label><b>Foo</b></vaadin-label></tr>" + "</thead>" + "</table></vaadin7-grid>"; //@formatter:on Label component = new Label("<b>Foo</b>"); component.setContentMode(ContentMode.HTML); Grid grid = new Grid(); grid.addColumn("Column1", String.class); grid.getDefaultHeaderRow().getCell("Column1").setComponent(component); testRead(design, grid, true); testWrite(design, grid); } @Test public void testComponentInGridFooter() { //@formatter:off String design = "<vaadin7-grid><table>" + "<colgroup>" + " <col sortable property-id='Column1'>" + "</colgroup>" + "<thead />" // No headers read or written + "<tfoot>" + "<tr><td><vaadin-label><b>Foo</b></vaadin-label></tr>" + "</tfoot>" + "</table></vaadin7-grid>"; //@formatter:on Label component = new Label("<b>Foo</b>"); component.setContentMode(ContentMode.HTML); Grid grid = new Grid(); grid.addColumn("Column1", String.class); grid.prependFooterRow().getCell("Column1").setComponent(component); grid.removeHeaderRow(grid.getDefaultHeaderRow()); testRead(design, grid, true); testWrite(design, grid); } @Test public void testHtmlEntitiesinGridHeaderFooter() { //@formatter:off String design = "<vaadin7-grid><table>" + "<colgroup>" + " <col sortable=\"true\" property-id=\"> test\">" + "</colgroup>" + "<thead>" + " <tr><th plain-text=\"true\">> Test</th></tr>" + "</thead>" + "<tfoot>" + " <tr><td plain-text=\"true\">> Test</td></tr>" + "</tfoot>" + "<tbody />" + "</table></vaadin7-grid>"; //@formatter:on Grid grid = read(design); String actualHeader = grid.getHeaderRow(0).getCell("> test").getText(); String actualFooter = grid.getFooterRow(0).getCell("> test").getText(); String expected = "> Test"; Assert.assertEquals(expected, actualHeader); Assert.assertEquals(expected, actualFooter); design = design.replace("plain-text=\"true\"", ""); grid = read(design); actualHeader = grid.getHeaderRow(0).getCell("> test").getHtml(); actualFooter = grid.getFooterRow(0).getCell("> test").getHtml(); expected = "> Test"; Assert.assertEquals(expected, actualHeader); Assert.assertEquals(expected, actualFooter); grid = new Grid(); grid.setColumns("test"); HeaderRow header = grid.addHeaderRowAt(0); FooterRow footer = grid.addFooterRowAt(0); grid.removeHeaderRow(grid.getDefaultHeaderRow()); // entities should be encoded when writing back, not interpreted as HTML header.getCell("test").setText("& Test"); footer.getCell("test").setText("& Test"); Element root = new Element(Tag.valueOf("vaadin7-grid"), ""); grid.writeDesign(root, new DesignContext()); Assert.assertEquals("&amp; Test", root.getElementsByTag("th").get(0).html()); Assert.assertEquals("&amp; Test", root.getElementsByTag("td").get(0).html()); header = grid.addHeaderRowAt(0); footer = grid.addFooterRowAt(0); // entities should not be encoded, this is already given as HTML header.getCell("test").setHtml("& Test"); footer.getCell("test").setHtml("& Test"); root = new Element(Tag.valueOf("vaadin7-grid"), ""); grid.writeDesign(root, new DesignContext()); Assert.assertEquals("& Test", root.getElementsByTag("th").get(0).html()); Assert.assertEquals("& Test", root.getElementsByTag("td").get(0).html()); } }