diff options
author | Adam Wagner <wbadam@users.noreply.github.com> | 2017-03-30 13:18:10 +0300 |
---|---|---|
committer | Henri Sara <henri.sara@gmail.com> | 2017-04-12 14:58:11 +0300 |
commit | 659313e8c35e68d14fe2599b9bbb4dbba35fb4a3 (patch) | |
tree | 17c1c3c9bcad4043c79c7499262f076a56c96374 /client | |
parent | 1ac4f9724106fcf4abaab892210122231710c6be (diff) | |
download | vaadin-framework-659313e8c35e68d14fe2599b9bbb4dbba35fb4a3.tar.gz vaadin-framework-659313e8c35e68d14fe2599b9bbb4dbba35fb4a3.zip |
Provide dragged Grid items in server side (#8950)
Fixes #8931
Diffstat (limited to 'client')
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. * |