aboutsummaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorAdam Wagner <wbadam@users.noreply.github.com>2017-03-30 13:18:10 +0300
committerHenri Sara <henri.sara@gmail.com>2017-04-12 14:58:11 +0300
commit659313e8c35e68d14fe2599b9bbb4dbba35fb4a3 (patch)
tree17c1c3c9bcad4043c79c7499262f076a56c96374 /client
parent1ac4f9724106fcf4abaab892210122231710c6be (diff)
downloadvaadin-framework-659313e8c35e68d14fe2599b9bbb4dbba35fb4a3.tar.gz
vaadin-framework-659313e8c35e68d14fe2599b9bbb4dbba35fb4a3.zip
Provide dragged Grid items in server side (#8950)
Fixes #8931
Diffstat (limited to 'client')
-rw-r--r--client/src/main/java/com/vaadin/client/connectors/grid/GridDragSourceExtensionConnector.java74
-rw-r--r--client/src/main/java/com/vaadin/client/extensions/DragSourceExtensionConnector.java50
2 files changed, 106 insertions, 18 deletions
diff --git a/client/src/main/java/com/vaadin/client/connectors/grid/GridDragSourceExtensionConnector.java b/client/src/main/java/com/vaadin/client/connectors/grid/GridDragSourceExtensionConnector.java
index b31a2578eb..40eb80621c 100644
--- a/client/src/main/java/com/vaadin/client/connectors/grid/GridDragSourceExtensionConnector.java
+++ b/client/src/main/java/com/vaadin/client/connectors/grid/GridDragSourceExtensionConnector.java
@@ -19,7 +19,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
-import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.dom.client.TableRowElement;
import com.vaadin.client.ServerConnector;
import com.vaadin.client.extensions.DragSourceExtensionConnector;
@@ -29,15 +28,16 @@ import com.vaadin.client.widgets.Escalator;
import com.vaadin.client.widgets.Grid;
import com.vaadin.shared.Range;
import com.vaadin.shared.ui.Connect;
-import com.vaadin.shared.ui.dnd.DragSourceState;
+import com.vaadin.shared.ui.dnd.DropEffect;
+import com.vaadin.shared.ui.grid.GridDragSourceExtensionRpc;
import com.vaadin.shared.ui.grid.GridDragSourceExtensionState;
+import com.vaadin.shared.ui.grid.GridState;
import com.vaadin.ui.GridDragSourceExtension;
import elemental.events.Event;
import elemental.json.Json;
import elemental.json.JsonArray;
import elemental.json.JsonObject;
-import elemental.json.JsonValue;
/**
* Adds HTML5 drag and drop functionality to a {@link com.vaadin.client.widgets.Grid
@@ -53,6 +53,11 @@ public class GridDragSourceExtensionConnector extends
private GridConnector gridConnector;
+ /**
+ * List of dragged item keys.
+ */
+ private List<String> draggedItemKeys;
+
@Override
protected void extend(ServerConnector target) {
this.gridConnector = (GridConnector) target;
@@ -67,25 +72,66 @@ public class GridDragSourceExtensionConnector extends
@Override
protected void onDragStart(Event event) {
+
+ // Collect the keys of dragged rows
+ draggedItemKeys = getDraggedRows(event).stream()
+ .map(row -> row.getString(GridState.JSONKEY_ROWKEY))
+ .collect(Collectors.toList());
+
super.onDragStart(event);
+ }
+
+ @Override
+ protected String createDataTransferText(Event dragStartEvent) {
+ JsonArray dragData = toJsonArray(
+ getDraggedRows(dragStartEvent).stream().map(this::getDragData)
+ .collect(Collectors.toList()));
+ return dragData.toJson();
+ }
+
+ @Override
+ protected void sendDragStartEventToServer(Event dragStartEvent) {
+
+ // Start server RPC with dragged item keys
+ getRpcProxy(GridDragSourceExtensionRpc.class)
+ .dragStart(draggedItemKeys);
+ }
- if (event.getTarget() instanceof TableRowElement) {
- TableRowElement row = (TableRowElement) event.getTarget();
+ private List<JsonObject> getDraggedRows(Event dragStartEvent) {
+ List<JsonObject> draggedRows = new ArrayList<>();
+
+ if (dragStartEvent.getTarget() instanceof TableRowElement) {
+ TableRowElement row = (TableRowElement) dragStartEvent.getTarget();
int rowIndex = ((Escalator.AbstractRowContainer) getGridBody())
.getLogicalRowIndex(row);
JsonObject rowData = gridConnector.getDataSource().getRow(rowIndex);
- // Generate drag data. Dragged row or all the selected rows
- JsonValue dragData = dragMultipleRows(rowData) ? toJsonArray(
- getSelectedVisibleRows().stream().map(this::getDragData)
- .collect(Collectors.toList()))
- : getDragData(rowData);
-
- // Set drag data in DataTransfer object
- ((NativeEvent) event).getDataTransfer()
- .setData(DragSourceState.DATA_TYPE_TEXT, dragData.toJson());
+ if (dragMultipleRows(rowData)) {
+ getSelectedVisibleRows().forEach(draggedRows::add);
+ } else {
+ draggedRows.add(rowData);
+ }
}
+
+ return draggedRows;
+ }
+
+ @Override
+ protected void onDragEnd(Event event) {
+ super.onDragEnd(event);
+
+ // Clear item key list
+ draggedItemKeys = null;
+ }
+
+ @Override
+ protected void sendDragEndEventToServer(Event dragEndEvent,
+ DropEffect dropEffect) {
+
+ // Send server RPC with dragged item keys
+ getRpcProxy(GridDragSourceExtensionRpc.class)
+ .dragEnd(dropEffect, draggedItemKeys);
}
/**
diff --git a/client/src/main/java/com/vaadin/client/extensions/DragSourceExtensionConnector.java b/client/src/main/java/com/vaadin/client/extensions/DragSourceExtensionConnector.java
index 52c70b362b..cf7db05830 100644
--- a/client/src/main/java/com/vaadin/client/extensions/DragSourceExtensionConnector.java
+++ b/client/src/main/java/com/vaadin/client/extensions/DragSourceExtensionConnector.java
@@ -137,13 +137,41 @@ public class DragSourceExtensionConnector extends AbstractExtensionConnector {
// Set text data parameter
nativeEvent.getDataTransfer().setData(DragSourceState.DATA_TYPE_TEXT,
- getState().dataTransferText);
+ createDataTransferText(event));
// Initiate firing server side dragstart event when there is a
// DragStartListener attached on the server side
if (hasEventListener(DragSourceState.EVENT_DRAGSTART)) {
- getRpcProxy(DragSourceRpc.class).dragStart();
+ sendDragStartEventToServer(event);
}
+
+ // Stop event bubbling
+ nativeEvent.stopPropagation();
+ }
+
+ /**
+ * Creates data of type {@code "text"} for the {@code DataTransfer} object
+ * of the given event.
+ *
+ * @param dragStartEvent
+ * Event to set the data for.
+ * @return Textual data to be set for the event or {@literal null}.
+ */
+ protected String createDataTransferText(Event dragStartEvent) {
+ return getState().dataTransferText;
+ }
+
+ /**
+ * Initiates a server RPC for the drag start event.
+ * <p>
+ * This method is called only if there is a server side drag start event
+ * handler attached.
+ *
+ * @param dragStartEvent
+ * Client side dragstart event.
+ */
+ protected void sendDragStartEventToServer(Event dragStartEvent) {
+ getRpcProxy(DragSourceRpc.class).dragStart();
}
/**
@@ -162,12 +190,26 @@ public class DragSourceExtensionConnector extends AbstractExtensionConnector {
assert dropEffect != null : "Drop effect should never be null";
- getRpcProxy(DragSourceRpc.class)
- .dragEnd(DropEffect.valueOf(dropEffect.toUpperCase()));
+ sendDragEndEventToServer(event,
+ DropEffect.valueOf(dropEffect.toUpperCase()));
}
}
/**
+ * Initiates a server RPC for the drag end event.
+ *
+ * @param dragEndEvent
+ * Client side dragend event.
+ * @param dropEffect
+ * Drop effect of the dragend event, extracted from {@code
+ * DataTransfer.dropEffect} parameter.
+ */
+ protected void sendDragEndEventToServer(Event dragEndEvent,
+ DropEffect dropEffect) {
+ getRpcProxy(DragSourceRpc.class).dragEnd(dropEffect);
+ }
+
+ /**
* Finds the draggable element within the widget. By default, returns the
* topmost element.
*