diff --git a/gui/default/assets/css/overrides.css b/gui/default/assets/css/overrides.css index 2adebda39..b773cf000 100644 --- a/gui/default/assets/css/overrides.css +++ b/gui/default/assets/css/overrides.css @@ -180,7 +180,7 @@ input[type="checkbox"].extended-attributes-filter-rule-checkbox { margin-right: .14285715em; } -.remote-devices-panel { +.inline-icon { display: inline-block; } @@ -460,15 +460,17 @@ ul.three-columns li, ul.two-columns li { } @media (max-width: 419px) { - /* the selectors are build to target only the content of folder and device - panels as it would "destroy" e.g. out of sync or recent changes listings */ + /* The selectors are build to target only the content of folder and device + panels as it would "destroy" e.g. out of sync or recent changes listings. + The !important is needed to override .visible-xs that sets display to a + specific table element instead of block. */ div[id^='device-'].panel-collapse table, div[id^='folder-'].panel-collapse table, div[id^='device-'].panel-collapse tbody, div[id^='folder-'].panel-collapse tbody, div[id^='device-'].panel-collapse tr, div[id^='folder-'].panel-collapse tr { - display: block; + display: block !important; } div[id^='device-'].panel-collapse th, div[id^='folder-'].panel-collapse th, diff --git a/gui/default/assets/lang/lang-en.json b/gui/default/assets/lang/lang-en.json index 4a34c972f..7a7731483 100644 --- a/gui/default/assets/lang/lang-en.json +++ b/gui/default/assets/lang/lang-en.json @@ -99,6 +99,7 @@ "Device ID": "Device ID", "Device Identification": "Device Identification", "Device Name": "Device Name", + "Device Status": "Device Status", "Device is untrusted, enter encryption password": "Device is untrusted, enter encryption password", "Device rate limits": "Device rate limits", "Device that last modified the item": "Device that last modified the item", @@ -168,6 +169,7 @@ "Folder ID": "Folder ID", "Folder Label": "Folder Label", "Folder Path": "Folder Path", + "Folder Status": "Folder Status", "Folder Type": "Folder Type", "Folder type \"{%receiveEncrypted%}\" can only be set when adding a new folder.": "Folder type \"{{receiveEncrypted}}\" can only be set when adding a new folder.", "Folder type \"{%receiveEncrypted%}\" cannot be changed after adding the folder. You need to remove the folder, delete or decrypt the data on disk, and add the folder again.": "Folder type \"{{receiveEncrypted}}\" cannot be changed after adding the folder. You need to remove the folder, delete or decrypt the data on disk, and add the folder again.", diff --git a/gui/default/index.html b/gui/default/index.html index 4c55ffd7b..729e50580 100644 --- a/gui/default/index.html +++ b/gui/default/index.html @@ -395,37 +395,12 @@
- - - - - - - - - - - - - - - - - - - - - - - - - ({{syncPercentage(folder.id) | percent}}, {{model[folder.id].needBytes | binary}}B) - - - - + + ({{scanPercentage(folder.id) | percent}}) + ({{syncPercentage(folder.id) | percent}}, {{model[folder.id].needBytes | binary}}B) + + +
{{folder.label.length != 0 ? folder.label : folder.id}} @@ -436,6 +411,10 @@
+ + + + @@ -794,23 +773,16 @@

- - - - - - ({{completion[deviceCfg.deviceID]._total | percent}}, {{completion[deviceCfg.deviceID]._needBytes | binary}}B) - - - - - - +
+ + ({{completion[deviceCfg.deviceID]._total | percent}}, {{completion[deviceCfg.deviceID]._needBytes | binary}}B) + + - + - +
{{deviceName(deviceCfg)}}

@@ -818,6 +790,10 @@
 Folder Status{{folderStatusText(folder)}}
 Folder ID {{folder.id}}
+ + + +
 Device Status{{deviceStatusText(deviceCfg)}}
 Last seen diff --git a/gui/default/syncthing/core/syncthingController.js b/gui/default/syncthing/core/syncthingController.js index bc04e8fe2..5b761feb2 100755 --- a/gui/default/syncthing/core/syncthingController.js +++ b/gui/default/syncthing/core/syncthingController.js @@ -1151,6 +1151,113 @@ angular.module('syncthing.core') } }; + $scope.deviceStatusIcon = function(cfg) { + switch ($scope.deviceStatus(cfg)) { + case 'disconnected': + case 'disconnected-inactive': + return 'fa-power-off'; + case 'insync': + return 'fa-check'; + case 'paused': + return 'fa-pause'; + case 'syncing': + return 'fa-sync'; + case 'unused-disconnected': + case 'unused-insync': + case 'unused-paused': + return 'fa-unlink'; + } + }; + + $scope.deviceStatusText = function(device) { + switch ($scope.deviceStatus(device)) { + case 'disconnected': + return $translate.instant('Disconnected'); + case 'disconnected-inactive': + return $translate.instant('Disconnected (Inactive)'); + case 'insync': + return $translate.instant('Up to Date'); + case 'paused': + return $translate.instant('Paused'); + case 'syncing': + return $translate.instant('Syncing'); + case 'unused-disconnected': + return $translate.instant('Disconnected (Unused)'); + case 'unused-insync': + return $translate.instant('Connected (Unused)'); + case 'unused-paused': + return $translate.instant('Paused (Unused)'); + } + }; + + $scope.folderStatusIcon = function(cfg) { + switch ($scope.folderStatus(cfg)) { + case 'clean-waiting': + case 'scan-waiting': + case 'sync-preparing': + case 'sync-waiting': + return 'fa-hourglass-half'; + case 'cleaning': + return 'fa-recycle'; + case 'faileditems': + case 'localunencrypted': + case 'outofsync': + return 'fa-exclamation-circle'; + case 'idle': + case 'localadditions': + return 'fa-check'; + case 'paused': + return 'fa-pause'; + case 'scanning': + return 'fa-search'; + case 'stopped': + return 'fa-stop'; + case 'syncing': + return 'fa-sync'; + case 'unknown': + return 'fa-question-circle'; + case 'unshared': + return 'fa-unlink'; + } + }; + + $scope.folderStatusText = function(folder) { + switch ($scope.folderStatus(folder)) { + case 'clean-waiting': + return $translate.instant('Waiting to Clean'); + case 'cleaning': + return $translate.instant('Cleaning Versions'); + case 'faileditems': + return $translate.instant('Failed Items'); + case 'idle': + return $translate.instant('Up to Date'); + case 'localadditions': + return $translate.instant('Local Additions'); + case 'localunencrypted': + return $translate.instant('Unexpected Items'); + case 'outofsync': + return $translate.instant('Out of Sync'); + case 'paused': + return $translate.instant('Paused'); + case 'scan-waiting': + return $translate.instant('Waiting to Scan'); + case 'scanning': + return $translate.instant('Scanning'); + case 'stopped': + return $translate.instant('Stopped'); + case 'sync-preparing': + return $translate.instant('Preparing to Sync'); + case 'sync-waiting': + return $translate.instant('Waiting to Sync'); + case 'syncing': + return $translate.instant('Syncing'); + case 'unknown': + return $translate.instant('Unknown'); + case 'unshared': + return $translate.instant('Unshared'); + } + }; + $scope.deviceClass = function (deviceCfg) { if (typeof $scope.connections[deviceCfg.deviceID] === 'undefined') { return 'info';