From 4171c59bd79a54c1fd65128f7100247a4dec8720 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Mon, 04 Jul 2011 07:40:02 -0400
Subject: [PATCH] - Add optional textual upload progress indicator (#1486039)

---
 CHANGELOG                             |    1 
 program/include/main.inc              |   42 +++++++++++++++++++++
 program/steps/mail/attachments.inc    |    4 ++
 program/steps/mail/compose.inc        |    5 ++
 program/localization/en_US/labels.inc |    1 
 config/main.inc.php.dist              |    5 ++
 program/js/app.js                     |   41 +++++++++++++++++++-
 7 files changed, 96 insertions(+), 3 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index f3c995c..d9c7d9c 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Add optional textual upload progress indicator (#1486039)
 - Fix parsing URLs containing commas (#1487970)
 - Added vertical splitter for books/groups list in addressbook (#1487923)
 - Improved namespace roots handling in folder manager
diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist
index 3994a94..56e5a79 100644
--- a/config/main.inc.php.dist
+++ b/config/main.inc.php.dist
@@ -437,6 +437,11 @@
 // Must be less than 'session_lifetime'
 $rcmail_config['min_keep_alive'] = 60;
 
+// Enables files upload indicator. Requires APC installed and enabled apc.rfc1867 option.
+// By default refresh time is set to 1 second. You can set this value to true
+// or any integer value indicating number of seconds.
+$rcmail_config['upload_progress'] = false;
+
 // ----------------------------------
 // ADDRESSBOOK SETTINGS
 // ----------------------------------
diff --git a/program/include/main.inc b/program/include/main.inc
index 7e2875a..2a5a660 100644
--- a/program/include/main.inc
+++ b/program/include/main.inc
@@ -2080,3 +2080,45 @@
     }
 }
 
+function rcube_upload_progress()
+{
+    global $RCMAIL;
+
+    $prefix = ini_get('apc.rfc1867_prefix');
+    $params = array(
+        'action' => $RCMAIL->action,
+        'name' => get_input_value('_progress', RCUBE_INPUT_GET),
+    );
+
+    if (function_exists('apc_fetch')) {
+        $status = apc_fetch($prefix . $params['name']);
+
+        if (!empty($status)) {
+            $status['percent'] = $status['current']/$status['total']*100;
+            $params = array_merge($status, $params);
+        }
+    }
+
+    if (isset($params['percent']))
+        $params['text'] = rcube_label(array('name' => 'uploadprogress', 'vars' => array(
+            'percent' => $params['percent'] . '%',
+            'current' => show_bytes($params['current']),
+            'total'   => show_bytes($params['total'])
+        )));
+console($params);
+    $RCMAIL->output->command('upload_progress_update', $params);
+    $RCMAIL->output->send();
+}
+
+function rcube_upload_progress_init()
+{
+    global $RCMAIL;
+
+    // Enable upload progress bar
+    if (($seconds = $RCMAIL->config->get('upload_progress')) && ini_get('apc.rfc1867')) {
+        if ($field_name = ini_get('apc.rfc1867_name')) {
+            $RCMAIL->output->set_env('upload_progress_name', $field_name);
+            $RCMAIL->output->set_env('upload_progress_time', (int) $seconds);
+        }
+    }
+}
diff --git a/program/js/app.js b/program/js/app.js
index 53ae463..f3298cf 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -3264,14 +3264,19 @@
       });
 
       // display upload indicator and cancel button
-      var content = this.get_label('uploading' + (files > 1 ? 'many' : '')),
+      var content = '<span>' + this.get_label('uploading' + (files > 1 ? 'many' : '')) + '</span>',
         ts = frame_name.replace(/^rcmupload/, '');
 
-      if (this.env.loadingicon)
+      if (!this.env.upload_progress_time && this.env.loadingicon)
         content = '<img src="'+this.env.loadingicon+'" alt="" />'+content;
       if (this.env.cancelicon)
         content = '<a title="'+this.get_label('cancel')+'" onclick="return rcmail.cancel_attachment_upload(\''+ts+'\', \''+frame_name+'\');" href="#cancelupload"><img src="'+this.env.cancelicon+'" alt="" /></a>'+content;
       this.add2attachment_list(ts, { name:'', html:content, complete:false });
+
+      // upload progress support
+      if (this.env.upload_progress_time) {
+        this.upload_progress_start('upload', ts);
+      }
     }
 
     // set reference to the form object
@@ -3334,6 +3339,25 @@
     this.remove_from_attachment_list(name);
     $("iframe[name='"+frame_name+"']").remove();
     return false;
+  };
+
+  this.upload_progress_start = function(action, name)
+  {
+    window.setTimeout(function() { rcmail.http_request(action, {_progress: name}); },
+      this.env.upload_progress_time * 1000);
+  };
+
+  this.upload_progress_update = function(param)
+  {
+    var elem = $('#'+param.name + '> span');
+
+    if (!elem.length || !param.text)
+      return;
+
+    elem.text(param.text);
+
+    if (!param.done)
+      this.upload_progress_start(param.action, param.name);
   };
 
   // send remote request to add a new contact
@@ -5602,6 +5626,19 @@
     var ts = new Date().getTime(),
       frame_name = 'rcmupload'+ts;
 
+    // upload progress support
+    if (this.env.upload_progress_name) {
+      var fname = this.env.upload_progress_name,
+        field = $('input[name='+fname+']', form);
+
+      if (!field.length) {
+        field = $('<input>').attr({type: 'hidden', name: fname});
+        field.appendTo(form);
+      }
+
+      field.val(ts);
+    }
+
     // have to do it this way for IE
     // otherwise the form will be posted to a new window
     if (document.all) {
diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc
index 401bc1e..b2f136b 100644
--- a/program/localization/en_US/labels.inc
+++ b/program/localization/en_US/labels.inc
@@ -210,6 +210,7 @@
 
 $labels['attachments'] = 'Attachments';
 $labels['upload'] = 'Upload';
+$labels['uploadprogress'] = '$percent ($current from $total)';
 $labels['close']  = 'Close';
 $labels['messageoptions']  = 'Message options...';
 
diff --git a/program/steps/mail/attachments.inc b/program/steps/mail/attachments.inc
index 14712c6..4674034 100644
--- a/program/steps/mail/attachments.inc
+++ b/program/steps/mail/attachments.inc
@@ -19,6 +19,10 @@
 
 */
 
+// Upload progress update
+if (!empty($_GET['_progress'])) {
+  rcube_upload_progress();
+}
 
 $COMPOSE_ID = get_input_value('_id', RCUBE_INPUT_GPC);
 $_SESSION['compose'] = $_SESSION['compose_data'][$COMPOSE_ID];
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 943c800..458441f 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -1199,12 +1199,15 @@
 
 function rcmail_compose_attachment_form($attrib)
 {
-  global $OUTPUT;
+  global $RCMAIL, $OUTPUT;
 
   // add ID if not given
   if (!$attrib['id'])
     $attrib['id'] = 'rcmUploadbox';
 
+  // Enable upload progress bar
+  rcube_upload_progress_init();
+
   // find max filesize value
   $max_filesize = parse_bytes(ini_get('upload_max_filesize'));
   $max_postsize = parse_bytes(ini_get('post_max_size'));

--
Gitblit v1.9.1