plugins/kolab_files

Aleksander Machniak machniak at kolabsys.com
Thu Nov 20 12:15:52 CET 2014


 plugins/kolab_files/kolab_files.js             |  133 +++++++++++++++++++++----
 plugins/kolab_files/lib/kolab_files_engine.php |    3 
 2 files changed, 119 insertions(+), 17 deletions(-)

New commits:
commit 5738a7a7eca4256f39b279918d77f354cb9d4e28
Author: Aleksander Machniak <machniak at kolabsys.com>
Date:   Thu Nov 20 06:07:37 2014 -0500

    Display progress info when uploading files (#2832)

diff --git a/plugins/kolab_files/kolab_files.js b/plugins/kolab_files/kolab_files.js
index 33712a8..ed3e52c 100644
--- a/plugins/kolab_files/kolab_files.js
+++ b/plugins/kolab_files/kolab_files.js
@@ -857,6 +857,41 @@ kolab_files_drag_hover = function(e)
   elem[e.type == 'dragover' ? 'addClass' : 'removeClass']('hover');
 };
 
+// returns localized file size
+kolab_files_file_size = function(size)
+{
+  var i, units = ['GB', 'MB', 'KB', 'B'];
+
+  size = file_api.file_size(size);
+
+  for (i = 0; i < units.length; i++)
+    if (size.toUpperCase().indexOf(units[i]) > 0)
+      return size.replace(units[i], rcmail.gettext(units[i]));
+
+  return size;
+};
+
+kolab_files_progress_str = function(param)
+{
+  var current, total = file_api.file_size(param.total).toUpperCase();
+
+  if (total.indexOf('GB') > 0)
+    current = parseFloat(param.current/1073741824).toFixed(1);
+  else if (total.indexOf('MB') > 0)
+    current = parseFloat(param.current/1048576).toFixed(1);
+  else if (total.indexOf('KB') > 0)
+    current = parseInt(param.current/1024);
+  else
+    current = param.current;
+
+  total = kolab_files_file_size(param.total);
+
+  return rcmail.gettext('uploadprogress')
+    .replace(/\$percent/, param.percent + '%')
+    .replace(/\$current/, current)
+    .replace(/\$total/, total);
+};
+
 
 /***********************************************************/
 /**********              Commands                 **********/
@@ -1062,6 +1097,7 @@ rcube_webmail.prototype.folder_mount = function()
 function kolab_files_ui()
 {
   this.requests = {};
+  this.uploads = [];
 
 /*
   // Called on "session expired" session
@@ -1832,7 +1868,7 @@ function kolab_files_ui()
         response = {status: 'ERROR'};
       }
 
-      rcmail.hide_message(event.data.ts);
+      file_api.file_upload_progress_stop(event.data.ts);
 
       // refresh the list on upload success
       file_api.file_upload_response(response);
@@ -1858,7 +1894,7 @@ function kolab_files_ui()
         size += files[i].size || files[i].fileSize;
 
       if (size > maxsize) {
-        alert(rcmail.get_label('kolab_files.uploadsizeerror').replace('$size', this.file_size(maxsize)));
+        alert(rcmail.get_label('kolab_files.uploadsizeerror').replace('$size', kolab_files_file_size(maxsize)));
         return false;
       }
     }
@@ -1869,21 +1905,25 @@ function kolab_files_ui()
   // post the given form to a hidden iframe
   this.file_upload_form = function(form, action, onload)
   {
-    var ts = rcmail.display_message(rcmail.get_label('kolab_files.uploading'), 'loading', 1000),
-      frame_name = 'fileupload'+ts;
-/*
+    var ts = new Date().getTime(),
+      frame_name = 'fileupload' + ts;
+
     // upload progress support
-    if (this.env.upload_progress_name) {
-      var fname = this.env.upload_progress_name,
+    if (rcmail.env.files_progress_name) {
+      var fname = rcmail.env.files_progress_name,
         field = $('input[name='+fname+']', form);
 
       if (!field.length) {
         field = $('<input>').attr({type: 'hidden', name: fname});
         field.prependTo(form);
       }
+
       field.val(ts);
+      this.file_upload_progress(ts, true);
     }
-*/
+
+    rcmail.display_progress({name: ts});
+
     // have to do it this way for IE
     // otherwise the form will be posted to a new window
     if (document.all) {
@@ -1903,7 +1943,7 @@ function kolab_files_ui()
 
     $(form).attr({
       target: frame_name,
-      action: this.env.url + this.url(action, {folder: this.env.folder, token: this.env.token, uploadid:ts}),
+      action: this.env.url + this.url(action, {folder: this.env.folder, token: this.env.token}),
       method: 'POST'
     }).attr(form.encoding ? 'encoding' : 'enctype', 'multipart/form-data')
       .submit();
@@ -1913,21 +1953,26 @@ function kolab_files_ui()
   // compose a multipart form data and submit it to the server
   this.file_drop = function(e)
   {
+    var files = e.target.files || e.dataTransfer.files;
+
+    if (!files || !files.length || !this.file_upload_size_check(files))
+      return;
+
     // prepare multipart form data composition
-    var files = e.target.files || e.dataTransfer.files,
+    var ts = new Date().getTime(),
       formdata = window.FormData ? new FormData() : null,
       fieldname = 'file[]',
       boundary = '------multipartformboundary' + (new Date).getTime(),
       dashdash = '--', crlf = '\r\n',
       multipart = dashdash + boundary + crlf;
 
-    if (!files || !files.length || !this.file_upload_size_check(files))
-      return;
-
     // inline function to submit the files to the server
     var submit_data = function() {
-      var multiple = files.length > 1,
-        ts = rcmail.display_message(rcmail.get_label('kolab_files.uploading'), 'loading', 1000);
+      var multiple = files.length > 1;
+
+      rcmail.display_progress({name: ts});
+      if (rcmail.env.files_progress_name)
+        file_api.file_upload_progress(ts, true);
 
       // complete multipart content and post request
       multipart += dashdash + boundary + dashdash + crlf;
@@ -1942,12 +1987,12 @@ function kolab_files_ui()
         data: formdata || multipart,
         headers: {'X-Session-Token': file_api.env.token},
         success: function(data) {
+          file_api.file_upload_progress_stop(ts);
           file_api.file_upload_response(data);
-          rcmail.hide_message(ts);
         },
         error: function(o, status, err) {
+          file_api.file_upload_progress_stop(ts);
           rcmail.http_error(o, status, err);
-          rcmail.hide_message(ts);
         },
         xhr: function() {
           var xhr = jQuery.ajaxSettings.xhr();
@@ -1958,6 +2003,16 @@ function kolab_files_ui()
       });
     };
 
+    // upload progress supported (and handler exists)
+    // add progress ID to the request - need to be added before files
+    if (rcmail.env.files_progress_name) {
+      if (formdata)
+        formdata.append(rcmail.env.files_progress_name, ts);
+      else
+        multipart += 'Content-Disposition: form-data; name="' + rcmail.env.files_progress_name + '"'
+          + crlf + crlf + ts + crlf + dashdash + boundary + crlf;
+    }
+
     // get contents of all dropped files
     var f, j, i = 0, last = files.length - 1;
     for (j = 0; j <= last && (f = files[i]); i++) {
@@ -2000,6 +2055,50 @@ function kolab_files_ui()
     }
   };
 
+  // upload progress requests
+  this.file_upload_progress = function(id, init)
+  {
+    if (init && id)
+      this.uploads[id] = this.env.folder;
+
+    setTimeout(function() {
+      if (id && file_api.uploads[id])
+        file_api.request('upload_progress', {id: id}, 'file_upload_progress_response');
+    }, rcmail.env.files_progress_time * 1000);
+  };
+
+  // upload progress response
+  this.file_upload_progress_response = function(response)
+  {
+    if (!this.response(response))
+      return;
+
+    var param = response.result;
+
+    if (!param.id || !this.uploads[param.id])
+      return;
+
+    if (param.total) {
+      param.name = param.id;
+
+      if (!param.done)
+        param.text = kolab_files_progress_str(param);
+
+      rcmail.display_progress(param);
+    }
+
+    if (!param.done && param.total)
+      this.file_upload_progress(param.id);
+  };
+
+  this.file_upload_progress_stop = function(id)
+  {
+    if (id && this.uploads[id]) {
+      delete this.uploads[id];
+      rcmail.display_progress({name: id});
+    }
+  };
+
   // open file in new window, using file API viewer
   this.file_open = function(file, viewer)
   {
diff --git a/plugins/kolab_files/lib/kolab_files_engine.php b/plugins/kolab_files/lib/kolab_files_engine.php
index 365ca5b..0c01ce6 100644
--- a/plugins/kolab_files/lib/kolab_files_engine.php
+++ b/plugins/kolab_files/lib/kolab_files_engine.php
@@ -766,10 +766,13 @@ class kolab_files_engine
             'fileskip', 'fileskipall', 'fileoverwrite', 'fileoverwriteall'
         );
 
+        $this->rc->output->add_label('uploadprogress', 'GB', 'MB', 'KB', 'B');
         $this->rc->output->set_pagetitle($this->plugin->gettext('files'));
         $this->rc->output->set_env('file_mimetypes', $this->get_mimetypes());
         $this->rc->output->set_env('files_quota', $_SESSION['kolab_files_caps']['QUOTA']);
         $this->rc->output->set_env('files_max_upload', $_SESSION['kolab_files_caps']['MAX_UPLOAD']);
+        $this->rc->output->set_env('files_progress_name', $_SESSION['kolab_files_caps']['PROGRESS_NAME']);
+        $this->rc->output->set_env('files_progress_time', $_SESSION['kolab_files_caps']['PROGRESS_TIME']);
         $this->rc->output->send('kolab_files.files');
     }
 




More information about the commits mailing list