diff --git a/src/index.html b/src/index.html index ccdc609..00365b7 100644 --- a/src/index.html +++ b/src/index.html @@ -378,6 +378,7 @@ + diff --git a/src/langs/zh_Hans.txt b/src/langs/zh_Hans.txt index 75a48ff..6d9bb29 100644 --- a/src/langs/zh_Hans.txt +++ b/src/langs/zh_Hans.txt @@ -26,6 +26,9 @@ Search=搜索 Default=默认 Expand=展开 Collapse=折叠 +Open=打开 +Save=保存 +Import=导入 Remove Task=删除任务 Clear Stopped Tasks=清空已结束任务 Click to view task detail=点击查看任务详情 @@ -157,6 +160,12 @@ Navigate to Task Detail Page=转到任务详情页面 RPC List Display Order=RPC 列表显示顺序 Recently Used=最近使用 RPC Alias=RPC 别名 +Import / Export AriaNg Settings=导入 / 导出 AriaNg 设置 +Import Settings=导入设置 +Export Settings=导出设置 +Confirm Import=确认导入 +Are you sure you want to import all settings?=您是否要导入所有设置? +Invalid settings data format!=无效的设置数据格式! Supported Placeholder=支持的占位符 AriaNg Title=AriaNg 标题 Downloading Count=正在下载数量 diff --git a/src/langs/zh_Hant.txt b/src/langs/zh_Hant.txt index 7f76874..aff3fb4 100644 --- a/src/langs/zh_Hant.txt +++ b/src/langs/zh_Hant.txt @@ -26,6 +26,9 @@ Search=搜尋 Default=預設 Expand=展開 Collapse=摺疊 +Open=打開 +Save=儲存 +Import=匯入 Remove Task=刪除工作 Clear Stopped Tasks=清除已結束工作 Click to view task detail=點選檢視工作詳情 @@ -157,6 +160,12 @@ Navigate to Task Detail Page=轉到工作詳情頁面 RPC List Display Order=RPC 清單顯示順序 Recently Used=最近使用 RPC Alias=RPC 別名 +Import / Export AriaNg Settings=匯入 / 匯出 AriaNg 設定 +Import Settings=匯入設定 +Export Settings=匯出設定 +Confirm Import=確認匯入 +Are you sure you want to import all settings?=您是否要匯入所有設定? +Invalid settings data format!=無效的設定資料格式! Supported Placeholder=支援的預留位置 AriaNg Title=AriaNg 標題 Downloading Count=正在下載數量 diff --git a/src/scripts/config/constants.js b/src/scripts/config/constants.js index cb3d1e4..7d347fb 100644 --- a/src/scripts/config/constants.js +++ b/src/scripts/config/constants.js @@ -37,6 +37,9 @@ downloadTaskRefreshInterval: 1000, rpcListDisplayOrder: 'recentlyUsed', afterCreatingNewTask: 'task-list', - removeOldTaskAfterRestarting: false + removeOldTaskAfterRestarting: false, + displayOrder: 'default:asc', + fileListDisplayOrder: 'default:asc', + peerListDisplayOrder: 'default:asc' }); }()); diff --git a/src/scripts/config/defaultLanguage.js b/src/scripts/config/defaultLanguage.js index b377511..d4f32d2 100644 --- a/src/scripts/config/defaultLanguage.js +++ b/src/scripts/config/defaultLanguage.js @@ -30,6 +30,9 @@ 'Default': 'Default', 'Expand': 'Expand', 'Collapse': 'Collapse', + 'Open': 'Open', + 'Save': 'Save', + 'Import': 'Import', 'Remove Task': 'Remove Task', 'Clear Stopped Tasks': 'Clear Stopped Tasks', 'Click to view task detail': 'Click to view task detail', @@ -161,6 +164,12 @@ 'RPC List Display Order': 'RPC List Display Order', 'Recently Used': 'Recently Used', 'RPC Alias': 'RPC Alias', + 'Import / Export AriaNg Settings': 'Import / Export AriaNg Settings', + 'Import Settings': 'Import Settings', + 'Export Settings': 'Export Settings', + 'Confirm Import': 'Confirm Import', + 'Are you sure you want to import all settings?': 'Are you sure you want to import all settings?', + 'Invalid settings data format!': 'Invalid settings data format!', 'Supported Placeholder': 'Supported Placeholder', 'AriaNg Title': 'AriaNg Title', 'Downloading Count': 'Downloading Count', diff --git a/src/scripts/controllers/settings-ariang.js b/src/scripts/controllers/settings-ariang.js index b2ee8f5..7bcb58c 100644 --- a/src/scripts/controllers/settings-ariang.js +++ b/src/scripts/controllers/settings-ariang.js @@ -1,7 +1,7 @@ (function () { 'use strict'; - angular.module('ariaNg').controller('AriaNgSettingsController', ['$rootScope', '$scope', '$routeParams', '$window', '$interval', '$timeout', 'ariaNgLanguages', 'ariaNgCommonService', 'ariaNgNotificationService', 'ariaNgLocalizationService', 'ariaNgSettingService', 'ariaNgMonitorService', 'ariaNgTitleService', 'aria2SettingService', function ($rootScope, $scope, $routeParams, $window, $interval, $timeout, ariaNgLanguages, ariaNgCommonService, ariaNgNotificationService, ariaNgLocalizationService, ariaNgSettingService, ariaNgMonitorService, ariaNgTitleService, aria2SettingService) { + angular.module('ariaNg').controller('AriaNgSettingsController', ['$rootScope', '$scope', '$routeParams', '$window', '$interval', '$timeout', '$filter', 'ariaNgLanguages', 'ariaNgCommonService', 'ariaNgNotificationService', 'ariaNgLocalizationService', 'ariaNgLogService', 'ariaNgFileService', 'ariaNgSettingService', 'ariaNgMonitorService', 'ariaNgTitleService', 'aria2SettingService', function ($rootScope, $scope, $routeParams, $window, $interval, $timeout, $filter, ariaNgLanguages, ariaNgCommonService, ariaNgNotificationService, ariaNgLocalizationService, ariaNgLogService, ariaNgFileService, ariaNgSettingService, ariaNgMonitorService, ariaNgTitleService, aria2SettingService) { var extendType = $routeParams.extendType; var lastRefreshPageNotification = null; @@ -41,7 +41,10 @@ isInsecureProtocolDisabled: ariaNgSettingService.isInsecureProtocolDisabled(), settings: ariaNgSettingService.getAllOptions(), sessionSettings: ariaNgSettingService.getAllSessionOptions(), - rpcSettings: ariaNgSettingService.getAllRpcSettings() + rpcSettings: ariaNgSettingService.getAllRpcSettings(), + isSupportBlob: ariaNgFileService.isSupportBlob(), + importSettings: null, + exportSettings: null }; $scope.context.showDebugMode = $scope.context.sessionSettings.debugMode || extendType === 'debug'; @@ -161,6 +164,60 @@ ariaNgSettingService.setRemoveOldTaskAfterRestarting(value); }; + $scope.showImportSettingsModal = function () { + $scope.context.importSettings = null; + angular.element('#import-settings-modal').modal(); + }; + + $('#import-settings-modal').on('hide.bs.modal', function (e) { + $scope.context.importSettings = null; + }); + + $scope.openAriaNgConfigFile = function () { + ariaNgFileService.openFileContent({ + fileFilter: '.json', + fileType: 'text' + }, function (result) { + $scope.context.importSettings = result.content; + }, function (error) { + ariaNgLocalizationService.showError(error); + }, angular.element('#import-file-holder')); + }; + + $scope.importSettings = function (settings) { + var settingsObj = null; + + try { + settingsObj = JSON.parse(settings); + } catch (e) { + ariaNgLogService.error('[AriaNgSettingsController.importSettings] parse settings json error', e); + ariaNgLocalizationService.showError('Invalid settings data format!'); + return; + } + + if (!angular.isObject(settingsObj) || angular.isArray(settingsObj)) { + ariaNgLogService.error('[AriaNgSettingsController.importSettings] settings json is not object'); + ariaNgLocalizationService.showError('Invalid settings data format!'); + return; + } + + if (settingsObj) { + ariaNgLocalizationService.confirm('Confirm Import', 'Are you sure you want to import all settings?', 'warning', function () { + ariaNgSettingService.importAllOptions(settingsObj); + $window.location.reload(); + }); + } + }; + + $scope.showExportSettingsModal = function () { + $scope.context.exportSettings = $filter('json')(ariaNgSettingService.exportAllOptions()); + angular.element('#export-settings-modal').modal(); + }; + + $('#export-settings-modal').on('hide.bs.modal', function (e) { + $scope.context.exportSettings = null; + }); + $scope.addNewRpcSetting = function () { setNeedRefreshPage(); diff --git a/src/scripts/directives/blobDownload.js b/src/scripts/directives/blobDownload.js new file mode 100644 index 0000000..43570e8 --- /dev/null +++ b/src/scripts/directives/blobDownload.js @@ -0,0 +1,24 @@ +(function () { + 'use strict'; + + angular.module('ariaNg').directive('ngBlobDownload', ['ariaNgFileService', function (ariaNgFileService) { + return { + restrict: 'A', + scope: { + ngBlobDownload: '=ngBlobDownload', + ngFileName: '@', + ngContentType: '@' + }, + link: function (scope, element) { + scope.$watch('ngBlobDownload', function (value) { + if (value) { + ariaNgFileService.saveFileContent(value, element, { + fileName: scope.ngFileName, + contentType: scope.ngContentType + }); + } + }); + } + }; + }]); +}()); diff --git a/src/scripts/services/ariaNgSettingService.js b/src/scripts/services/ariaNgSettingService.js index 3eb1069..ba0cf94 100644 --- a/src/scripts/services/ariaNgSettingService.js +++ b/src/scripts/services/ariaNgSettingService.js @@ -257,6 +257,49 @@ return result; }, + importAllOptions: function (options) { + var finalOptions = angular.copy(ariaNgDefaultOptions); + + for (var key in options) { + if (!options.hasOwnProperty(key) || !finalOptions.hasOwnProperty(key)) { + continue; + } + + if (angular.isObject(options[key]) || angular.isArray(options[key])) { + continue; + } + + finalOptions[key] = options[key]; + } + + if (angular.isArray(options.extendRpcServers)) { + for (var i = 0; i < options.extendRpcServers.length; i++) { + var rpcSetting = options.extendRpcServers[i]; + var finalRpcSetting = createNewRpcSetting(); + + for (var key in rpcSetting) { + if (!rpcSetting.hasOwnProperty(key) || !finalRpcSetting.hasOwnProperty(key)) { + continue; + } + + if (angular.isObject(rpcSetting[key]) || angular.isArray(rpcSetting[key])) { + continue; + } + + finalRpcSetting[key] = rpcSetting[key]; + } + + finalOptions.extendRpcServers.push(finalRpcSetting); + } + } + + setOptions(finalOptions); + }, + exportAllOptions: function () { + var options = angular.extend({}, ariaNgDefaultOptions, getOptions()); + + return options; + }, getAllSessionOptions: function () { return angular.copy(sessionSettings); }, diff --git a/src/views/settings-ariang.html b/src/views/settings-ariang.html index 11f9043..d43cf9b 100644 --- a/src/views/settings-ariang.html +++ b/src/views/settings-ariang.html @@ -151,6 +151,19 @@ +
+
+ Import / Export AriaNg Settings +
+
+ + +
+
* Changes to the settings take effect after refreshing page. @@ -252,6 +265,64 @@
+ + +