support select files by file extension
This commit is contained in:
parent
c21c77ff99
commit
e42884a50f
|
@ -5,6 +5,7 @@ Error=错误
|
||||||
OK=确定
|
OK=确定
|
||||||
Confirm=确认
|
Confirm=确认
|
||||||
Cancel=取消
|
Cancel=取消
|
||||||
|
Close=关闭
|
||||||
True=是
|
True=是
|
||||||
False=否
|
False=否
|
||||||
Connecting=连接中
|
Connecting=连接中
|
||||||
|
@ -100,6 +101,9 @@ Pictures=图片
|
||||||
Documents=文档
|
Documents=文档
|
||||||
Applications=应用程序
|
Applications=应用程序
|
||||||
Archives=存档文件
|
Archives=存档文件
|
||||||
|
Other=其他
|
||||||
|
Custom=自定义
|
||||||
|
Custom Choose File=自定义选择文件
|
||||||
Address=地址
|
Address=地址
|
||||||
Client=客户端
|
Client=客户端
|
||||||
Status=状态
|
Status=状态
|
||||||
|
|
|
@ -5,6 +5,7 @@ Error=錯誤
|
||||||
OK=確定
|
OK=確定
|
||||||
Confirm=確認
|
Confirm=確認
|
||||||
Cancel=取消
|
Cancel=取消
|
||||||
|
Close=關閉
|
||||||
True=是
|
True=是
|
||||||
False=否
|
False=否
|
||||||
Connecting=連線中
|
Connecting=連線中
|
||||||
|
@ -100,6 +101,9 @@ Pictures=圖片
|
||||||
Documents=文件
|
Documents=文件
|
||||||
Applications=應用程式
|
Applications=應用程式
|
||||||
Archives=封存檔案
|
Archives=封存檔案
|
||||||
|
Other=其他
|
||||||
|
Custom=自訂
|
||||||
|
Custom Choose File=自訂選擇檔案
|
||||||
Address=位址
|
Address=位址
|
||||||
Client=客戶端
|
Client=客戶端
|
||||||
Status=狀態
|
Status=狀態
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
'OK': 'OK',
|
'OK': 'OK',
|
||||||
'Confirm': 'Confirm',
|
'Confirm': 'Confirm',
|
||||||
'Cancel': 'Cancel',
|
'Cancel': 'Cancel',
|
||||||
|
'Close': 'Close',
|
||||||
'True': 'True',
|
'True': 'True',
|
||||||
'False': 'False',
|
'False': 'False',
|
||||||
'Connecting': 'Connecting',
|
'Connecting': 'Connecting',
|
||||||
|
@ -104,6 +105,9 @@
|
||||||
'Documents': 'Documents',
|
'Documents': 'Documents',
|
||||||
'Applications': 'Applications',
|
'Applications': 'Applications',
|
||||||
'Archives': 'Archives',
|
'Archives': 'Archives',
|
||||||
|
'Other': 'Other',
|
||||||
|
'Custom': 'Custom',
|
||||||
|
'Custom Choose File': 'Custom Choose File',
|
||||||
'Address': 'Address',
|
'Address': 'Address',
|
||||||
'Client': 'Client',
|
'Client': 'Client',
|
||||||
'Status': 'Status',
|
'Status': 'Status',
|
||||||
|
|
|
@ -2,7 +2,9 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
angular.module('ariaNg').constant('ariaNgFileTypes', {
|
angular.module('ariaNg').constant('ariaNgFileTypes', {
|
||||||
video: [
|
video: {
|
||||||
|
name: 'Videos',
|
||||||
|
extensions: [
|
||||||
'.3g2',
|
'.3g2',
|
||||||
'.3gp',
|
'.3gp',
|
||||||
'.3gp2',
|
'.3gp2',
|
||||||
|
@ -32,8 +34,11 @@
|
||||||
'.ts',
|
'.ts',
|
||||||
'.vob',
|
'.vob',
|
||||||
'.wmv'
|
'.wmv'
|
||||||
],
|
]
|
||||||
audio: [
|
},
|
||||||
|
audio: {
|
||||||
|
name: 'Audios',
|
||||||
|
extensions: [
|
||||||
'.aac',
|
'.aac',
|
||||||
'.ac3',
|
'.ac3',
|
||||||
'.adts',
|
'.adts',
|
||||||
|
@ -58,8 +63,11 @@
|
||||||
'.wav',
|
'.wav',
|
||||||
'.wma',
|
'.wma',
|
||||||
'.wv'
|
'.wv'
|
||||||
],
|
]
|
||||||
picture: [
|
},
|
||||||
|
picture: {
|
||||||
|
name: 'Pictures',
|
||||||
|
extensions: [
|
||||||
'.abr',
|
'.abr',
|
||||||
'.bmp',
|
'.bmp',
|
||||||
'.emf',
|
'.emf',
|
||||||
|
@ -95,8 +103,11 @@
|
||||||
'.webp',
|
'.webp',
|
||||||
'.wmf',
|
'.wmf',
|
||||||
'.xif'
|
'.xif'
|
||||||
],
|
]
|
||||||
document: [
|
},
|
||||||
|
document: {
|
||||||
|
name: 'Documents',
|
||||||
|
extensions: [
|
||||||
'.csv',
|
'.csv',
|
||||||
'.doc',
|
'.doc',
|
||||||
'.docm',
|
'.docm',
|
||||||
|
@ -144,8 +155,11 @@
|
||||||
'.xltx',
|
'.xltx',
|
||||||
'.xlw',
|
'.xlw',
|
||||||
'.xps'
|
'.xps'
|
||||||
],
|
]
|
||||||
application: [
|
},
|
||||||
|
application: {
|
||||||
|
name: 'Applications',
|
||||||
|
extensions: [
|
||||||
'.apk',
|
'.apk',
|
||||||
'.bat',
|
'.bat',
|
||||||
'.com',
|
'.com',
|
||||||
|
@ -158,8 +172,11 @@
|
||||||
'.msi',
|
'.msi',
|
||||||
'.rpm',
|
'.rpm',
|
||||||
'.sh'
|
'.sh'
|
||||||
],
|
]
|
||||||
archive: [
|
},
|
||||||
|
archive: {
|
||||||
|
name: 'Archives',
|
||||||
|
extensions: [
|
||||||
'.001',
|
'.001',
|
||||||
'.7z',
|
'.7z',
|
||||||
'.ace',
|
'.ace',
|
||||||
|
@ -190,5 +207,6 @@
|
||||||
'.z',
|
'.z',
|
||||||
'.zip'
|
'.zip'
|
||||||
]
|
]
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}());
|
}());
|
||||||
|
|
|
@ -194,6 +194,7 @@
|
||||||
currentTab: 'overview',
|
currentTab: 'overview',
|
||||||
isEnableSpeedChart: ariaNgSettingService.getDownloadTaskRefreshInterval() > 0,
|
isEnableSpeedChart: ariaNgSettingService.getDownloadTaskRefreshInterval() > 0,
|
||||||
showChooseFilesToolbar: false,
|
showChooseFilesToolbar: false,
|
||||||
|
fileExtensions: [],
|
||||||
collapsedDirs: {},
|
collapsedDirs: {},
|
||||||
btPeers: [],
|
btPeers: [],
|
||||||
healthPercent: 0,
|
healthPercent: 0,
|
||||||
|
@ -342,7 +343,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
var files = $scope.task.files;
|
var files = $scope.task.files;
|
||||||
var extensions = ariaNgFileTypes[type];
|
var extensions = ariaNgFileTypes[type].extensions;
|
||||||
var fileIndexes = [];
|
var fileIndexes = [];
|
||||||
var isAllSelected = true;
|
var isAllSelected = true;
|
||||||
|
|
||||||
|
@ -395,6 +396,143 @@
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
$scope.showCustomChooseFileModal = function () {
|
||||||
|
if (!$scope.task || !$scope.task.files) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var files = $scope.task.files;
|
||||||
|
var extensionsMap = {};
|
||||||
|
|
||||||
|
for (var i = 0; i < files.length; i++) {
|
||||||
|
var file = files[i];
|
||||||
|
|
||||||
|
if (file.isDir) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var extension = ariaNgCommonService.getFileExtension(file.fileName);
|
||||||
|
|
||||||
|
if (extension) {
|
||||||
|
extension = extension.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
var extensionInfo = extensionsMap[extension];
|
||||||
|
|
||||||
|
if (!extensionInfo) {
|
||||||
|
var extensionName = extension;
|
||||||
|
|
||||||
|
if (extensionName.length > 0 && extensionName.charAt(0) === '.') {
|
||||||
|
extensionName = extensionName.substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
extensionInfo = {
|
||||||
|
extension: extensionName,
|
||||||
|
classified: false,
|
||||||
|
selected: false,
|
||||||
|
selectedCount: 0,
|
||||||
|
unSelectedCount: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
extensionsMap[extension] = extensionInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file.selected) {
|
||||||
|
extensionInfo.selected = true;
|
||||||
|
extensionInfo.selectedCount++;
|
||||||
|
} else {
|
||||||
|
extensionInfo.unSelectedCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var allClassifiedExtensions = {};
|
||||||
|
|
||||||
|
for (var type in ariaNgFileTypes) {
|
||||||
|
if (!ariaNgFileTypes.hasOwnProperty(type)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var extensionTypeName = ariaNgFileTypes[type].name;
|
||||||
|
var allExtensions = ariaNgFileTypes[type].extensions;
|
||||||
|
var extensions = [];
|
||||||
|
|
||||||
|
for (var i = 0; i < allExtensions.length; i++) {
|
||||||
|
var extension = allExtensions[i];
|
||||||
|
var extensionInfo = extensionsMap[extension];
|
||||||
|
|
||||||
|
if (extensionInfo) {
|
||||||
|
extensionInfo.classified = true;
|
||||||
|
extensions.push(extensionInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extensions.length > 0) {
|
||||||
|
allClassifiedExtensions[type] = {
|
||||||
|
name: extensionTypeName,
|
||||||
|
extensions: extensions
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var unClassifiedExtensions = [];
|
||||||
|
|
||||||
|
for (var extension in extensionsMap) {
|
||||||
|
if (!extensionsMap.hasOwnProperty(extension)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var extensionInfo = extensionsMap[extension];
|
||||||
|
|
||||||
|
if (!extensionInfo.classified) {
|
||||||
|
unClassifiedExtensions.push(extensionInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unClassifiedExtensions.length > 0) {
|
||||||
|
allClassifiedExtensions.other = {
|
||||||
|
name: 'Other',
|
||||||
|
extensions: unClassifiedExtensions
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.context.fileExtensions = allClassifiedExtensions;
|
||||||
|
angular.element('#custom-choose-file-modal').modal();
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.setSelectedExtension = function (selectedExtension, selected) {
|
||||||
|
if (!$scope.task || !$scope.task.files) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var files = $scope.task.files;
|
||||||
|
|
||||||
|
for (var i = 0; i < files.length; i++) {
|
||||||
|
var file = files[i];
|
||||||
|
|
||||||
|
if (file.isDir) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var extension = ariaNgCommonService.getFileExtension(file.fileName);
|
||||||
|
|
||||||
|
if (extension) {
|
||||||
|
extension = extension.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extension !== '.' + selectedExtension) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
file.selected = selected;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateAllDirNodesSelectedStatus();
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#custom-choose-file-modal').on('hide.bs.modal', function (e) {
|
||||||
|
$scope.context.fileExtensions = null;
|
||||||
|
});
|
||||||
|
|
||||||
$scope.setSelectedFile = function (updateNodeSelectedStatus) {
|
$scope.setSelectedFile = function (updateNodeSelectedStatus) {
|
||||||
if (updateNodeSelectedStatus) {
|
if (updateNodeSelectedStatus) {
|
||||||
updateAllDirNodesSelectedStatus();
|
updateAllDirNodesSelectedStatus();
|
||||||
|
|
|
@ -235,6 +235,10 @@
|
||||||
<i class="fa fa-file-archive-o"></i>
|
<i class="fa fa-file-archive-o"></i>
|
||||||
<span translate>Archives</span>
|
<span translate>Archives</span>
|
||||||
</button>
|
</button>
|
||||||
|
<button class="btn btn-xs btn-default" ng-click="showCustomChooseFileModal()">
|
||||||
|
<i class="fa fa-filter"></i>
|
||||||
|
<span translate>Custom</span>
|
||||||
|
</button>
|
||||||
<button class="btn btn-xs btn-success" ng-click="saveChoosedFiles()" ng-disabled="!isAnyFileSelected()" translate>Confirm</button>
|
<button class="btn btn-xs btn-success" ng-click="saveChoosedFiles()" ng-disabled="!isAnyFileSelected()" translate>Confirm</button>
|
||||||
<button class="btn btn-xs btn-default" ng-click="cancelChooseFiles()" translate>Cancel</button>
|
<button class="btn btn-xs btn-default" ng-click="cancelChooseFiles()" translate>Cancel</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -369,4 +373,32 @@
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="custom-choose-file-modal" class="modal fade" tabindex="-1" role="dialog">
|
||||||
|
<div class="modal-dialog" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||||
|
<h4 class="modal-title" translate>Custom Choose File</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body no-padding">
|
||||||
|
<div class="settings-table striped hoverable">
|
||||||
|
<div class="row" ng-repeat="(extensionTypeName, extensionTypeInfo) in context.fileExtensions">
|
||||||
|
<div class="setting-key setting-key-without-desc col-sm-4" ng-bind="extensionTypeInfo.name | translate"></div>
|
||||||
|
<div class="setting-value col-sm-8">
|
||||||
|
<div class="checkbox checkbox-primary checkbox-inline" ng-repeat="info in extensionTypeInfo.extensions">
|
||||||
|
<input id="{{info.extension}}" type="checkbox" ng-model="info.selected"
|
||||||
|
ng-indeterminate="info.selectedCount > 0 && info.unSelectedCount > 0"
|
||||||
|
ng-change="setSelectedExtension(info.extension, info.selected)">
|
||||||
|
<label for="{{info.extension}}" ng-bind="info.extension"></label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal" translate>Close</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
Reference in a new issue