Skip to content

Commit 71be4a3

Browse files
committed
feat: introduce generate data when hidden api
1 parent 9724293 commit 71be4a3

File tree

4 files changed

+351
-186
lines changed

4 files changed

+351
-186
lines changed

vaadin-grid-flow-parent/vaadin-grid-flow/src/main/java/com/vaadin/flow/component/grid/AbstractColumn.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,14 @@ public Grid<?> getGrid() {
7373
/**
7474
* {@inheritDoc}
7575
* <p>
76-
* Note that column related data is sent to the client side even if the
77-
* column is invisible. Use {@link Grid#removeColumn(Column)} to remove
78-
* column (or don't add the column all) and avoid sending extra data.
76+
* By default, every added column sends data to the client side regardless
77+
* of its visibility state. To avoid sending extra data, either remove the
78+
* column using {@link Grid#removeColumn(Column)} or use
79+
* {@link Column#setGenerateDataWhenHidden(boolean)}.
7980
* </p>
8081
*
8182
* @see Grid#removeColumn(Column)
83+
* @see Column#setGenerateDataWhenHidden(boolean)
8284
*/
8385
@Override
8486
public void setVisible(boolean visible) {

vaadin-grid-flow-parent/vaadin-grid-flow/src/main/java/com/vaadin/flow/component/grid/Grid.java

Lines changed: 114 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,13 @@ public static void setDefaultMultiSortPriority(MultiSortPriority priority) {
432432
/**
433433
* Server-side component for the {@code <vaadin-grid-column>} element.
434434
*
435+
* <p>
436+
* By default, every added column sends data to the client side regardless
437+
* of its visibility state. To avoid sending extra data, either remove the
438+
* column using {@link Grid#removeColumn(Column)} or use
439+
* {@link #setGenerateDataWhenHidden(boolean)}.
440+
* </p>
441+
*
435442
* @param <T>
436443
* type of the underlying grid this column is compatible with
437444
*/
@@ -443,6 +450,7 @@ public static class Column<T> extends AbstractColumn<Column<T>> {
443450
private String columnKey; // defined and used by the user
444451

445452
private boolean sortingEnabled;
453+
private boolean generateDataWhenHidden = true;
446454

447455
private Component editorComponent;
448456
private EditorRenderer<T> editorRenderer;
@@ -502,7 +510,8 @@ public Column(Grid<T> grid, String columnId, Renderer<T> renderer) {
502510
var conditionalDataGenerator = new DataGenerator<T>() {
503511
@Override
504512
public void generateData(T item, JsonObject jsonObject) {
505-
if (Column.this.isVisible()) {
513+
if (isGenerateDataWhenHidden()
514+
|| Column.this.isVisible()) {
506515
generator.generateData(item, jsonObject);
507516
}
508517
}
@@ -529,7 +538,9 @@ public void refreshData(T item) {
529538

530539
@Override
531540
public void setVisible(boolean visible) {
532-
boolean resetDataCommunicator = visible && !isVisible();
541+
// Data has to be generated for previously hidden columns
542+
boolean resetDataCommunicator = !isGenerateDataWhenHidden()
543+
&& visible && !isVisible();
533544
super.setVisible(visible);
534545
if (resetDataCommunicator) {
535546
getGrid().getDataCommunicator().reset();
@@ -926,6 +937,49 @@ public boolean isSortable() {
926937
return sortingEnabled;
927938
}
928939

940+
/**
941+
* Sets whether the data for this column should be generated and sent to
942+
* the client even when the column is hidden. By default, data for
943+
* hidden columns is generated and sent to the client.
944+
* <p>
945+
* Setting this property to {@code false} will prevent the data for this
946+
* column from being generated and sent to the client when the column is
947+
* hidden. Alternatively, you can remove the column using
948+
* {@link Grid#removeColumn(Column)} or avoid adding the column
949+
* altogether.
950+
* </p>
951+
*
952+
* @param generateDataWhenHidden
953+
* {@code true} to generate data even when the column is
954+
* hidden, {@code false} otherwise
955+
* @return this column
956+
*/
957+
public Column<T> setGenerateDataWhenHidden(
958+
boolean generateDataWhenHidden) {
959+
if (this.generateDataWhenHidden == generateDataWhenHidden) {
960+
return this;
961+
}
962+
// Data has to be generated for hidden columns.
963+
if (!isVisible() && generateDataWhenHidden
964+
&& !isGenerateDataWhenHidden()) {
965+
getGrid().getDataCommunicator().reset();
966+
}
967+
this.generateDataWhenHidden = generateDataWhenHidden;
968+
return this;
969+
}
970+
971+
/**
972+
* Returns whether the data for this column is generated and sent to the
973+
* client when the column is hidden. The default is {@code true}.
974+
*
975+
* @return {@code true} if data is generated even when the column is
976+
* hidden, {@code false} otherwise
977+
* @see #setGenerateDataWhenHidden(boolean)
978+
*/
979+
public boolean isGenerateDataWhenHidden() {
980+
return generateDataWhenHidden;
981+
}
982+
929983
/**
930984
* Sets a header text to the column.
931985
* <p>
@@ -1891,6 +1945,12 @@ protected GridArrayUpdater createDefaultArrayUpdater(
18911945
* see {@link #addColumn(Renderer)}.
18921946
* </p>
18931947
* <p>
1948+
* By default, every added column sends data to the client side regardless
1949+
* of its visibility state. To avoid sending extra data, either remove the
1950+
* column using {@link #removeColumn(Column)} or use
1951+
* {@link Column#setGenerateDataWhenHidden(boolean)}.
1952+
* </p>
1953+
* <p>
18941954
* <em>NOTE:</em> This method is a shorthand for
18951955
* {@link #addColumn(ValueProvider, BiFunction)}
18961956
* </p>
@@ -1918,6 +1978,12 @@ public Column<T> addColumn(ValueProvider<T, ?> valueProvider) {
19181978
* {@link #addComponentColumn(ValueProvider)}. For using build-in renderers,
19191979
* see {@link #addColumn(Renderer)}.
19201980
* </p>
1981+
* <p>
1982+
* By default, every added column sends data to the client side regardless
1983+
* of its visibility state. To avoid sending extra data, either remove the
1984+
* column using {@link #removeColumn(Column)} or use
1985+
* {@link Column#setGenerateDataWhenHidden(boolean)}.
1986+
* </p>
19211987
*
19221988
* @param valueProvider
19231989
* the value provider
@@ -1977,6 +2043,13 @@ private String formatValueToSendToTheClient(Object value) {
19772043
* built in renderers or using {@link LitRenderer}.
19782044
* </p>
19792045
*
2046+
* <p>
2047+
* By default, every added column sends data to the client side regardless
2048+
* of its visibility state. To avoid sending extra data, either remove the
2049+
* column using {@link #removeColumn(Column)} or use
2050+
* {@link Column#setGenerateDataWhenHidden(boolean)}.
2051+
* </p>
2052+
*
19802053
* @param componentProvider
19812054
* a value provider that will return a component for the given
19822055
* item
@@ -1999,6 +2072,13 @@ public <V extends Component> Column<T> addComponentColumn(
19992072
* automatically configured using the return type of the given
20002073
* {@link ValueProvider}.
20012074
*
2075+
* <p>
2076+
* By default, every added column sends data to the client side regardless
2077+
* of its visibility state. To avoid sending extra data, either remove the
2078+
* column using {@link #removeColumn(Column)} or use
2079+
* {@link Column#setGenerateDataWhenHidden(boolean)}.
2080+
* </p>
2081+
*
20022082
* @see Column#setComparator(ValueProvider)
20032083
* @see Column#setSortProperty(String...)
20042084
* @see #removeColumn(Column)
@@ -2033,6 +2113,12 @@ public <V extends Comparable<? super V>> Column<T> addColumn(
20332113
* or using {@link LitRenderer}.
20342114
* </p>
20352115
* <p>
2116+
* By default, every added column sends data to the client side regardless
2117+
* of its visibility state. To avoid sending extra data, either remove the
2118+
* column using {@link #removeColumn(Column)} or use
2119+
* {@link Column#setGenerateDataWhenHidden(boolean)}.
2120+
* </p>
2121+
* <p>
20362122
* <em>NOTE:</em> This method is a shorthand for
20372123
* {@link #addColumn(Renderer, BiFunction)}
20382124
* </p>
@@ -2065,6 +2151,12 @@ public Column<T> addColumn(Renderer<T> renderer) {
20652151
* {@link ComponentRenderer} is not as efficient as the built in renderers
20662152
* or using {@link LitRenderer}.
20672153
* </p>
2154+
* <p>
2155+
* By default, every added column sends data to the client side regardless
2156+
* of its visibility state. To avoid sending extra data, either remove the
2157+
* column using {@link #removeColumn(Column)} or use
2158+
* {@link Column#setGenerateDataWhenHidden(boolean)}.
2159+
* </p>
20682160
*
20692161
* @param renderer
20702162
* the renderer used to create the grid cell structure
@@ -2168,6 +2260,13 @@ protected BiFunction<Renderer<T>, String, Column<T>> getDefaultColumnFactory() {
21682260
* from a bean type with {@link #Grid(Class)}.
21692261
*
21702262
* <p>
2263+
* By default, every added column sends data to the client side regardless
2264+
* of its visibility state. To avoid sending extra data, either remove the
2265+
* column using {@link #removeColumn(Column)} or use
2266+
* {@link Column#setGenerateDataWhenHidden(boolean)}.
2267+
* </p>
2268+
*
2269+
* <p>
21712270
* <strong>Note:</strong> This method is a shorthand for
21722271
* {@link #addColumn(String, BiFunction)}
21732272
* </p>
@@ -2202,6 +2301,13 @@ public Column<T> addColumn(String propertyName) {
22022301
* <strong>Note:</strong> This method can only be used for a Grid created
22032302
* from a bean type with {@link #Grid(Class)}.
22042303
*
2304+
* <p>
2305+
* By default, every added column sends data to the client side regardless
2306+
* of its visibility state. To avoid sending extra data, either remove the
2307+
* column using {@link #removeColumn(Column)} or use
2308+
* {@link Column#setGenerateDataWhenHidden(boolean)}.
2309+
* </p>
2310+
*
22052311
* @see #addColumn(String)
22062312
* @see #removeColumn(Column)
22072313
*
@@ -2272,6 +2378,12 @@ private Object runPropertyValueGetter(PropertyDefinition<T, ?> property,
22722378
* <p>
22732379
* <strong>Note:</strong> This method can only be used for a Grid created
22742380
* from a bean type with {@link #Grid(Class)}.
2381+
* <p>
2382+
* By default, every added column sends data to the client side regardless
2383+
* of its visibility state. To avoid sending extra data, either remove the
2384+
* column using {@link #removeColumn(Column)} or use
2385+
* {@link Column#setGenerateDataWhenHidden(boolean)}.
2386+
* </p>
22752387
*
22762388
* @param propertyNames
22772389
* the property names of the new columns, not <code>null</code>

0 commit comments

Comments
 (0)