2016-05-23 19:06:50 +02:00
|
|
|
(function () {
|
|
|
|
'use strict';
|
|
|
|
|
2017-10-14 20:13:28 +02:00
|
|
|
angular.module('ariaNg').controller('TaskDetailController', ['$rootScope', '$scope', '$routeParams', '$interval', 'clipboard', 'aria2RpcErrors', 'ariaNgFileTypes', 'ariaNgCommonService', 'ariaNgSettingService', 'ariaNgMonitorService', 'aria2TaskService', 'aria2SettingService', function ($rootScope, $scope, $routeParams, $interval, clipboard, aria2RpcErrors, ariaNgFileTypes, ariaNgCommonService, ariaNgSettingService, ariaNgMonitorService, aria2TaskService, aria2SettingService) {
|
2016-05-24 19:30:02 +02:00
|
|
|
var tabOrders = ['overview', 'blocks', 'filelist', 'btpeers'];
|
2016-05-23 19:06:50 +02:00
|
|
|
var downloadTaskRefreshPromise = null;
|
2016-06-07 17:40:57 +02:00
|
|
|
var pauseDownloadTaskRefresh = false;
|
2016-05-23 19:06:50 +02:00
|
|
|
|
2016-06-01 18:02:10 +02:00
|
|
|
var getAvailableOptions = function (status, isBittorrent) {
|
|
|
|
var keys = aria2SettingService.getAvailableTaskOptionKeys(status, isBittorrent);
|
2016-05-25 17:33:06 +02:00
|
|
|
|
2017-03-25 05:57:07 +01:00
|
|
|
return aria2SettingService.getSpecifiedOptions(keys, {
|
|
|
|
disableRequired: true
|
|
|
|
});
|
2016-06-01 18:02:10 +02:00
|
|
|
};
|
2016-05-25 17:33:06 +02:00
|
|
|
|
2016-07-04 18:59:04 +02:00
|
|
|
var processTask = function (task) {
|
|
|
|
if (!task) {
|
2016-06-07 17:40:57 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-08-01 16:49:16 +02:00
|
|
|
if (task.status !== 'active' || !task.bittorrent) {
|
2016-07-04 18:59:04 +02:00
|
|
|
if (tabOrders.indexOf('btpeers') >= 0) {
|
|
|
|
tabOrders.splice(tabOrders.indexOf('btpeers'), 1);
|
2016-06-10 13:23:16 +02:00
|
|
|
}
|
2016-07-04 18:59:04 +02:00
|
|
|
}
|
2016-06-10 13:23:16 +02:00
|
|
|
|
2016-08-01 16:49:16 +02:00
|
|
|
if (!$scope.task || $scope.task.status !== task.status) {
|
2016-07-04 18:59:04 +02:00
|
|
|
$scope.context.availableOptions = getAvailableOptions(task.status, !!task.bittorrent);
|
|
|
|
}
|
2016-06-10 13:23:16 +02:00
|
|
|
|
2016-07-04 18:59:04 +02:00
|
|
|
$scope.task = ariaNgCommonService.copyObjectTo(task, $scope.task);
|
|
|
|
|
|
|
|
$rootScope.taskContext.list = [$scope.task];
|
|
|
|
$rootScope.taskContext.selected = {};
|
|
|
|
$rootScope.taskContext.selected[$scope.task.gid] = true;
|
|
|
|
|
|
|
|
ariaNgMonitorService.recordStat(task.gid, task);
|
|
|
|
};
|
|
|
|
|
|
|
|
var processPeers = function (peers) {
|
|
|
|
if (!peers) {
|
|
|
|
return;
|
|
|
|
}
|
2016-05-24 17:30:33 +02:00
|
|
|
|
2016-07-04 18:59:04 +02:00
|
|
|
if (!ariaNgCommonService.extendArray(peers, $scope.context.btPeers, 'peerId')) {
|
|
|
|
$scope.context.btPeers = peers;
|
|
|
|
}
|
|
|
|
|
|
|
|
$scope.context.healthPercent = aria2TaskService.estimateHealthPercentFromPeers($scope.task, $scope.context.btPeers);
|
|
|
|
};
|
|
|
|
|
|
|
|
var requireBtPeers = function (task) {
|
2016-08-01 16:49:16 +02:00
|
|
|
return (task && task.bittorrent && task.status === 'active');
|
2016-07-04 18:59:04 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
var refreshDownloadTask = function (silent) {
|
|
|
|
if (pauseDownloadTaskRefresh) {
|
|
|
|
return;
|
2016-12-10 18:50:25 +01:00
|
|
|
}
|
2016-06-01 18:02:10 +02:00
|
|
|
|
2016-07-04 18:59:04 +02:00
|
|
|
var processError = function (message) {
|
2017-05-20 06:46:26 +02:00
|
|
|
$interval.cancel(downloadTaskRefreshPromise);
|
2016-07-04 18:59:04 +02:00
|
|
|
};
|
2016-05-30 19:26:41 +02:00
|
|
|
|
2016-07-04 18:59:04 +02:00
|
|
|
var includeLocalPeer = true;
|
2016-07-03 12:07:07 +02:00
|
|
|
|
2016-07-04 18:59:04 +02:00
|
|
|
if (!$scope.task) {
|
|
|
|
return aria2TaskService.getTaskStatus($routeParams.gid, function (response) {
|
|
|
|
if (!response.success) {
|
|
|
|
return processError(response.data.message);
|
2016-07-03 12:07:07 +02:00
|
|
|
}
|
|
|
|
|
2016-07-04 18:59:04 +02:00
|
|
|
var task = response.data;
|
|
|
|
processTask(task);
|
2016-07-03 12:07:07 +02:00
|
|
|
|
2016-07-04 18:59:04 +02:00
|
|
|
if (requireBtPeers(task)) {
|
|
|
|
aria2TaskService.getBtTaskPeers(task, function (response) {
|
|
|
|
if (response.success) {
|
|
|
|
processPeers(response.data);
|
|
|
|
}
|
|
|
|
}, silent, includeLocalPeer);
|
|
|
|
}
|
|
|
|
}, silent);
|
|
|
|
} else {
|
|
|
|
return aria2TaskService.getTaskStatusAndBtPeers($routeParams.gid, function (response) {
|
|
|
|
if (!response.success) {
|
|
|
|
return processError(response.data.message);
|
|
|
|
}
|
2016-06-10 19:25:09 +02:00
|
|
|
|
2016-07-04 18:59:04 +02:00
|
|
|
processTask(response.task);
|
|
|
|
processPeers(response.peers);
|
|
|
|
}, silent, requireBtPeers($scope.task), includeLocalPeer);
|
|
|
|
}
|
2016-05-23 19:06:50 +02:00
|
|
|
};
|
|
|
|
|
2016-06-26 12:10:58 +02:00
|
|
|
var setSelectFiles = function (silent) {
|
|
|
|
if (!$scope.task || !$scope.task.files) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var gid = $scope.task.gid;
|
|
|
|
var selectedFileIndex = [];
|
|
|
|
|
|
|
|
for (var i = 0; i < $scope.task.files.length; i++) {
|
|
|
|
var file = $scope.task.files[i];
|
|
|
|
|
|
|
|
if (file && file.selected) {
|
|
|
|
selectedFileIndex.push(file.index);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pauseDownloadTaskRefresh = true;
|
|
|
|
|
|
|
|
return aria2TaskService.selectTaskFile(gid, selectedFileIndex, function (response) {
|
|
|
|
pauseDownloadTaskRefresh = false;
|
|
|
|
|
|
|
|
if (response.success) {
|
|
|
|
refreshDownloadTask(false);
|
|
|
|
}
|
|
|
|
}, silent);
|
|
|
|
};
|
|
|
|
|
2016-06-01 18:02:10 +02:00
|
|
|
$scope.context = {
|
2016-06-10 19:25:09 +02:00
|
|
|
currentTab: 'overview',
|
2016-12-04 16:36:12 +01:00
|
|
|
isEnableSpeedChart: ariaNgSettingService.getDownloadTaskRefreshInterval() > 0,
|
2016-06-26 12:10:58 +02:00
|
|
|
showChooseFilesToolbar: false,
|
2016-06-20 18:20:30 +02:00
|
|
|
btPeers: [],
|
2016-06-10 19:25:09 +02:00
|
|
|
healthPercent: 0,
|
2016-07-10 14:42:21 +02:00
|
|
|
collapseTrackers: true,
|
2016-06-10 19:25:09 +02:00
|
|
|
statusData: ariaNgMonitorService.getEmptyStatsData($routeParams.gid),
|
2016-06-20 18:20:30 +02:00
|
|
|
availableOptions: [],
|
|
|
|
options: []
|
2016-06-01 18:02:10 +02:00
|
|
|
};
|
|
|
|
|
2016-06-20 17:45:33 +02:00
|
|
|
$scope.changeTab = function (tabName) {
|
2016-08-01 16:49:16 +02:00
|
|
|
if (tabName === 'settings') {
|
2016-06-20 17:45:33 +02:00
|
|
|
$scope.loadTaskOption($scope.task);
|
|
|
|
}
|
|
|
|
|
|
|
|
$scope.context.currentTab = tabName;
|
|
|
|
};
|
|
|
|
|
2016-05-24 19:30:02 +02:00
|
|
|
$rootScope.swipeActions.extentLeftSwipe = function () {
|
|
|
|
var tabIndex = tabOrders.indexOf($scope.context.currentTab);
|
|
|
|
|
|
|
|
if (tabIndex < tabOrders.length - 1) {
|
2016-06-20 17:45:33 +02:00
|
|
|
$scope.changeTab(tabOrders[tabIndex + 1]);
|
2016-05-24 19:30:02 +02:00
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
$rootScope.swipeActions.extentRightSwipe = function () {
|
|
|
|
var tabIndex = tabOrders.indexOf($scope.context.currentTab);
|
|
|
|
|
|
|
|
if (tabIndex > 0) {
|
2016-06-20 17:45:33 +02:00
|
|
|
$scope.changeTab(tabOrders[tabIndex - 1]);
|
2016-05-24 19:30:02 +02:00
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2016-05-25 17:33:06 +02:00
|
|
|
$scope.changeFileListDisplayOrder = function (type, autoSetReverse) {
|
2016-05-31 16:51:12 +02:00
|
|
|
var oldType = ariaNgCommonService.parseOrderType(ariaNgSettingService.getFileListDisplayOrder());
|
|
|
|
var newType = ariaNgCommonService.parseOrderType(type);
|
2016-05-25 17:33:06 +02:00
|
|
|
|
2016-08-01 16:49:16 +02:00
|
|
|
if (autoSetReverse && newType.type === oldType.type) {
|
2016-05-25 17:33:06 +02:00
|
|
|
newType.reverse = !oldType.reverse;
|
|
|
|
}
|
|
|
|
|
|
|
|
ariaNgSettingService.setFileListDisplayOrder(newType.getValue());
|
|
|
|
};
|
|
|
|
|
2016-05-25 18:09:00 +02:00
|
|
|
$scope.isSetFileListDisplayOrder = function (type) {
|
2016-05-31 16:51:12 +02:00
|
|
|
var orderType = ariaNgCommonService.parseOrderType(ariaNgSettingService.getFileListDisplayOrder());
|
|
|
|
var targetType = ariaNgCommonService.parseOrderType(type);
|
2016-05-25 17:33:06 +02:00
|
|
|
|
2016-05-25 18:09:00 +02:00
|
|
|
return orderType.equals(targetType);
|
2016-05-25 17:33:06 +02:00
|
|
|
};
|
2016-05-25 18:09:00 +02:00
|
|
|
|
2016-05-25 17:33:06 +02:00
|
|
|
$scope.getFileListOrderType = function () {
|
|
|
|
return ariaNgSettingService.getFileListDisplayOrder();
|
|
|
|
};
|
|
|
|
|
2016-06-26 12:10:58 +02:00
|
|
|
$scope.showChooseFilesToolbar = function () {
|
|
|
|
pauseDownloadTaskRefresh = true;
|
|
|
|
$scope.context.showChooseFilesToolbar = true;
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.getSelectedFileCount = function () {
|
|
|
|
var count = 0;
|
|
|
|
|
|
|
|
for (var i = 0; i < $scope.task.files.length; i++) {
|
|
|
|
count += $scope.task.files[i].selected ? 1 : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return count;
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.selectFiles = function (type) {
|
2016-06-06 17:15:46 +02:00
|
|
|
if (!$scope.task || !$scope.task.files) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-06-26 12:10:58 +02:00
|
|
|
for (var i = 0; i < $scope.task.files.length; i++) {
|
2016-08-01 16:49:16 +02:00
|
|
|
if (type === 'all') {
|
2016-06-26 12:10:58 +02:00
|
|
|
$scope.task.files[i].selected = true;
|
2016-08-01 16:49:16 +02:00
|
|
|
} else if (type === 'none') {
|
2016-06-26 12:10:58 +02:00
|
|
|
$scope.task.files[i].selected = false;
|
2016-08-01 16:49:16 +02:00
|
|
|
} else if (type === 'reverse') {
|
2016-06-26 12:10:58 +02:00
|
|
|
$scope.task.files[i].selected = !$scope.task.files[i].selected;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.chooseSpecifiedFiles = function (type) {
|
|
|
|
if (!$scope.task || !$scope.task.files || !ariaNgFileTypes[type]) {
|
|
|
|
return;
|
|
|
|
}
|
2016-06-28 16:13:16 +02:00
|
|
|
|
2016-06-26 12:10:58 +02:00
|
|
|
var extensions = ariaNgFileTypes[type];
|
|
|
|
var fileIndexes = [];
|
|
|
|
var isAllSelected = true;
|
2016-06-06 17:15:46 +02:00
|
|
|
|
|
|
|
for (var i = 0; i < $scope.task.files.length; i++) {
|
2016-06-26 12:10:58 +02:00
|
|
|
var extension = ariaNgCommonService.getFileExtension($scope.task.files[i].fileName);
|
2016-06-06 17:15:46 +02:00
|
|
|
|
2017-02-09 16:55:18 +01:00
|
|
|
if (extension) {
|
|
|
|
extension = extension.toLowerCase();
|
|
|
|
}
|
|
|
|
|
2016-06-26 12:10:58 +02:00
|
|
|
if (extensions.indexOf(extension) >= 0) {
|
|
|
|
fileIndexes.push(i);
|
|
|
|
|
|
|
|
if (!$scope.task.files[i].selected) {
|
|
|
|
isAllSelected = false;
|
|
|
|
}
|
2016-06-06 17:15:46 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-06-26 12:10:58 +02:00
|
|
|
for (var i = 0; i < fileIndexes.length; i++) {
|
|
|
|
var index = fileIndexes[i];
|
|
|
|
$scope.task.files[index].selected = !isAllSelected;
|
|
|
|
}
|
|
|
|
};
|
2016-06-07 17:40:57 +02:00
|
|
|
|
2016-06-26 12:10:58 +02:00
|
|
|
$scope.saveChoosedFiles = function () {
|
|
|
|
if ($scope.context.showChooseFilesToolbar) {
|
|
|
|
$rootScope.loadPromise = setSelectFiles(false);
|
|
|
|
$scope.context.showChooseFilesToolbar = false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.cancelChooseFiles = function () {
|
|
|
|
if ($scope.context.showChooseFilesToolbar) {
|
2016-06-07 17:40:57 +02:00
|
|
|
pauseDownloadTaskRefresh = false;
|
2016-06-26 12:10:58 +02:00
|
|
|
refreshDownloadTask(true);
|
|
|
|
$scope.context.showChooseFilesToolbar = false;
|
|
|
|
}
|
|
|
|
};
|
2016-06-10 13:23:16 +02:00
|
|
|
|
2016-06-26 12:10:58 +02:00
|
|
|
$scope.setSelectedFile = function () {
|
|
|
|
if (!$scope.context.showChooseFilesToolbar) {
|
|
|
|
setSelectFiles(true);
|
|
|
|
}
|
2016-06-10 13:23:16 +02:00
|
|
|
};
|
2016-06-06 17:15:46 +02:00
|
|
|
|
2016-06-11 16:24:49 +02:00
|
|
|
$scope.changePeerListDisplayOrder = function (type, autoSetReverse) {
|
|
|
|
var oldType = ariaNgCommonService.parseOrderType(ariaNgSettingService.getPeerListDisplayOrder());
|
|
|
|
var newType = ariaNgCommonService.parseOrderType(type);
|
|
|
|
|
2016-08-01 16:49:16 +02:00
|
|
|
if (autoSetReverse && newType.type === oldType.type) {
|
2016-06-11 16:24:49 +02:00
|
|
|
newType.reverse = !oldType.reverse;
|
|
|
|
}
|
|
|
|
|
|
|
|
ariaNgSettingService.setPeerListDisplayOrder(newType.getValue());
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.isSetPeerListDisplayOrder = function (type) {
|
|
|
|
var orderType = ariaNgCommonService.parseOrderType(ariaNgSettingService.getPeerListDisplayOrder());
|
|
|
|
var targetType = ariaNgCommonService.parseOrderType(type);
|
|
|
|
|
|
|
|
return orderType.equals(targetType);
|
|
|
|
};
|
|
|
|
|
|
|
|
$scope.getPeerListOrderType = function () {
|
|
|
|
return ariaNgSettingService.getPeerListDisplayOrder();
|
|
|
|
};
|
|
|
|
|
2016-06-01 18:02:10 +02:00
|
|
|
$scope.loadTaskOption = function (task) {
|
2016-06-10 13:23:16 +02:00
|
|
|
$rootScope.loadPromise = aria2TaskService.getTaskOptions(task.gid, function (response) {
|
|
|
|
if (response.success) {
|
2016-06-20 18:20:30 +02:00
|
|
|
$scope.context.options = response.data;
|
2016-06-10 13:23:16 +02:00
|
|
|
}
|
2016-06-01 18:02:10 +02:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2016-06-02 18:16:27 +02:00
|
|
|
$scope.setOption = function (key, value, optionStatus) {
|
2016-06-10 13:23:16 +02:00
|
|
|
return aria2TaskService.setTaskOption($scope.task.gid, key, value, function (response) {
|
2016-08-01 16:49:16 +02:00
|
|
|
if (response.success && response.data === 'OK') {
|
2016-06-02 18:16:27 +02:00
|
|
|
optionStatus.setSuccess();
|
|
|
|
} else {
|
2016-06-25 15:48:06 +02:00
|
|
|
optionStatus.setFailed(response.data.message);
|
2016-06-02 18:16:27 +02:00
|
|
|
}
|
2016-06-10 13:23:16 +02:00
|
|
|
}, true);
|
2016-06-01 18:02:10 +02:00
|
|
|
};
|
|
|
|
|
2016-05-23 19:06:50 +02:00
|
|
|
if (ariaNgSettingService.getDownloadTaskRefreshInterval() > 0) {
|
|
|
|
downloadTaskRefreshPromise = $interval(function () {
|
2016-08-01 16:49:16 +02:00
|
|
|
if ($scope.task && ($scope.task.status === 'complete' || $scope.task.status === 'error' || $scope.task.status === 'removed')) {
|
2016-06-28 16:13:16 +02:00
|
|
|
$interval.cancel(downloadTaskRefreshPromise);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-06-04 09:33:40 +02:00
|
|
|
refreshDownloadTask(true);
|
2016-05-23 19:06:50 +02:00
|
|
|
}, ariaNgSettingService.getDownloadTaskRefreshInterval());
|
|
|
|
}
|
|
|
|
|
|
|
|
$scope.$on('$destroy', function () {
|
|
|
|
if (downloadTaskRefreshPromise) {
|
|
|
|
$interval.cancel(downloadTaskRefreshPromise);
|
|
|
|
}
|
|
|
|
});
|
2016-05-31 16:51:12 +02:00
|
|
|
|
2017-10-14 20:13:28 +02:00
|
|
|
angular.element('#overview-items .row').contextmenu({
|
|
|
|
target:'#task-overview-contextmenu',
|
|
|
|
onItem: function (context, e) {
|
|
|
|
var name = context.find('.setting-key > span').text().trim();
|
|
|
|
var value = "";
|
|
|
|
|
|
|
|
context.find('.setting-value > span').each(function (i, element) {
|
|
|
|
if (i > 0) {
|
|
|
|
value += '\n';
|
|
|
|
}
|
|
|
|
|
|
|
|
value += angular.element(element).text().trim();
|
|
|
|
});
|
|
|
|
|
|
|
|
var info = name + ': ' + value;
|
|
|
|
clipboard.copyText(info);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2016-06-04 09:33:40 +02:00
|
|
|
$rootScope.loadPromise = refreshDownloadTask(false);
|
2016-05-23 19:06:50 +02:00
|
|
|
}]);
|
2016-08-01 16:49:16 +02:00
|
|
|
}());
|