gui, lib/model: Display list of files needed by remote (fixes #4369)

GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/4559
LGTM: AudriusButkevicius, calmh
This commit is contained in:
Simon Frei
2017-12-15 20:01:56 +00:00
committed by Jakob Borg
parent c7522063b3
commit 8fa2b7765a
10 changed files with 313 additions and 76 deletions

View File

@@ -45,7 +45,6 @@ angular.module('syncthing.core')
$scope.progress = {};
$scope.version = {};
$scope.needed = [];
$scope.neededTotal = 0;
$scope.neededCurrentPage = 1;
$scope.neededPageSize = 10;
$scope.failed = {};
@@ -56,6 +55,7 @@ angular.module('syncthing.core')
$scope.globalChangeEvents = {};
$scope.metricRates = false;
$scope.folderPathErrors = {};
resetRemoteNeed();
try {
$scope.metricRates = (window.localStorage["metricRates"] == "true");
@@ -241,7 +241,8 @@ angular.module('syncthing.core')
};
$scope.completion[arg.data.id] = {
_total: 100,
_needBytes: 0
_needBytes: 0,
_needItems: 0
};
}
});
@@ -389,7 +390,8 @@ angular.module('syncthing.core')
$scope.devices.forEach(function (deviceCfg) {
$scope.completion[deviceCfg.deviceID] = {
_total: 100,
_needBytes: 0
_needBytes: 0,
_needItems: 0
};
});
$scope.devices.sort(deviceCompare);
@@ -431,7 +433,7 @@ angular.module('syncthing.core')
}
}
$scope.listenersFailed = listenersFailed;
$scope.listenersTotal = Object.keys(data.connectionServiceStatus).length;
$scope.listenersTotal = $scope.sizeOf(data.connectionServiceStatus);
$scope.discoveryTotal = data.discoveryMethods;
var discoveryFailed = [];
@@ -476,21 +478,24 @@ angular.module('syncthing.core')
}
function recalcCompletion(device) {
var total = 0, needed = 0, deletes = 0;
var total = 0, needed = 0, deletes = 0, items = 0;
for (var folder in $scope.completion[device]) {
if (folder === "_total" || folder === '_needBytes') {
if (folder === "_total" || folder === '_needBytes' || folder === '_needItems') {
continue;
}
total += $scope.completion[device][folder].globalBytes;
needed += $scope.completion[device][folder].needBytes;
items += $scope.completion[device][folder].needItems;
deletes += $scope.completion[device][folder].needDeletes;
}
if (total == 0) {
$scope.completion[device]._total = 100;
$scope.completion[device]._needBytes = 0;
$scope.completion[device]._needItems = 0;
} else {
$scope.completion[device]._total = Math.floor(100 * (1 - needed / total));
$scope.completion[device]._needBytes = needed
$scope.completion[device]._needItems = items;
}
if (needed == 0 && deletes > 0) {
@@ -498,7 +503,6 @@ angular.module('syncthing.core')
// to do. Drop down the completion percentage to indicate
// that we have stuff to do.
$scope.completion[device]._total = 95;
$scope.completion[device]._needBytes = 0;
}
console.log("recalcCompletion", device, $scope.completion[device]);
@@ -616,7 +620,6 @@ angular.module('syncthing.core')
merged.push(item);
});
$scope.needed = merged;
$scope.neededTotal = data.total;
}
function pathJoin(base, name) {
@@ -638,6 +641,12 @@ angular.module('syncthing.core')
return $scope.config.options && $scope.config.options.defaultFolderPath && !$scope.editingExisting && $scope.folderEditor.folderPath.$pristine
}
function resetRemoteNeed() {
$scope.remoteNeed = {};
$scope.remoteNeedFolders = [];
$scope.remoteNeedDevice = undefined;
}
$scope.neededPageChanged = function (page) {
$scope.neededCurrentPage = page;
refreshNeed($scope.neededFolder);
@@ -656,6 +665,20 @@ angular.module('syncthing.core')
$scope.failedPageSize = perpage;
};
$scope.refreshRemoteNeed = function (folder, page, perpage) {
var url = urlbase + '/db/remoteneed?device=' + $scope.remoteNeedDevice.deviceID;
url += '&folder=' + encodeURIComponent(folder);
url += "&page=" + page + "&perpage=" + perpage;
$http.get(url).success(function (data) {
if ($scope.remoteNeedDevice !== '') {
$scope.remoteNeed[folder] = data;
}
}).error(function (err) {
$scope.remoteNeed[folder] = undefined;
$scope.emitHTTPError(err);
});
};
var refreshDeviceStats = debounce(function () {
$http.get(urlbase + "/stats/device").success(function (data) {
$scope.deviceStats = data;
@@ -965,7 +988,7 @@ angular.module('syncthing.core')
}
// enumerate notifications
if ($scope.openNoAuth || !$scope.configInSync || Object.keys($scope.deviceRejections).length > 0 || Object.keys($scope.folderRejections).length > 0 || $scope.errorList().length > 0 || !online) {
if ($scope.openNoAuth || !$scope.configInSync || $scope.sizeOf($scope.deviceRejections) > 0 || $scope.sizeOf($scope.folderRejections) > 0 || $scope.errorList().length > 0 || !online) {
notifyCount++;
}
@@ -1623,17 +1646,14 @@ angular.module('syncthing.core')
$scope.deviceFolders = function (deviceCfg) {
var folders = [];
for (var folderID in $scope.folders) {
var devices = $scope.folders[folderID].devices;
for (var i = 0; i < devices.length; i++) {
if (devices[i].deviceID === deviceCfg.deviceID) {
folders.push(folderID);
$scope.folderList().forEach(function (folder) {
for (var i = 0; i < folder.devices.length; i++) {
if (folder.devices[i].deviceID === deviceCfg.deviceID) {
folders.push(folder.id);
break;
}
}
}
folders.sort(folderCompare);
});
return folders;
};
@@ -1729,11 +1749,25 @@ angular.module('syncthing.core')
$('#needed').modal().on('hidden.bs.modal', function () {
$scope.neededFolder = undefined;
$scope.needed = undefined;
$scope.neededTotal = 0;
$scope.neededCurrentPage = 1;
});
};
$scope.showRemoteNeed = function (device) {
resetRemoteNeed();
$scope.remoteNeedDevice = device;
$scope.deviceFolders(device).forEach(function(folder) {
if ($scope.completion[device.deviceID][folder].needItems === 0) {
return;
}
$scope.remoteNeedFolders.push(folder);
$scope.refreshRemoteNeed(folder, 1, 10);
});
$('#remoteNeed').modal().on('hidden.bs.modal', function () {
resetRemoteNeed();
});
};
$scope.showFailed = function (folder) {
$scope.failedCurrent = $scope.failed[folder];
$scope.failedFolderPath = $scope.folders[folder].path;
@@ -1900,12 +1934,16 @@ angular.module('syncthing.core')
// pseudo main. called on all definitions assigned
initController();
}
}
};
$scope.toggleUnits = function () {
$scope.metricRates = !$scope.metricRates;
try {
window.localStorage["metricRates"] = $scope.metricRates;
} catch (exception) { }
}
};
$scope.sizeOf = function (dict) {
return Object.keys(dict).length;
};
});