diff --git a/plugins/kolab_files/kolab_files.js b/plugins/kolab_files/kolab_files.js index f01a477b..c39c9103 100644 --- a/plugins/kolab_files/kolab_files.js +++ b/plugins/kolab_files/kolab_files.js @@ -632,6 +632,21 @@ rcube_webmail.prototype.files_open = function() file_api.file_open(files[0], rcmail.env.viewer); }; +rcube_webmail.prototype.files_set_quota = function(p) +{ + if (p.total) { + p.used *= 1024; + p.total *= 1024; + p.title = file_api.file_size(p.used) + ' / ' + file_api.file_size(p.total) + + ' (' + p.percent + '%)'; + } + + p.type = this.env.quota_type; + + this.set_quota(p); +}; + + /**********************************************************/ /********* Files API handler **********/ /**********************************************************/ @@ -769,6 +784,8 @@ function kolab_files_ui() this.env.collection = null; rcmail.command('files-list', {folder: folder}); } + + this.quota(); }; this.folder_unselect = function() @@ -778,6 +795,8 @@ function kolab_files_ui() rcmail.enable_command('files-folder-delete', 'files-upload', false); this.env.folder = null; this.env.collection = null; + + this.quota(); }; // folder create request @@ -818,6 +837,23 @@ function kolab_files_ui() // refresh folders list this.folder_list(); + this.quota(); + }; + + // quota request + this.quota = function() + { + if (rcmail.env.files_quota) + this.request('quota', {folder: this.env.folder}, 'quota_response'); + }; + + // quota response handler + this.quota_response = function(response) + { + if (!this.response(response)) + return; + + rcmail.files_set_quota(response.result); }; this.file_list = function(params) @@ -1090,8 +1126,10 @@ function kolab_files_ui() // @TODO: reload files list in parent window window.close(); } - else + else { this.file_list(); + this.quota(); + } }; // file(s) move request @@ -1164,8 +1202,10 @@ function kolab_files_ui() if (response.result && response.result.already_exist && response.result.already_exist.length) this.file_move_ask_user(response.result.already_exist); - else + else { this.display_message('kolab_files.filecopynotice', 'confirmation'); + this.quota(); + } }; // when file move/copy operation returns file-exists error @@ -1274,6 +1314,7 @@ function kolab_files_ui() // refresh the list on upload success if (file_api.response_parse(response)) file_api.file_list(); + file_api.quota(); }); } }; diff --git a/plugins/kolab_files/lib/kolab_files_engine.php b/plugins/kolab_files/lib/kolab_files_engine.php index f8b1bb86..246abb6b 100644 --- a/plugins/kolab_files/lib/kolab_files_engine.php +++ b/plugins/kolab_files/lib/kolab_files_engine.php @@ -101,6 +101,7 @@ class kolab_files_engine 'folder-create-form' => array($this, 'folder_create_form'), 'file-search-form' => array($this, 'file_search_form'), 'filelist' => array($this, 'file_list'), + 'filequotadisplay' => array($this, 'quota_display'), )); if ($this->rc->task != 'files') { @@ -416,6 +417,48 @@ class kolab_files_engine return html::iframe(array('id' => 'file-content', 'src' => $href)); } + /** + * Template object for quota display + */ + public function quota_display($attrib) + { + if (!$attrib['id']) { + $attrib['id'] = 'rcmquotadisplay'; + } + + $quota_type = !empty($attrib['display']) ? $attrib['display'] : 'text'; + + $this->rc->output->add_gui_object('quotadisplay', $attrib['id']); + $this->rc->output->set_env('quota_type', $quota_type); + + // get quota + $token = $this->get_api_token(); + $request = $this->get_request(array('method' => 'quota'), $token); + + // send request to the API + try { + $response = $request->send(); + $status = $response->getStatus(); + $body = @json_decode($response->getBody(), true); + + if ($status == 200 && $body['status'] == 'OK') { + $quota = $body['result']; + } + else { + throw new Exception($body['reason']); + } + } + catch (Exception $e) { + $quota = array('total' => 0, 'percent' => 0); + } + + $quota = rcube_output::json_serialize($quota); + + $this->rc->output->add_script(rcmail_output::JS_OBJECT_NAME . ".files_set_quota($quota);", 'docready'); + + return html::span($attrib, ''); + } + /** * Get API token for current user session, authenticate if needed */ @@ -463,6 +506,7 @@ class kolab_files_engine if ($token) { $_SESSION['kolab_files_token'] = $token; $_SESSION['kolab_files_time'] = time(); + $_SESSION['kolab_files_caps'] = $body['result']['capabilities']; } } else { @@ -542,6 +586,7 @@ class kolab_files_engine $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->send('kolab_files.files'); } diff --git a/plugins/kolab_files/skins/larry/templates/files.html b/plugins/kolab_files/skins/larry/templates/files.html index 13f6619d..fc45ca93 100644 --- a/plugins/kolab_files/skins/larry/templates/files.html +++ b/plugins/kolab_files/skins/larry/templates/files.html @@ -31,6 +31,9 @@
diff --git a/plugins/kolab_files/skins/larry/ui.js b/plugins/kolab_files/skins/larry/ui.js index 954e5b54..374e79ec 100644 --- a/plugins/kolab_files/skins/larry/ui.js +++ b/plugins/kolab_files/skins/larry/ui.js @@ -10,6 +10,7 @@ function kolab_files_ui_init() $(document).ready(function() { rcmail.addEventListener('menu-open', kolab_files_show_listoptions); rcmail.addEventListener('menu-save', kolab_files_save_listoptions); + rcmail.addEventListener('setquota', kolab_files_update_quota); var menu = $('#dragfilemenu'); if (menu.length) { @@ -27,6 +28,11 @@ function kolab_files_ui_init() kolab_files_upload_input('#filestoolbar a.upload'); }; +function kolab_files_update_quota(p) +{ + return UI.update_quota(p); +} + function kolab_files_show_listoptions() { var $dialog = $('#listoptions');