1 | export default["$timeout", function loadStatusFactory($timeout) {
|
2 |
|
3 | return {
|
4 | init: function($scope, initialTasks) {
|
5 | var service = {};
|
6 | var existing = $scope.loadStatus;
|
7 | if (existing) {
|
8 | angular.extend(service, existing);
|
9 | service.allTasks = [].concat(existing.allTasks);
|
10 |
|
11 | } else {
|
12 | service.allTasks = [];
|
13 | }
|
14 | $scope.loadStatus = service;
|
15 |
|
16 | service.registerTask = function(key, taskOptions) {
|
17 | var task = {
|
18 | key: key,
|
19 | title: "Untitled Task",
|
20 | progressCurrent: 0,
|
21 | progressTotal: 1,
|
22 | active: false,
|
23 | message: "",
|
24 | error: null,
|
25 | start: function(message) {
|
26 | $timeout(function() {
|
27 | task.message = message || "";
|
28 | task.active = true;
|
29 | task.error = null;
|
30 | task.progressCurrent = 0;
|
31 | task.completed = false;
|
32 | });
|
33 | },
|
34 | finish: function(message) {
|
35 | $timeout(function() {
|
36 | task.message = message || "";
|
37 | task.progressCurrent = task.progressTotal;
|
38 | task.completed = true;
|
39 | task.active = false;
|
40 | });
|
41 | },
|
42 | fail: function(message) {
|
43 | $timeout(function() {
|
44 | task.active = false;
|
45 | task.error = message;
|
46 | task.completed = false;
|
47 | });
|
48 | },
|
49 | progress: function(progress, total, message) {
|
50 | $timeout(function() {
|
51 | task.active = true;
|
52 | task.progressCurrent = progress;
|
53 | if (total !== undefined) task.progressTotal = total;
|
54 | if (message !== undefined) task.message = message;
|
55 | });
|
56 | }
|
57 | };
|
58 | angular.extend(task, taskOptions);
|
59 | service[key] = task;
|
60 | service.allTasks.push(task);
|
61 | };
|
62 |
|
63 | service.onUpdate = function(tasksOrKeys, fn) {
|
64 |
|
65 | tasksOrKeys = tasksOrKeys || service.allTasks;
|
66 | var watchedKeys = [];
|
67 | for (let i = 0; i < tasksOrKeys.length; i++) {
|
68 | var t = tasksOrKeys[i];
|
69 | if (typeof t == "string") watchedKeys.push(t);
|
70 | else if (t.key) watchedKeys.push(t.key);
|
71 | }
|
72 | if (watchedKeys.length === 0) return fn({
|
73 | tasks: [],
|
74 | completed: true
|
75 | });
|
76 |
|
77 | $scope.$watch("[loadStatus." + watchedKeys.join(",loadStatus.") + "]", function(newTasks) {
|
78 |
|
79 | if (!newTasks) return;
|
80 |
|
81 | var result = {
|
82 | tasks: newTasks
|
83 | };
|
84 |
|
85 | result.currentTask = undefined;
|
86 | for (var i = 0; i < newTasks.length; i++) {
|
87 | var task = newTasks[i];
|
88 | if (task.error) {
|
89 | result.currentTask = task;
|
90 | break;
|
91 | }
|
92 |
|
93 | if (task.active) {
|
94 | result.currentTask = task;
|
95 | break;
|
96 | }
|
97 | if (task.progressCurrent < task.progressTotal && (!result.currentTask || task.progressTotal > result.currentTask.progressTotal)) {
|
98 | result.currentTask = task;
|
99 | break;
|
100 | }
|
101 | }
|
102 | if (!result.currentTask) {
|
103 |
|
104 | result.message = "finished";
|
105 | result.completed = true;
|
106 | } else {
|
107 | result.completed = false;
|
108 | result.title = result.currentTask.title;
|
109 | result.error = result.currentTask.error;
|
110 | result.message = result.currentTask.message || (result.currentTask.progressCurrent + " / " + result.currentTask.progressTotal);
|
111 | }
|
112 |
|
113 | fn(result);
|
114 |
|
115 | }, true);
|
116 |
|
117 | };
|
118 |
|
119 | service.after = function(tasksOrKeys, fn) {
|
120 | service.onUpdate(tasksOrKeys, function(taskGroup) {
|
121 | if (taskGroup.completed) return fn();
|
122 | });
|
123 | };
|
124 |
|
125 | if (initialTasks) {
|
126 | for (var tk in initialTasks) {
|
127 | service.registerTask(tk, initialTasks[tk]);
|
128 | }
|
129 | }
|
130 | return service;
|
131 | }
|
132 | };
|
133 | }];
|