From 0b36d151572e050b51d82e7429fee847ebb33e22 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Thu, 20 Nov 2014 06:03:22 -0500 Subject: [PATCH] Add method to display operation (uploading) progress in UI message --- program/include/rcmail.php | 119 ++++++++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 85 insertions(+), 34 deletions(-) diff --git a/program/include/rcmail.php b/program/include/rcmail.php index b105eb8..f0c3631 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -106,21 +106,23 @@ // reset some session parameters when changing task if ($this->task != 'utils') { // we reset list page when switching to another task - // but only to the main task interface - empty action (#1489076) + // but only to the main task interface - empty action (#1489076, #1490116) // this will prevent from unintentional page reset on cross-task requests if ($this->session && $_SESSION['task'] != $this->task && empty($this->action)) { $this->session->remove('page'); - } - // set current task to session - $_SESSION['task'] = $this->task; + // set current task to session + $_SESSION['task'] = $this->task; + } } - // init output class - if (!empty($_REQUEST['_remote'])) + // init output class (not in CLI mode) + if (!empty($_REQUEST['_remote'])) { $GLOBALS['OUTPUT'] = $this->json_init(); - else + } + else if ($_SERVER['REMOTE_ADDR']) { $GLOBALS['OUTPUT'] = $this->load_gui(!empty($_REQUEST['_framed'])); + } // load plugins $this->plugins->init($this, $this->task); @@ -147,8 +149,13 @@ $this->task = $task; $this->comm_path = $this->url(array('task' => $this->task)); + if (!empty($_REQUEST['_framed'])) { + $this->comm_path .= '&_framed=1'; + } + if ($this->output) { $this->output->set_env('task', $this->task); + $this->output->set_env('comm_path', $this->comm_path); } } @@ -168,7 +175,7 @@ setlocale(LC_ALL, $lang . '.utf8', $lang . '.UTF-8', 'en_US.utf8', 'en_US.UTF-8'); // workaround for http://bugs.php.net/bug.php?id=18556 - if (version_compare(PHP_VERSION, '5.5.0', '<') && in_array($lang, array('tr_TR', 'ku', 'az_AZ'))) { + if (PHP_VERSION_ID < 50500 && in_array($lang, array('tr_TR', 'ku', 'az_AZ'))) { setlocale(LC_CTYPE, 'en_US.utf8', 'en_US.UTF-8'); } } @@ -427,9 +434,12 @@ $this->output->set_env('user_id', $this->user->get_hash()); } + // set compose mode for all tasks (message compose step can be triggered from everywhere) + $this->output->set_env('compose_extwin', $this->config->get('compose_extwin',false)); + // add some basic labels to client $this->output->add_label('loading', 'servererror', 'connerror', 'requesttimedout', - 'refreshing', 'windowopenerror'); + 'refreshing', 'windowopenerror', 'uploadingmany'); return $this->output; } @@ -786,11 +796,13 @@ /** * Build a valid URL to this instance of Roundcube * - * @param mixed Either a string with the action or url parameters as key-value pairs + * @param mixed Either a string with the action or url parameters as key-value pairs + * @param boolean Build an URL absolute to document root + * @param boolean Create fully qualified URL including http(s):// and hostname * * @return string Valid application URL */ - public function url($p) + public function url($p, $absolute = false, $full = false) { if (!is_array($p)) { if (strpos($p, 'http') === 0) { @@ -800,14 +812,15 @@ $p = array('_action' => @func_get_arg(0)); } - $task = $p['_task'] ? $p['_task'] : ($p['task'] ? $p['task'] : $this->task); - $p['_task'] = $task; - unset($p['task']); + $pre = array(); + $task = $p['_task'] ?: ($p['task'] ?: $this->task); + $pre['_task'] = $task; + unset($p['task'], $p['_task']); - $url = './' . $this->filename; + $url = $this->filename; $delm = '?'; - foreach (array_reverse($p) as $key => $val) { + foreach (array_merge($pre, $p) as $key => $val) { if ($val !== '' && $val !== null) { $par = $key[0] == '_' ? $key : '_'.$key; $url .= $delm.urlencode($par).'='.urlencode($val); @@ -815,7 +828,24 @@ } } - return $url; + if ($absolute || $full) { + // add base path to this Roundcube installation + $base_path = preg_replace('![^/]+$!', '', strval($_SERVER['SCRIPT_NAME'])); + if ($base_path == '') $base_path = '/'; + $prefix = $base_path; + + // prepend protocol://hostname:port + if ($full) { + $prefix = rcube_utils::resolve_url($prefix); + } + + $prefix = rtrim($prefix, '/') . '/'; + } + else { + $prefix = './'; + } + + return $prefix . $url; } /** @@ -1684,7 +1714,8 @@ $quota = $this->plugins->exec_hook('quota', $quota); $quota_result = (array) $quota; - $quota_result['type'] = isset($_SESSION['quota_display']) ? $_SESSION['quota_display'] : ''; + $quota_result['type'] = isset($_SESSION['quota_display']) ? $_SESSION['quota_display'] : ''; + $quota_result['folder'] = $folder !== null && $folder !== '' ? $folder : 'INBOX'; if ($quota['total'] > 0) { if (!isset($quota['percent'])) { @@ -1748,10 +1779,6 @@ unset($quota_result['all']); } - if ($folder !== null && $folder !== '') { - $quota_result['folder'] = $folder; - } - return $quota_result; } @@ -1775,7 +1802,7 @@ $error = 'errorreadonly'; } else if ($res_code == rcube_storage::OVERQUOTA) { - $error = 'errorroverquota'; + $error = 'erroroverquota'; } else if ($err_code && ($err_str = $this->storage->get_error_str())) { // try to detect access rights problem and display appropriate message @@ -1931,13 +1958,32 @@ } if (!empty($params['total'])) { - $params['percent'] = round($status['current']/$status['total']*100); + $total = $this->show_bytes($params['total'], $unit); + switch ($unit) { + case 'GB': + $gb = $params['current']/1073741824; + $current = sprintf($gb >= 10 ? "%d" : "%.1f", $gb); + break; + case 'MB': + $mb = $params['current']/1048576; + $current = sprintf($mb >= 10 ? "%d" : "%.1f", $mb); + break; + case 'KB': + $current = round($params['current']/1024); + break; + case 'B': + default: + $current = $params['current']; + break; + } + + $params['percent'] = round($params['current']/$params['total']*100); $params['text'] = $this->gettext(array( 'name' => 'uploadprogress', 'vars' => array( 'percent' => $params['percent'] . '%', - 'current' => $this->show_bytes($params['current']), - 'total' => $this->show_bytes($params['total']) + 'current' => $current, + 'total' => $total ) )); } @@ -2123,25 +2169,30 @@ /** * Create a human readable string for a number of bytes * - * @param int Number of bytes + * @param int Number of bytes + * @param string Size unit * * @return string Byte string */ - public function show_bytes($bytes) + public function show_bytes($bytes, &$unit = null) { if ($bytes >= 1073741824) { - $gb = $bytes/1073741824; - $str = sprintf($gb>=10 ? "%d " : "%.1f ", $gb) . $this->gettext('GB'); + $unit = 'GB'; + $gb = $bytes/1073741824; + $str = sprintf($gb >= 10 ? "%d " : "%.1f ", $gb) . $this->gettext($unit); } else if ($bytes >= 1048576) { - $mb = $bytes/1048576; - $str = sprintf($mb>=10 ? "%d " : "%.1f ", $mb) . $this->gettext('MB'); + $unit = 'MB'; + $mb = $bytes/1048576; + $str = sprintf($mb >= 10 ? "%d " : "%.1f ", $mb) . $this->gettext($unit); } else if ($bytes >= 1024) { - $str = sprintf("%d ", round($bytes/1024)) . $this->gettext('KB'); + $unit = 'KB'; + $str = sprintf("%d ", round($bytes/1024)) . $this->gettext($unit); } else { - $str = sprintf('%d ', $bytes) . $this->gettext('B'); + $unit = 'B'; + $str = sprintf('%d ', $bytes) . $this->gettext(); } return $str; -- Gitblit v1.9.1