summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--share/www/_sidebar.html3
-rw-r--r--share/www/script/jquery.couch.js18
-rw-r--r--share/www/status.html106
-rw-r--r--share/www/style/layout.css13
4 files changed, 139 insertions, 1 deletions
diff --git a/share/www/_sidebar.html b/share/www/_sidebar.html
index 6ef988b9..670a8e54 100644
--- a/share/www/_sidebar.html
+++ b/share/www/_sidebar.html
@@ -5,8 +5,9 @@
<ul id="nav">
<li><span>Tools</span><ul>
<li><a href="index.html">Overview</a></li>
- <li><a href="replicator.html">Replicator</a></li>
<li><a href="config.html">Configuration</a></li>
+ <li><a href="replicator.html">Replicator</a></li>
+ <li><a href="status.html">Status</a></li>
<li><a href="couch_tests.html?script/couch_tests.js">Test Suite</a></li>
</ul></li>
<li><span>Recent Databases</span>
diff --git a/share/www/script/jquery.couch.js b/share/www/script/jquery.couch.js
index f3547b8d..c92be220 100644
--- a/share/www/script/jquery.couch.js
+++ b/share/www/script/jquery.couch.js
@@ -14,6 +14,24 @@
$.couch = $.couch || {};
$.extend($.couch, {
+ activeTasks: function(options) {
+ options = options || {};
+ $.ajax({
+ type: "GET", url: "/_active_tasks", dataType: "json",
+ complete: function(req) {
+ var resp = $.httpData(req, "json");
+ if (req.status == 200) {
+ if (options.success) options.success(resp);
+ } else if (options.error) {
+ options.error(req.status, resp.error, resp.reason);
+ } else {
+ alert("Active task status could not be retrieved: " +
+ resp.reason);
+ }
+ }
+ });
+ },
+
allDbs: function(options) {
options = options || {};
$.ajax({
diff --git a/share/www/status.html b/share/www/status.html
new file mode 100644
index 00000000..fa2e1d24
--- /dev/null
+++ b/share/www/status.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<!--
+
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed
+under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+CONDITIONS OF ANY KIND, either express or implied. See the License for the
+specific language governing permissions and limitations under the License.
+
+-->
+<html lang="en">
+ <head>
+ <title>Status</title>
+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+ <link rel="stylesheet" href="style/layout.css?0.9.0" type="text/css">
+ <script src="script/json2.js"></script>
+ <script src="script/jquery.js?1.3.1"></script>
+ <script src="script/jquery.cookies.js?0.9.0"></script>
+ <script src="script/jquery.couch.js?0.9.0"></script>
+ <script src="script/futon.js?0.9.0"></script>
+ </head>
+ <body><div id="wrap">
+ <h1>
+ <a href="index.html">Overview</a>
+ <strong>Status</strong>
+ </h1>
+ <div id="content">
+ <div id="interval">
+ <label>Poll interval:
+ <input type="range" min="1" max="30" value="5" size="3">
+ <span class="secs">5</span> second(s)
+ </label>
+ </div>
+ <table id="status" class="listing" cellspacing="0">
+ <caption>Active Tasks</caption>
+ <thead><tr>
+ <th>Type</th>
+ <th>Object</th>
+ <th>PID</th>
+ <th>Status</th>
+ </tr></thead>
+ <tbody class="content"></tbody>
+ </table>
+
+ </div>
+ </div></body>
+ <script>
+ var refreshTimeout = null;
+
+ function refresh() {
+ $.couch.activeTasks({
+ success: function(tasks) {
+ clearTimeout(refreshTimeout);
+ $("#status tbody.content").empty();
+ if (!tasks.length) {
+ $("<tr class='none'><th colspan='4'>No tasks running</th></tr>")
+ .appendTo("#status tbody.content");
+ } else {
+ $.each(tasks, function(idx, task) {
+ $("<tr><th></th><td class='object'></td><td class='pid'></td><td class='status'></td></tr>")
+ .find("th").text(task.type).end()
+ .find("td.object").text(task.task).end()
+ .find("td.pid").text(task.pid).end()
+ .find("td.status").text(task.status).end()
+ .appendTo("#status tbody.content");
+ });
+ }
+ refreshTimeout = setTimeout(refresh,
+ parseInt($("#interval input").val(), 10) * 1000);
+ }
+ });
+ }
+
+ function updateInterval(value) {
+ if (isNaN(value)) {
+ value = 5;
+ $("#interval input").val(value);
+ }
+ $("#interval .secs").text(value);
+ refresh();
+ $.cookies.set("pollinterval", value);
+ }
+
+ $(function() {
+ var slider = $("#interval input");
+ slider.val(parseInt($.cookies.get("pollinterval", "5")) || 5);
+ if (slider[0].type == "range") {
+ slider.bind("input", function() {
+ updateInterval(this.value);
+ });
+ $("#interval .secs").text($("#interval input").val());
+ } else {
+ slider.bind("change", function() {
+ updateInterval(this.value);
+ });
+ $("#interval .secs").hide();
+ }
+ refresh();
+ });
+ </script>
+</html>
diff --git a/share/www/style/layout.css b/share/www/style/layout.css
index 0d63d934..b4d20322 100644
--- a/share/www/style/layout.css
+++ b/share/www/style/layout.css
@@ -517,3 +517,16 @@ form#replicator p.swap button:hover { color: #000; }
form#replicator p.actions { padding: 1px; clear: left; margin: 0;
text-align: right;
}
+
+/* Active tasks */
+
+#interval { color: #666; float: right; font-size: 90%; font-weight: bold;
+ line-height: 16px; padding: 5px;
+}
+#interval input { vertical-align: top; }
+#interval .secs { display: inline-block; width: 2em; text-align: right; }
+
+#status tr.none th { color: #666; font-weight: normal; }
+#status td.object, #status td.pid {
+ font-family: "DejaVu Sans Mono",Monaco,monospace; font-size: 11px;
+}