settings-ariang.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. (function () {
  2. 'use strict';
  3. angular.module('ariaNg').controller('AriaNgSettingsController', ['$rootScope', '$scope', '$routeParams', '$window', '$interval', '$timeout', '$filter', 'clipboard', 'ariaNgLanguages', 'ariaNgCommonService', 'ariaNgNotificationService', 'ariaNgLocalizationService', 'ariaNgLogService', 'ariaNgFileService', 'ariaNgSettingService', 'ariaNgMonitorService', 'ariaNgTitleService', 'aria2SettingService', 'ariaNgVersionService', 'ariaNgNativeElectronService', function ($rootScope, $scope, $routeParams, $window, $interval, $timeout, $filter, clipboard, ariaNgLanguages, ariaNgCommonService, ariaNgNotificationService, ariaNgLocalizationService, ariaNgLogService, ariaNgFileService, ariaNgSettingService, ariaNgMonitorService, ariaNgTitleService, aria2SettingService, ariaNgVersionService, ariaNgNativeElectronService) {
  4. var extendType = $routeParams.extendType;
  5. var lastRefreshPageNotification = null;
  6. var getFinalTitle = function () {
  7. return ariaNgTitleService.getFinalTitleByGlobalStat({
  8. globalStat: ariaNgMonitorService.getCurrentGlobalStat(),
  9. currentRpcProfile: getCurrentRPCProfile()
  10. });
  11. };
  12. var getCurrentRPCProfile = function () {
  13. if (!$scope.context || !$scope.context.rpcSettings || $scope.context.rpcSettings.length < 1) {
  14. return null;
  15. }
  16. for (var i = 0; i < $scope.context.rpcSettings.length; i++) {
  17. var rpcSetting = $scope.context.rpcSettings[i];
  18. if (rpcSetting.isDefault) {
  19. return rpcSetting;
  20. }
  21. }
  22. return null;
  23. };
  24. var getNativeSettings = function () {
  25. var originalConfig = ariaNgNativeElectronService.getNativeConfig();
  26. var config = {};
  27. config.defaultPosition = originalConfig.defaultPosition || 'last-position';
  28. if (!originalConfig.minimizedToTray) {
  29. config.afterMainWindowClosed = 'exit-application';
  30. } else {
  31. config.afterMainWindowClosed = 'minimize-to-tray';
  32. }
  33. return config;
  34. };
  35. var setNeedRefreshPage = function () {
  36. if (lastRefreshPageNotification) {
  37. return;
  38. }
  39. lastRefreshPageNotification = ariaNgLocalizationService.notifyInPage('', 'Configuration has been modified, please reload the page for the changes to take effect.', {
  40. delay: false,
  41. type: 'info',
  42. templateUrl: 'views/notification-reloadable.html',
  43. onClose: function () {
  44. lastRefreshPageNotification = null;
  45. }
  46. });
  47. };
  48. $scope.context = {
  49. currentTab: 'global',
  50. ariaNgNativeVersion: ariaNgNativeElectronService.getVersion(),
  51. ariaNgVersion: ariaNgNativeElectronService.getAriaNgVersion(),
  52. isCurrentLatestVersion: false,
  53. runtimeEnvironment: ariaNgNativeElectronService.getRuntimeEnvironment(),
  54. runtimeEnvironmentCollapsed: true,
  55. languages: ariaNgLanguages,
  56. titlePreview: getFinalTitle(),
  57. availableTime: ariaNgCommonService.getTimeOptions([1000, 2000, 3000, 5000, 10000, 30000, 60000], true),
  58. trueFalseOptions: [{name: 'Enabled', value: true}, {name: 'Disabled', value: false}],
  59. showRpcSecret: false,
  60. isInsecureProtocolDisabled: ariaNgSettingService.isInsecureProtocolDisabled(),
  61. settings: ariaNgSettingService.getAllOptions(),
  62. nativeSettings: getNativeSettings(),
  63. sessionSettings: ariaNgSettingService.getAllSessionOptions(),
  64. rpcSettings: ariaNgSettingService.getAllRpcSettings(),
  65. isSupportBlob: ariaNgFileService.isSupportBlob(),
  66. importSettings: null,
  67. exportSettings: null,
  68. exportSettingsCopied: false
  69. };
  70. $scope.context.titlePreview = getFinalTitle();
  71. $scope.context.showDebugMode = $scope.context.sessionSettings.debugMode || extendType === 'debug';
  72. $scope.changeGlobalTab = function () {
  73. $scope.context.currentTab = 'global';
  74. };
  75. $scope.isCurrentGlobalTab = function () {
  76. return $scope.context.currentTab === 'global';
  77. };
  78. $scope.changeRpcTab = function (rpcIndex) {
  79. $scope.context.currentTab = 'rpc' + rpcIndex;
  80. };
  81. $scope.isCurrentRpcTab = function (rpcIndex) {
  82. return $scope.context.currentTab === 'rpc' + rpcIndex;
  83. };
  84. $scope.getCurrentRpcTabIndex = function () {
  85. if ($scope.isCurrentGlobalTab()) {
  86. return -1;
  87. }
  88. return parseInt($scope.context.currentTab.substring(3));
  89. };
  90. $scope.checkUpdate = function () {
  91. return ariaNgVersionService.getTheLatestVersion()
  92. .then(function onSuccess(response) {
  93. if (!response || !response.data || !response.data.tag_name) {
  94. ariaNgLogService.warn('[AriaNgSettingsController.checkUpdate] data format of latest version is invalid', response);
  95. ariaNgLocalizationService.showError('Failed to get latest version!');
  96. return;
  97. }
  98. var latestVersion = response.data.tag_name;
  99. if (ariaNgVersionService.compareVersion($scope.context.ariaNgNativeVersion, latestVersion) >= 0) {
  100. ariaNgLocalizationService.showInfo('Check Update', 'You have installed the latest version!');
  101. $scope.context.isCurrentLatestVersion = true;
  102. } else {
  103. ariaNgNativeElectronService.openProjectReleaseLink();
  104. }
  105. }).catch(function onError(response) {
  106. ariaNgLogService.error('[AriaNgSettingsController.checkUpdate] failed to get latest version', response);
  107. ariaNgLocalizationService.showError('Failed to get latest version!');
  108. });
  109. };
  110. $scope.updateTitlePreview = function () {
  111. $scope.context.titlePreview = getFinalTitle();
  112. };
  113. $rootScope.swipeActions.extentLeftSwipe = function () {
  114. var tabIndex = -1;
  115. if (!$scope.isCurrentGlobalTab()) {
  116. tabIndex = parseInt($scope.getCurrentRpcTabIndex());
  117. }
  118. if (tabIndex < $scope.context.rpcSettings.length - 1) {
  119. $scope.changeRpcTab(tabIndex + 1);
  120. return true;
  121. } else {
  122. return false;
  123. }
  124. };
  125. $rootScope.swipeActions.extentRightSwipe = function () {
  126. var tabIndex = -1;
  127. if (!$scope.isCurrentGlobalTab()) {
  128. tabIndex = parseInt($scope.getCurrentRpcTabIndex());
  129. }
  130. if (tabIndex > 0) {
  131. $scope.changeRpcTab(tabIndex - 1);
  132. return true;
  133. } else if (tabIndex === 0) {
  134. $scope.changeGlobalTab();
  135. return true;
  136. } else {
  137. return false;
  138. }
  139. };
  140. $scope.isSupportNotification = function () {
  141. return ariaNgNotificationService.isSupportBrowserNotification() &&
  142. ariaNgSettingService.isCurrentRpcUseWebSocket($scope.context.settings.protocol);
  143. };
  144. $scope.setLanguage = function (value) {
  145. if (ariaNgSettingService.setLanguage(value)) {
  146. ariaNgLocalizationService.applyLanguage(value);
  147. }
  148. $scope.updateTitlePreview();
  149. };
  150. $scope.setDebugMode = function (value) {
  151. ariaNgSettingService.setDebugMode(value);
  152. };
  153. $scope.setTitle = function (value) {
  154. ariaNgSettingService.setTitle(value);
  155. };
  156. $scope.setEnableBrowserNotification = function (value) {
  157. ariaNgSettingService.setBrowserNotification(value);
  158. if (value && !ariaNgNotificationService.hasBrowserPermission()) {
  159. ariaNgNotificationService.requestBrowserPermission(function (result) {
  160. if (!result.granted) {
  161. $scope.context.settings.browserNotification = false;
  162. ariaNgLocalizationService.showError('You have disabled notification in your browser. You should change your browser\'s settings before you enable this function.');
  163. }
  164. });
  165. }
  166. };
  167. $scope.setTitleRefreshInterval = function (value) {
  168. setNeedRefreshPage();
  169. ariaNgSettingService.setTitleRefreshInterval(value);
  170. };
  171. $scope.setGlobalStatRefreshInterval = function (value) {
  172. setNeedRefreshPage();
  173. ariaNgSettingService.setGlobalStatRefreshInterval(value);
  174. };
  175. $scope.setDownloadTaskRefreshInterval = function (value) {
  176. setNeedRefreshPage();
  177. ariaNgSettingService.setDownloadTaskRefreshInterval(value);
  178. };
  179. $scope.setRPCListDisplayOrder = function (value) {
  180. setNeedRefreshPage();
  181. ariaNgSettingService.setRPCListDisplayOrder(value);
  182. };
  183. $scope.setAfterCreatingNewTask = function (value) {
  184. ariaNgSettingService.setAfterCreatingNewTask(value);
  185. };
  186. $scope.setRemoveOldTaskAfterRetrying = function (value) {
  187. ariaNgSettingService.setRemoveOldTaskAfterRetrying(value);
  188. };
  189. $scope.setConfirmTaskRemoval = function (value) {
  190. ariaNgSettingService.setConfirmTaskRemoval(value);
  191. };
  192. $scope.setIncludePrefixWhenCopyingFromTaskDetails = function (value) {
  193. ariaNgSettingService.setIncludePrefixWhenCopyingFromTaskDetails(value);
  194. };
  195. $scope.setAfterRetryingTask = function (value) {
  196. ariaNgSettingService.setAfterRetryingTask(value);
  197. };
  198. $scope.setDefaultPosition = function (value) {
  199. ariaNgNativeElectronService.setDefaultPosition(value);
  200. }
  201. $scope.setAfterMainWindowClosed = function (value) {
  202. if (value === 'minimize-to-tray') {
  203. ariaNgNativeElectronService.setMinimizedToTray(true);
  204. } else if (value === 'exit-application') {
  205. ariaNgNativeElectronService.setMinimizedToTray(false);
  206. }
  207. };
  208. $scope.showImportSettingsModal = function () {
  209. $scope.context.importSettings = null;
  210. angular.element('#import-settings-modal').modal();
  211. };
  212. $('#import-settings-modal').on('hide.bs.modal', function (e) {
  213. $scope.context.importSettings = null;
  214. });
  215. $scope.openAriaNgConfigFile = function () {
  216. ariaNgFileService.openFileContent({
  217. scope: $scope,
  218. fileFilter: '.json',
  219. fileType: 'text'
  220. }, function (result) {
  221. $scope.context.importSettings = result.content;
  222. }, function (error) {
  223. ariaNgLocalizationService.showError(error);
  224. }, angular.element('#import-file-holder'));
  225. };
  226. $scope.importSettings = function (settings) {
  227. var settingsObj = null;
  228. try {
  229. settingsObj = JSON.parse(settings);
  230. } catch (e) {
  231. ariaNgLogService.error('[AriaNgSettingsController.importSettings] parse settings json error', e);
  232. ariaNgLocalizationService.showError('Invalid settings data format!');
  233. return;
  234. }
  235. if (!angular.isObject(settingsObj) || angular.isArray(settingsObj)) {
  236. ariaNgLogService.error('[AriaNgSettingsController.importSettings] settings json is not object');
  237. ariaNgLocalizationService.showError('Invalid settings data format!');
  238. return;
  239. }
  240. if (settingsObj) {
  241. ariaNgLocalizationService.confirm('Confirm Import', 'Are you sure you want to import all settings?', 'warning', function () {
  242. ariaNgSettingService.importAllOptions(settingsObj);
  243. $window.location.reload();
  244. });
  245. }
  246. };
  247. $scope.showExportSettingsModal = function () {
  248. $scope.context.exportSettings = $filter('json')(ariaNgSettingService.exportAllOptions());
  249. $scope.context.exportSettingsCopied = false;
  250. angular.element('#export-settings-modal').modal();
  251. };
  252. $('#export-settings-modal').on('hide.bs.modal', function (e) {
  253. $scope.context.exportSettings = null;
  254. $scope.context.exportSettingsCopied = false;
  255. });
  256. $scope.copyExportSettings = function () {
  257. clipboard.copyText($scope.context.exportSettings, {
  258. container: angular.element('#export-settings-modal')[0]
  259. });
  260. $scope.context.exportSettingsCopied = true;
  261. };
  262. $scope.addNewRpcSetting = function () {
  263. setNeedRefreshPage();
  264. var newRpcSetting = ariaNgSettingService.addNewRpcSetting();
  265. $scope.context.rpcSettings.push(newRpcSetting);
  266. $scope.changeRpcTab($scope.context.rpcSettings.length - 1);
  267. };
  268. $scope.updateRpcSetting = function (setting, field) {
  269. setNeedRefreshPage();
  270. ariaNgSettingService.updateRpcSetting(setting, field);
  271. };
  272. $scope.removeRpcSetting = function (setting) {
  273. var rpcName = (setting.rpcAlias ? setting.rpcAlias : setting.rpcHost + ':' + setting.rpcPort);
  274. ariaNgLocalizationService.confirm('Confirm Remove', 'Are you sure you want to remove rpc setting "{{rpcName}}"?', 'warning', function () {
  275. setNeedRefreshPage();
  276. var currentIndex = $scope.getCurrentRpcTabIndex();
  277. var index = $scope.context.rpcSettings.indexOf(setting);
  278. ariaNgSettingService.removeRpcSetting(setting);
  279. $scope.context.rpcSettings.splice(index, 1);
  280. if (currentIndex >= $scope.context.rpcSettings.length) {
  281. $scope.changeRpcTab($scope.context.rpcSettings.length - 1);
  282. } else if (currentIndex <= 0 || currentIndex <= index) {
  283. ; // Do Nothing
  284. } else { // currentIndex > index
  285. $scope.changeRpcTab(currentIndex - 1);
  286. }
  287. }, false, {
  288. textParams: {
  289. rpcName: rpcName
  290. }
  291. });
  292. };
  293. $scope.setDefaultRpcSetting = function (setting) {
  294. if (setting.isDefault) {
  295. return;
  296. }
  297. ariaNgSettingService.setDefaultRpcSetting(setting);
  298. $window.location.reload();
  299. };
  300. $scope.resetSettings = function () {
  301. ariaNgLocalizationService.confirm('Confirm Reset', 'Are you sure you want to reset all settings?', 'warning', function () {
  302. ariaNgSettingService.resetSettings();
  303. $window.location.reload();
  304. });
  305. };
  306. $scope.clearHistory = function () {
  307. ariaNgLocalizationService.confirm('Confirm Clear', 'Are you sure you want to clear all settings history?', 'warning', function () {
  308. aria2SettingService.clearSettingsHistorys();
  309. $window.location.reload();
  310. });
  311. };
  312. $scope.reloadApp = function () {
  313. ariaNgNativeElectronService.reload();
  314. };
  315. angular.element('[data-toggle="popover"]').popover();
  316. $rootScope.loadPromise = $timeout(function () {}, 100);
  317. }]);
  318. }());