Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix rendering of TreeGrid's frozen columns after hierarchy-column reset #12028

Merged
merged 2 commits into from
Jun 18, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion client/src/main/java/com/vaadin/client/widgets/Grid.java
Original file line number Diff line number Diff line change
Expand Up @@ -7416,7 +7416,15 @@ private int getVisibleFrozenColumnCount() {

// for the escalator the hidden columns are not in the frozen column
// count, but for grid they are. thus need to convert the index
for (int i = 0; i < frozenColumnCount; i++) {
int limit = getFrozenColumnCount();
if (getSelectionColumn().isPresent()) {
// If the grid is in MultiSelect mode, getColumn(0) in the following
// for loop returns the selection column. Accordingly, verifying
// which frozen columns are visible if the selection column is
// present should take this fact into account.
limit++;
}
for (int i = 0; i < limit; i++) {
if (i >= getColumnCount() || getColumn(i).isHidden()) {
numberOfColumns--;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package com.vaadin.tests.components.treegrid;

import com.vaadin.data.TreeData;
import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.Grid;
import com.vaadin.ui.Label;
import com.vaadin.ui.TreeGrid;

public class TreeGridChangeHierarchyColumn extends AbstractTestUI {

@Override
protected String getTestDescription() {
return "TreeGrid in MultiSelect mode should take hiden columns into account when"
+ " rendering frozen columns after hierarchy-column reset.";
}

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

@Override
protected void setup(VaadinRequest request) {
TreeGrid<String> treeGrid = new TreeGrid<>();
treeGrid.setId("TreeGrid");

for (int i = 0; i < 20; i++) {
String columnId = String.valueOf(i);
Grid.Column<String, Component> column = addColumn(treeGrid,
columnId);
column.setCaption(columnId);
column.setId(columnId);
}

TreeData<String> data = treeGrid.getTreeData();
data.addItem(null, "child");
data.addItem("child", "grandChild");

treeGrid.setHierarchyColumn(treeGrid.getColumns().get(0));

Button hideHierCol = new Button("Hide Hierarchy Column");
hideHierCol.addClickListener(e -> {
treeGrid.getHierarchyColumn().setHidden(true);
});
hideHierCol.setId("hideHierColButton");

Button setHierCol = new Button("Set new Hierarchy Column");
setHierCol.addClickListener(e -> {
treeGrid.getColumns().stream().filter(column -> !column.isHidden())
.findFirst().ifPresent(col -> {
treeGrid.setHierarchyColumn(col.getId());
});
});
setHierCol.setId("setHierColButton");

treeGrid.setSelectionMode(Grid.SelectionMode.MULTI);
treeGrid.setFrozenColumnCount(1);

addComponents(treeGrid, hideHierCol, setHierCol);
}

private Grid.Column<String, Component> addColumn(Grid<String> grid,
String columnId) {
return grid.addComponentColumn(val -> {
Label label = new Label(columnId);
label.setWidth(50, Unit.PIXELS);
return new CssLayout(label);
});
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.vaadin.tests.components.treegrid;

import static org.junit.Assert.assertEquals;
import java.util.List;

import org.junit.Test;
import org.openqa.selenium.WebElement;
import com.vaadin.testbench.By;
import com.vaadin.testbench.elements.ButtonElement;
import com.vaadin.testbench.elements.TreeGridElement;
import com.vaadin.tests.tb3.MultiBrowserTest;

public class TreeGridChangeHierarchyColumnTest extends MultiBrowserTest {

@Test
public void renderingFrozenColumnsShouldFactorInHiddenColumns() {
openTestURL();
waitForElementPresent(By.id("TreeGrid"));
waitForElementPresent(By.id("hideHierColButton"));
waitForElementPresent(By.id("setHierColButton"));

TreeGridElement treeGrid = $(TreeGridElement.class).id("TreeGrid");
ButtonElement hideHierCol = $(ButtonElement.class)
.id("hideHierColButton");
ButtonElement setHierCol = $(ButtonElement.class)
.id("setHierColButton");

hideHierCol.click();
setHierCol.click();

// Wait for the new hierarchy column to be rendered
waitForElementPresent(By.className("v-treegrid-expander"));

List<WebElement> frozenCells = treeGrid
.findElements(By.className("frozen"));

assertEquals("Only the MultiSelect column should have frozen cells.", 2,
frozenCells.size());
}
}