-
Notifications
You must be signed in to change notification settings - Fork 2
/
TaskerAdmin.js
104 lines (86 loc) · 3.35 KB
/
TaskerAdmin.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
* Tasker module - javascript frontend
*
* Performs API calls to query task status / execute command etc.
*
* Copyright 2017-2020 Tamas Meszaros <[email protected]>
* This file licensed under Mozilla Public License v2.0 http://mozilla.org/MPL/2.0/
*/
// Execute a command on a given task using backend API calls
function TaskerAction(taskId, command) {
taskerAdminAPIUrl = ProcessWire.config.tasker.apiUrl,
taskdiv = $("div[taskid='" + taskId + "']"),
taskdiv.children("ul.actions").hide();
taskdiv.children("i.fa").hide();
taskdiv.children('span.TaskTitle').prepend('<b>Calling ' + command + ':</b> ');
performAPICall(taskerAdminAPIUrl + '?id=' + taskId + '&cmd=' + command, statusCallback, taskdiv);
}
// perform a HTTP request to the TaskerAdmin API and display the results
function performAPICall(url, callback, taskdiv) {
var msgText = taskdiv.children("span.TaskTitle"),
timeout = ProcessWire.config.tasker.timeout + 500, // add some extra time
unloading = false;
// signal if the user is leaving the page
$(window).bind('beforeunload', function() { unloading = true; });
// send the HTTP request
$.ajax({
dataType: "json",
url: url,
success: callback,
timeout: timeout,
error: function(jqXHR, status, errorThrown) {
taskdiv.children("ul.actions").remove(); // remove the action buttons on error
if (status == 'timeout') {
msgText.append(" <b>ERROR:</b> Request timeout. Please check the backend for more info.");
} else if (unloading) {
msgText.append(" Cancelling request...");
} else {
msgText.append(" <b>ERROR:</b> Invalid response from the server: " + status);
}
}
});
}
// callback for HTTP requests
function statusCallback(data) {
var taskId = data['taskid'],
taskdiv = $("div[taskid='" + taskId + "']"),
msgText = taskdiv.children("span.TaskTitle"),
progressbar = taskdiv.children("div.progressbar");
if (data['status_html'] == '') {
// Task not found (e.g. trashed), remove it from the tasklist
taskdiv.remove();
return;
}
// replace the task div with the new HTML content
taskdiv.replaceWith(data['status_html']);
if (!data['status']) { // return status is not OK
if (progressbar.length) progressbar.remove();
return;
}
// update the variables from the newly received content
taskdiv = $("div[taskid='" + taskId + "']");
progressbar = taskdiv.children("div.progressbar");
if (!progressbar.length) return;
run = taskdiv.attr('run'),
repeatTime = taskdiv.attr('repeatTime');
progressLabel = progressbar.children('div.progress-label');
// initialize a progressbar for the task
progressbar.progressbar({
value: false,
change: function() {
progressLabel.text(progressbar.progressbar( "value" ) + "% done.");
},
});
progressLabel.text("Querying task's status...");
progressbar.progressbar("value", data['progress']);
// TODO don't execute the task if it is stopped by another request
if (run) { // we're executing the task and it is still active
if (repeatTime > 0) {
setTimeout(function() {
performAPICall(ProcessWire.config.tasker.apiUrl + '?cmd=run&id=' + taskId, statusCallback, taskdiv);
}, 1000 * Number(repeatTime));
} else {
performAPICall(ProcessWire.config.tasker.apiUrl + '?cmd=run&id=' + taskId, statusCallback, taskdiv);
}
}
}