Browse Source

Fix duplicate grid column visibility change event (#11565)

* Fix duplicate grid column visibility change event

Toggle a column visibility through UI will fire 2 event. There should be only 1.

* Add Test
tags/8.9.0.alpha1
cuong-phan 5 years ago
parent
commit
2b1f9fac34

+ 2
- 1
server/src/main/java/com/vaadin/ui/Grid.java View File

@@ -697,8 +697,9 @@ public class Grid<T> extends AbstractListing<T> implements HasComponents,
@Override
public void columnVisibilityChanged(String internalId, boolean hidden) {
Column<T, ?> column = getColumnByInternalId(internalId);
column.checkColumnIsAttached();
if (column.isHidden() != hidden) {
column.setHidden(hidden);
column.getState().hidden = hidden;
fireColumnVisibilityChangeEvent(column, hidden, true);
}
}

+ 64
- 0
uitest/src/main/java/com/vaadin/tests/components/grid/GridEventSentOnColumnVisibilityChange.java View File

@@ -0,0 +1,64 @@
package com.vaadin.tests.components.grid;

import java.util.Arrays;
import java.util.List;

import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUIWithLog;
import com.vaadin.ui.Grid;

public class GridEventSentOnColumnVisibilityChange
extends AbstractTestUIWithLog {

@Override
protected void setup(VaadinRequest request) {
List<Person> people = Arrays.asList(
new Person("Nicolaus Copernicus", 1543),
new Person("Galileo Galilei", 1564),
new Person("Johannes Kepler", 1571));

Grid<Person> grid = new Grid<>();

grid.setItems(people);
grid.addColumn(Person::getName).setId("name").setCaption("Name")
.setHidable(true);
grid.addColumn(Person::getBirthYear).setCaption("Year of birth")
.setHidable(true);

grid.setSizeFull();

grid.addColumnVisibilityChangeListener(
event -> log("UserOriginated: " + event.isUserOriginated()));

addComponent(grid);
}

private class Person {
private final String name;
private final int birthYear;

public Person(String name, int birthYear) {
this.name = name;
this.birthYear = birthYear;
}

public String getName() {
return name;
}

public int getBirthYear() {
return birthYear;
}
}

@Override
public String getDescription() {
return "Every time when the user changes the visibility of the column,"
+ " there should have only one event sent";
}

@Override
protected Integer getTicketNumber() {
return 11419;
}
}

+ 39
- 0
uitest/src/test/java/com/vaadin/tests/components/grid/GridEventSentOnColumnVisibilityChangeTest.java View File

@@ -0,0 +1,39 @@
package com.vaadin.tests.components.grid;

import java.util.List;

import org.junit.Assert;
import org.junit.Test;
import org.openqa.selenium.WebElement;

import com.vaadin.testbench.By;
import com.vaadin.testbench.elements.GridElement;
import com.vaadin.tests.tb3.SingleBrowserTest;

public class GridEventSentOnColumnVisibilityChangeTest extends SingleBrowserTest {

@Test
public void changeVisibilityAssertLog() {
openTestURL();

GridElement grid = $(GridElement.class).first();
getSidebarOpenButton(grid).click();
// hide the first column
getSidebarPopup().findElements(By.tagName("td")).get(0).click();
Assert.assertTrue("Log content should match",
"1. UserOriginated: true".equals(getLogRow(0)));
}

protected WebElement getSidebarOpenButton(GridElement grid) {
List<WebElement> elements = grid
.findElements(By.className("v-grid-sidebar-button"));
return elements.isEmpty() ? null : elements.get(0);
}

protected WebElement getSidebarPopup() {
List<WebElement> elements = findElements(
By.className("v-grid-sidebar-popup"));
return elements.isEmpty() ? null : elements.get(0);
}
}

Loading…
Cancel
Save