diff --git a/client/src/main/java/com/vaadin/client/connectors/grid/DetailsManagerConnector.java b/client/src/main/java/com/vaadin/client/connectors/grid/DetailsManagerConnector.java index f605329fd91..7e7389e65d0 100644 --- a/client/src/main/java/com/vaadin/client/connectors/grid/DetailsManagerConnector.java +++ b/client/src/main/java/com/vaadin/client/connectors/grid/DetailsManagerConnector.java @@ -702,6 +702,7 @@ private boolean refreshDetails(int rowIndex) { // updated, replace reference indexToDetailConnectorId.put(rowIndex, id); newOrUpdatedDetails = true; + getWidget().resetVisibleDetails(rowIndex); } } else { // new Details content, listeners will get attached to the connector diff --git a/client/src/main/java/com/vaadin/client/widget/escalator/RowContainer.java b/client/src/main/java/com/vaadin/client/widget/escalator/RowContainer.java index 1b05eeb488b..fc82bd87d76 100644 --- a/client/src/main/java/com/vaadin/client/widget/escalator/RowContainer.java +++ b/client/src/main/java/com/vaadin/client/widget/escalator/RowContainer.java @@ -85,6 +85,16 @@ void setSpacer(int rowIndex, double height) */ boolean spacerExists(int rowIndex); + /** + * Updates the spacer corresponding with the given rowIndex to currently + * provided contents. + * + * @since + * @param rowIndex + * the row index for the spacer in need of updating + */ + void resetSpacer(int rowIndex); + /** * Sets a new spacer updater. *
diff --git a/client/src/main/java/com/vaadin/client/widgets/Escalator.java b/client/src/main/java/com/vaadin/client/widgets/Escalator.java
index 31b439a6d8b..f48177fa84a 100644
--- a/client/src/main/java/com/vaadin/client/widgets/Escalator.java
+++ b/client/src/main/java/com/vaadin/client/widgets/Escalator.java
@@ -4964,6 +4964,11 @@ public boolean spacerExists(int rowIndex) {
return spacerContainer.spacerExists(rowIndex);
}
+ @Override
+ public void resetSpacer(int rowIndex) {
+ spacerContainer.resetSpacer(rowIndex);
+ }
+
@Override
public void setSpacerUpdater(SpacerUpdater spacerUpdater)
throws IllegalArgumentException {
@@ -6111,8 +6116,10 @@ public void setHeight(double height) {
root.getStyle().setHeight(height + defaultCellBorderBottomSize,
Unit.PX);
- // move the visible spacers getRow row onwards.
- shiftSpacerPositionsAfterRow(getRow(), heightDiff);
+ if (!delayRepositioning) {
+ // move the visible spacers getRow row onwards.
+ shiftSpacerPositionsAfterRow(getRow(), heightDiff);
+ }
/*
* If we're growing, we'll adjust the scroll size first, then
@@ -6178,7 +6185,7 @@ public void setHeight(double height) {
tBodyScrollTop + moveDiff);
verticalScrollbar.setScrollPosByDelta(moveDiff);
- } else {
+ } else if (!delayRepositioning) {
body.shiftRowPositions(getRow(), heightDiff);
}
@@ -6336,6 +6343,8 @@ public void onScroll(ScrollEvent event) {
/** Width of the spacers' decos. Calculated once then cached. */
private double spacerDecoWidth = 0.0D;
+ private boolean delayRepositioning = false;
+
public void setSpacer(int rowIndex, double height)
throws IllegalArgumentException {
@@ -6376,6 +6385,23 @@ public boolean isSpacer(Element row) {
return false;
}
+ void resetSpacer(int rowIndex) {
+ if (spacerExists(rowIndex)) {
+ delayRepositioning = true;
+ double oldHeight = getSpacer(rowIndex).getHeight();
+ removeSpacer(rowIndex);
+ // real height will be determined later
+ insertNewSpacer(rowIndex, 0);
+ // reposition content below this point to match lack of height,
+ // otherwise later repositioning will fail
+ if (oldHeight > 0) {
+ shiftSpacerPositionsAfterRow(rowIndex, -oldHeight);
+ body.shiftRowPositions(rowIndex, -oldHeight);
+ }
+ delayRepositioning = false;
+ }
+ }
+
@SuppressWarnings("boxing")
void scrollToSpacer(int spacerIndex, ScrollDestination destination,
int padding) {
diff --git a/client/src/main/java/com/vaadin/client/widgets/Grid.java b/client/src/main/java/com/vaadin/client/widgets/Grid.java
index 792fcc98b0b..d2b3860ef66 100755
--- a/client/src/main/java/com/vaadin/client/widgets/Grid.java
+++ b/client/src/main/java/com/vaadin/client/widgets/Grid.java
@@ -9661,6 +9661,17 @@ public boolean isDetailsVisible(int rowIndex) {
return visibleDetails.contains(Integer.valueOf(rowIndex));
}
+ /**
+ * Reset the details row with current contents.
+ *
+ * @since
+ * @param rowIndex
+ * the index of the row for which details should be reset
+ */
+ public void resetVisibleDetails(int rowIndex) {
+ escalator.getBody().resetSpacer(rowIndex);
+ }
+
/**
* Update details row height.
*
diff --git a/server/src/main/java/com/vaadin/ui/Grid.java b/server/src/main/java/com/vaadin/ui/Grid.java
index ec891396e9f..f84dbd40cbd 100644
--- a/server/src/main/java/com/vaadin/ui/Grid.java
+++ b/server/src/main/java/com/vaadin/ui/Grid.java
@@ -4997,7 +4997,17 @@ protected SerializableComparator