Skip to content
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
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,18 @@
import com.vaadin.flow.dom.ClassList;
import com.vaadin.flow.dom.Element;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.AbstractSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.experimental.Delegate;
import org.apache.commons.lang3.StringUtils;

Expand Down Expand Up @@ -121,24 +124,54 @@ protected String getSelectorTemplate() {

}

private static final Method AbstractCell_getColumn;

static {
Method method = null;
try {
Class<?> AbstractCell =
Class.forName("com.vaadin.flow.component.grid.AbstractRow$AbstractCell");
method = AbstractCell.getDeclaredMethod("getColumn");
method.setAccessible(true);
} catch (ClassNotFoundException | NoSuchMethodException e) {
// Will use cell identity; keep field null.
}

AbstractCell_getColumn = method;
}

private abstract class CellSelector<ROW, CELL> implements SelectorSupplier {

@Getter
// AbstractColumn (or CELL if reflection is not available)
private final Object column;

CellSelector(CELL cell) {
column = Objects.requireNonNull(getColumn(cell));
}

@SneakyThrows
protected final Object getColumn(CELL cell) {
if (AbstractCell_getColumn != null) {
return AbstractCell_getColumn.invoke(cell);
} else {
return cell;
}
}

protected abstract RowSelector<ROW> getRowSelector();

protected abstract CELL getCell(ROW row, Column<?> c);

protected abstract CELL getCell();

private int getColumnIndex() {
ROW row = getRowSelector().getRow();
int j = -1;

CELL last = null;
CELL target = getCell();
Object last = null;
Object target = getColumn();
for (Column<?> c : helper.getGrid().getColumns()) {
if (c.isVisible()) {
CELL curr = getCell(row, c);
Object curr = getColumn(getCell(row, c));
if (curr != last) {
++j;
last = curr;
Expand Down Expand Up @@ -167,14 +200,11 @@ protected String getSelectorTemplate() {

private final class HeaderCellSelector extends CellSelector<HeaderRow, HeaderCell> {

@Getter
final HeaderCell cell;

@Getter
final HeaderRowSelector rowSelector;

public HeaderCellSelector(HeaderCell cell) {
this.cell = cell;
super(cell);
for (HeaderRow row : helper.getGrid().getHeaderRows()) {
if (row.getCells().contains(cell)) {
rowSelector = new HeaderRowSelector(row);
Expand All @@ -194,14 +224,11 @@ protected HeaderCell getCell(HeaderRow row, Column<?> c) {

private final class FooterCellSelector extends CellSelector<FooterRow, FooterCell> {

@Getter
final FooterCell cell;

@Getter
final FooterRowSelector rowSelector;

public FooterCellSelector(FooterCell cell) {
this.cell = cell;
super(cell);
for (FooterRow row : helper.getGrid().getFooterRows()) {
if (row.getCells().contains(cell)) {
rowSelector = new FooterRowSelector(row);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,6 @@ public interface HeaderCellWrapper extends GridStylesHelper, RmiRemote { }

HeaderRowWrapper getRow(int rowIndex);

void setColumnOrder(int... columnIndexes);

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
package com.flowingcode.vaadin.addons.gridhelpers.it;

import static org.junit.Assert.assertEquals;
import com.flowingcode.vaadin.addons.gridhelpers.it.HeaderFooterStylesCallables.HeaderCellWrapper;
import com.flowingcode.vaadin.addons.gridhelpers.it.HeaderFooterStylesCallables.HeaderRowWrapper;
import com.flowingcode.vaadin.testbench.rpc.HasRpcSupport;
import com.vaadin.flow.component.grid.testbench.GridElement;
Expand Down Expand Up @@ -61,4 +62,18 @@ public void testHeaderClassesApplied() {
}
}

@Test
public void testHeaderCellMutability() {
// https://github.com/FlowingCode/GridHelpers/issues/134
// setColumnOrder and join reuse existing HeaderCell instances
HeaderRowWrapper row0 = $server.getRow(0);
HeaderCellWrapper header0 = row0.join(0, 1);
HeaderCellWrapper header1 = row0.join(2, 3);
$server.setColumnOrder(2, 3, 0, 1, 4);
header0.setClassName("row0-cell0");
header1.setClassName("row0-cell1");
assertEquals("row0-cell1", grid.getHeaderCell(0, 0).getAttribute("class"));
assertEquals("row0-cell0", grid.getHeaderCell(0, 1).getAttribute("class"));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import com.vaadin.flow.router.Route;
import elemental.json.JsonObject;
import elemental.json.JsonValue;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import lombok.RequiredArgsConstructor;
Expand All @@ -50,7 +51,8 @@ public HeaderFooterStylesView() {
getElement().getStyle().set("flex-grow", "1");
grid = new Grid<>();
for (int i = 0; i < 5; i++) {
grid.addColumn(x -> x).setHeader("col " + i);
String key = "col " + i;
grid.addColumn(x -> x).setHeader(key).setKey(key);
}
grid.prependHeaderRow();
add(grid);
Expand Down Expand Up @@ -108,4 +110,11 @@ public HeaderRowWrapper getRow(int rowIndex) {
return new HeaderRowWrapperImpl(row);
}

@Override
public void setColumnOrder(int... columnIndexes) {
List<Column<Integer>> columns = grid.getColumns();
grid.setColumnOrder(
IntStream.of(columnIndexes).mapToObj(columns::get).collect(Collectors.toList()));
}

}