UNPKG

5.35 kBJavaScriptView Raw
1export default["$timeout", function loadStatusFactory($timeout) {
2 // simple UI to track loading status
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 // if no task array specified, include all tasks in the current scope
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 // check all tasks, see if there are any outstanding
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 // finished
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}];