support select file by file type in task detail page
This commit is contained in:
parent
1d5b8a6ee1
commit
e581a16724
|
@ -3,12 +3,15 @@
|
||||||
"Operation Succeeded": "操作成功",
|
"Operation Succeeded": "操作成功",
|
||||||
"Error": "错误",
|
"Error": "错误",
|
||||||
"OK": "确定",
|
"OK": "确定",
|
||||||
|
"Confirm": "确认",
|
||||||
"Cancel": "取消",
|
"Cancel": "取消",
|
||||||
"New": "新建",
|
"New": "新建",
|
||||||
"Start": "开始下载任务",
|
"Start": "开始下载任务",
|
||||||
"Pause": "暂停下载任务",
|
"Pause": "暂停下载任务",
|
||||||
"Delete": "删除下载任务",
|
"Delete": "删除下载任务",
|
||||||
"Select All": "全选",
|
"Select All": "全选",
|
||||||
|
"Select None": "不选",
|
||||||
|
"Select Invert": "反选",
|
||||||
"Display Order": "显示顺序",
|
"Display Order": "显示顺序",
|
||||||
"Search": "搜索",
|
"Search": "搜索",
|
||||||
"Default": "默认",
|
"Default": "默认",
|
||||||
|
@ -64,6 +67,13 @@
|
||||||
"Connections": "连接数",
|
"Connections": "连接数",
|
||||||
"Seed Creation Time": "种子创建时间",
|
"Seed Creation Time": "种子创建时间",
|
||||||
"Download Dir": "下载路径",
|
"Download Dir": "下载路径",
|
||||||
|
"(Choose Files)": "(选择文件)",
|
||||||
|
"Videos": "视频",
|
||||||
|
"Audios": "音频",
|
||||||
|
"Pictures": "图片",
|
||||||
|
"Documents": "文档",
|
||||||
|
"Applications": "应用程序",
|
||||||
|
"Archives": "存档文件",
|
||||||
"Address": "地址",
|
"Address": "地址",
|
||||||
"Status": "状态",
|
"Status": "状态",
|
||||||
"Percent": "完成度",
|
"Percent": "完成度",
|
||||||
|
|
|
@ -9,6 +9,103 @@
|
||||||
taskStatStorageCapacity: 300,
|
taskStatStorageCapacity: 300,
|
||||||
lazySaveTimeout: 500,
|
lazySaveTimeout: 500,
|
||||||
errorTooltipDelay: 200
|
errorTooltipDelay: 200
|
||||||
|
}).constant('ariaNgFileTypes', {
|
||||||
|
video: [
|
||||||
|
'.3gp',
|
||||||
|
'.3gpp',
|
||||||
|
'.asf',
|
||||||
|
'.asx',
|
||||||
|
'.avi',
|
||||||
|
'.dat',
|
||||||
|
'.flv',
|
||||||
|
'.m4v',
|
||||||
|
'.mkv',
|
||||||
|
'.mov',
|
||||||
|
'.mp4',
|
||||||
|
'.mpe',
|
||||||
|
'.mpeg',
|
||||||
|
'.mpg',
|
||||||
|
'.rm',
|
||||||
|
'.rmvb',
|
||||||
|
'.vob',
|
||||||
|
'.wmv'
|
||||||
|
],
|
||||||
|
audio: [
|
||||||
|
'.aac',
|
||||||
|
'.amr',
|
||||||
|
'.ape',
|
||||||
|
'.flac',
|
||||||
|
'.m4a',
|
||||||
|
'.mid',
|
||||||
|
'.mp3',
|
||||||
|
'.ogg',
|
||||||
|
'.ra',
|
||||||
|
'.vqf',
|
||||||
|
'.wav',
|
||||||
|
'.wma'
|
||||||
|
],
|
||||||
|
picture: [
|
||||||
|
'.bmp',
|
||||||
|
'.emf',
|
||||||
|
'.gif',
|
||||||
|
'.jp2',
|
||||||
|
'.jpeg',
|
||||||
|
'.jpg',
|
||||||
|
'.png',
|
||||||
|
'.psd',
|
||||||
|
'.raw',
|
||||||
|
'.tga',
|
||||||
|
'.tif',
|
||||||
|
'.tiff',
|
||||||
|
'.wmf'
|
||||||
|
],
|
||||||
|
document: [
|
||||||
|
'.doc',
|
||||||
|
'.docx',
|
||||||
|
'.key',
|
||||||
|
'.numbers',
|
||||||
|
'.odp',
|
||||||
|
'.ods',
|
||||||
|
'.odt',
|
||||||
|
'.pages',
|
||||||
|
'.pdf',
|
||||||
|
'.ppt',
|
||||||
|
'.pptx',
|
||||||
|
'.rtf',
|
||||||
|
'.txt',
|
||||||
|
'.vsd',
|
||||||
|
'.vsdx',
|
||||||
|
'.wps',
|
||||||
|
'.xls',
|
||||||
|
'.xlsx'
|
||||||
|
],
|
||||||
|
application: [
|
||||||
|
'.apk',
|
||||||
|
'.bat',
|
||||||
|
'.com',
|
||||||
|
'.deb',
|
||||||
|
'.dll',
|
||||||
|
'.dmg',
|
||||||
|
'.exe',
|
||||||
|
'.ipa',
|
||||||
|
'.jar',
|
||||||
|
'.rpm',
|
||||||
|
'.sh'
|
||||||
|
],
|
||||||
|
archive: [
|
||||||
|
'.7z',
|
||||||
|
'.arj',
|
||||||
|
'.bz2',
|
||||||
|
'.cab',
|
||||||
|
'.gz',
|
||||||
|
'.iso',
|
||||||
|
'.r',
|
||||||
|
'.rar',
|
||||||
|
'.tar',
|
||||||
|
'.tar',
|
||||||
|
'.z',
|
||||||
|
'.zip'
|
||||||
|
]
|
||||||
}).constant('ariaNgDefaultOptions', {
|
}).constant('ariaNgDefaultOptions', {
|
||||||
language: 'en',
|
language: 'en',
|
||||||
rpcHost: '',
|
rpcHost: '',
|
||||||
|
|
|
@ -7,12 +7,15 @@
|
||||||
'Operation Succeeded': 'Operation Succeeded',
|
'Operation Succeeded': 'Operation Succeeded',
|
||||||
'Error': 'Error',
|
'Error': 'Error',
|
||||||
'OK': 'OK',
|
'OK': 'OK',
|
||||||
|
'Confirm': 'Confirm',
|
||||||
'Cancel': 'Cancel',
|
'Cancel': 'Cancel',
|
||||||
'New': 'New',
|
'New': 'New',
|
||||||
'Start': 'Start',
|
'Start': 'Start',
|
||||||
'Pause': 'Pause',
|
'Pause': 'Pause',
|
||||||
'Delete': 'Delete',
|
'Delete': 'Delete',
|
||||||
'Select All': 'Select All',
|
'Select All': 'Select All',
|
||||||
|
'Select None': 'Select None',
|
||||||
|
'Select Invert': 'Select Invert',
|
||||||
'Display Order': 'Display Order',
|
'Display Order': 'Display Order',
|
||||||
'Search': 'Search',
|
'Search': 'Search',
|
||||||
'Default': 'Default',
|
'Default': 'Default',
|
||||||
|
@ -68,6 +71,13 @@
|
||||||
'Connections': 'Connections',
|
'Connections': 'Connections',
|
||||||
'Seed Creation Time': 'Seed Creation Time',
|
'Seed Creation Time': 'Seed Creation Time',
|
||||||
'Download Dir': 'Download Dir',
|
'Download Dir': 'Download Dir',
|
||||||
|
'(Choose Files)': '(Choose Files)',
|
||||||
|
'Videos': 'Videos',
|
||||||
|
'Audios': 'Audios',
|
||||||
|
'Pictures': 'Pictures',
|
||||||
|
'Documents': 'Documents',
|
||||||
|
'Applications': 'Applications',
|
||||||
|
'Archives': 'Archives',
|
||||||
'Address': 'Address',
|
'Address': 'Address',
|
||||||
'Status': 'Status',
|
'Status': 'Status',
|
||||||
'Percent': 'Percent',
|
'Percent': 'Percent',
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
(function () {
|
(function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
angular.module('ariaNg').controller('TaskDetailController', ['$rootScope', '$scope', '$routeParams', '$interval', 'aria2RpcErrors', 'ariaNgCommonService', 'ariaNgSettingService', 'ariaNgMonitorService', 'aria2TaskService', 'aria2SettingService', function ($rootScope, $scope, $routeParams, $interval, aria2RpcErrors, ariaNgCommonService, ariaNgSettingService, ariaNgMonitorService, aria2TaskService, aria2SettingService) {
|
angular.module('ariaNg').controller('TaskDetailController', ['$rootScope', '$scope', '$routeParams', '$interval', 'aria2RpcErrors', 'ariaNgFileTypes', 'ariaNgCommonService', 'ariaNgSettingService', 'ariaNgMonitorService', 'aria2TaskService', 'aria2SettingService', function ($rootScope, $scope, $routeParams, $interval, aria2RpcErrors, ariaNgFileTypes, ariaNgCommonService, ariaNgSettingService, ariaNgMonitorService, aria2TaskService, aria2SettingService) {
|
||||||
var tabOrders = ['overview', 'blocks', 'filelist', 'btpeers'];
|
var tabOrders = ['overview', 'blocks', 'filelist', 'btpeers'];
|
||||||
var downloadTaskRefreshPromise = null;
|
var downloadTaskRefreshPromise = null;
|
||||||
var pauseDownloadTaskRefresh = false;
|
var pauseDownloadTaskRefresh = false;
|
||||||
|
@ -74,8 +74,36 @@
|
||||||
}, silent);
|
}, silent);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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);
|
||||||
|
};
|
||||||
|
|
||||||
$scope.context = {
|
$scope.context = {
|
||||||
currentTab: 'overview',
|
currentTab: 'overview',
|
||||||
|
showChooseFilesToolbar: false,
|
||||||
btPeers: [],
|
btPeers: [],
|
||||||
healthPercent: 0,
|
healthPercent: 0,
|
||||||
statusData: ariaNgMonitorService.getEmptyStatsData($routeParams.gid),
|
statusData: ariaNgMonitorService.getEmptyStatsData($routeParams.gid),
|
||||||
|
@ -135,31 +163,83 @@
|
||||||
return ariaNgSettingService.getFileListDisplayOrder();
|
return ariaNgSettingService.getFileListDisplayOrder();
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.setSelectedFile = function () {
|
$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) {
|
||||||
if (!$scope.task || !$scope.task.files) {
|
if (!$scope.task || !$scope.task.files) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var gid = $scope.task.gid;
|
for (var i = 0; i < $scope.task.files.length; i++) {
|
||||||
var selectedFileIndex = [];
|
if (type == 'all') {
|
||||||
|
$scope.task.files[i].selected = true;
|
||||||
|
} else if (type == 'none') {
|
||||||
|
$scope.task.files[i].selected = false;
|
||||||
|
} else if (type == 'reverse') {
|
||||||
|
$scope.task.files[i].selected = !$scope.task.files[i].selected;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.chooseSpecifiedFiles = function (type) {
|
||||||
|
if (!$scope.task || !$scope.task.files || !ariaNgFileTypes[type]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var extensions = ariaNgFileTypes[type];
|
||||||
|
var fileIndexes = [];
|
||||||
|
var isAllSelected = true;
|
||||||
|
|
||||||
for (var i = 0; i < $scope.task.files.length; i++) {
|
for (var i = 0; i < $scope.task.files.length; i++) {
|
||||||
var file = $scope.task.files[i];
|
var extension = ariaNgCommonService.getFileExtension($scope.task.files[i].fileName);
|
||||||
|
|
||||||
if (file && file.selected) {
|
if (extensions.indexOf(extension) >= 0) {
|
||||||
selectedFileIndex.push(file.index);
|
fileIndexes.push(i);
|
||||||
|
|
||||||
|
if (!$scope.task.files[i].selected) {
|
||||||
|
isAllSelected = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pauseDownloadTaskRefresh = true;
|
for (var i = 0; i < fileIndexes.length; i++) {
|
||||||
|
var index = fileIndexes[i];
|
||||||
|
$scope.task.files[index].selected = !isAllSelected;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return aria2TaskService.selectTaskFile(gid, selectedFileIndex, function (response) {
|
$scope.saveChoosedFiles = function () {
|
||||||
|
if ($scope.context.showChooseFilesToolbar) {
|
||||||
|
$rootScope.loadPromise = setSelectFiles(false);
|
||||||
|
$scope.context.showChooseFilesToolbar = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.cancelChooseFiles = function () {
|
||||||
|
if ($scope.context.showChooseFilesToolbar) {
|
||||||
pauseDownloadTaskRefresh = false;
|
pauseDownloadTaskRefresh = false;
|
||||||
|
refreshDownloadTask(true);
|
||||||
|
$scope.context.showChooseFilesToolbar = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if (response.success) {
|
$scope.setSelectedFile = function () {
|
||||||
refreshDownloadTask(false);
|
if (!$scope.context.showChooseFilesToolbar) {
|
||||||
}
|
setSelectFiles(true);
|
||||||
}, true);
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.changePeerListDisplayOrder = function (type, autoSetReverse) {
|
$scope.changePeerListDisplayOrder = function (type, autoSetReverse) {
|
||||||
|
|
|
@ -51,6 +51,13 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
getFileExtension: function (filePath) {
|
||||||
|
if (!filePath || filePath.lastIndexOf('.') < 0) {
|
||||||
|
return filePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
return filePath.substring(filePath.lastIndexOf('.'));
|
||||||
|
},
|
||||||
extendArray: function (sourceArray, targetArray, keyProperty) {
|
extendArray: function (sourceArray, targetArray, keyProperty) {
|
||||||
if (!targetArray || !sourceArray || sourceArray.length != targetArray.length) {
|
if (!targetArray || !sourceArray || sourceArray.length != targetArray.length) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -157,6 +157,7 @@
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<a ng-click="changeFileListDisplayOrder('name:asc', true)" translate>File Name</a>
|
<a ng-click="changeFileListDisplayOrder('name:asc', true)" translate>File Name</a>
|
||||||
<i class="fa" ng-class="{'fa-sort-asc fa-order-asc': isSetFileListDisplayOrder('name:asc'), 'fa-sort-desc fa-order-desc': isSetFileListDisplayOrder('name:desc')}"></i>
|
<i class="fa" ng-class="{'fa-sort-asc fa-order-asc': isSetFileListDisplayOrder('name:asc'), 'fa-sort-desc fa-order-desc': isSetFileListDisplayOrder('name:desc')}"></i>
|
||||||
|
<a ng-click="showChooseFilesToolbar()" ng-if="task && (task.status == 'waiting' || task.status == 'paused')" translate>(Choose Files)</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-2">
|
<div class="col-sm-2">
|
||||||
<a ng-click="changeFileListDisplayOrder('percent:desc', true)" translate>Completed Percent</a>
|
<a ng-click="changeFileListDisplayOrder('percent:desc', true)" translate>Completed Percent</a>
|
||||||
|
@ -168,6 +169,41 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="task-table-title" ng-if="context.showChooseFilesToolbar">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<button class="btn btn-xs btn-primary" ng-click="selectFiles('all')" translate>Select All</button>
|
||||||
|
<button class="btn btn-xs btn-primary" ng-click="selectFiles('none')" translate>Select None</button>
|
||||||
|
<button class="btn btn-xs btn-primary" ng-click="selectFiles('reverse')" translate>Select Invert</button>
|
||||||
|
<button class="btn btn-xs btn-default" ng-click="chooseSpecifiedFiles('video')">
|
||||||
|
<i class="fa fa-file-video-o"></i>
|
||||||
|
<span translate>Videos</span>
|
||||||
|
</button>
|
||||||
|
<button class="btn btn-xs btn-default" ng-click="chooseSpecifiedFiles('audio')">
|
||||||
|
<i class="fa fa-file-audio-o"></i>
|
||||||
|
<span translate>Audios</span>
|
||||||
|
</button>
|
||||||
|
<button class="btn btn-xs btn-default" ng-click="chooseSpecifiedFiles('picture')">
|
||||||
|
<i class="fa fa-file-picture-o"></i>
|
||||||
|
<span translate>Pictures</span>
|
||||||
|
</button>
|
||||||
|
<button class="btn btn-xs btn-default" ng-click="chooseSpecifiedFiles('document')">
|
||||||
|
<i class="fa fa-file-text-o"></i>
|
||||||
|
<span translate>Documents</span>
|
||||||
|
</button>
|
||||||
|
<button class="btn btn-xs btn-default" ng-click="chooseSpecifiedFiles('application')">
|
||||||
|
<i class="fa fa-file-o"></i>
|
||||||
|
<span translate>Applications</span>
|
||||||
|
</button>
|
||||||
|
<button class="btn btn-xs btn-default" ng-click="chooseSpecifiedFiles('archive')">
|
||||||
|
<i class="fa fa-file-archive-o"></i>
|
||||||
|
<span translate>Archives</span>
|
||||||
|
</button>
|
||||||
|
<button class="btn btn-xs btn-success" ng-click="saveChoosedFiles()" ng-disabled="getSelectedFileCount() < 1" translate>Confirm</button>
|
||||||
|
<button class="btn btn-xs btn-default" ng-click="cancelChooseFiles()" translate>Cancel</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="task-table-body">
|
<div class="task-table-body">
|
||||||
<div class="row" ng-repeat="file in task.files | fileOrderBy: getFileListOrderType()" data-file-index="{{file.index}}">
|
<div class="row" ng-repeat="file in task.files | fileOrderBy: getFileListOrderType()" data-file-index="{{file.index}}">
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
|
|
Reference in a new issue