From 93e879afdf90c1593c7b99528b0e2e2220d7fab7 Mon Sep 17 00:00:00 2001 From: Pekka Hyvönen Date: Mon, 16 Mar 2015 15:26:56 +0200 Subject: Display button for opening sidebar in Grid when hidable columns #17023 Change-Id: I9dc1d5d8ede4984c2dd6f5fcc932bb987ce95dcb --- WebContent/VAADIN/themes/base/grid/grid.scss | 27 ++++ client/src/com/vaadin/client/widgets/Grid.java | 155 ++++++++++++++++++++- .../grid/basicfeatures/GridColumnHidingTest.java | 84 +++++++++++ .../client/grid/GridBasicClientFeaturesWidget.java | 7 +- 4 files changed, 265 insertions(+), 8 deletions(-) diff --git a/WebContent/VAADIN/themes/base/grid/grid.scss b/WebContent/VAADIN/themes/base/grid/grid.scss index 20f8478885..eb6e0112ad 100644 --- a/WebContent/VAADIN/themes/base/grid/grid.scss +++ b/WebContent/VAADIN/themes/base/grid/grid.scss @@ -52,6 +52,8 @@ $v-grid-editor-background-color: $v-grid-row-background-color !default; .#{$primaryStyleName}-tablewrapper { border: $v-grid-border; } + + // Column drag and drop elements .#{$primaryStyleName} .header-drag-table { border-spacing: 0; @@ -76,6 +78,31 @@ $v-grid-editor-background-color: $v-grid-row-background-color !default; } } } + + // Sidebar + + .#{$primaryStyleName}-sidebar { + position: absolute; + top: 1px; + right : 0; + + background-color: $v-grid-header-background-color; + border-left: $v-grid-header-border; + border-bottom: $v-grid-header-border; + z-index: 5; + + .#{$primaryStyleName}-sidebar-button { + height: $v-grid-header-row-height; + + &:after { + content: "\f0c9"; + font-family: FontAwesome, sans-serif; + font-size: $v-grid-header-font-size; + line-height: $v-grid-header-row-height; + padding: 0 $v-grid-cell-padding-horizontal; + } + } + } // Common cell styles diff --git a/client/src/com/vaadin/client/widgets/Grid.java b/client/src/com/vaadin/client/widgets/Grid.java index f7744d52ae..e84ea7d1f5 100644 --- a/client/src/com/vaadin/client/widgets/Grid.java +++ b/client/src/com/vaadin/client/widgets/Grid.java @@ -61,9 +61,12 @@ import com.google.gwt.user.client.Event.NativePreviewHandler; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; +import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HasEnabled; +import com.google.gwt.user.client.ui.HasHorizontalAlignment.HorizontalAlignmentConstant; import com.google.gwt.user.client.ui.HasWidgets; import com.google.gwt.user.client.ui.ResizeComposite; +import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.vaadin.client.BrowserInfo; import com.vaadin.client.DeferredWorker; @@ -74,6 +77,7 @@ import com.vaadin.client.renderers.ComplexRenderer; import com.vaadin.client.renderers.Renderer; import com.vaadin.client.renderers.WidgetRenderer; import com.vaadin.client.ui.SubPartAware; +import com.vaadin.client.ui.VButton; import com.vaadin.client.ui.dd.DragAndDropHandler; import com.vaadin.client.ui.dd.DragAndDropHandler.DragAndDropCallback; import com.vaadin.client.widget.escalator.Cell; @@ -2784,6 +2788,92 @@ public class Grid extends ResizeComposite implements } } + /** + * Sidebar displaying toggles for hidable columns and additional custom + * widgets. + * + * @since + */ + public static class Sidebar extends Composite { + + private final ClickHandler openCloseButtonHandler = new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + if (!open) { + open(); + } else { + close(); + } + } + }; + + private final VerticalPanel rootContainer; + + private final VButton openCloseButton; + + private boolean open; + + public Sidebar() { + rootContainer = new VerticalPanel(); + initWidget(rootContainer); + + openCloseButton = new VButton(); + openCloseButton.addClickHandler(openCloseButtonHandler); + + rootContainer.add(openCloseButton); + rootContainer + .setCellHorizontalAlignment( + openCloseButton, + HorizontalAlignmentConstant + .endOf(com.google.gwt.i18n.client.HasDirection.Direction.LTR)); + } + + /** + * Opens the sidebar if not yet opened. + * + * @since + */ + public void open() { + if (!open) { + addStyleName("opened"); + open = true; + } + } + + /** + * Closes the sidebar if not yet closed. + * + * @since + */ + public void close() { + if (open) { + removeStyleName("opened"); + open = false; + } + } + + /** + * Returns whether the sidebar is open or not. + *

+ * Note: The sidebar can be in "open state" but not actually + * visible inside grid. See {@link #isVisibleInGrid()}. + * + * @since + * @return true if open, false if not + */ + public boolean isOpen() { + return open; + } + + @Override + public void setStylePrimaryName(String styleName) { + super.setStylePrimaryName(styleName); + openCloseButton.setStylePrimaryName(styleName + "-button"); + } + + } + /** * Escalator used internally by grid to render the rows */ @@ -2793,6 +2883,8 @@ public class Grid extends ResizeComposite implements private final Footer footer = GWT.create(Footer.class); + private final Sidebar sidebar = GWT.create(Sidebar.class); + /** * List of columns in the grid. Order defines the visible order. */ @@ -3385,7 +3477,7 @@ public class Grid extends ResizeComposite implements private boolean hidden = false; - private boolean hideable = false; + private boolean hidable = false; private String headerCaption = ""; @@ -3699,13 +3791,13 @@ public class Grid extends ResizeComposite implements * programmatically using {@link #setHidden(boolean)}. * * @since - * @param hideable + * @param hidable * true if the user can hide this column, * false if not */ - public void setHideable(boolean hideable) { - this.hideable = hideable; - // TODO update whether sidebar/popup can be opened + public void setHidable(boolean hidable) { + this.hidable = hidable; + grid.updateSideBarVisibility(); } /** @@ -3719,8 +3811,8 @@ public class Grid extends ResizeComposite implements * @return true if the user can hide the column, * false if not */ - public boolean isHideable() { - return hideable; + public boolean isHidable() { + return hidable; } @Override @@ -4444,6 +4536,7 @@ public class Grid extends ResizeComposite implements super.setStylePrimaryName(style); escalator.setStylePrimaryName(style); editor.setStylePrimaryName(style); + sidebar.setStylePrimaryName(style + "-sidebar"); String rowStyle = getStylePrimaryName() + "-row"; rowHasDataStyleName = rowStyle + "-has-data"; @@ -6945,4 +7038,52 @@ public class Grid extends ResizeComposite implements public void recalculateColumnWidths() { autoColumnWidthsRecalculator.schedule(); } + + /** + * Setter for displaying the grid's {@link Sidebar}. The sidebar is visible + * automatically when there are {@link Column#setHidable(boolean) hidable + * columns}. + *

+ * Setting the sidebar visible doens't open it - it only shows the button + * for opening it. For opening and closing the sidebar use + * {@link Sidebar#open()} and {@link Sidebar#close()}. + * + * @since + * @param visible + * true for showing the sidebar, false + * for removing it + */ + public void setSidebarVisible(boolean visible) { + if ((sidebar.getParent() != null) != visible) { + if (visible) { + getElement().appendChild(sidebar.getElement()); + setParent(sidebar, this); + } else { + sidebar.getElement().removeFromParent(); + sidebar.removeFromParent(); + } + } + } + + /** + * Returns the sidebar for this grid. + * + * @since + * @return + */ + public Sidebar getSidebar() { + return sidebar; + } + + private void updateSideBarVisibility() { + boolean visible = false; + for (Column c : getColumns()) { + if (c.isHidable()) { + visible = true; + break; + } + } + setSidebarVisible(visible); + } + } diff --git a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridColumnHidingTest.java b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridColumnHidingTest.java index 6d38c25fb6..ba4468da2c 100644 --- a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridColumnHidingTest.java +++ b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridColumnHidingTest.java @@ -16,7 +16,12 @@ package com.vaadin.tests.components.grid.basicfeatures; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.util.List; import org.junit.Before; import org.junit.Test; @@ -127,6 +132,85 @@ public class GridColumnHidingTest extends GridBasicClientFeaturesTest { assertEquals(false, hidden); } + @Test + public void testColumnHidability_onTriggerColumnHidability_showsSidebarButton() { + WebElement sidebar = getSidebar(); + assertNull(sidebar); + + toggleHidableColumn(0); + + sidebar = getSidebar(); + assertNotNull(sidebar); + } + + @Test + public void testColumnHidability_triggeringColumnHidabilityWithSeveralColumns_showsAndHidesSiderbarButton() { + verifySidebarNotVisible(); + + toggleHidableColumn(3); + toggleHidableColumn(4); + + verifySidebarVisible(); + + toggleHidableColumn(3); + + verifySidebarVisible(); + + toggleHidableColumn(4); + + verifySidebarNotVisible(); + } + + @Test + public void testColumnHidability_clickingSidebarButton_opensClosesSidebar() { + toggleHidableColumn(0); + verifySidebarClosed(); + + getSidebarOpenButton().click(); + + verifySidebarOpened(); + + getSidebarOpenButton().click(); + + verifySidebarClosed(); + } + + private void verifySidebarOpened() { + WebElement sidebar = getSidebar(); + assertTrue(sidebar.getAttribute("class").contains("opened")); + } + + private void verifySidebarClosed() { + WebElement sidebar = getSidebar(); + assertFalse(sidebar.getAttribute("class").contains("opened")); + } + + private void verifySidebarNotVisible() { + WebElement sidebar = getSidebar(); + assertNull(sidebar); + } + + private void verifySidebarVisible() { + WebElement sidebar = getSidebar(); + assertNotNull(sidebar); + } + + private WebElement getSidebar() { + List elements = findElements(By.className("v-grid-sidebar")); + return elements.isEmpty() ? null : elements.get(0); + } + + private WebElement getSidebarOpenButton() { + List elements = findElements(By + .className("v-grid-sidebar-button")); + return elements.isEmpty() ? null : elements.get(0); + } + + private void toggleHidableColumn(int columnIndex) { + selectMenuPath("Component", "Columns", "Column " + columnIndex, + "Hidable"); + } + private void toggleHideColumn(int columnIndex) { selectMenuPath("Component", "Columns", "Column " + columnIndex, "Hidden"); diff --git a/uitest/src/com/vaadin/tests/widgetset/client/grid/GridBasicClientFeaturesWidget.java b/uitest/src/com/vaadin/tests/widgetset/client/grid/GridBasicClientFeaturesWidget.java index 9131a2bdbe..1db3eebea6 100644 --- a/uitest/src/com/vaadin/tests/widgetset/client/grid/GridBasicClientFeaturesWidget.java +++ b/uitest/src/com/vaadin/tests/widgetset/client/grid/GridBasicClientFeaturesWidget.java @@ -782,7 +782,12 @@ public class GridBasicClientFeaturesWidget extends column.setHidden(!column.isHidden()); } }, "Component", "Columns", "Column " + i); - + addMenuCommand("Hidable", new ScheduledCommand() { + @Override + public void execute() { + column.setHidable(!column.isHidable()); + } + }, "Component", "Columns", "Column " + i); addMenuCommand("auto", new ScheduledCommand() { @Override public void execute() { -- cgit v1.2.3 From 4e26f150752d29a015dec71dfcba186b19b7506a Mon Sep 17 00:00:00 2001 From: Pekka Hyvönen Date: Wed, 18 Mar 2015 14:37:56 +0200 Subject: Grid's columns hidable with toggles in the sidebar (#17023) There is know issue with hidden columns and reordering columns. Change-Id: If308c84aed5dd23c2c00cb38ed6bba41c6f1a28e --- client/src/com/vaadin/client/widgets/Grid.java | 233 +++++++++++--- .../basicfeatures/GridBasicClientFeaturesTest.java | 5 + .../grid/basicfeatures/GridColumnHidingTest.java | 337 +++++++++++++++++++-- .../grid/basicfeatures/GridColumnReorderTest.java | 4 - 4 files changed, 504 insertions(+), 75 deletions(-) diff --git a/client/src/com/vaadin/client/widgets/Grid.java b/client/src/com/vaadin/client/widgets/Grid.java index e84ea7d1f5..0238d4a1a0 100644 --- a/client/src/com/vaadin/client/widgets/Grid.java +++ b/client/src/com/vaadin/client/widgets/Grid.java @@ -66,6 +66,7 @@ import com.google.gwt.user.client.ui.HasEnabled; import com.google.gwt.user.client.ui.HasHorizontalAlignment.HorizontalAlignmentConstant; import com.google.gwt.user.client.ui.HasWidgets; import com.google.gwt.user.client.ui.ResizeComposite; +import com.google.gwt.user.client.ui.ToggleButton; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.vaadin.client.BrowserInfo; @@ -2791,6 +2792,11 @@ public class Grid extends ResizeComposite implements /** * Sidebar displaying toggles for hidable columns and additional custom * widgets. + *

+ * The button for opening the sidebar is automatically visible inside the + * grid, if it contains any column hiding options or custom widgets. The + * column hiding toggles and custom widgets become visible once the sidebar + * has been opened. * * @since */ @@ -2808,13 +2814,23 @@ public class Grid extends ResizeComposite implements } }; + /** + * Contains all the widgets which should be shown once the sidebar is + * opened + */ + private final List widgets = new ArrayList(); + private final VerticalPanel rootContainer; private final VButton openCloseButton; + private final Grid grid; + private boolean open; - public Sidebar() { + public Sidebar(Grid grid) { + this.grid = grid; + rootContainer = new VerticalPanel(); initWidget(rootContainer); @@ -2838,6 +2854,9 @@ public class Grid extends ResizeComposite implements if (!open) { addStyleName("opened"); open = true; + for (Widget w : widgets) { + rootContainer.add(w); + } } } @@ -2850,6 +2869,8 @@ public class Grid extends ResizeComposite implements if (open) { removeStyleName("opened"); open = false; + rootContainer.clear(); + rootContainer.add(openCloseButton); } } @@ -2866,12 +2887,158 @@ public class Grid extends ResizeComposite implements return open; } + /** + * Adds or moves the given widget to the end of the sidebar. + * + * @param widget + * the widget to add or move + */ + public void add(Widget widget) { + widgets.remove(widget); + widgets.add(widget); + if (open) { + rootContainer.add(widget); + } + updateVisibility(); + } + + /** + * Removes the given widget from the sidebar. + * + * @param widget + * the widget to remove + */ + public void remove(Widget widget) { + widgets.remove(widget); + if (open) { + rootContainer.remove(widget); + } + updateVisibility(); + } + + /** + * Inserts given widget to the given index inside the sidebar. If the + * widget is already in the sidebar, then it is moved to the new index. + *

+ * See + * {@link VerticalPanel#insert(com.google.gwt.user.client.ui.IsWidget, int)} + * for further details. + * + * @param widget + * the widget to insert + * @param beforeIndex + * 0-based index position for the widget. + */ + public void insert(Widget widget, int beforeIndex) { + widgets.remove(widget); + widgets.add(beforeIndex, widget); + if (open) { + // the first widget in the container is always the open button + rootContainer.insert(widget, beforeIndex + 1); + } + updateVisibility(); + } + @Override public void setStylePrimaryName(String styleName) { super.setStylePrimaryName(styleName); openCloseButton.setStylePrimaryName(styleName + "-button"); } + private void updateVisibility() { + final boolean hasWidgets = widgets.size() > 0; + final boolean isVisible = getParent() != null; + if (isVisible && !hasWidgets) { + getElement().removeFromParent(); + removeFromParent(); + } else if (!isVisible && hasWidgets) { + grid.getElement().appendChild(getElement()); + Grid.setParent(this, grid); + } + } + + } + + /** + * UI and functionality related to hiding columns with toggles in the + * sidebar. + */ + private final class ColumnHider extends VerticalPanel { + + ColumnHider() { + setStyleName("column-hiding-panel"); + } + + /** Map from columns to their hiding toggles, component might change */ + private HashMap, ToggleButton> columnToHidingToggleMap = new HashMap, ToggleButton>(); + + private void updateColumnHidable(final Column column) { + if (column.isHidable()) { + ToggleButton cb = columnToHidingToggleMap.get(column); + if (cb == null) { + cb = createToggle(column); + } + updateToggleValue(cb, column.isHidden()); + } else if (columnToHidingToggleMap.containsValue(column)) { + ((Widget) columnToHidingToggleMap.remove(column)) + .removeFromParent(); + } + updateTogglesOrder(); + updatePanelVisibility(); + } + + private ToggleButton createToggle(final Column column) { + ToggleButton toggle = new ToggleButton(column.headerCaption); + toggle.addStyleName("column-hiding-toggle"); + toggle.addValueChangeHandler(new ValueChangeHandler() { + + @Override + public void onValueChange(ValueChangeEvent event) { + column.setHidden(!event.getValue(), true); + } + }); + columnToHidingToggleMap.put(column, toggle); + return toggle; + } + + private void updateTogglesOrder() { + clear(); + for (Column c : getColumns()) { + if (c.isHidable()) { + add(columnToHidingToggleMap.get(c)); + } + } + } + + private void updatePanelVisibility() { + final boolean columnHidable = getWidgetCount() > 0; + // parent for the panel might be null sidebar is not open + final boolean columnTogglesPanelIsVisible = sidebar.widgets + .contains(this); + + if (columnHidable && !columnTogglesPanelIsVisible) { + sidebar.insert(this, 0); + } else if (!columnHidable && columnTogglesPanelIsVisible) { + sidebar.remove(this); + } + } + + private void updateToggleValue(Column column) { + if (column.isHidable()) { + updateToggleValue(columnToHidingToggleMap.get(column), + column.isHidden()); + } // else we can just ignore + } + + private void updateToggleValue(ToggleButton hasValue, boolean hidden) { + hasValue.setValue(!hidden, false); + hasValue.setStyleName("hidden", hidden); + } + + private void updateColumnHidingToggleCaption(Column column) { + columnToHidingToggleMap.get(column).setText(column.headerCaption); + } + } /** @@ -2883,7 +3050,7 @@ public class Grid extends ResizeComposite implements private final Footer footer = GWT.create(Footer.class); - private final Sidebar sidebar = GWT.create(Sidebar.class); + private final Sidebar sidebar = new Sidebar(this); /** * List of columns in the grid. Order defines the visible order. @@ -2963,6 +3130,8 @@ public class Grid extends ResizeComposite implements private boolean columnReorderingAllowed; + private ColumnHider columnHider = new ColumnHider(); + private DragAndDropHandler dndHandler = new DragAndDropHandler(); private AutoScroller autoScroller = new AutoScroller(this); @@ -3589,6 +3758,9 @@ public class Grid extends ResizeComposite implements HeaderRow row = grid.getHeader().getDefaultRow(); if (row != null) { row.getCell(this).setText(headerCaption); + if (isHidable()) { + grid.columnHider.updateColumnHidingToggleCaption(this); + } } } @@ -3756,6 +3928,10 @@ public class Grid extends ResizeComposite implements * to show */ public void setHidden(boolean hidden) { + setHidden(hidden, false); + } + + private void setHidden(boolean hidden, boolean userOriginated) { if (this.hidden != hidden) { if (hidden) { grid.escalator.getColumnConfiguration().removeColumns( @@ -3766,9 +3942,10 @@ public class Grid extends ResizeComposite implements grid.escalator.getColumnConfiguration().insertColumns( grid.getVisibleColumns().indexOf(this), 1); } + grid.columnHider.updateToggleValue(this); scheduleColumnWidthRecalculator(); this.grid.fireEvent(new ColumnVisibilityChangeEvent(this, - hidden, false)); + hidden, userOriginated)); } } @@ -3796,8 +3973,10 @@ public class Grid extends ResizeComposite implements * false if not */ public void setHidable(boolean hidable) { - this.hidable = hidable; - grid.updateSideBarVisibility(); + if (this.hidable != hidable) { + this.hidable = hidable; + grid.columnHider.updateColumnHidable(this); + } } /** @@ -6686,6 +6865,8 @@ public class Grid extends ResizeComposite implements row.calculateColspans(); } + columnHider.updateTogglesOrder(); + fireEvent(new ColumnReorderEvent()); } @@ -7039,51 +7220,17 @@ public class Grid extends ResizeComposite implements autoColumnWidthsRecalculator.schedule(); } - /** - * Setter for displaying the grid's {@link Sidebar}. The sidebar is visible - * automatically when there are {@link Column#setHidable(boolean) hidable - * columns}. - *

- * Setting the sidebar visible doens't open it - it only shows the button - * for opening it. For opening and closing the sidebar use - * {@link Sidebar#open()} and {@link Sidebar#close()}. - * - * @since - * @param visible - * true for showing the sidebar, false - * for removing it - */ - public void setSidebarVisible(boolean visible) { - if ((sidebar.getParent() != null) != visible) { - if (visible) { - getElement().appendChild(sidebar.getElement()); - setParent(sidebar, this); - } else { - sidebar.getElement().removeFromParent(); - sidebar.removeFromParent(); - } - } - } - /** * Returns the sidebar for this grid. + *

+ * The grid's sidebar shows the column hiding options for those columns that + * have been set as {@link Column#setHidable(boolean) hidable}. * * @since - * @return + * @return the sidebar widget for this grid */ public Sidebar getSidebar() { return sidebar; } - private void updateSideBarVisibility() { - boolean visible = false; - for (Column c : getColumns()) { - if (c.isHidable()) { - visible = true; - break; - } - } - setSidebarVisible(visible); - } - } diff --git a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridBasicClientFeaturesTest.java b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridBasicClientFeaturesTest.java index 8b4eb0e267..90b572cffe 100644 --- a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridBasicClientFeaturesTest.java +++ b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridBasicClientFeaturesTest.java @@ -98,4 +98,9 @@ public abstract class GridBasicClientFeaturesTest extends GridBasicFeaturesTest assertColumnHeader("HEADER (0," + indices[i] + ")", headers.get(i)); } } + + protected void toggleColumnReorder() { + selectMenuPath("Component", "State", "Column Reordering"); + } + } diff --git a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridColumnHidingTest.java b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridColumnHidingTest.java index ba4468da2c..87af43af12 100644 --- a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridColumnHidingTest.java +++ b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridColumnHidingTest.java @@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue; import java.util.List; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; @@ -43,12 +44,12 @@ public class GridColumnHidingTest extends GridBasicClientFeaturesTest { selectMenuPath("Component", "State", "Width", "1000px"); assertColumnHeaderOrder(0, 1, 2, 3, 4, 5, 6); - toggleHideColumn(0); + toggleHideColumnAPI(0); assertColumnHeaderOrder(1, 2, 3, 4, 5, 6); - toggleHideColumn(1); - toggleHideColumn(2); - toggleHideColumn(3); + toggleHideColumnAPI(1); + toggleHideColumnAPI(2); + toggleHideColumnAPI(3); assertColumnHeaderOrder(4, 5, 6, 7, 8); } @@ -57,19 +58,19 @@ public class GridColumnHidingTest extends GridBasicClientFeaturesTest { selectMenuPath("Component", "State", "Width", "1000px"); assertColumnHeaderOrder(0, 1, 2, 3, 4, 5, 6); - toggleHideColumn(0); + toggleHideColumnAPI(0); assertColumnHeaderOrder(1, 2, 3, 4, 5, 6); - toggleHideColumn(0); + toggleHideColumnAPI(0); assertColumnHeaderOrder(0, 1, 2, 3, 4, 5, 6); - toggleHideColumn(1); - toggleHideColumn(2); - toggleHideColumn(3); + toggleHideColumnAPI(1); + toggleHideColumnAPI(2); + toggleHideColumnAPI(3); assertColumnHeaderOrder(0, 4, 5, 6, 7, 8); - toggleHideColumn(1); - toggleHideColumn(2); + toggleHideColumnAPI(1); + toggleHideColumnAPI(2); assertColumnHeaderOrder(0, 1, 2, 4, 5, 6); } @@ -78,26 +79,26 @@ public class GridColumnHidingTest extends GridBasicClientFeaturesTest { selectMenuPath("Component", "State", "Width", "1000px"); assertColumnHeaderOrder(0, 1, 2, 3, 4, 5, 6); - toggleHideColumn(2); + toggleHideColumnAPI(2); assertColumnHeaderOrder(0, 1, 3, 4, 5, 6); - toggleHideColumn(2); + toggleHideColumnAPI(2); assertColumnHeaderOrder(0, 1, 2, 3, 4, 5, 6); - toggleHideColumn(2); + toggleHideColumnAPI(2); assertColumnHeaderOrder(0, 1, 3, 4, 5, 6); - toggleHideColumn(2); + toggleHideColumnAPI(2); assertColumnHeaderOrder(0, 1, 2, 3, 4, 5, 6); } @Test - public void testColumnHiding_onVisibilityChange_triggersClientSideEvent() { + public void testColumnHiding_changeVisibilityAPI_triggersClientSideEvent() { assertColumnHeaderOrder(0, 1, 2, 3, 4); selectMenuPath("Component", "Internals", "Listeners", "Add Column Visibility Change listener"); - toggleHideColumn(2); + toggleHideColumnAPI(2); assertColumnHeaderOrder(0, 1, 3, 4); WebElement webElement = findElement(By.id("columnvisibility")); @@ -115,7 +116,7 @@ public class GridColumnHidingTest extends GridBasicClientFeaturesTest { assertEquals(false, userOriginated); assertEquals(true, hidden); - toggleHideColumn(2); + toggleHideColumnAPI(2); assertColumnHeaderOrder(0, 1, 2, 3, 4); webElement = findElement(By.id("columnvisibility")); @@ -132,12 +133,55 @@ public class GridColumnHidingTest extends GridBasicClientFeaturesTest { assertEquals(false, hidden); } + @Test + public void testColumnHiding_changeVisibilityToggle_triggersClientSideEvent() { + assertColumnHeaderOrder(0, 1, 2, 3, 4); + selectMenuPath("Component", "Internals", "Listeners", + "Add Column Visibility Change listener"); + + toggleHidableColumnAPI(2); + clickSidebarOpenButton(); + getColumnHidingToggle(2).click(); + assertColumnHeaderOrder(0, 1, 3, 4); + + WebElement webElement = findElement(By.id("columnvisibility")); + int counter = Integer.parseInt(webElement.getAttribute("counter")); + int columnIndex = Integer.parseInt(webElement + .getAttribute("columnindex")); + boolean userOriginated = Boolean.parseBoolean(webElement + .getAttribute("useroriginated")); + boolean hidden = Boolean.parseBoolean(webElement + .getAttribute("ishidden")); + + assertNotNull("no event fired", webElement); + assertEquals(1, counter); + assertEquals(2, columnIndex); + assertEquals(true, userOriginated); + assertEquals(true, hidden); + + getColumnHidingToggle(2).click(); + assertColumnHeaderOrder(0, 1, 2, 3, 4); + + webElement = findElement(By.id("columnvisibility")); + counter = Integer.parseInt(webElement.getAttribute("counter")); + columnIndex = Integer.parseInt(webElement.getAttribute("columnIndex")); + userOriginated = Boolean.parseBoolean(webElement + .getAttribute("userOriginated")); + hidden = Boolean.parseBoolean(webElement.getAttribute("ishidden")); + + assertNotNull("no event fired", webElement); + assertEquals(2, counter); + assertEquals(2, columnIndex); + assertEquals(true, userOriginated); + assertEquals(false, hidden); + } + @Test public void testColumnHidability_onTriggerColumnHidability_showsSidebarButton() { WebElement sidebar = getSidebar(); assertNull(sidebar); - toggleHidableColumn(0); + toggleHidableColumnAPI(0); sidebar = getSidebar(); assertNotNull(sidebar); @@ -147,32 +191,248 @@ public class GridColumnHidingTest extends GridBasicClientFeaturesTest { public void testColumnHidability_triggeringColumnHidabilityWithSeveralColumns_showsAndHidesSiderbarButton() { verifySidebarNotVisible(); - toggleHidableColumn(3); - toggleHidableColumn(4); + toggleHidableColumnAPI(3); + toggleHidableColumnAPI(4); verifySidebarVisible(); - toggleHidableColumn(3); + toggleHidableColumnAPI(3); verifySidebarVisible(); - toggleHidableColumn(4); + toggleHidableColumnAPI(4); verifySidebarNotVisible(); } @Test public void testColumnHidability_clickingSidebarButton_opensClosesSidebar() { - toggleHidableColumn(0); + toggleHidableColumnAPI(0); verifySidebarClosed(); - getSidebarOpenButton().click(); + clickSidebarOpenButton(); verifySidebarOpened(); - getSidebarOpenButton().click(); + clickSidebarOpenButton(); + + verifySidebarClosed(); + } + + @Test + public void testColumnHidability_settingColumnHidable_showsToggleInSidebar() { + toggleHidableColumnAPI(0); + verifySidebarClosed(); + clickSidebarOpenButton(); + verifySidebarOpened(); + + verifyColumnHidingOption(0, false); + } + + @Test + public void testColumnHiding_hidingColumnWithToggle_works() { + assertColumnHeaderOrder(0, 1, 2, 3, 4); + toggleHidableColumnAPI(0); + verifySidebarClosed(); + clickSidebarOpenButton(); + verifySidebarOpened(); + verifyColumnHidingOption(0, false); + + getColumnHidingToggle(0).click(); + verifyColumnHidingOption(0, true); + assertColumnHeaderOrder(1, 2, 3, 4); + + getColumnHidingToggle(0).click(); + verifyColumnHidingOption(0, false); + assertColumnHeaderOrder(0, 1, 2, 3, 4); + } + + @Test + public void testColumnHiding_updatingHiddenWhileSidebarClosed_updatesToggleValue() { + toggleHidableColumnAPI(0); + toggleHidableColumnAPI(3); + toggleHideColumnAPI(3); + assertColumnHeaderOrder(0, 1, 2, 4); + verifySidebarClosed(); + + clickSidebarOpenButton(); + verifySidebarOpened(); + verifyColumnHidingOption(0, false); + verifyColumnHidingOption(3, true); + clickSidebarOpenButton(); verifySidebarClosed(); + + toggleHideColumnAPI(0); + toggleHideColumnAPI(3); + + clickSidebarOpenButton(); + verifySidebarOpened(); + verifyColumnHidingOption(0, true); + verifyColumnHidingOption(3, false); + + } + + @Test + public void testColumnHiding_hidingMultipleColumnsWithToggle_hidesColumns() { + assertColumnHeaderOrder(0, 1, 2, 3, 4); + + toggleHideColumnAPI(1); + toggleHidableColumnAPI(0); + toggleHidableColumnAPI(1); + toggleHidableColumnAPI(2); + toggleHidableColumnAPI(3); + toggleHidableColumnAPI(4); + verifySidebarClosed(); + assertColumnHeaderOrder(0, 2, 3, 4); + + clickSidebarOpenButton(); + verifySidebarOpened(); + verifyColumnHidingOption(0, false); + verifyColumnHidingOption(1, true); + verifyColumnHidingOption(2, false); + verifyColumnHidingOption(3, false); + verifyColumnHidingOption(4, false); + + // must be done in a funny order so that the header indexes won't break + // (because of data source uses counter) + getColumnHidingToggle(1).click(); + getColumnHidingToggle(2).click(); + getColumnHidingToggle(3).click(); + getColumnHidingToggle(4).click(); + getColumnHidingToggle(0).click(); + verifyColumnHidingOption(0, true); + verifyColumnHidingOption(1, false); + verifyColumnHidingOption(2, true); + verifyColumnHidingOption(3, true); + verifyColumnHidingOption(4, true); + + assertColumnHeaderOrder(1, 5, 6, 7); + + getColumnHidingToggle(0).click(); + getColumnHidingToggle(2).click(); + getColumnHidingToggle(1).click(); + verifyColumnHidingOption(0, false); + verifyColumnHidingOption(1, true); + verifyColumnHidingOption(2, false); + assertColumnHeaderOrder(0, 2, 5, 6); + } + + @Test + public void testColumnHidability_changingHidabilityWhenSidebarClosed_addsRemovesToggles() { + toggleHideColumnAPI(0); + toggleHideColumnAPI(4); + assertColumnHeaderOrder(1, 2, 3, 5); + toggleHidableColumnAPI(0); + toggleHidableColumnAPI(3); + toggleHidableColumnAPI(4); + verifySidebarClosed(); + + clickSidebarOpenButton(); + verifySidebarOpened(); + verifyColumnHidingOption(0, true); + verifyColumnHidingOption(3, false); + verifyColumnHidingOption(4, true); + + clickSidebarOpenButton(); + verifySidebarClosed(); + + toggleHidableColumnAPI(0); + toggleHidableColumnAPI(3); + + verifySidebarClosed(); + clickSidebarOpenButton(); + verifySidebarOpened(); + verifyColumnHidingOption(4, true); + + assertNull(getColumnHidingToggle(0)); + assertNull(getColumnHidingToggle(3)); + } + + @Test + public void testColumnHidability_togglingHidability_placesTogglesInRightOrder() { + toggleHidableColumnAPI(3); + toggleHidableColumnAPI(2); + clickSidebarOpenButton(); + + verifyColumnHidingTogglesOrder(2, 3); + + toggleHidableColumnAPI(1); + toggleHidableColumnAPI(2); + toggleHidableColumnAPI(6); + toggleHidableColumnAPI(0); + + verifyColumnHidingTogglesOrder(0, 1, 3, 6); + + clickSidebarOpenButton(); + + toggleHidableColumnAPI(2); + toggleHidableColumnAPI(4); + toggleHidableColumnAPI(7); + + clickSidebarOpenButton(); + + verifyColumnHidingTogglesOrder(0, 1, 2, 3, 4, 6, 7); + } + + @Test + public void testColumnHidability_reorderingColumns_updatesColumnToggleOrder() { + selectMenuPath("Component", "State", "Width", "1000px"); + toggleHidableColumnAPI(0); + toggleHidableColumnAPI(1); + toggleHidableColumnAPI(3); + toggleHidableColumnAPI(4); + clickSidebarOpenButton(); + verifyColumnHidingTogglesOrder(0, 1, 3, 4); + clickSidebarOpenButton(); + + toggleColumnReorder(); + dragAndDropColumnHeader(0, 3, 0, 5); + + assertColumnHeaderOrder(3, 0, 1, 2, 4); + clickSidebarOpenButton(); + verifyColumnHidingTogglesOrder(3, 0, 1, 4); + + clickSidebarOpenButton(); + dragAndDropColumnHeader(0, 1, 3, 100); + dragAndDropColumnHeader(0, 4, 0, 5); + dragAndDropColumnHeader(0, 3, 0, 5); + + assertColumnHeaderOrder(2, 4, 3, 1, 0); + clickSidebarOpenButton(); + verifyColumnHidingTogglesOrder(4, 3, 1, 0); + } + + // know issue, will be fixed in next patch + @Test + @Ignore + public void testColumnHidingAndReorder_reorderingOverHiddenColumns_orderIsKept() { + toggleColumnReorder(); + toggleHideColumnAPI(0); + assertColumnHeaderOrder(1, 2, 3, 4, 5); + + dragAndDropColumnHeader(0, 1, 0, 5); + assertColumnHeaderOrder(2, 1, 3, 4, 5); + + toggleHideColumnAPI(0); + assertColumnHeaderOrder(0, 2, 1, 3, 4, 5); + } + + private void verifyColumnHidingTogglesOrder(int... indices) { + WebElement sidebar = getSidebar(); + List elements = sidebar.findElements(By + .className("column-hiding-toggle")); + for (int i = 0; i < indices.length; i++) { + WebElement e = elements.get(i); + assertTrue(("Header (0," + indices[i] + ")").equalsIgnoreCase(e + .getText())); + } + } + + private void verifyColumnHidingOption(int columnIndex, boolean hidden) { + WebElement columnHidingToggle = getColumnHidingToggle(columnIndex); + assertEquals(hidden, + columnHidingToggle.getAttribute("class").contains("hidden")); } private void verifySidebarOpened() { @@ -206,12 +466,33 @@ public class GridColumnHidingTest extends GridBasicClientFeaturesTest { return elements.isEmpty() ? null : elements.get(0); } - private void toggleHidableColumn(int columnIndex) { + /** + * Returns the toggle inside the sidebar for hiding the column at the given + * index, or null if not found. + */ + private WebElement getColumnHidingToggle(int columnIndex) { + WebElement sidebar = getSidebar(); + List elements = sidebar.findElements(By + .className("column-hiding-toggle")); + for (WebElement e : elements) { + if (("Header (0," + columnIndex + ")") + .equalsIgnoreCase(e.getText())) { + return e; + } + } + return null; + } + + private void clickSidebarOpenButton() { + getSidebarOpenButton().click(); + } + + private void toggleHidableColumnAPI(int columnIndex) { selectMenuPath("Component", "Columns", "Column " + columnIndex, "Hidable"); } - private void toggleHideColumn(int columnIndex) { + private void toggleHideColumnAPI(int columnIndex) { selectMenuPath("Component", "Columns", "Column " + columnIndex, "Hidden"); } diff --git a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridColumnReorderTest.java b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridColumnReorderTest.java index 685c00bbbd..023c206825 100644 --- a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridColumnReorderTest.java +++ b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/GridColumnReorderTest.java @@ -601,10 +601,6 @@ public class GridColumnReorderTest extends GridBasicClientFeaturesTest { assertColumnHeaderOrder(1, 2, 0, 3, 4); } - private void toggleColumnReorder() { - selectMenuPath("Component", "State", "Column Reordering"); - } - private void toggleSortableColumn(int index) { selectMenuPath("Component", "Columns", "Column " + index, "Sortable"); } -- cgit v1.2.3