settings-ariang.html 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643
  1. <section class="content no-padding">
  2. <div class="nav-tabs-custom">
  3. <ul class="nav nav-tabs">
  4. <li ng-class="{'active': isCurrentGlobalTab()}">
  5. <a class="pointer-cursor" ng-click="changeGlobalTab()" translate>Global</a>
  6. </li>
  7. <li class="nav-tab-title-rpcname" ng-repeat="setting in context.rpcSettings" ng-class="{'active': isCurrentRpcTab($index)}">
  8. <a class="pointer-cursor" ng-click="changeRpcTab($index)">
  9. <span class="nav-tab-rpcname" ng-bind="'RPC' + (setting.rpcAlias || setting.rpcHost ? ' (' + (setting.rpcAlias ? setting.rpcAlias : setting.rpcHost + ':' + setting.rpcPort) + ')' : '')" title="{{(setting.rpcAlias ? setting.rpcAlias : setting.rpcHost + ':' + setting.rpcPort)}}">RPC</span>
  10. </a><a class="pointer-cursor nav-tab-close" ng-if="!setting.isDefault" title="{{'Delete RPC Setting' | translate}}">
  11. <i class="fa fa-times" ng-click="removeRpcSetting(setting)"></i>
  12. </a>
  13. </li>
  14. <li class="slim">
  15. <a class="pointer-cursor" ng-click="addNewRpcSetting()" title="{{'Add New RPC Setting' | translate}}">
  16. <i class="fa fa-plus"></i>
  17. </a>
  18. </li>
  19. </ul>
  20. <div class="tab-content no-padding">
  21. <div class="tab-pane" ng-class="{'active': isCurrentGlobalTab()}">
  22. <div class="settings-table striped hoverable">
  23. <div class="row" ng-if="context.ariaNgVersion">
  24. <div class="setting-key col-sm-4">
  25. <span translate>AriaNg Version</span>
  26. <i class="icon-expand pointer-cursor fa"
  27. ng-class="{'fa-plus': context.ariaNgVerboseVersionCollapsed, 'fa-minus': !context.ariaNgVerboseVersionCollapsed}"
  28. ng-click="context.ariaNgVerboseVersionCollapsed = !context.ariaNgVerboseVersionCollapsed"
  29. title="{{(context.ariaNgVerboseVersionCollapsed ? 'Expand' : 'Collapse') | translate}}"></i>
  30. </div>
  31. <div class="setting-value col-sm-8">
  32. <span ng-bind="'AriaNg Native ' + context.ariaNgNativeVersion + (context.buildCommit ? ' (' + context.buildCommit + ')' : '')"></span>
  33. <button class="btn btn-xs btn-default" ng-click="checkUpdate()" ng-disabled="context.isCurrentLatestVersion" promise-btn>
  34. <span ng-bind="(context.isCurrentLatestVersion ? 'Latest Version' : 'Check Update') | translate" translate>Check Update</span>
  35. </button>
  36. <span class="multi-line" ng-if="!context.ariaNgVerboseVersionCollapsed">
  37. <span ng-bind="('Based on' | translate) + ' AriaNg ' + context.ariaNgVersion"></span>
  38. </span>
  39. </div>
  40. </div>
  41. <div class="row" ng-if="context.runtimeEnvironment">
  42. <div class="setting-key col-sm-4">
  43. <span translate>Runtime Environment</span>
  44. <i class="icon-expand pointer-cursor fa" ng-if="context.runtimeEnvironment.length > 1"
  45. ng-class="{'fa-plus': context.runtimeEnvironmentCollapsed, 'fa-minus': !context.runtimeEnvironmentCollapsed}"
  46. ng-click="context.runtimeEnvironmentCollapsed = !context.runtimeEnvironmentCollapsed"
  47. title="{{(context.runtimeEnvironmentCollapsed ? 'Expand' : 'Collapse') | translate}}"></i>
  48. </div>
  49. <div class="setting-value col-sm-8">
  50. <span class="multi-line auto-ellipsis" ng-bind="item.name + ': ' + item.value"
  51. ng-repeat="item in context.runtimeEnvironment | limitTo: (context.runtimeEnvironmentCollapsed ? 1 : task.runtimeEnvironment.length)"></span>
  52. </div>
  53. </div>
  54. <div class="row">
  55. <div class="setting-key setting-key-without-desc col-sm-4">
  56. <span translate>Language</span>
  57. </div>
  58. <div class="setting-value col-sm-8">
  59. <select class="form-control" style="width: 100%;" ng-model="context.settings.language"
  60. ng-options="language.type as (((('languages.' + language.name) | translate) !== ('languages.' + language.name) ? (('languages.' + language.name) | translate) : language.name) + ' (' + language.displayName + ')') for language in context.languages"
  61. ng-change="setLanguage(context.settings.language)">
  62. </select>
  63. </div>
  64. </div>
  65. <div class="row">
  66. <div class="setting-key setting-key-without-desc col-sm-4">
  67. <span translate>Theme</span>
  68. </div>
  69. <div class="setting-value col-sm-8">
  70. <select class="form-control" style="width: 100%;" ng-model="context.settings.theme"
  71. ng-change="setTheme(context.settings.theme)">
  72. <option value="light" translate>Light</option>
  73. <option value="dark" translate>Dark</option>
  74. <option ng-if="context.isSupportDarkMode" value="system" translate>Follow system settings</option>
  75. </select>
  76. </div>
  77. </div>
  78. <div class="row" ng-if="context.showDebugMode">
  79. <div class="setting-key setting-key-without-desc col-sm-4">
  80. <span translate>Debug Mode</span>
  81. </div>
  82. <div class="setting-value col-sm-8">
  83. <select class="form-control" style="width: 100%;" ng-model="context.sessionSettings.debugMode"
  84. ng-options="option.value as (option.name | translate) for option in context.trueFalseOptions"
  85. ng-change="setDebugMode(context.sessionSettings.debugMode)">
  86. </select>
  87. </div>
  88. </div>
  89. <div class="row">
  90. <div class="setting-key setting-key-without-desc col-sm-4">
  91. <span translate>Check for Updates on Startup</span>
  92. </div>
  93. <div class="setting-value col-sm-8">
  94. <select class="form-control" style="width: 100%;" ng-model="context.settings.autoCheckUpdates"
  95. ng-change="setAutoCheckUpdates(context.settings.autoCheckUpdates)">
  96. <option value="never" translate>Never</option>
  97. <option value="daily" translate>Daily</option>
  98. <option value="weekly" translate>Weekly</option>
  99. <option value="monthly" translate>Monthly</option>
  100. </select>
  101. </div>
  102. </div>
  103. <div class="row">
  104. <div class="setting-key setting-key-without-desc col-sm-4">
  105. <span translate>Page Title</span>
  106. <i class="icon-primary fa fa-question-circle" data-toggle="popover"
  107. data-trigger="hover" data-placement="auto right" data-container="body" data-html="true"
  108. data-content="{{('Supported Placeholder' | translate) + ':<br/>' +
  109. ('AriaNg Title' | translate) + ': ${title}<br/>' +
  110. ('Current RPC Alias' | translate) + ': ${rpcprofile}<br/>' +
  111. ('Downloading Count' | translate) + ': ${downloading}<br/>' +
  112. ('Waiting Count' | translate) + ': ${waiting}<br/>' +
  113. ('Stopped Count' | translate) + ': ${stopped}<br/>' +
  114. ('Download Speed' | translate) + ': ${downspeed}<br/>' +
  115. ('Upload Speed' | translate) + ': ${upspeed}<br/><br/>' +
  116. ('Tips: You can use the &quot;noprefix&quot; tag to ignore the prefix, &quot;nosuffix&quot; tag to ignore the suffix, and &quot;scale=n&quot; tag to set the decimal precision.' | translate) + '<br/>' +
  117. ('Example: ${downspeed:noprefix:nosuffix:scale=1}' | translate)}}"></i>
  118. </div>
  119. <div class="setting-value col-sm-8">
  120. <input class="form-control" type="text" ng-model="context.settings.title"
  121. ng-change="setTitle(context.settings.title); updateTitlePreview()"/>
  122. <em>[<span translate>Preview</span>] <span ng-bind="context.titlePreview"></span></em>
  123. </div>
  124. </div>
  125. <div class="row" ng-if="isSupportNotification()">
  126. <div class="setting-key setting-key-without-desc col-sm-4">
  127. <span translate>Enable System Notification</span>
  128. </div>
  129. <div class="setting-value col-sm-8">
  130. <select class="form-control" style="width: 100%;"
  131. ng-model="context.settings.browserNotification"
  132. ng-change="setEnableBrowserNotification(context.settings.browserNotification)"
  133. ng-options="option.value as (option.name | translate) for option in context.trueFalseOptions">
  134. </select>
  135. </div>
  136. </div>
  137. <div class="row" ng-if="isSupportNotification() && context.settings.browserNotification">
  138. <div class="setting-key setting-key-without-desc col-sm-4">
  139. <span translate>System Notification Sound</span>
  140. </div>
  141. <div class="setting-value col-sm-8">
  142. <select class="form-control" style="width: 100%;"
  143. ng-model="context.settings.browserNotificationSound"
  144. ng-change="setBrowserNotificationSound(context.settings.browserNotificationSound)"
  145. ng-options="option.value as (option.name | translate) for option in context.trueFalseOptions">
  146. </select>
  147. </div>
  148. </div>
  149. <div class="row" ng-if="isSupportNotification() && context.settings.browserNotification">
  150. <div class="setting-key setting-key-without-desc col-sm-4">
  151. <span translate>System Notification Frequency</span>
  152. </div>
  153. <div class="setting-value col-sm-8">
  154. <select class="form-control" style="width: 100%;" ng-model="context.settings.browserNotificationFrequency"
  155. ng-change="setBrowserNotificationFrequency(context.settings.browserNotificationFrequency)">
  156. <option value="unlimited" translate>Unlimited</option>
  157. <option value="high" translate>High (Up to 10 Notifications / 1 Minute)</option>
  158. <option value="middle" translate>Middle (Up to 1 Notification / 1 Minute)</option>
  159. <option value="low" translate>Low (Up to 1 Notification / 5 Minutes)</option>
  160. </select>
  161. </div>
  162. </div>
  163. <div class="row" ng-if="isSupportMessagePush()">
  164. <div class="setting-key setting-key-without-desc col-sm-4">
  165. <span translate>Play Sound After Download Finished</span>
  166. </div>
  167. <div class="setting-value col-sm-8">
  168. <div class="input-group">
  169. <input class="form-control" type="text" readonly="readonly"
  170. ng-model="context.settings.playSoundAfterDownloadFinished"/>
  171. <div class="input-group-btn">
  172. <button type="button" class="btn btn-default" ng-click="browseAndSetPlaySoundAfterDownloadFinished()">
  173. <span translate>Browse</span>
  174. </button>
  175. <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"
  176. ng-disabled="!context.settings.playSoundAfterDownloadFinished">
  177. <span class="caret"></span>
  178. </button>
  179. <ul class="dropdown-menu dropdown-menu-right">
  180. <li><a class="pointer-cursor" ng-click="playSound()" translate>Play Sound</a></li>
  181. <li><a class="pointer-cursor" ng-click="stopPlayingSound()" translate>Stop Playing Sound</a></li>
  182. <li class="divider"></li>
  183. <li><a class="pointer-cursor" ng-click="clearPlaySoundAfterDownloadFinished()" translate>Clear</a></li>
  184. </ul>
  185. </div>
  186. </div>
  187. </div>
  188. </div>
  189. <div class="row" ng-if="context.isSupportReconnect">
  190. <div class="setting-key setting-key-without-desc col-sm-4">
  191. <span translate>WebSocket Auto Reconnect Interval</span>
  192. <span class="asterisk">*</span>
  193. </div>
  194. <div class="setting-value col-sm-8">
  195. <select class="form-control" style="width: 100%;"
  196. ng-model="context.settings.webSocketReconnectInterval"
  197. ng-change="setWebSocketReconnectInterval(context.settings.webSocketReconnectInterval)"
  198. ng-options="time.optionValue as (time.name | translate: {value: time.value}) for time in context.availableTime">
  199. </select>
  200. </div>
  201. </div>
  202. <div class="row">
  203. <div class="setting-key setting-key-without-desc col-sm-4">
  204. <span translate>Updating Page Title Interval</span>
  205. <span class="asterisk">*</span>
  206. </div>
  207. <div class="setting-value col-sm-8">
  208. <select class="form-control" style="width: 100%;"
  209. ng-model="context.settings.titleRefreshInterval"
  210. ng-change="setTitleRefreshInterval(context.settings.titleRefreshInterval)"
  211. ng-options="time.optionValue as (time.name | translate: {value: time.value}) for time in context.availableTime">
  212. </select>
  213. </div>
  214. </div>
  215. <div class="row">
  216. <div class="setting-key setting-key-without-desc col-sm-4">
  217. <span translate>Updating Global Stat Interval</span>
  218. <span class="asterisk">*</span>
  219. </div>
  220. <div class="setting-value col-sm-8">
  221. <select class="form-control" style="width: 100%;"
  222. ng-model="context.settings.globalStatRefreshInterval"
  223. ng-change="setGlobalStatRefreshInterval(context.settings.globalStatRefreshInterval)"
  224. ng-options="time.optionValue as (time.name | translate: {value: time.value}) for time in context.availableTime">
  225. </select>
  226. </div>
  227. </div>
  228. <div class="row">
  229. <div class="setting-key setting-key-without-desc col-sm-4">
  230. <span translate>Updating Task Information Interval</span>
  231. <span class="asterisk">*</span>
  232. </div>
  233. <div class="setting-value col-sm-8">
  234. <select class="form-control" style="width: 100%;"
  235. ng-model="context.settings.downloadTaskRefreshInterval"
  236. ng-change="setDownloadTaskRefreshInterval(context.settings.downloadTaskRefreshInterval)"
  237. ng-options="time.optionValue as (time.name | translate: {value: time.value}) for time in context.availableTime">
  238. </select>
  239. </div>
  240. </div>
  241. <div class="row">
  242. <div class="setting-key setting-key-without-desc col-sm-4">
  243. <span translate>Keyboard Shortcuts</span>
  244. <i class="icon-primary fa fa-question-circle" data-toggle="popover"
  245. data-trigger="hover" data-placement="auto right" data-container="body" data-html="true"
  246. data-content="{{('Supported Keyboard Shortcuts' | translate) + ':<br/>' +
  247. ('Remove Selected Task' | translate) + ': <span class=\'keyboard-key\'>Delete</span><br/>' +
  248. ('Select All Tasks' | translate) + ': ' + (!context.isMacKeyboardLike ? '<span class=\'keyboard-key\'>Ctrl</span>+<span class=\'keyboard-key\'>A</span>' : '<span class=\'keyboard-key\'>Command</span>+<span class=\'keyboard-key\'>A</span>') + '<br/>' +
  249. ('Set Focus On Search Box' | translate) + ': ' + (!context.isMacKeyboardLike ? '<span class=\'keyboard-key\'>Ctrl</span>+<span class=\'keyboard-key\'>F</span>' : '<span class=\'keyboard-key\'>Command</span>+<span class=\'keyboard-key\'>F</span>') + '<br/>' +
  250. ('Create New Task' | translate) + ': ' + (!context.isMacKeyboardLike ? '<span class=\'keyboard-key\'>Ctrl</span>+<span class=\'keyboard-key\'>N</span>' : '<span class=\'keyboard-key\'>Command</span>+<span class=\'keyboard-key\'>N</span>') + '<br/>' +
  251. ('Download Now' | translate) + ': ' + (!context.isMacKeyboardLike ? '<span class=\'keyboard-key\'>Ctrl</span>+<span class=\'keyboard-key\'>Enter</span>' : '<span class=\'keyboard-key\'>Command</span>+<span class=\'keyboard-key\'>Return</span>') +
  252. (isEnableDebugMode() ? ('<br/>' + ('Open Browser DevTools' | translate) + ': ' + (!context.isMacKeyboardLike ? '<span class=\'keyboard-key\'>F12</span>' : '<span class=\'keyboard-key\'>Command</span>+<span class=\'keyboard-key\'>Option</span>+<span class=\'keyboard-key\'>I</span>')) : '')}}"></i>
  253. </div>
  254. <div class="setting-value col-sm-8">
  255. <select class="form-control" style="width: 100%;" ng-model="context.settings.keyboardShortcuts"
  256. ng-change="setKeyboardShortcuts(context.settings.keyboardShortcuts)"
  257. ng-options="option.value as (option.name | translate) for option in context.trueFalseOptions">
  258. </select>
  259. </div>
  260. </div>
  261. <div class="row">
  262. <div class="setting-key setting-key-without-desc col-sm-4">
  263. <span translate>Swipe Gesture</span>
  264. </div>
  265. <div class="setting-value col-sm-8">
  266. <select class="form-control" style="width: 100%;" ng-model="context.settings.swipeGesture"
  267. ng-change="setSwipeGesture(context.settings.swipeGesture)"
  268. ng-options="option.value as (option.name | translate) for option in context.trueFalseOptions">
  269. </select>
  270. </div>
  271. </div>
  272. <div class="row">
  273. <div class="setting-key setting-key-without-desc col-sm-4">
  274. <span translate>Change Tasks Order by Drag-and-drop</span>
  275. </div>
  276. <div class="setting-value col-sm-8">
  277. <select class="form-control" style="width: 100%;" ng-model="context.settings.dragAndDropTasks"
  278. ng-change="setDragAndDropTasks(context.settings.dragAndDropTasks)"
  279. ng-options="option.value as (option.name | translate) for option in context.trueFalseOptions">
  280. </select>
  281. </div>
  282. </div>
  283. <div class="row">
  284. <div class="setting-key setting-key-without-desc col-sm-4">
  285. <span translate>RPC List Display Order</span>
  286. <span class="asterisk">*</span>
  287. </div>
  288. <div class="setting-value col-sm-8">
  289. <select class="form-control" style="width: 100%;" ng-model="context.settings.rpcListDisplayOrder"
  290. ng-change="setRPCListDisplayOrder(context.settings.rpcListDisplayOrder)">
  291. <option value="recentlyUsed" translate>Recently Used</option>
  292. <option value="rpcAlias" translate>RPC Alias</option>
  293. </select>
  294. </div>
  295. </div>
  296. <div class="row">
  297. <div class="setting-key setting-key-without-desc col-sm-4">
  298. <span translate>Each Task List Page Uses Independent Display Order</span>
  299. </div>
  300. <div class="setting-value col-sm-8">
  301. <select class="form-control" style="width: 100%;" ng-model="context.settings.taskListIndependentDisplayOrder"
  302. ng-change="setTaskListIndependentDisplayOrder(context.settings.taskListIndependentDisplayOrder)"
  303. ng-options="option.value as (option.name | translate) for option in context.trueFalseOptions">
  304. </select>
  305. </div>
  306. </div>
  307. <div class="row">
  308. <div class="setting-key setting-key-without-desc col-sm-4">
  309. <span translate>Action After Creating New Tasks</span>
  310. </div>
  311. <div class="setting-value col-sm-8">
  312. <select class="form-control" style="width: 100%;" ng-model="context.settings.afterCreatingNewTask"
  313. ng-change="setAfterCreatingNewTask(context.settings.afterCreatingNewTask)">
  314. <option value="task-list" translate>Navigate to Task List Page</option>
  315. <option value="task-detail" translate>Navigate to Task Detail Page</option>
  316. </select>
  317. </div>
  318. </div>
  319. <div class="row">
  320. <div class="setting-key setting-key-without-desc col-sm-4">
  321. <span translate>Action After Retrying Task</span>
  322. </div>
  323. <div class="setting-value col-sm-8">
  324. <select class="form-control" style="width: 100%;" ng-model="context.settings.afterRetryingTask"
  325. ng-change="setAfterRetryingTask(context.settings.afterRetryingTask)">
  326. <option value="task-list-downloading" translate>Navigate to Downloading Tasks Page</option>
  327. <option value="task-detail" translate>Navigate to Task Detail Page</option>
  328. <option value="stay-on-current" translate>Stay on Current Page</option>
  329. </select>
  330. </div>
  331. </div>
  332. <div class="row">
  333. <div class="setting-key setting-key-without-desc col-sm-4">
  334. <span translate>Remove Old Tasks After Retrying</span>
  335. </div>
  336. <div class="setting-value col-sm-8">
  337. <select class="form-control" style="width: 100%;" ng-model="context.settings.removeOldTaskAfterRetrying"
  338. ng-change="setRemoveOldTaskAfterRetrying(context.settings.removeOldTaskAfterRetrying)"
  339. ng-options="option.value as (option.name | translate) for option in context.trueFalseOptions">
  340. </select>
  341. </div>
  342. </div>
  343. <div class="row">
  344. <div class="setting-key setting-key-without-desc col-sm-4">
  345. <span translate>Confirm Task Removal</span>
  346. </div>
  347. <div class="setting-value col-sm-8">
  348. <select class="form-control" style="width: 100%;" ng-model="context.settings.confirmTaskRemoval"
  349. ng-change="setConfirmTaskRemoval(context.settings.confirmTaskRemoval)"
  350. ng-options="option.value as (option.name | translate) for option in context.trueFalseOptions">
  351. </select>
  352. </div>
  353. </div>
  354. <div class="row">
  355. <div class="setting-key setting-key-without-desc col-sm-4">
  356. <span translate>Include Prefix When Copying From Task Details</span>
  357. </div>
  358. <div class="setting-value col-sm-8">
  359. <select class="form-control" style="width: 100%;" ng-model="context.settings.includePrefixWhenCopyingFromTaskDetails"
  360. ng-change="setIncludePrefixWhenCopyingFromTaskDetails(context.settings.includePrefixWhenCopyingFromTaskDetails)"
  361. ng-options="option.value as (option.name | translate) for option in context.trueFalseOptions">
  362. </select>
  363. </div>
  364. </div>
  365. <div class="row">
  366. <div class="setting-key setting-key-without-desc col-sm-4">
  367. <span translate>Show Pieces Info In Task Detail Page</span>
  368. </div>
  369. <div class="setting-value col-sm-8">
  370. <select class="form-control" style="width: 100%;" ng-model="context.settings.showPiecesInfoInTaskDetailPage"
  371. ng-change="setShowPiecesInfoInTaskDetailPage(context.settings.showPiecesInfoInTaskDetailPage)">
  372. <option value="always" translate>Always</option>
  373. <option value="le102400" translate translate-values="{value: '102,400'}">Pieces Amount is Less than or Equal to {value}</option>
  374. <option value="le10240" translate translate-values="{value: '10,240'}">Pieces Amount is Less than or Equal to {value}</option>
  375. <option value="le1024" translate translate-values="{value: '1,024'}">Pieces Amount is Less than or Equal to {value}</option>
  376. <option value="never" translate>Never</option>
  377. </select>
  378. </div>
  379. </div>
  380. <div class="row">
  381. <div class="setting-key setting-key-without-desc col-sm-4">
  382. <span translate>Default Window Position</span>
  383. </div>
  384. <div class="setting-value col-sm-8">
  385. <select class="form-control" style="width: 100%;" ng-model="context.nativeSettings.defaultPosition"
  386. ng-change="setDefaultPosition(context.nativeSettings.defaultPosition)">
  387. <option value="last-position" translate>Last Position</option>
  388. <option value="screen-center" translate>Screen Center</option>
  389. </select>
  390. </div>
  391. </div>
  392. <div class="row">
  393. <div class="setting-key setting-key-without-desc col-sm-4">
  394. <span translate>Execute Command on Startup</span>
  395. </div>
  396. <div class="setting-value col-sm-8">
  397. <div class="input-group">
  398. <input class="form-control" type="text"
  399. ng-model="context.nativeSettings.execCommandOnStartup"
  400. ng-change="setExecCommandOnStartup(context.nativeSettings.execCommandOnStartup)"/>
  401. <div class="input-group-btn">
  402. <button type="button" class="btn btn-default" ng-click="browseAndSetExecCommandOnStartup()">
  403. <span translate>Browse</span>
  404. </button>
  405. </div>
  406. </div>
  407. </div>
  408. </div>
  409. <div class="row" ng-if="context.nativeSettings.execCommandOnStartup">
  410. <div class="setting-key setting-key-without-desc col-sm-4">
  411. <span translate>Execute Command Arguments on Startup</span>
  412. </div>
  413. <div class="setting-value col-sm-8">
  414. <textarea class="form-control" rows="3"
  415. ng-placeholder="'Support multiple arguments, one argument per line.' | translate"
  416. ng-model="context.nativeSettings.execCommandArgumentsOnStartup"
  417. ng-change="setExecCommandArgumentsOnStartup(context.nativeSettings.execCommandArgumentsOnStartup)"></textarea>
  418. </div>
  419. </div>
  420. <div class="row" ng-if="context.nativeSettings.execCommandOnStartup">
  421. <div class="setting-key setting-key-without-desc col-sm-4">
  422. <span translate>Execute Command Options on Startup</span>
  423. </div>
  424. <div class="setting-value col-sm-8">
  425. <select class="form-control" style="width: 100%;" ng-model="context.nativeSettings.execCommandOptionsOnStartup"
  426. ng-change="setExecCommandOptionsOnStartup(context.nativeSettings.execCommandOptionsOnStartup)">
  427. <option value="as-child-process" translate>As Child Process</option>
  428. <option value="as-detached-process" translate>As Detached Process</option>
  429. </select>
  430. </div>
  431. </div>
  432. <div class="row">
  433. <div class="setting-key setting-key-without-desc col-sm-4">
  434. <span translate>Action After Main Window Closed</span>
  435. </div>
  436. <div class="setting-value col-sm-8">
  437. <select class="form-control" style="width: 100%;" ng-model="context.nativeSettings.afterMainWindowClosed"
  438. ng-change="setAfterMainWindowClosed(context.nativeSettings.afterMainWindowClosed)">
  439. <option value="minimize-to-tray" translate>Minimize to Tray</option>
  440. <option value="exit-application" translate>Exit Application</option>
  441. </select>
  442. </div>
  443. </div>
  444. <div class="row">
  445. <div class="setting-key setting-key-without-desc col-sm-4">
  446. <span translate>Import / Export AriaNg Native Settings</span>
  447. </div>
  448. <div class="setting-value col-sm-8">
  449. <button class="btn btn-sm btn-default" ng-click="showImportSettingsModal()">
  450. <span translate>Import Settings</span>
  451. </button>
  452. <button class="btn btn-sm btn-default" ng-click="showExportSettingsModal()">
  453. <span translate>Export Settings</span>
  454. </button>
  455. </div>
  456. </div>
  457. <div class="row tip no-background no-hover">
  458. <span class="asterisk">*</span>
  459. <span translate>Changes to the settings take effect after refreshing page.</span>
  460. <button class="btn btn-xs btn-default" ng-click="resetSettings()">
  461. <span translate>Reset Settings</span>
  462. </button>
  463. <button class="btn btn-xs btn-default" ng-click="clearHistory()">
  464. <span translate>Clear Settings History</span>
  465. </button>
  466. <button class="btn btn-xs btn-default" ng-click="reloadApp()">
  467. <span translate>Reload AriaNg Native</span>
  468. </button>
  469. </div>
  470. </div>
  471. </div>
  472. <div class="tab-pane" ng-repeat="setting in context.rpcSettings" ng-class="{'active': isCurrentRpcTab($index)}">
  473. <div class="settings-table striped hoverable">
  474. <div class="row">
  475. <div class="setting-key setting-key-without-desc col-sm-4">
  476. <span translate>Aria2 RPC Alias</span>
  477. <span class="asterisk">*</span>
  478. </div>
  479. <div class="setting-value col-sm-8">
  480. <input class="form-control" type="text" ng-placeholder="(setting.rpcHost ? setting.rpcHost + ':' + setting.rpcPort : '')" ng-model="setting.rpcAlias" ng-change="updateRpcSetting(setting, 'rpcAlias')"/>
  481. </div>
  482. </div>
  483. <div class="row">
  484. <div class="setting-key setting-key-without-desc col-sm-4">
  485. <span translate>Aria2 RPC Address</span>
  486. <span class="asterisk">*</span>
  487. </div>
  488. <div class="setting-value col-sm-8">
  489. <div class="input-group input-group-multiple">
  490. <span class="input-group-addon" ng-bind="setting.protocol + '://'"></span>
  491. <input class="form-control" type="text" ng-model="setting.rpcHost" ng-change="updateRpcSetting(setting, 'rpcHost')"/>
  492. <span class="input-group-addon">:</span>
  493. <div class="input-group-addon-container">
  494. <input class="form-control form-control-rpcport" type="text" ng-model="setting.rpcPort" ng-change="updateRpcSetting(setting, 'rpcPort')"/>
  495. </div>
  496. <span class="input-group-addon">/</span>
  497. <div class="input-group-addon-container">
  498. <input class="form-control form-control-rpcinterface" type="text" ng-model="setting.rpcInterface" ng-change="updateRpcSetting(setting, 'rpcInterface')"/>
  499. </div>
  500. </div>
  501. </div>
  502. </div>
  503. <div class="row">
  504. <div class="setting-key setting-key-without-desc col-sm-4">
  505. <span translate>Aria2 RPC Protocol</span>
  506. <span class="asterisk">*</span>
  507. <i class="icon-primary fa fa-question-circle" ng-tooltip-container="body" ng-tooltip-placement="top"
  508. ng-tooltip="{{'Http and WebSocket would be disabled when accessing AriaNg via Https.' | translate}}"></i>
  509. </div>
  510. <div class="setting-value col-sm-8">
  511. <select class="form-control" style="width: 100%;" ng-model="setting.protocol" ng-change="updateRpcSetting(setting, 'protocol')">
  512. <option value="http" ng-disabled="::(context.isInsecureProtocolDisabled)" ng-bind="('Http' + (context.isInsecureProtocolDisabled ? ' (Disabled)' : '')) | translate">Http</option>
  513. <option value="https" translate>Https</option>
  514. <option value="ws" ng-disabled="::(context.isInsecureProtocolDisabled)" ng-bind="('WebSocket' + (context.isInsecureProtocolDisabled ? ' (Disabled)' : '')) | translate">WebSocket</option>
  515. <option value="wss" translate>WebSocket (Security)</option>
  516. </select>
  517. </div>
  518. </div>
  519. <div class="row" ng-if="setting.protocol === 'http' || setting.protocol === 'https'">
  520. <div class="setting-key setting-key-without-desc col-sm-4">
  521. <span translate>Aria2 RPC Http Request Method</span>
  522. <span class="asterisk">*</span>
  523. <i class="icon-primary fa fa-question-circle" ng-tooltip-container="body" ng-tooltip-placement="top"
  524. ng-tooltip="{{'POST method only supports aria2 v1.15.2 and above.' | translate}}"></i>
  525. </div>
  526. <div class="setting-value col-sm-8">
  527. <select class="form-control" style="width: 100%;" ng-model="setting.httpMethod" ng-change="updateRpcSetting(setting, 'httpMethod')">
  528. <option value="POST" translate>POST</option>
  529. <option value="GET" translate>GET</option>
  530. </select>
  531. </div>
  532. </div>
  533. <div class="row" ng-if="setting.protocol === 'http' || setting.protocol === 'https'">
  534. <div class="setting-key setting-key-without-desc col-sm-4">
  535. <span translate>Aria2 RPC Request Headers</span>
  536. <span class="asterisk">*</span>
  537. </div>
  538. <div class="setting-value col-sm-8">
  539. <textarea class="form-control" style="width: 100%;" rows="4" ng-model="setting.rpcRequestHeaders"
  540. ng-change="updateRpcSetting(setting, 'rpcRequestHeaders')"
  541. ng-placeholder="'Support multiple request headers, one header per line, each line containing &quot;header name: header value&quot;.' | translate"></textarea>
  542. </div>
  543. </div>
  544. <div class="row">
  545. <div class="setting-key setting-key-without-desc col-sm-4">
  546. <span translate>Aria2 RPC Secret Token</span>
  547. <span class="asterisk">*</span>
  548. </div>
  549. <div class="setting-value col-sm-8">
  550. <div class="input-group">
  551. <input class="form-control" type="{{context.showRpcSecret ? 'text' : 'password'}}" ng-model="setting.secret" ng-change="updateRpcSetting(setting, 'secret')"/>
  552. <span class="input-group-addon input-group-addon-compact no-vertical-padding">
  553. <button class="btn btn-xs btn-default" title="{{context.showRpcSecret ? 'Hide Secret' : 'Show Secret' | translate}}"
  554. ng-class="{'active': context.showRpcSecret}" ng-click="context.showRpcSecret = !context.showRpcSecret">
  555. <i class="fa fa-eye"></i>
  556. </button>
  557. </span>
  558. </div>
  559. </div>
  560. </div>
  561. <div class="row">
  562. <div class="setting-key setting-key-without-desc col-sm-4">
  563. <span translate>Export Command API</span>
  564. </div>
  565. <div class="setting-value col-sm-8">
  566. <button class="btn btn-sm btn-default" ng-click="showExportCommandAPIModal(setting)">
  567. <span translate>Export</span>
  568. </button>
  569. </div>
  570. </div>
  571. <div class="row tip no-background no-hover">
  572. <span class="asterisk">*</span>
  573. <span translate>Changes to the settings take effect after refreshing page.</span>
  574. <button class="btn btn-xs btn-default" ng-disabled="setting.isDefault" ng-click="setDefaultRpcSetting(setting)">
  575. <span translate>Activate</span>
  576. </button>
  577. </div>
  578. </div>
  579. </div>
  580. </div>
  581. </div>
  582. <div id="import-settings-modal" class="modal fade" tabindex="-1" role="dialog">
  583. <div class="modal-dialog modal-lg" role="document">
  584. <div class="modal-content">
  585. <div class="modal-header">
  586. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  587. <h4 class="modal-title">
  588. <span translate>Import Settings</span>
  589. <small>
  590. <a class="pointer-cursor" title="{{'Open' | translate}}" ng-click="openAriaNgConfigFile()">
  591. <i class="icon-primary fa fa-folder-open-o"></i>
  592. </a>
  593. </small>
  594. </h4>
  595. </div>
  596. <div class="modal-body no-padding">
  597. <div class="settings-table striped">
  598. <input id="import-file-holder" type="file" style="display: none"/>
  599. <textarea class="form-control" ng-model="context.importSettings" rows="20"
  600. ng-placeholder="'AriaNg Native settings data' | translate"></textarea>
  601. </div>
  602. </div>
  603. <div class="modal-footer">
  604. <button type="button" class="btn btn-primary" ng-disabled="!context.importSettings || !context.importSettings.length"
  605. ng-click="importSettings(context.importSettings)" translate>Import</button>
  606. <button type="button" class="btn btn-default" data-dismiss="modal" translate>Cancel</button>
  607. </div>
  608. </div>
  609. </div>
  610. </div>
  611. <div id="export-settings-modal" class="modal fade" tabindex="-1" role="dialog">
  612. <div class="modal-dialog modal-lg" role="document">
  613. <div class="modal-content">
  614. <div class="modal-header">
  615. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  616. <h4 class="modal-title">
  617. <span translate>Export Settings</span>
  618. <small>
  619. <a class="pointer-cursor" title="{{'Save' | translate}}" ng-if="context.isSupportBlob"
  620. ng-blob-download="context.exportSettings" ng-file-name="AriaNgConfig.json" ng-content-type="application/json">
  621. <i class="icon-primary fa fa-save"></i>
  622. </a>
  623. <a class="pointer-cursor" title="{{'Copy' | translate}}" ng-click="copyExportSettings()">
  624. <i class="icon-primary fa fa-copy"></i>
  625. </a>
  626. <span class="label label-default fade-in" ng-if="context.exportSettingsCopied" translate>Data has been copied to clipboard.</span>
  627. </small>
  628. </h4>
  629. </div>
  630. <div class="modal-body no-padding">
  631. <div class="settings-table striped">
  632. <textarea class="form-control" ng-model="context.exportSettings" rows="20" readonly="readonly"></textarea>
  633. </div>
  634. </div>
  635. <div class="modal-footer">
  636. <button type="button" class="btn btn-default" data-dismiss="modal" translate>Cancel</button>
  637. </div>
  638. </div>
  639. </div>
  640. </div>
  641. <ng-export-command-api-dialog options="context.exportCommandApiOptions"></ng-export-command-api-dialog>
  642. </section>