Skip to content

Commit 9ecf02d

Browse files
javier-godoypaodb
authored andcommitted
fix: track columns instead of cells
Close #134
1 parent 63685b7 commit 9ecf02d

File tree

4 files changed

+67
-14
lines changed

4 files changed

+67
-14
lines changed

src/main/java/com/flowingcode/vaadin/addons/gridhelpers/HeaderFooterStylesHelper.java

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,18 @@
2929
import com.vaadin.flow.dom.ClassList;
3030
import com.vaadin.flow.dom.Element;
3131
import java.io.Serializable;
32+
import java.lang.reflect.Method;
3233
import java.util.AbstractSet;
3334
import java.util.ArrayList;
3435
import java.util.HashMap;
3536
import java.util.Iterator;
3637
import java.util.List;
3738
import java.util.Map;
39+
import java.util.Objects;
3840
import java.util.stream.Collectors;
3941
import lombok.Getter;
4042
import lombok.RequiredArgsConstructor;
43+
import lombok.SneakyThrows;
4144
import lombok.experimental.Delegate;
4245
import org.apache.commons.lang3.StringUtils;
4346

@@ -121,24 +124,54 @@ protected String getSelectorTemplate() {
121124

122125
}
123126

127+
private static final Method AbstractCell_getColumn;
128+
129+
static {
130+
Method method = null;
131+
try {
132+
Class<?> AbstractCell =
133+
Class.forName("com.vaadin.flow.component.grid.AbstractRow$AbstractCell");
134+
method = AbstractCell.getDeclaredMethod("getColumn");
135+
method.setAccessible(true);
136+
} catch (ClassNotFoundException | NoSuchMethodException e) {
137+
// Will use cell identity; keep field null.
138+
}
139+
140+
AbstractCell_getColumn = method;
141+
}
124142

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

145+
@Getter
146+
// AbstractColumn (or CELL if reflection is not available)
147+
private final Object column;
148+
149+
CellSelector(CELL cell) {
150+
column = Objects.requireNonNull(getColumn(cell));
151+
}
152+
153+
@SneakyThrows
154+
protected final Object getColumn(CELL cell) {
155+
if (AbstractCell_getColumn != null) {
156+
return AbstractCell_getColumn.invoke(cell);
157+
} else {
158+
return cell;
159+
}
160+
}
161+
127162
protected abstract RowSelector<ROW> getRowSelector();
128163

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

131-
protected abstract CELL getCell();
132-
133166
private int getColumnIndex() {
134167
ROW row = getRowSelector().getRow();
135168
int j = -1;
136169

137-
CELL last = null;
138-
CELL target = getCell();
170+
Object last = null;
171+
Object target = getColumn();
139172
for (Column<?> c : helper.getGrid().getColumns()) {
140173
if (c.isVisible()) {
141-
CELL curr = getCell(row, c);
174+
Object curr = getColumn(getCell(row, c));
142175
if (curr != last) {
143176
++j;
144177
last = curr;
@@ -167,14 +200,11 @@ protected String getSelectorTemplate() {
167200

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

170-
@Getter
171-
final HeaderCell cell;
172-
173203
@Getter
174204
final HeaderRowSelector rowSelector;
175205

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

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

197-
@Getter
198-
final FooterCell cell;
199-
200227
@Getter
201228
final FooterRowSelector rowSelector;
202229

203230
public FooterCellSelector(FooterCell cell) {
204-
this.cell = cell;
231+
super(cell);
205232
for (FooterRow row : helper.getGrid().getFooterRows()) {
206233
if (row.getCells().contains(cell)) {
207234
rowSelector = new FooterRowSelector(row);

src/test/java/com/flowingcode/vaadin/addons/gridhelpers/it/HeaderFooterStylesCallables.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,6 @@ public interface HeaderCellWrapper extends GridStylesHelper, RmiRemote { }
3434

3535
HeaderRowWrapper getRow(int rowIndex);
3636

37+
void setColumnOrder(int... columnIndexes);
38+
3739
}

src/test/java/com/flowingcode/vaadin/addons/gridhelpers/it/HeaderFooterStylesIT.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package com.flowingcode.vaadin.addons.gridhelpers.it;
2121

2222
import static org.junit.Assert.assertEquals;
23+
import com.flowingcode.vaadin.addons.gridhelpers.it.HeaderFooterStylesCallables.HeaderCellWrapper;
2324
import com.flowingcode.vaadin.addons.gridhelpers.it.HeaderFooterStylesCallables.HeaderRowWrapper;
2425
import com.flowingcode.vaadin.testbench.rpc.HasRpcSupport;
2526
import com.vaadin.flow.component.grid.testbench.GridElement;
@@ -61,4 +62,18 @@ public void testHeaderClassesApplied() {
6162
}
6263
}
6364

65+
@Test
66+
public void testHeaderCellMutability() {
67+
// https://github.com/FlowingCode/GridHelpers/issues/134
68+
// setColumnOrder and join reuse existing HeaderCell instances
69+
HeaderRowWrapper row0 = $server.getRow(0);
70+
HeaderCellWrapper header0 = row0.join(0, 1);
71+
HeaderCellWrapper header1 = row0.join(2, 3);
72+
$server.setColumnOrder(2, 3, 0, 1, 4);
73+
header0.setClassName("row0-cell0");
74+
header1.setClassName("row0-cell1");
75+
assertEquals("row0-cell1", grid.getHeaderCell(0, 0).getAttribute("class"));
76+
assertEquals("row0-cell0", grid.getHeaderCell(0, 1).getAttribute("class"));
77+
}
78+
6479
}

src/test/java/com/flowingcode/vaadin/addons/gridhelpers/it/HeaderFooterStylesView.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import com.vaadin.flow.router.Route;
3131
import elemental.json.JsonObject;
3232
import elemental.json.JsonValue;
33+
import java.util.List;
3334
import java.util.stream.Collectors;
3435
import java.util.stream.IntStream;
3536
import lombok.RequiredArgsConstructor;
@@ -50,7 +51,8 @@ public HeaderFooterStylesView() {
5051
getElement().getStyle().set("flex-grow", "1");
5152
grid = new Grid<>();
5253
for (int i = 0; i < 5; i++) {
53-
grid.addColumn(x -> x).setHeader("col " + i);
54+
String key = "col " + i;
55+
grid.addColumn(x -> x).setHeader(key).setKey(key);
5456
}
5557
grid.prependHeaderRow();
5658
add(grid);
@@ -108,4 +110,11 @@ public HeaderRowWrapper getRow(int rowIndex) {
108110
return new HeaderRowWrapperImpl(row);
109111
}
110112

113+
@Override
114+
public void setColumnOrder(int... columnIndexes) {
115+
List<Column<Integer>> columns = grid.getColumns();
116+
grid.setColumnOrder(
117+
IntStream.of(columnIndexes).mapToObj(columns::get).collect(Collectors.toList()));
118+
}
119+
111120
}

0 commit comments

Comments
 (0)