summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorAdam Wagner <wbadam@users.noreply.github.com>2017-05-16 14:25:26 +0300
committerPekka Hyvönen <pekka@vaadin.com>2017-05-16 14:25:26 +0300
commit76a0e04cb056fe2c6e2ad62f6d0972b2347a0fcf (patch)
tree44920ce9ef58ac71e7d30aafb86874b84a572798 /client
parent37c4af2b27effe0de5f3f2e301a7d4179e7012f2 (diff)
downloadvaadin-framework-76a0e04cb056fe2c6e2ad62f6d0972b2347a0fcf.tar.gz
vaadin-framework-76a0e04cb056fe2c6e2ad62f6d0972b2347a0fcf.zip
Add API for multiple drag data generators (#9321)
* Add ability to set multiple drag data generators for any drag data type and change default to be accepted by spreadsheet applications such as Excel
Diffstat (limited to 'client')
-rw-r--r--client/src/main/java/com/vaadin/client/connectors/grid/GridDragSourceConnector.java67
-rw-r--r--client/src/main/java/com/vaadin/client/extensions/DragSourceExtensionConnector.java53
2 files changed, 68 insertions, 52 deletions
diff --git a/client/src/main/java/com/vaadin/client/connectors/grid/GridDragSourceConnector.java b/client/src/main/java/com/vaadin/client/connectors/grid/GridDragSourceConnector.java
index 175383af87..1a96c1ea66 100644
--- a/client/src/main/java/com/vaadin/client/connectors/grid/GridDragSourceConnector.java
+++ b/client/src/main/java/com/vaadin/client/connectors/grid/GridDragSourceConnector.java
@@ -16,7 +16,11 @@
package com.vaadin.client.connectors.grid;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
import java.util.stream.Collectors;
import com.google.gwt.animation.client.AnimationScheduler;
@@ -35,6 +39,7 @@ import com.vaadin.client.widget.escalator.RowContainer;
import com.vaadin.client.widget.grid.selection.SelectionModel;
import com.vaadin.client.widgets.Escalator;
import com.vaadin.client.widgets.Grid;
+import com.vaadin.server.SerializableFunction;
import com.vaadin.shared.Range;
import com.vaadin.shared.ui.Connect;
import com.vaadin.shared.ui.dnd.DragSourceState;
@@ -45,8 +50,6 @@ import com.vaadin.shared.ui.grid.GridState;
import com.vaadin.ui.components.grid.GridDragSource;
import elemental.events.Event;
-import elemental.json.Json;
-import elemental.json.JsonArray;
import elemental.json.JsonObject;
/**
@@ -199,10 +202,26 @@ public class GridDragSourceConnector extends DragSourceExtensionConnector {
}
@Override
- protected String createDataTransferText(NativeEvent dragStartEvent) {
- JsonArray dragData = toJsonArray(getDraggedRows(dragStartEvent).stream()
- .map(this::getDragData).collect(Collectors.toList()));
- return dragData.toJson();
+ protected Map<String, String> createDataTransferData(
+ NativeEvent dragStartEvent) {
+ Map<String, String> dataMap = super
+ .createDataTransferData(dragStartEvent);
+
+ // Add data provided by the generator functions
+ getDraggedRows(dragStartEvent).forEach(row -> {
+ Map<String, String> rowDragData = getRowDragData(row);
+ rowDragData.forEach((type, data) -> {
+ if (dataMap.containsKey(type)) {
+ dataMap.put(type, data);
+ } else {
+ // Separate data with new line character when multiple rows
+ // are dragged
+ dataMap.put(type, dataMap.get(type) + "\n" + data);
+ }
+ });
+ });
+
+ return dataMap;
}
@Override
@@ -309,31 +328,25 @@ public class GridDragSourceConnector extends DragSourceExtensionConnector {
}
/**
- * Converts a list of {@link JsonObject}s to a {@link JsonArray}.
+ * Gets drag data provided by the generator functions.
*
- * @param objects
- * List of json objects.
- * @return Json array containing all json objects.
+ * @param row
+ * The row data.
+ * @return The generated drag data type mapped to the corresponding drag
+ * data. If there are no generator functions, returns an empty map.
*/
- private JsonArray toJsonArray(List<JsonObject> objects) {
- JsonArray array = Json.createArray();
- for (int i = 0; i < objects.size(); i++) {
- array.set(i, objects.get(i));
+ private Map<String, String> getRowDragData(JsonObject row) {
+ // Collect a map of data types and data that is provided by the
+ // generator functions set for this drag source
+ if (row.hasKey(GridDragSourceState.JSONKEY_DRAG_DATA)) {
+ JsonObject dragData = row
+ .getObject(GridDragSourceState.JSONKEY_DRAG_DATA);
+ return Arrays.stream(dragData.keys()).collect(
+ Collectors.toMap(Function.identity(), dragData::get));
}
- return array;
- }
- /**
- * Gets drag data from the row data if exists or returns complete row data
- * otherwise.
- *
- * @param row
- * Row data.
- * @return Drag data if present or row data otherwise.
- */
- private JsonObject getDragData(JsonObject row) {
- return row.hasKey(GridDragSourceState.JSONKEY_DRAG_DATA)
- ? row.getObject(GridDragSourceState.JSONKEY_DRAG_DATA) : row;
+ // Otherwise return empty map
+ return Collections.emptyMap();
}
@Override
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 552ff151cd..7d79fb74dc 100644
--- a/client/src/main/java/com/vaadin/client/extensions/DragSourceExtensionConnector.java
+++ b/client/src/main/java/com/vaadin/client/extensions/DragSourceExtensionConnector.java
@@ -15,7 +15,7 @@
*/
package com.vaadin.client.extensions;
-import java.util.List;
+import java.util.LinkedHashMap;
import java.util.Map;
import com.google.gwt.animation.client.AnimationScheduler;
@@ -185,27 +185,25 @@ public class DragSourceExtensionConnector extends AbstractExtensionConnector {
// Set drag image
setDragImage(nativeEvent);
- // Set data parameters
- List<String> types = getState().types;
- Map<String, String> data = getState().data;
- for (String type : types) {
- nativeEvent.getDataTransfer().setData(type, data.get(type));
- }
+ // Create drag data
+ Map<String, String> dataMap = createDataTransferData(nativeEvent);
- // Always set something as the text data, or DnD won't work in FF !
- String dataTransferText = createDataTransferText(nativeEvent);
- if (dataTransferText == null) {
- dataTransferText = "";
- }
+ if (dataMap != null) {
+ // Always set something as the text data, or DnD won't work in FF !
+ dataMap.putIfAbsent(DragSourceState.DATA_TYPE_TEXT, "");
- // Override data type "text" when storing special data is needed
- nativeEvent.getDataTransfer()
- .setData(DragSourceState.DATA_TYPE_TEXT, dataTransferText);
+ // Set data to the event's data transfer
+ dataMap.forEach((type, data) -> nativeEvent.getDataTransfer()
+ .setData(type, data));
- // Initiate firing server side dragstart event when there is a
- // DragStartListener attached on the server side
- if (hasEventListener(DragSourceState.EVENT_DRAGSTART)) {
- sendDragStartEventToServer(nativeEvent);
+ // Initiate firing server side dragstart event when there is a
+ // DragStartListener attached on the server side
+ if (hasEventListener(DragSourceState.EVENT_DRAGSTART)) {
+ sendDragStartEventToServer(nativeEvent);
+ }
+ } else {
+ // If returned data map is null, cancel drag event
+ nativeEvent.preventDefault();
}
// Stop event bubbling
@@ -255,15 +253,20 @@ public class DragSourceExtensionConnector extends AbstractExtensionConnector {
}
/**
- * Creates data of type {@code "text"} for the {@code DataTransfer} object
- * of the given event.
+ * Creates the data map to be set as the {@code DataTransfer} object's data.
*
* @param dragStartEvent
- * Event to set the data for.
- * @return Textual data to be set for the event or {@literal null}.
+ * The drag start event
+ * @return The map from type to data, or {@code null} for not setting any
+ * data. Returning {@code null} will cancel the drag start.
*/
- protected String createDataTransferText(NativeEvent dragStartEvent) {
- return getState().data.get(DragSourceState.DATA_TYPE_TEXT);
+ protected Map<String, String> createDataTransferData(
+ NativeEvent dragStartEvent) {
+ Map<String, String> orderedData = new LinkedHashMap<>();
+ for (String type : getState().types) {
+ orderedData.put(type, getState().data.get(type));
+ }
+ return orderedData;
}
/**