MDL-22504 Improved drag and drop status message, fixed text dragged from firefox...
authorDavo Smith <git@davosmith.co.uk>
Thu, 17 May 2012 12:59:54 +0000 (13:59 +0100)
committerDavo Smith <git@davosmith.co.uk>
Thu, 17 May 2012 12:59:54 +0000 (13:59 +0100)
course/dndupload.js
course/dndupload.php
course/dnduploadlib.php
lang/en/moodle.php

index b0d35a3..3dbe326 100644 (file)
@@ -92,14 +92,12 @@ M.course_dndupload = {
             this.init_events(el);
         }, this);
 
-        var div = this.add_status_div();
-        div.setContent(M.util.get_string('dndworking', 'moodle'));
+        this.add_status_div();
     },
 
     /**
      * Add a div element to tell the user that drag and drop upload
      * is available (or to explain why it is not available)
-     * @return the DOM element to add messages to
      */
     add_status_div: function() {
         var div = document.createElement('div');
@@ -108,7 +106,34 @@ M.course_dndupload = {
         if (coursecontents) {
             coursecontents.insertBefore(div, coursecontents.firstChild);
         }
-        return this.Y.one(div);
+        div = this.Y.one(div);
+
+        var handlefile = (this.handlers.filehandlers.length > 0);
+        var handletext = false;
+        var handlelink = false;
+        var i;
+        for (i=0; i<this.handlers.types.length; i++) {
+            switch (this.handlers.types[i].identifier) {
+            case 'text':
+            case 'text/html':
+                handletext = true;
+                break;
+            case 'url':
+                handlelink = true;
+                break;
+            }
+        }
+        $msgident = 'dndworking';
+        if (handlefile) {
+            $msgident += 'file';
+        }
+        if (handletext) {
+            $msgident += 'text';
+        }
+        if (handlelink) {
+            $msgident += 'link';
+        }
+        div.setContent(M.util.get_string($msgident, 'moodle'));
     },
 
     /**
@@ -176,14 +201,7 @@ M.course_dndupload = {
      */
     types_includes: function(e, type) {
         var i;
-        if (e._event.dataTransfer === null) {
-            // TODO MDL-33054: If we get here then something has gone wrong.
-            return false;
-        }
         var types = e._event.dataTransfer.types;
-        if (types == null) {
-            return false;
-        }
         for (i=0; i<types.length; i++) {
             if (types[i] == type) {
                 return true;
@@ -204,6 +222,18 @@ M.course_dndupload = {
      *           }
      */
     drag_type: function(e) {
+        // Check there is some data attached.
+        if (e._event.dataTransfer === null) {
+            return false;
+        }
+        if (e._event.dataTransfer.types === null) {
+            return false;
+        }
+        if (e._event.dataTransfer.types.length == 0) {
+            return false;
+        }
+
+        // Check for files first.
         if (this.types_includes(e, 'Files')) {
             if (this.handlers.filehandlers.length == 0) {
                 return false; // No available file handlers - ignore this drag.
@@ -216,7 +246,7 @@ M.course_dndupload = {
             };
         }
 
-        // Check each of the registered types
+        // Check each of the registered types.
         var types = this.handlers.types;
         for (var i=0; i<types.length; i++) {
             // Check each of the different identifiers for this type
@@ -401,6 +431,7 @@ M.course_dndupload = {
         resel.div.appendChild(resel.a);
 
         resel.icon.src = M.util.image_url('i/ajaxloader');
+        resel.icon.className = 'activityicon';
         resel.a.appendChild(resel.icon);
 
         resel.a.appendChild(document.createTextNode(' '));
@@ -869,6 +900,17 @@ M.course_dndupload = {
         formData.append('type', type);
         formData.append('module', module);
 
+        // Contents from Firefox have their unicode byte-order reversed, swap back and
+        // provide as an alternative.
+        if (type == 'text/html') {
+            var fixedcontents = '';
+            for (i=0; i<contents.length; i+=2) {
+                var val = contents.charCodeAt(i+1) * 256 + contents.charCodeAt(i);
+                fixedcontents += String.fromCharCode(val);
+            }
+            formData.append('fixedcontents', fixedcontents);
+        }
+
         // Send the data
         xhr.open("POST", this.url, true);
         xhr.send(formData);
index c4df5a8..1c8bdda 100644 (file)
@@ -34,6 +34,10 @@ $type = required_param('type', PARAM_TEXT);
 $modulename = required_param('module', PARAM_PLUGIN);
 $displayname = optional_param('displayname', null, PARAM_TEXT);
 $contents = optional_param('contents', null, PARAM_RAW); // It will be up to each plugin to clean this data, before saving it.
+if (!$contents) {
+    // Check if there was a fixed version of contents provided (to cope with dragging from Firefox).
+    $contents = optional_param('fixedcontents', null, PARAM_RAW);
+}
 
 $dndproc = new dndupload_ajax_processor($courseid, $section, $type, $modulename);
 $dndproc->process($displayname, $contents);
index 7c7756c..b5fbc0a 100644 (file)
@@ -52,7 +52,13 @@ function dndupload_add_to_course($course, $modnames) {
         'fullpath' => new moodle_url('/course/dndupload.js'),
         'strings' => array(
             array('addfilehere', 'moodle'),
-            array('dndworking', 'moodle'),
+            array('dndworkingfiletextlink', 'moodle'),
+            array('dndworkingfilelink', 'moodle'),
+            array('dndworkingfiletext', 'moodle'),
+            array('dndworkingfile', 'moodle'),
+            array('dndworkingtextlink', 'moodle'),
+            array('dndworkingtext', 'moodle'),
+            array('dndworkinglink', 'moodle'),
             array('filetoolarge', 'moodle'),
             array('actionchoice', 'moodle'),
             array('servererror', 'moodle'),
index cf4b698..8950c32 100644 (file)
@@ -466,7 +466,13 @@ $string['dndenabled'] = 'Drag and drop available';
 $string['dndenabled_help'] = 'You can drag one or more files from your desktop and drop them onto the box below to upload them.<br />Note: this may not work with other web browsers';
 $string['dndenabled_insentence'] = 'drag and drop available';
 $string['dndenabled_inbox'] = 'drag and drop files here to upload them';
-$string['dndworking'] = 'Drag and drop files, text or links onto course sections to upload them';
+$string['dndworkingfiletextlink'] = 'Drag and drop files, text or links onto course sections to upload them';
+$string['dndworkingfilelink'] = 'Drag and drop files or links onto course sections to upload them';
+$string['dndworkingfiletext'] = 'Drag and drop files or text onto course sections to upload them';
+$string['dndworkingfile'] = 'Drag and drop files onto course sections to upload them';
+$string['dndworkingtextlink'] = 'Drag and drop text or links onto course sections to upload them';
+$string['dndworkingtext'] = 'Drag and drop text onto course sections to upload it';
+$string['dndworkinglink'] = 'Drag and drop links onto course sections to upload them';
 $string['documentation'] = 'Moodle documentation';
 $string['down'] = 'Down';
 $string['download'] = 'Download';