support retry multi tasks

This commit is contained in:
MaysWind 2018-11-11 22:23:11 +08:00
parent 65df41f3fd
commit 3645a4f540
7 changed files with 158 additions and 11 deletions

View file

@ -1,4 +1,5 @@
[global]
Operation Result=操作结果
Operation Succeeded=操作成功
{{name}} is connected={{name}} 已连接
Error=错误
@ -16,6 +17,7 @@ New=新建
Start=开始任务
Pause=暂停任务
Retry=重试
Retry Selected Tasks=重试选中任务
Delete=删除任务
Select All=全部选中
Select None=全部不选
@ -113,8 +115,9 @@ No Data=无数据
No connected peers=没有连接到其他节点
Failed to change some tasks state.=修改一些任务状态时失败.
Confirm Retry=确认重试
Are you sure you want to retry this task? AriaNg will create a same task after clicking OK.=您是否要重试这个任务? 点击 "确定" 后, AriaNg 将会创建一个相同的任务.
Are you sure you want to retry the selected task? AriaNg will create same task after clicking OK.=您是否要重试选中的任务? 点击 "确定" 后, AriaNg 将会创建相同的任务.
Failed to retry this task.=该任务重试失败.
{{successCount}} tasks have been retried and {{failedCount}} tasks are failed.={{successCount}} 个任务重试成功以及 {{failedCount}} 个任务失败.
Confirm Remove=确认删除
Are you sure you want to remove the selected task?=您是否要删除选中的任务?
Failed to remove some task(s).=删除一些任务时失败.

View file

@ -1,4 +1,5 @@
[global]
Operation Result=操作結果
Operation Succeeded=操作成功
{{name}} is connected={{name}} 已連線
Error=錯誤
@ -16,6 +17,7 @@ New=新增
Start=開始工作
Pause=暫停工作
Retry=重試
Retry Selected Tasks=重試選中工作
Delete=刪除工作
Select All=全部選中
Select None=全部不選
@ -113,8 +115,9 @@ No Data=無資料
No connected peers=沒有連線到其他節點
Failed to change some tasks state.=修改一些工作狀態時失敗.
Confirm Retry=確認重試
Are you sure you want to retry this task? AriaNg will create a same task after clicking OK.=您是否要重試這個工作? 點選 "確定" 後, AriaNg 將會建立一個相同的工作.
Are you sure you want to retry the selected task? AriaNg will create same task after clicking OK.=您是否要重試選中的工作? 點選 "確定" 後, AriaNg 將會建立相同的工作.
Failed to retry this task.=該工作重試失敗.
{{successCount}} tasks have been retried and {{failedCount}} tasks are failed.={{successCount}} 个工作重試成功以及 {{failedCount}} 个工作失敗.
Confirm Remove=確認刪除
Are you sure you want to remove the selected task?=您是否要刪除選中的工作?
Failed to remove some task(s).=刪除一些工作時失敗.

View file

@ -3,6 +3,7 @@
angular.module('ariaNg').config(['$translateProvider', 'ariaNgConstants', function ($translateProvider, ariaNgConstants) {
var defaultLanguageResource = {
'Operation Result': 'Operation Result',
'Operation Succeeded': 'Operation Succeeded',
'{{name}} is connected': '{{name}} is connected',
'Error': 'Error',
@ -20,6 +21,7 @@
'Start': 'Start',
'Pause': 'Pause',
'Retry': 'Retry',
'Retry Selected Tasks': 'Retry Selected Tasks',
'Delete': 'Delete',
'Select All': 'Select All',
'Select None': 'Select None',
@ -117,8 +119,9 @@
'No connected peers': 'No connected peers',
'Failed to change some tasks state.': 'Failed to change some tasks state.',
'Confirm Retry': 'Confirm Retry',
'Are you sure you want to retry this task? AriaNg will create a same task after clicking OK.': 'Are you sure you want to retry this task? AriaNg will create a same task after clicking OK.',
'Are you sure you want to retry the selected task? AriaNg will create same task after clicking OK.': 'Are you sure you want to retry the selected task? AriaNg will create same task after clicking OK.',
'Failed to retry this task.': 'Failed to retry this task.',
'{{successCount}} tasks have been retried and {{failedCount}} tasks are failed.': '{{successCount}} tasks have been retried and {{failedCount}} tasks are failed.',
'Confirm Remove': 'Confirm Remove',
'Are you sure you want to remove the selected task?': 'Are you sure you want to remove the selected task?',
'Failed to remove some task(s).': 'Failed to remove some task(s).',

View file

@ -139,7 +139,7 @@
};
$scope.retryTask = function (task) {
ariaNgLocalizationService.confirm('Confirm Retry', 'Are you sure you want to retry this task? AriaNg will create a same task after clicking OK.', 'info', function () {
ariaNgLocalizationService.confirm('Confirm Retry', 'Are you sure you want to retry the selected task? AriaNg will create same task after clicking OK.', 'info', function () {
$rootScope.loadPromise = aria2TaskService.retryTask(task.gid, function (response) {
if (!response.success) {
ariaNgLocalizationService.showError('Failed to retry this task.');
@ -167,6 +167,75 @@
});
};
$scope.isTaskRetryable = function (task) {
return task && task.status === 'error' && task.errorDescription && !task.bittorrent;
};
$scope.isSelectedTaskRetryable = function () {
var selectedTasks = $rootScope.taskContext.getSelectedTasks();
if (selectedTasks.length < 1) {
return false;
}
for (var i = 0; i < selectedTasks.length; i++) {
if (!$scope.isTaskRetryable(selectedTasks[i])) {
return false;
}
}
return true;
};
$scope.retryTasks = function () {
var tasks = $rootScope.taskContext.getSelectedTasks();
if (!tasks || tasks.length < 1) {
return;
} else if (tasks.length === 1) {
return $scope.retryTask(tasks[0]);
}
var retryableTasks = [];
var skipCount = 0;
for (var i = 0; i < tasks.length; i++) {
if ($scope.isTaskRetryable(tasks[i])) {
retryableTasks.push(tasks[i]);
} else {
skipCount++;
}
}
ariaNgLocalizationService.confirm('Confirm Retry', 'Are you sure you want to retry the selected task? AriaNg will create same task after clicking OK.', 'info', function () {
$rootScope.loadPromise = aria2TaskService.retryTasks(retryableTasks, function (response) {
refreshGlobalStat(true);
ariaNgLocalizationService.showInfo('Operation Result', '{{successCount}} tasks have been retried and {{failedCount}} tasks are failed.', function () {
var actionAfterRetryingTask = ariaNgSettingService.getAfterRetryingTask();
if (response.hasSuccess) {
if (actionAfterRetryingTask === 'task-list-downloading') {
if ($location.path() !== '/downloading') {
$location.path('/downloading');
} else {
$route.reload();
}
} else {
$route.reload();
}
}
}, {
textParams: {
successCount: response.successCount,
failedCount: response.failedCount,
skipCount: skipCount
}
});
}, false);
}, true);
};
$scope.removeTasks = function () {
var tasks = $rootScope.taskContext.getSelectedTasks();

View file

@ -720,6 +720,63 @@
return deferred.promise;
},
retryTasks: function (tasks, callback, silent) {
if (!callback) {
ariaNgLogService.warn('[aria2TaskService.retryTasks] callback is null');
return;
}
var retryTaskFunc = this.retryTask;
var deferred = $q.defer();
var lastPromise = null;
var successCount = 0;
var failedCount = 0;
var doRetryFunc = function (task, index) {
return retryTaskFunc(task.gid, function (response) {
ariaNgLogService.debug('[aria2TaskService.retryTasks] task#' + index + ', gid=' + task.gid + ', result=' + response.success, task);
if (response.success) {
successCount++;
} else {
failedCount++;
}
if ((successCount + failedCount) === tasks.length) {
var finalResponse = {
successCount: successCount,
failedCount: failedCount,
hasSuccess: successCount > 0,
hasError: failedCount > 0
};
deferred.resolve(finalResponse);
callback(finalResponse);
}
}, silent);
};
for (var i = 0; i < tasks.length; i++) {
var task = tasks[i];
var currentPromise = null;
if (!lastPromise) {
currentPromise = doRetryFunc(task, i);
} else {
currentPromise = (function (task, index) {
return lastPromise.then(function () {
return doRetryFunc(task, index);
});
})(task, i);
}
lastPromise = currentPromise;
}
return deferred.promise;
},
removeTasks: function (tasks, callback, silent) {
var runningTaskGids = [];
var stoppedTaskGids = [];

View file

@ -15,20 +15,25 @@
getLongDateFormat: function () {
return this.getLocalizedText('format.longdate');
},
showDialog: function (title, text, type, callback) {
showDialog: function (title, text, type, callback, extendSettings) {
if (!extendSettings) {
extendSettings = {};
}
if (title) {
title = this.getLocalizedText(title);
}
if (text) {
text = this.getLocalizedText(text);
text = this.getLocalizedText(text, extendSettings.textParams);
}
var options = {
confirmButtonText: this.getLocalizedText('OK')
};
extendSettings.confirmButtonText = this.getLocalizedText('OK');
ariaNgCommonService.showDialog(title, text, type, callback, options);
ariaNgCommonService.showDialog(title, text, type, callback, extendSettings);
},
showInfo: function (title, text, callback, extendSettings) {
this.showDialog(title, text, 'info', callback, extendSettings);
},
showError: function (text, callback) {
this.showDialog('Error', text, 'error', callback);

View file

@ -48,7 +48,7 @@
<a ng-href="#!/task/detail/{{task.gid}}" title="{{'Click to view task detail' | translate}}">
<span ng-if="task.files" ng-bind="('format.settings.file-count' | translate: {count: task.selectedFileCount})"></span>
</a><i class="icon-error fa fa-times" ng-if="task && task.status === 'error' && task.errorDescription" title="{{task.errorDescription | translate}}"></i><i class="icon-seeder fa fa-arrow-up" ng-if="task && task.status === 'active' && task.seeder" title="{{'Seeding' | translate}}"></i>
<a ng-if="task && task.status === 'error' && task.errorDescription && !task.bittorrent" ng-click="retryTask(task)" title="{{'Retry' | translate}}" translate>Retry</a>
<a ng-if="isTaskRetryable(task)" ng-click="retryTask(task)" title="{{'Retry' | translate}}" translate>Retry</a>
</div>
</div>
<div class="col-md-2 col-sm-3 col-xs-12">
@ -76,6 +76,13 @@
</div>
<div id="task-table-contextmenu">
<ul class="dropdown-menu" role="menu">
<li ng-if="isSelectedTaskRetryable()">
<a tabindex="-1" class="pointer-cursor" title="{{'Retry Selected Tasks' | translate}}" ng-click="retryTasks()">
<i class="fa fa-refresh"></i>
<span translate>Retry Selected Tasks</span>
</a>
</li>
<li class="divider" ng-if="isSelectedTaskRetryable()"></li>
<li ng-if="isSpecifiedTaskSelected('paused')">
<a tabindex="-1" class="pointer-cursor" title="{{'Start' | translate}}" ng-click="changeTasksState('start')">
<i class="fa fa-play"></i>