From c5f06896d4db5f2479b5988cb2cea6ef0fa80cad Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Thu, 26 Jun 2014 06:32:52 -0400
Subject: [PATCH] Display full quota information in popup (#1485769, #1486604)

---
 CHANGELOG                             |    1 
 skins/classic/functions.js            |   12 ++++
 program/include/rcmail.php            |   41 +++++++++++++
 program/localization/en_US/labels.inc |    5 +
 skins/classic/common.css              |   29 +++++++++
 skins/larry/styles.css                |   24 ++++++++
 skins/larry/ui.js                     |   15 ++++
 7 files changed, 123 insertions(+), 4 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 2239fcf..6ff89c2 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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 29ed66a..cfdd181 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -1678,7 +1678,6 @@
         $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 @@
                 $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 @@
             $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 ba8fe2e..1e179cb 100644
--- a/program/localization/en_US/labels.inc
+++ b/program/localization/en_US/labels.inc
@@ -208,6 +208,11 @@
 $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 273defe..6e99861 100644
--- a/skins/classic/common.css
+++ b/skins/classic/common.css
@@ -1236,6 +1236,35 @@
 .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 4fef611..7f2b8b4 100644
--- a/skins/classic/functions.js
+++ b/skins/classic/functions.js
@@ -879,6 +879,18 @@
 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 e4a5c67..5e3eae2 100644
--- a/skins/larry/styles.css
+++ b/skins/larry/styles.css
@@ -2277,6 +2277,30 @@
 	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 11125c3..f67b422 100644
--- a/skins/larry/ui.js
+++ b/skins/larry/ui.js
@@ -515,14 +515,25 @@
 
   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);
+      });
+    }
   }
 
 

--
Gitblit v1.9.1