diff options
-rw-r--r-- | CHANGELOG | 1 | ||||
-rw-r--r-- | program/include/rcmail.php | 41 | ||||
-rw-r--r-- | program/localization/en_US/labels.inc | 5 | ||||
-rw-r--r-- | skins/classic/common.css | 29 | ||||
-rw-r--r-- | skins/classic/functions.js | 12 | ||||
-rw-r--r-- | skins/larry/styles.css | 24 | ||||
-rw-r--r-- | skins/larry/ui.js | 15 |
7 files changed, 123 insertions, 4 deletions
@@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Display full quota information in popup (#1485769, #1486604) - Mail compose: Selecting contact inserts recipient to previously focused input - to/cc/bcc accordingly (#1489684) - Add option to set default message list mode - default_list_mode (#1487312) - Close "no subject" prompt with Enter key (#1489580) diff --git a/program/include/rcmail.php b/program/include/rcmail.php index 29ed66a43..cfdd1816e 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -1678,7 +1678,6 @@ class rcmail extends rcube $quota = $this->storage->get_quota(); $quota = $this->plugins->exec_hook('quota', $quota); - unset($quota['abort']); $quota_result = (array) $quota; $quota_result['type'] = isset($_SESSION['quota_display']) ? $_SESSION['quota_display'] : ''; @@ -1697,7 +1696,39 @@ class rcmail extends rcube $quota_result['width'] = $attrib['width']; } if ($attrib['height']) { - $quota_result['height'] = $attrib['height']; + $quota_result['height'] = $attrib['height']; + } + + // build a table of quota types/roots info + if (($root_cnt = count($quota_result['all'])) > 1 || count($quota_result['all'][key($quota_result['all'])]) > 1) { + $table = new html_table(array('cols' => 3, 'class' => 'quota-info')); + + $table->add_header(null, self::Q($this->gettext('quotatype'))); + $table->add_header(null, self::Q($this->gettext('quotatotal'))); + $table->add_header(null, self::Q($this->gettext('quotaused'))); + + foreach ($quota_result['all'] as $root => $data) { + if ($root_cnt > 1 && $root) { + $table->add(array('colspan' => 3, 'class' => 'root'), self::Q($root)); + } + + if ($storage = $data['storage']) { + $percent = min(100, round(($storage['used']/max(1,$storage['total']))*100)); + + $table->add('name', self::Q($this->gettext('quotastorage'))); + $table->add(null, $this->show_bytes($storage['total'] * 1024)); + $table->add(null, sprintf('%s (%.0f%%)', $this->show_bytes($storage['used'] * 1024), $percent)); + } + if ($message = $data['message']) { + $percent = min(100, round(($message['used']/max(1,$message['total']))*100)); + + $table->add('name', self::Q($this->gettext('quotamessage'))); + $table->add(null, intval($message['total'])); + $table->add(null, sprintf('%d (%.0f%%)', $message['used'], $percent)); + } + } + + $quota_result['table'] = $table->show(); } } else { @@ -1706,6 +1737,12 @@ class rcmail extends rcube $quota_result['percent'] = 0; } + // cleanup + unset($quota_result['abort']); + if (empty($quota_result['table'])) { + unset($quota_result['all']); + } + return $quota_result; } diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc index ba8fe2e40..1e179cbcf 100644 --- a/program/localization/en_US/labels.inc +++ b/program/localization/en_US/labels.inc @@ -208,6 +208,11 @@ $labels['importmessages'] = 'Import messages'; $labels['quota'] = 'Disk usage'; $labels['unknown'] = 'unknown'; $labels['unlimited'] = 'unlimited'; +$labels['quotatype'] = 'Quota type'; +$labels['quotatotal'] = 'Limit'; +$labels['quotaused'] = 'Used'; +$labels['quotastorage'] = 'Disk space'; +$labels['quotamessage'] = 'Messages count'; $labels['quicksearch'] = 'Quick search'; $labels['resetsearch'] = 'Reset search'; diff --git a/skins/classic/common.css b/skins/classic/common.css index 273defe19..6e9986165 100644 --- a/skins/classic/common.css +++ b/skins/classic/common.css @@ -1236,6 +1236,35 @@ fieldset.tabbed .quota_text_mid { color: #666; } .quota_text_low { color: #666; } +table.quota-info { + border-spacing: 0; + border-collapse: collapse; + table-layout: fixed; + margin: 2px; +} + +table.quota-info td, +table.quota-info th { + border: 1px solid #999; + padding: 2px 3px; + text-align: center; + min-width: 80px; + color: #333; + font-size: 11px; +} + +table.quota-info th { + font-weight: bold; + background-color: #ddd; +} + +table.quota-info td.name { + text-align: left; +} + +table.quota-info td.root { + font-style: italic; +} /********** TinyMCE styles **********/ .mce-btn-small button diff --git a/skins/classic/functions.js b/skins/classic/functions.js index 4fef61151..7f2b8b4fb 100644 --- a/skins/classic/functions.js +++ b/skins/classic/functions.js @@ -879,6 +879,18 @@ function fit_string_to_size(str, elem, len) function update_quota(data) { percent_indicator(rcmail.gui_objects.quotadisplay, data); + + if (data.table) { + var menu = $('#quotamenu'); + + if (!menu.length) + menu = $('<div id="quotamenu" class="popupmenu">').appendTo($('body')); + + menu.html(data.table); + $('#quotaimg').css('cursor', 'pointer').off('click').on('click', function(e) { + return rcmail.command('menu-open', 'quotamenu', e.target, e); + }); + } }; // percent (quota) indicator diff --git a/skins/larry/styles.css b/skins/larry/styles.css index e4a5c6799..5e3eae2b3 100644 --- a/skins/larry/styles.css +++ b/skins/larry/styles.css @@ -2277,6 +2277,30 @@ a.iconbutton:focus, background: url(images/quota.png) -100px 0 no-repeat; } +table.quota-info { + border-spacing: 0; + border-collapse: collapse; + table-layout: fixed; + margin: 5px; +} + +table.quota-info td, +table.quota-info th { + color: white; + border: 1px solid lightgrey; + padding: 2px 3px; + text-align: center; + min-width: 80px; +} + +table.quota-info td.name { + text-align: left; +} + +table.quota-info td.root { + font-style: italic; +} + /*** popup menus ***/ .popupmenu, diff --git a/skins/larry/ui.js b/skins/larry/ui.js index 11125c389..f67b42250 100644 --- a/skins/larry/ui.js +++ b/skins/larry/ui.js @@ -515,14 +515,25 @@ function rcube_mail_ui() function update_quota(p) { - var step = 24, step_count = 20, + var element = $('#quotadisplay'), menu = $('#quotamenu'), + step = 24, step_count = 20, y = p.total ? Math.ceil(p.percent / 100 * step_count) * step : 0; // never show full-circle if quota is close to 100% but below. if (p.total && y == step * step_count && p.percent < 100) y -= step; - $('#quotadisplay').css('background-position', '0 -'+y+'px'); + element.css('background-position', '0 -' + y + 'px'); + + if (p.table) { + if (!menu.length) + menu = $('<div id="quotamenu" class="popupmenu">').appendTo($('body')); + + menu.html(p.table); + element.css('cursor', 'pointer').off('click').on('click', function(e) { + return rcmail.command('menu-open', 'quotamenu', e.target, e); + }); + } } |