Pārlūkot izejas kodu

HUE-5555 [core] Create a global drag&drop layer

Enrico Berti 9 gadi atpakaļ
vecāks
revīzija
752145d

+ 91 - 0
desktop/core/src/desktop/static/desktop/js/hue.utils.js

@@ -374,6 +374,97 @@ var huePubSub = (function () {
   };
 })();
 
+var hueDrop = (function () {
+  var draggableMeta = {};
+  huePubSub.subscribe('draggable.text.meta', function (meta) {
+    draggableMeta = meta;
+  });
+
+  return {
+    fromAssist: function (element, callback) {
+      if (typeof element === 'function' && !(element instanceof jQuery)) {
+        callback = element;
+      }
+      if (typeof element === 'string') {
+        element = $(element);
+      }
+      if (element.length > 0) {
+        element.droppable({
+          accept: '.draggableText',
+          drop: function (e, ui) {
+            var droppedText = ui.helper.text();
+            if (callback) {
+              callback({
+                text: ui.helper.text(),
+                meta: draggableMeta
+              });
+            }
+          }
+        });
+      }
+      else {
+        console.warn('hueDrop.fromAssist could not be attached to the element');
+      }
+    },
+    fromDesktop: function (element, callback, method) {
+      if (window.FileReader) {
+        if (typeof element === 'function' && !(element instanceof jQuery)) {
+          callback = element;
+        }
+        if (typeof element === 'string') {
+          element = $(element);
+        }
+
+        function handleFileSelect(e) {
+          e.stopPropagation();
+          e.preventDefault();
+          var dt = e.dataTransfer;
+          var files = dt.files;
+          for (var i = 0, f; f = files[i]; i++) {
+            var reader = new FileReader();
+            reader.onload = (function (file) {
+              return function (e) {
+                callback(e.target.result);
+              };
+            })(f);
+            switch (method) {
+              case 'arrayBuffer':
+                reader.readAsArrayBuffer(f);
+                break;
+              case 'binaryString':
+                reader.readAsBinaryString(f);
+                break;
+              case 'dataURL':
+                reader.readAsDataURL(f);
+                break;
+              default:
+                reader.readAsText(f);
+            }
+          }
+        }
+
+        function handleDragOver(e) {
+          e.stopPropagation();
+          e.preventDefault();
+          e.dataTransfer.dropEffect = 'copy';
+        }
+
+        if (element.length > 0) {
+          element[0].addEventListener('dragover', handleDragOver, false);
+          element[0].addEventListener('drop', handleFileSelect, false);
+        }
+        else {
+          console.warn('hueDrop.fromDesktop could not be attached to the element');
+        }
+
+      }
+      else {
+        console.warn('FileReader is not supported by your browser. Please consider upgrading to fully experience Hue!')
+      }
+    }
+  };
+})();
+
 var hueDebugTimer = (function () {
   var initialTime = null;
   var times = [];