Browse Source

Scroll the parent if Grid has already scrolled to the end (#10700)

Fixes #9477
tags/8.4.0.alpha1
Anna Koskinen 6 years ago
parent
commit
31eba3b64b

+ 19
- 5
client/src/main/java/com/vaadin/client/widgets/Escalator.java View File

@@ -568,7 +568,6 @@ public class Escalator extends Widget
yMov.moveTouch(event);
xMov.validate(yMov);
yMov.validate(xMov);
event.getNativeEvent().preventDefault();
moveScrollFromEvent(escalator, xMov.delta, yMov.delta,
event.getNativeEvent());
}
@@ -620,21 +619,36 @@ public class Escalator extends Widget
final double deltaX, final double deltaY,
final NativeEvent event) {

boolean scrollPosXChanged = false;
boolean scrollPosYChanged = false;

if (!Double.isNaN(deltaX)) {
double oldScrollPosX = escalator.horizontalScrollbar
.getScrollPos();
escalator.horizontalScrollbar.setScrollPosByDelta(deltaX);
if (oldScrollPosX != escalator.horizontalScrollbar
.getScrollPos()) {
scrollPosXChanged = true;
}
}

if (!Double.isNaN(deltaY)) {
double oldScrollPosY = escalator.verticalScrollbar
.getScrollPos();
escalator.verticalScrollbar.setScrollPosByDelta(deltaY);
if (oldScrollPosY != escalator.verticalScrollbar
.getScrollPos()) {
scrollPosYChanged = true;
}
}

/*
* TODO: only prevent if not scrolled to end/bottom. Or no? UX team
* needs to decide.
* Only prevent if internal scrolling happened. If there's no more
* room to scroll internally, allow the event to pass further.
*/
final boolean warrantedYScroll = deltaY != 0
final boolean warrantedYScroll = deltaY != 0 && scrollPosYChanged
&& escalator.verticalScrollbar.showsScrollHandle();
final boolean warrantedXScroll = deltaX != 0
final boolean warrantedXScroll = deltaX != 0 && scrollPosXChanged
&& escalator.horizontalScrollbar.showsScrollHandle();
if (warrantedYScroll || warrantedXScroll) {
event.preventDefault();

+ 52
- 0
uitest/src/main/java/com/vaadin/tests/components/grid/GridScrollOuterLayoutAfterContents.java View File

@@ -0,0 +1,52 @@
package com.vaadin.tests.components.grid;

import java.util.stream.IntStream;

import com.vaadin.annotations.Widgetset;
import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.ui.grid.HeightMode;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.Grid;
import com.vaadin.ui.Panel;
import com.vaadin.ui.TextArea;
import com.vaadin.ui.VerticalLayout;

@Widgetset("com.vaadin.DefaultWidgetSet")
public class GridScrollOuterLayoutAfterContents extends AbstractTestUI {

@Override
protected void setup(VaadinRequest request) {
Grid<Integer> grid = new Grid<>();

// create column and fill rows
grid.addColumn(item -> "name" + item).setCaption("Name");
grid.addColumn(item -> "content" + item).setCaption("Content");
grid.setItems(IntStream.range(1, 21).boxed());

// set height mode and height
grid.setHeightMode(HeightMode.ROW);
grid.setHeightByRows(10);

VerticalLayout layout = new VerticalLayout(grid, new TextArea());
layout.setSpacing(true);
layout.setMargin(false);
layout.setSizeUndefined();

Panel panel = new Panel();
panel.setContent(layout);
panel.setHeight("200px");
panel.setWidthUndefined();

addComponent(panel);
}

@Override
protected String getTestDescription() {
return "Should be possible to scroll to the TextArea underneath the Grid even on mobile";
}

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

Loading…
Cancel
Save