diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2015-10-29 11:25:52 +0100 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2015-10-29 11:25:52 +0100 |
commit | 911613f7114c3f2c95b364b8b3d21ced5ee96283 (patch) | |
tree | 289c9a487c85c7875660d936fab64bfe863b41d7 /apps | |
parent | c7f409713e8e2d44bc83c0e811bc5b2b46649080 (diff) | |
parent | 9a4d37f626dca4663ea7d25f78f7c1f174306ab5 (diff) | |
download | nextcloud-server-911613f7114c3f2c95b364b8b3d21ced5ee96283.tar.gz nextcloud-server-911613f7114c3f2c95b364b8b3d21ced5ee96283.zip |
Merge pull request #19100 from owncloud/ext-tooltip-unavailable
Display external storage status as tooltip
Diffstat (limited to 'apps')
-rw-r--r-- | apps/files_external/controller/storagescontroller.php | 16 | ||||
-rw-r--r-- | apps/files_external/js/settings.js | 39 | ||||
-rw-r--r-- | apps/files_external/lib/config.php | 1 | ||||
-rw-r--r-- | apps/files_external/lib/storageconfig.php | 25 |
4 files changed, 67 insertions, 14 deletions
diff --git a/apps/files_external/controller/storagescontroller.php b/apps/files_external/controller/storagescontroller.php index f754565f628..048f3588ed7 100644 --- a/apps/files_external/controller/storagescontroller.php +++ b/apps/files_external/controller/storagescontroller.php @@ -237,9 +237,21 @@ abstract class StoragesController extends Controller { ) ); } catch (InsufficientDataForMeaningfulAnswerException $e) { - $storage->setStatus(\OC_Mount_Config::STATUS_INDETERMINATE); + $storage->setStatus( + \OC_Mount_Config::STATUS_INDETERMINATE, + $this->l10n->t('Insufficient data: %s', [$e->getMessage()]) + ); } catch (StorageNotAvailableException $e) { - $storage->setStatus(\OC_Mount_Config::STATUS_ERROR); + $storage->setStatus( + \OC_Mount_Config::STATUS_ERROR, + $e->getMessage() + ); + } catch (\Exception $e) { + // FIXME: convert storage exceptions to StorageNotAvailableException + $storage->setStatus( + \OC_Mount_Config::STATUS_ERROR, + get_class($e).': '.$e->getMessage() + ); } } diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js index 5da34c52193..a839f396b9b 100644 --- a/apps/files_external/js/settings.js +++ b/apps/files_external/js/settings.js @@ -643,6 +643,10 @@ MountConfigListView.prototype = _.extend({ }); addSelect2(this.$el.find('tr:not(#addMountPoint) .applicableUsers'), this._userListLimit); + this.$el.tooltip({ + selector: '.status span', + container: 'body' + }); this._initEvents(); @@ -709,11 +713,12 @@ MountConfigListView.prototype = _.extend({ } highlightInput($target); var $tr = $target.closest('tr'); + this.updateStatus($tr, null); var timer = $tr.data('save-timer'); clearTimeout(timer); timer = setTimeout(function() { - self.saveStorageConfig($tr); + self.saveStorageConfig($tr, null, timer); }, 2000); $tr.data('save-timer', timer); }, @@ -931,8 +936,9 @@ MountConfigListView.prototype = _.extend({ * * @param $tr storage row * @param Function callback callback to call after save + * @param concurrentTimer only update if the timer matches this */ - saveStorageConfig:function($tr, callback) { + saveStorageConfig:function($tr, callback, concurrentTimer) { var self = this; var storage = this.getStorageConfig($tr); if (!storage.validate()) { @@ -942,15 +948,23 @@ MountConfigListView.prototype = _.extend({ this.updateStatus($tr, StorageConfig.Status.IN_PROGRESS); storage.save({ success: function(result) { - self.updateStatus($tr, result.status); - $tr.attr('data-id', result.id); - - if (_.isFunction(callback)) { - callback(storage); + if (concurrentTimer === undefined + || $tr.data('save-timer') === concurrentTimer + ) { + self.updateStatus($tr, result.status, result.statusMessage); + $tr.attr('data-id', result.id); + + if (_.isFunction(callback)) { + callback(storage); + } } }, error: function() { - self.updateStatus($tr, StorageConfig.Status.ERROR); + if (concurrentTimer === undefined + || $tr.data('save-timer') === concurrentTimer + ) { + self.updateStatus($tr, StorageConfig.Status.ERROR); + } } }); }, @@ -971,7 +985,7 @@ MountConfigListView.prototype = _.extend({ this.updateStatus($tr, StorageConfig.Status.IN_PROGRESS); storage.recheck({ success: function(result) { - self.updateStatus($tr, result.status); + self.updateStatus($tr, result.status, result.statusMessage); }, error: function() { self.updateStatus($tr, StorageConfig.Status.ERROR); @@ -984,11 +998,15 @@ MountConfigListView.prototype = _.extend({ * * @param {jQuery} $tr * @param {int} status + * @param {string} message */ - updateStatus: function($tr, status) { + updateStatus: function($tr, status, message) { var $statusSpan = $tr.find('.status span'); $statusSpan.removeClass('loading-small success indeterminate error'); switch (status) { + case null: + // remove status + break; case StorageConfig.Status.IN_PROGRESS: $statusSpan.addClass('loading-small'); break; @@ -1001,6 +1019,7 @@ MountConfigListView.prototype = _.extend({ default: $statusSpan.addClass('error'); } + $statusSpan.attr('data-original-title', (typeof message === 'string') ? message : ''); }, /** diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php index d9fdb748fcd..56a7e547ec6 100644 --- a/apps/files_external/lib/config.php +++ b/apps/files_external/lib/config.php @@ -269,6 +269,7 @@ class OC_Mount_Config { } } catch (Exception $exception) { \OCP\Util::logException('files_external', $exception); + throw $e; } } return self::STATUS_ERROR; diff --git a/apps/files_external/lib/storageconfig.php b/apps/files_external/lib/storageconfig.php index 70aaa186783..86a7e6ffa12 100644 --- a/apps/files_external/lib/storageconfig.php +++ b/apps/files_external/lib/storageconfig.php @@ -73,6 +73,13 @@ class StorageConfig implements \JsonSerializable { private $status; /** + * Status message + * + * @var string + */ + private $statusMessage; + + /** * Priority * * @var int @@ -295,7 +302,7 @@ class StorageConfig implements \JsonSerializable { } /** - * Sets the storage status, whether the config worked last time + * Gets the storage status, whether the config worked last time * * @return int $status status */ @@ -304,12 +311,23 @@ class StorageConfig implements \JsonSerializable { } /** + * Gets the message describing the storage status + * + * @return string|null + */ + public function getStatusMessage() { + return $this->statusMessage; + } + + /** * Sets the storage status, whether the config worked last time * * @param int $status status + * @param string|null $message optional message */ - public function setStatus($status) { + public function setStatus($status, $message = null) { $this->status = $status; + $this->statusMessage = $message; } /** @@ -341,6 +359,9 @@ class StorageConfig implements \JsonSerializable { if (!is_null($this->status)) { $result['status'] = $this->status; } + if (!is_null($this->statusMessage)) { + $result['statusMessage'] = $this->statusMessage; + } return $result; } } |