Browse Source

bump version to 1.0.3, merger AriaNg 1.0.3

MaysWind 6 years ago
parent
commit
7edd586e75

+ 3 - 1
app/langs/zh_Hans.txt

@@ -23,6 +23,7 @@ Delete=删除任务
 Select All=全部选中
 Select None=全部不选
 Select Invert=反向选择
+Select All Failed Task=全选失败任务
 Display Order=显示顺序
 Copy Download Url=复制下载链接
 Copy Magnet Link=复制磁力链接
@@ -42,6 +43,7 @@ Click to view task detail=点击查看任务详情
 By File Name=按文件名
 By File Size=按文件大小
 By Progress=按进度
+By Selected Status=按选中状态
 By Remain Time=按剩余时间
 By Download Speed=按下载速度
 By Upload Speed=按上传速度
@@ -481,7 +483,7 @@ bt-prioritize-piece.description=尝试先下载每个文件开头或结尾的分
 bt-remove-unselected-file.name=删除未选择的文件
 bt-remove-unselected-file.description=当 BT 任务完成后删除未选择的文件. 要选择需要下载的文件, 请使用 --select-file 选项. 如果没有选择, 则所有文件都默认为需要下载. 此选项会从磁盘上直接删除文件, 请谨慎使用此选项.
 bt-require-crypto.name=需要加密
-bt-require-crypto.description=如果设置为"是", aria 将不会接受以前的 BitTorrent 握手协议(\\19BitTorrent 协议)并建立连接. 因此 aria2 总是模糊握手.
+bt-require-crypto.description=如果设置为"是", aria 将不会接受以前的 BitTorrent 握手协议(\19BitTorrent 协议)并建立连接. 因此 aria2 总是模糊握手.
 bt-request-peer-speed-limit.name=期望下载速度
 bt-request-peer-speed-limit.description=如果一个 BT 下载的整体下载速度低于此选项设置的值, aria2 会临时提高连接数以提高下载速度. 在某些情况下, 设置期望下载速度可以提高您的下载速度. 您可以增加数值的单位 K 或 M (1K = 1024, 1M = 1024K).
 bt-save-metadata.name=保存种子文件

+ 3 - 1
app/langs/zh_Hant.txt

@@ -23,6 +23,7 @@ Delete=刪除工作
 Select All=全部選中
 Select None=全部不選
 Select Invert=反向選擇
+Select All Failed Task=全選失敗工作
 Display Order=顯示順序
 Copy Download Url=複製下載連結
 Copy Magnet Link=複製磁力連結
@@ -42,6 +43,7 @@ Click to view task detail=點選檢視工作詳情
 By File Name=依檔名
 By File Size=依檔案大小
 By Progress=依進度
+By Selected Status=依選中狀態
 By Remain Time=依剩餘時間
 By Download Speed=依下載速度
 By Upload Speed=依上傳速度
@@ -481,7 +483,7 @@ bt-prioritize-piece.description=嘗試先下載每個檔案開頭或結尾的分
 bt-remove-unselected-file.name=刪除未選擇的檔案
 bt-remove-unselected-file.description=當 BT 工作完成後刪除未選擇的檔案. 要選擇需要下載的檔案, 請使用 --select-file 選項. 如果沒有選擇, 則所有檔案都預設為需要下載. 此選項會從磁碟上直接刪除檔案, 請謹慎使用此選項.
 bt-require-crypto.name=需要加密
-bt-require-crypto.description=如果設定為"是", aria 將不會接受以前的 BitTorrent 握手協定(\\19BitTorrent 協定)並建立連線. 因此 aria2 總是模糊握手.
+bt-require-crypto.description=如果設定為"是", aria 將不會接受以前的 BitTorrent 握手協定(\19BitTorrent 協定)並建立連線. 因此 aria2 總是模糊握手.
 bt-request-peer-speed-limit.name=期望下載速度
 bt-request-peer-speed-limit.description=如果一個 BT 下載的整體下載速度低於此選項設定的值, aria2 會臨時提高連線數以提高下載速度. 在某些情況下, 設定期望下載速度可以提高您的下載速度. 您可以增加數值的單位 K 或 M (1K = 1024, 1M = 1024K).
 bt-save-metadata.name=儲存種子檔案

+ 2 - 0
app/scripts/config/defaultLanguage.js

@@ -27,6 +27,7 @@
             'Select All': 'Select All',
             'Select None': 'Select None',
             'Select Invert': 'Select Invert',
+            'Select All Failed Task': 'Select All Failed Task',
             'Display Order': 'Display Order',
             'Copy Download Url': 'Copy Download Url',
             'Copy Magnet Link': 'Copy Magnet Link',
@@ -46,6 +47,7 @@
             'By File Name': 'By File Name',
             'By File Size': 'By File Size',
             'By Progress': 'By Progress',
+            'By Selected Status': 'By Selected Status',
             'By Remain Time': 'By Remain Time',
             'By Download Speed': 'By Download Speed',
             'By Upload Speed': 'By Upload Speed',

+ 0 - 12
app/scripts/controllers/list.js

@@ -66,18 +66,6 @@
             }, silent);
         };
 
-        $scope.filterByTaskName = function (task) {
-            if (!task || !angular.isString(task.taskName)) {
-                return false;
-            }
-
-            if (!$rootScope.searchContext || !$rootScope.searchContext.text) {
-                return true;
-            }
-
-            return (task.taskName.toLowerCase().indexOf($rootScope.searchContext.text.toLowerCase()) >= 0);
-        };
-
         $scope.getOrderType = function () {
             return ariaNgSettingService.getDisplayOrder();
         };

+ 8 - 4
app/scripts/controllers/main.js

@@ -201,8 +201,8 @@
             });
         };
 
-        $scope.isTaskRetryable = function (task) {
-            return task && task.status === 'error' && task.errorDescription && !task.bittorrent;
+        $scope.hasRetryableTask = function () {
+            return $rootScope.taskContext.hasRetryableTask();
         };
 
         $scope.isSelectedTaskRetryable = function () {
@@ -213,7 +213,7 @@
             }
 
             for (var i = 0; i < selectedTasks.length; i++) {
-                if (!$scope.isTaskRetryable(selectedTasks[i])) {
+                if (!$rootScope.isTaskRetryable(selectedTasks[i])) {
                     return false;
                 }
             }
@@ -234,7 +234,7 @@
             var skipCount = 0;
 
             for (var i = 0; i < tasks.length; i++) {
-                if ($scope.isTaskRetryable(tasks[i])) {
+                if ($rootScope.isTaskRetryable(tasks[i])) {
                     retryableTasks.push(tasks[i]);
                 } else {
                     skipCount++;
@@ -326,6 +326,10 @@
             $rootScope.taskContext.selectAll();
         };
 
+        $scope.selectAllFailedTasks = function () {
+            $rootScope.taskContext.selectAllFailed();
+        };
+
         $scope.copySelectedOneTaskDownloadLink = function () {
             var selectedTasks = $rootScope.taskContext.getSelectedTasks();
 

+ 82 - 0
app/scripts/core/root.js

@@ -212,6 +212,10 @@
                 for (var i = 0; i < this.list.length; i++) {
                     var task = this.list[i];
 
+                    if (!$rootScope.filterTask(task)) {
+                        continue;
+                    }
+
                     if (!this.selected[task.gid]) {
                         isAllSelected = false;
                         break;
@@ -220,6 +224,21 @@
 
                 return isAllSelected;
             },
+            hasRetryableTask: function () {
+                for (var i = 0; i < this.list.length; i++) {
+                    var task = this.list[i];
+
+                    if (!$rootScope.filterTask(task)) {
+                        continue;
+                    }
+
+                    if ($rootScope.isTaskRetryable(task)) {
+                        return true;
+                    }
+                }
+
+                return false;
+            },
             selectAll: function () {
                 if (!this.list || !this.selected || this.list.length < 1) {
                     return;
@@ -233,9 +252,72 @@
 
                 for (var i = 0; i < this.list.length; i++) {
                     var task = this.list[i];
+
+                    if (!$rootScope.filterTask(task)) {
+                        continue;
+                    }
+
                     this.selected[task.gid] = !isAllSelected;
                 }
+            },
+            selectAllFailed: function () {
+                if (!this.list || !this.selected || this.list.length < 1) {
+                    return;
+                }
+
+                if (!this.enableSelectAll) {
+                    return;
+                }
+
+                var isAllFailedSelected = true;
+
+                for (var i = 0; i < this.list.length; i++) {
+                    var task = this.list[i];
+
+                    if (!$rootScope.filterTask(task)) {
+                        continue;
+                    }
+
+                    if (!$rootScope.isTaskRetryable(task)) {
+                        continue;
+                    }
+
+                    if (!this.selected[task.gid]) {
+                        isAllFailedSelected = false;
+                    }
+                }
+
+                for (var i = 0; i < this.list.length; i++) {
+                    var task = this.list[i];
+
+                    if (!$rootScope.filterTask(task)) {
+                        continue;
+                    }
+
+                    if (!$rootScope.isTaskRetryable(task)) {
+                        this.selected[task.gid] = false;
+                        continue;
+                    }
+
+                    this.selected[task.gid] = !isAllFailedSelected;
+                }
+            }
+        };
+
+        $rootScope.filterTask = function (task) {
+            if (!task || !angular.isString(task.taskName)) {
+                return false;
             }
+
+            if (!$rootScope.searchContext || !$rootScope.searchContext.text) {
+                return true;
+            }
+
+            return (task.taskName.toLowerCase().indexOf($rootScope.searchContext.text.toLowerCase()) >= 0);
+        };
+
+        $rootScope.isTaskRetryable = function (task) {
+            return task && task.status === 'error' && task.errorDescription && !task.bittorrent;
         };
 
         $rootScope.swipeActions = {

+ 2 - 0
app/scripts/filters/fileOrderBy.js

@@ -21,6 +21,8 @@
                 return $filter('orderBy')(array, ['length'], orderType.reverse);
             } else if (orderType.type === 'percent') {
                 return $filter('orderBy')(array, ['completePercent'], orderType.reverse);
+            } else if (orderType.type === 'selected') {
+                return $filter('orderBy')(array, ['selected'], orderType.reverse);
             } else {
                 return array;
             }

+ 9 - 2
app/views/list.html

@@ -33,7 +33,7 @@
             </div>
         </div>
         <div class="task-table-body" ng-class="{'draggable': isSupportDragTask()}" dragula="'task-list'" dragula-model="taskContext.list">
-            <div class="row pointer-cursor" ng-repeat="task in taskContext.list | filter: filterByTaskName | taskOrderBy: getOrderType()"
+            <div class="row pointer-cursor" ng-repeat="task in taskContext.list | filter: filterTask | taskOrderBy: getOrderType()"
                  data-gid="{{task.gid}}" data-selected="{{!!taskContext.selected[task.gid]}}" data-toggle="context" data-target="#task-table-contextmenu"
                  ng-click="taskContext.selected[task.gid] = !taskContext.selected[task.gid]">
                 <div class="col-md-8 col-sm-7 col-xs-12">
@@ -70,7 +70,8 @@
                     </div>
                 </div>
                 <div class="col-md-2 col-sm-2 hidden-xs">
-                    <span class="task-download-speed" ng-bind="task.status === 'waiting' ? ('Waiting' | translate) : (task.status === 'paused' ? ('Paused' | translate) : (task.status === 'active' ? (!task.seeder || task.downloadSpeed > 0 ? (task.downloadSpeed | readableVolume) + '/s' : '-') : ''))"></span>
+                    <span class="task-download-speed" title="{{task.status === 'active' ? (('Download Speed' | translate) + ': ' + (task.downloadSpeed | readableVolume) + '/s') + (task.bittorrent ? ', ' + ('Upload Speed' | translate) + ': ' + (task.uploadSpeed | readableVolume) + '/s' : '') : ''}}"
+                          ng-bind="task.status === 'waiting' ? ('Waiting' | translate) : (task.status === 'paused' ? ('Paused' | translate) : (task.status === 'active' ? (!task.seeder || task.downloadSpeed > 0 ? (task.downloadSpeed | readableVolume) + '/s' : '-') : ''))"></span>
                 </div>
                 <div class="task-right-arrow visible-md visible-lg">
                     <a ng-href="#!/task/detail/{{task.gid}}" title="{{'Click to view task detail' | translate}}">
@@ -163,6 +164,12 @@
                         <span translate>Select All</span>
                     </a>
                 </li>
+                <li ng-if="hasRetryableTask()">
+                    <a tabindex="-1" class="pointer-cursor" title="{{'Select All Failed Task' | translate}}" ng-click="selectAllFailedTasks()">
+                        <i class="fa fa-fw"></i>
+                        <span translate>Select All Failed Task</span>
+                    </a>
+                </li>
                 <li class="divider" ng-if="isSingleUrlTaskSelected() || isSingleBittorrentHasInfoHashTaskSelected()"></li>
                 <li ng-if="isSingleUrlTaskSelected()">
                     <a tabindex="-1" class="pointer-cursor" title="{{'Copy Download Url' | translate}}" ng-click="copySelectedOneTaskDownloadLink()">

+ 6 - 0
app/views/task-detail.html

@@ -419,6 +419,12 @@
                             <i class="fa fa-fw" ng-class="{'fa-check': isSetFileListDisplayOrder('size')}"></i>
                         </a>
                     </li>
+                    <li>
+                        <a class="pointer-cursor" ng-click="changeFileListDisplayOrder('selected:desc')">
+                            <span translate>By Selected Status</span>
+                            <i class="fa fa-fw" ng-class="{'fa-check': isSetFileListDisplayOrder('selected')}"></i>
+                        </a>
+                    </li>
                 </ul>
             </li>
         </ul>

+ 10 - 80
package-lock.json

@@ -1,6 +1,6 @@
 {
   "name": "ariang-native",
-  "version": "1.0.2",
+  "version": "1.0.3",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
@@ -59,9 +59,9 @@
       "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw=="
     },
     "admin-lte": {
-      "version": "2.4.9",
-      "resolved": "https://registry.npmjs.org/admin-lte/-/admin-lte-2.4.9.tgz",
-      "integrity": "sha512-+u3zt5sWPPT8HmBvRg4F8IGZPaE5wD0K10+IjXoynfe/jEUrMMj+4eA1LGH9fMK6QulmFr1NCtc1Tk+mTgC24A==",
+      "version": "2.4.10",
+      "resolved": "https://registry.npmjs.org/admin-lte/-/admin-lte-2.4.10.tgz",
+      "integrity": "sha512-X7ueyp+zG7lkYU47VKgZj6JW+Q3Kphd/qEzwNReta5ZhweeDap4IlS4EADYNfCqZCIwDZPqRstJ2Dww0Irowow==",
       "requires": {
         "bootstrap": "^3.4.0",
         "bootstrap-colorpicker": "^2.5.3",
@@ -139,8 +139,9 @@
       "integrity": "sha1-tPGzM+x87THCB9tePXdmU3XRjqA="
     },
     "angular-clipboard": {
-      "version": "git://github.com/mayswind/angular-clipboard.git#597a03b73a13754926bd2406979e5de65eb98102",
-      "from": "git://github.com/mayswind/angular-clipboard.git#597a03b73a13754926bd2406979e5de65eb98102"
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/angular-clipboard/-/angular-clipboard-1.7.0.tgz",
+      "integrity": "sha512-4/eg3zZw1MJpIsMc+mWzeVNyWBu8YWpXPTdmbgyPRp/6f0xB6I3XR2iC6Mb4mg/5E9q6exCd0sX2yiIsw+ZLJw=="
     },
     "angular-cookies": {
       "version": "1.6.10",
@@ -388,21 +389,6 @@
       "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
       "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys="
     },
-    "array-union": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
-      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
-      "dev": true,
-      "requires": {
-        "array-uniq": "^1.0.1"
-      }
-    },
-    "array-uniq": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
-      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
-      "dev": true
-    },
     "asn1": {
       "version": "0.2.4",
       "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
@@ -1477,20 +1463,6 @@
       "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
       "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
     },
-    "del": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
-      "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
-      "dev": true,
-      "requires": {
-        "globby": "^6.1.0",
-        "is-path-cwd": "^1.0.0",
-        "is-path-in-cwd": "^1.0.0",
-        "p-map": "^1.1.1",
-        "pify": "^3.0.0",
-        "rimraf": "^2.2.8"
-      }
-    },
     "delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -1708,9 +1680,9 @@
       "dev": true
     },
     "electron": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/electron/-/electron-4.1.3.tgz",
-      "integrity": "sha512-oOeuA+BAydrMcKGBu4GEJfgAtaRd189SabE8V9koAH/sUiTHYroWtwRzA6V24JFa/dCJAHNjVD8F4qSMybxzrA==",
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/electron/-/electron-4.1.4.tgz",
+      "integrity": "sha512-MelOjntJvd33izEjR6H4N/Uii7y535z/b2BuYXJGLNSHL6o1IlyhUQmfiT87kWABayERgeuYERgvsyf956OOFw==",
       "dev": true,
       "requires": {
         "@types/node": "^10.12.18",
@@ -2149,27 +2121,6 @@
         "ini": "^1.3.4"
       }
     },
-    "globby": {
-      "version": "6.1.0",
-      "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
-      "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
-      "dev": true,
-      "requires": {
-        "array-union": "^1.0.1",
-        "glob": "^7.0.3",
-        "object-assign": "^4.0.1",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true
-        }
-      }
-    },
     "got": {
       "version": "6.7.1",
       "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz",
@@ -2489,21 +2440,6 @@
       "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
       "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
     },
-    "is-path-cwd": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
-      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
-      "dev": true
-    },
-    "is-path-in-cwd": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
-      "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
-      "dev": true,
-      "requires": {
-        "is-path-inside": "^1.0.0"
-      }
-    },
     "is-path-inside": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
@@ -3188,12 +3124,6 @@
         "p-limit": "^2.0.0"
       }
     },
-    "p-map": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
-      "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
-      "dev": true
-    },
     "p-try": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",

+ 6 - 7
package.json

@@ -5,8 +5,8 @@
   },
   "name": "ariang-native",
   "appId": "net.mayswind.ariang",
-  "version": "1.0.2",
-  "ariang-version": "1.0.2",
+  "version": "1.0.3",
+  "ariang-version": "1.0.3",
   "description": "AriaNg Native is a desktop application containing full feature of AriaNg, and also has many features that AriaNg cannot implement.",
   "main": "main.js",
   "scripts": {
@@ -35,8 +35,7 @@
   },
   "homepage": "http://ariang.mayswind.net/",
   "devDependencies": {
-    "del": "^3.0.0",
-    "electron": "^4.1.3",
+    "electron": "^4.1.4",
     "electron-builder": "^20.39.0",
     "rimraf": "^2.6.2"
   },
@@ -47,7 +46,7 @@
     "moment-timezone": "0.5.23",
     "echarts": "3.8.5",
     "font-awesome": "^4.7.0",
-    "admin-lte": "2.4.9",
+    "admin-lte": "2.4.10",
     "sweetalert": "^1.1.3",
     "awesome-bootstrap-checkbox": "^0.3.7",
     "jquery-slimscroll": "^1.3.8",
@@ -62,7 +61,7 @@
     "angular-animate": "1.6.10",
     "angular-translate": "^2.18.1",
     "angular-moment": "1.3.0",
-    "angular-websocket": "^2.0.0",
+    "angular-websocket": "^2.0.1",
     "angular-local-storage": "^0.7.1",
     "angular-ui-notification": "^0.3.6",
     "angular-bittorrent-peerid": "^1.2.0",
@@ -70,7 +69,7 @@
     "angular-promise-buttons": "^0.1.23",
     "angular-sweetalert": "^1.1.2",
     "angular-utf8-base64": "^0.0.5",
-    "angular-clipboard": "git://github.com/mayswind/angular-clipboard.git#597a03b73a13754926bd2406979e5de65eb98102",
+    "angular-clipboard": "^1.7.0",
     "angular-input-dropdown": "git://github.com/mayswind/angular-input-dropdown.git#68670e39816698b3eb98c0e740a0efe77d5fbdd1",
     "angularjs-dragula": "^2.0.0",
     "electron-localshortcut": "^3.1.0",