forked from GithubBackups/healthchecks
Hook up buttons in the log page.
This commit is contained in:
parent
ea8e08acd2
commit
458c4cfeeb
@ -208,6 +208,9 @@ def update_name(request, code):
|
|||||||
check.tags = form.cleaned_data["tags"]
|
check.tags = form.cleaned_data["tags"]
|
||||||
check.save()
|
check.save()
|
||||||
|
|
||||||
|
if request.META.get("HTTP_REFERER", "").endswith("/log/"):
|
||||||
|
return redirect("hc-log", code)
|
||||||
|
|
||||||
return redirect("hc-checks")
|
return redirect("hc-checks")
|
||||||
|
|
||||||
|
|
||||||
@ -241,6 +244,10 @@ def update_timeout(request, code):
|
|||||||
check.alert_after = check.get_alert_after()
|
check.alert_after = check.get_alert_after()
|
||||||
|
|
||||||
check.save()
|
check.save()
|
||||||
|
|
||||||
|
if request.META.get("HTTP_REFERER", "").endswith("/log/"):
|
||||||
|
return redirect("hc-log", code)
|
||||||
|
|
||||||
return redirect("hc-checks")
|
return redirect("hc-checks")
|
||||||
|
|
||||||
|
|
||||||
@ -298,6 +305,9 @@ def pause(request, code):
|
|||||||
check.status = "paused"
|
check.status = "paused"
|
||||||
check.save()
|
check.save()
|
||||||
|
|
||||||
|
if request.META.get("HTTP_REFERER", "").endswith("/log/"):
|
||||||
|
return redirect("hc-log", code)
|
||||||
|
|
||||||
return redirect("hc-checks")
|
return redirect("hc-checks")
|
||||||
|
|
||||||
|
|
||||||
@ -340,6 +350,7 @@ def log(request, code):
|
|||||||
channels = list(channels.order_by("created"))
|
channels = list(channels.order_by("created"))
|
||||||
|
|
||||||
ctx = {
|
ctx = {
|
||||||
|
"page": "log",
|
||||||
"check": check,
|
"check": check,
|
||||||
"ping_endpoint": settings.PING_ENDPOINT,
|
"ping_endpoint": settings.PING_ENDPOINT,
|
||||||
"channels": channels,
|
"channels": channels,
|
||||||
|
@ -52,7 +52,7 @@ body {
|
|||||||
font-size: small;
|
font-size: small;
|
||||||
}
|
}
|
||||||
|
|
||||||
.page-checks .container-fluid {
|
.page-checks .container-fluid, .page-log .container-fluid {
|
||||||
/* Fluid below 1320px, but max width capped to 1320px ... */
|
/* Fluid below 1320px, but max width capped to 1320px ... */
|
||||||
max-width: 1320px;
|
max-width: 1320px;
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,10 @@
|
|||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.details-block .copy-btn {
|
||||||
|
width: 90px;
|
||||||
|
}
|
||||||
|
|
||||||
.details-block code {
|
.details-block code {
|
||||||
display: block;
|
display: block;
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
@ -30,6 +34,9 @@
|
|||||||
background: #f5f5f5;
|
background: #f5f5f5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.details-block form {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
#details-status td {
|
#details-status td {
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
@ -73,6 +80,10 @@
|
|||||||
content: " ";
|
content: " ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#log-container {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
#log {
|
#log {
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
|
@ -13,166 +13,6 @@ $(function () {
|
|||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
var MINUTE = {name: "minute", nsecs: 60};
|
|
||||||
var HOUR = {name: "hour", nsecs: MINUTE.nsecs * 60};
|
|
||||||
var DAY = {name: "day", nsecs: HOUR.nsecs * 24};
|
|
||||||
var WEEK = {name: "week", nsecs: DAY.nsecs * 7};
|
|
||||||
var UNITS = [WEEK, DAY, HOUR, MINUTE];
|
|
||||||
|
|
||||||
var secsToText = function(total) {
|
|
||||||
var remainingSeconds = Math.floor(total);
|
|
||||||
var result = "";
|
|
||||||
for (var i=0, unit; unit=UNITS[i]; i++) {
|
|
||||||
if (unit === WEEK && remainingSeconds % unit.nsecs != 0) {
|
|
||||||
// Say "8 days" instead of "1 week 1 day"
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
var count = Math.floor(remainingSeconds / unit.nsecs);
|
|
||||||
remainingSeconds = remainingSeconds % unit.nsecs;
|
|
||||||
|
|
||||||
if (count == 1) {
|
|
||||||
result += "1 " + unit.name + " ";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count > 1) {
|
|
||||||
result += count + " " + unit.name + "s ";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
var periodSlider = document.getElementById("period-slider");
|
|
||||||
noUiSlider.create(periodSlider, {
|
|
||||||
start: [20],
|
|
||||||
connect: "lower",
|
|
||||||
range: {
|
|
||||||
'min': [60, 60],
|
|
||||||
'33%': [3600, 3600],
|
|
||||||
'66%': [86400, 86400],
|
|
||||||
'83%': [604800, 604800],
|
|
||||||
'max': 2592000,
|
|
||||||
},
|
|
||||||
pips: {
|
|
||||||
mode: 'values',
|
|
||||||
values: [60, 1800, 3600, 43200, 86400, 604800, 2592000],
|
|
||||||
density: 4,
|
|
||||||
format: {
|
|
||||||
to: secsToText,
|
|
||||||
from: function() {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
periodSlider.noUiSlider.on("update", function(a, b, value) {
|
|
||||||
var rounded = Math.round(value);
|
|
||||||
$("#period-slider-value").text(secsToText(rounded));
|
|
||||||
$("#update-timeout-timeout").val(rounded);
|
|
||||||
});
|
|
||||||
|
|
||||||
var graceSlider = document.getElementById("grace-slider");
|
|
||||||
noUiSlider.create(graceSlider, {
|
|
||||||
start: [20],
|
|
||||||
connect: "lower",
|
|
||||||
range: {
|
|
||||||
'min': [60, 60],
|
|
||||||
'33%': [3600, 3600],
|
|
||||||
'66%': [86400, 86400],
|
|
||||||
'83%': [604800, 604800],
|
|
||||||
'max': 2592000,
|
|
||||||
},
|
|
||||||
pips: {
|
|
||||||
mode: 'values',
|
|
||||||
values: [60, 1800, 3600, 43200, 86400, 604800, 2592000],
|
|
||||||
density: 4,
|
|
||||||
format: {
|
|
||||||
to: secsToText,
|
|
||||||
from: function() {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
graceSlider.noUiSlider.on("update", function(a, b, value) {
|
|
||||||
var rounded = Math.round(value);
|
|
||||||
$("#grace-slider-value").text(secsToText(rounded));
|
|
||||||
$("#update-timeout-grace").val(rounded);
|
|
||||||
});
|
|
||||||
|
|
||||||
function showSimple() {
|
|
||||||
$("#update-timeout-form").show();
|
|
||||||
$("#update-cron-form").hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
function showCron() {
|
|
||||||
$("#update-timeout-form").hide();
|
|
||||||
$("#update-cron-form").show();
|
|
||||||
}
|
|
||||||
|
|
||||||
var currentPreviewHash = "";
|
|
||||||
function updateCronPreview() {
|
|
||||||
var schedule = $("#schedule").val();
|
|
||||||
var tz = $("#tz").val();
|
|
||||||
var hash = schedule + tz;
|
|
||||||
|
|
||||||
// Don't try preview with empty values, or if values have not changed
|
|
||||||
if (!schedule || !tz || hash == currentPreviewHash)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// OK, we're good
|
|
||||||
currentPreviewHash = hash;
|
|
||||||
$("#cron-preview-title").text("Updating...");
|
|
||||||
|
|
||||||
var token = $('input[name=csrfmiddlewaretoken]').val();
|
|
||||||
$.ajax({
|
|
||||||
url: "/checks/cron_preview/",
|
|
||||||
type: "post",
|
|
||||||
headers: {"X-CSRFToken": token},
|
|
||||||
data: {schedule: schedule, tz: tz},
|
|
||||||
success: function(data) {
|
|
||||||
if (hash != currentPreviewHash) {
|
|
||||||
return; // ignore stale results
|
|
||||||
}
|
|
||||||
|
|
||||||
$("#cron-preview" ).html(data);
|
|
||||||
var haveError = $("#invalid-arguments").size() > 0;
|
|
||||||
$("#update-cron-submit").prop("disabled", haveError);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
$(".timeout-grace").click(function() {
|
|
||||||
var code = $(this).closest("tr.checks-row").attr("id");
|
|
||||||
var url = "/checks/" + code + "/timeout/";
|
|
||||||
|
|
||||||
$("#update-timeout-form").attr("action", url);
|
|
||||||
$("#update-cron-form").attr("action", url);
|
|
||||||
|
|
||||||
// Simple
|
|
||||||
periodSlider.noUiSlider.set(this.dataset.timeout);
|
|
||||||
graceSlider.noUiSlider.set(this.dataset.grace);
|
|
||||||
|
|
||||||
// Cron
|
|
||||||
currentPreviewHash = "";
|
|
||||||
$("#cron-preview").html("<p>Updating...</p>");
|
|
||||||
$("#schedule").val(this.dataset.schedule);
|
|
||||||
document.getElementById("tz").selectize.setValue(this.dataset.tz);
|
|
||||||
var minutes = parseInt(this.dataset.grace / 60);
|
|
||||||
$("#update-timeout-grace-cron").val(minutes);
|
|
||||||
updateCronPreview();
|
|
||||||
|
|
||||||
this.dataset.kind == "simple" ? showSimple() : showCron();
|
|
||||||
$('#update-timeout-modal').modal({"show":true, "backdrop":"static"});
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Wire up events for Timeout/Cron forms
|
|
||||||
$(".kind-simple").click(showSimple);
|
|
||||||
$(".kind-cron").click(showCron);
|
|
||||||
|
|
||||||
$("#schedule").on("keyup", updateCronPreview);
|
|
||||||
$("#tz").selectize({onChange: updateCronPreview});
|
|
||||||
|
|
||||||
$(".check-menu-remove").click(function() {
|
$(".check-menu-remove").click(function() {
|
||||||
var code = $(this).closest("tr.checks-row").attr("id");
|
var code = $(this).closest("tr.checks-row").attr("id");
|
||||||
var url = "/checks/" + code + "/remove/";
|
var url = "/checks/" + code + "/remove/";
|
||||||
|
@ -1,4 +1,48 @@
|
|||||||
$(function () {
|
$(function () {
|
||||||
|
$("#edit-name").click(function() {
|
||||||
|
$('#update-name-modal').modal("show");
|
||||||
|
$("#update-name-input").focus();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#pause").click(function(e) {
|
||||||
|
$("#pause-form").submit();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#ping-now").click(function(e) {
|
||||||
|
var button = this;
|
||||||
|
$.get(this.dataset.url, function() {
|
||||||
|
button.textContent = "Success!";
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#ping-now").mouseout(function(e) {
|
||||||
|
setTimeout(function() {
|
||||||
|
e.target.textContent = "Ping Now!";
|
||||||
|
}, 300);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// Copy to clipboard
|
||||||
|
var clipboard = new Clipboard('button.copy-btn');
|
||||||
|
$("button.copy-btn").mouseout(function(e) {
|
||||||
|
setTimeout(function() {
|
||||||
|
e.target.textContent = e.target.dataset.label;
|
||||||
|
}, 300);
|
||||||
|
});
|
||||||
|
|
||||||
|
clipboard.on('success', function(e) {
|
||||||
|
e.trigger.textContent = "Copied!";
|
||||||
|
e.clearSelection();
|
||||||
|
});
|
||||||
|
|
||||||
|
clipboard.on('error', function(e) {
|
||||||
|
var text = e.trigger.getAttribute("data-clipboard-text");
|
||||||
|
prompt("Press Ctrl+C to select:", text)
|
||||||
|
});
|
||||||
|
|
||||||
$("#log tr.ok").on("click", function() {
|
$("#log tr.ok").on("click", function() {
|
||||||
$("#ping-details-body").text("Updating...");
|
$("#ping-details-body").text("Updating...");
|
||||||
$('#ping-details-modal').modal("show");
|
$('#ping-details-modal').modal("show");
|
||||||
|
192
static/js/update-timeout-modal.js
Normal file
192
static/js/update-timeout-modal.js
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
$(function () {
|
||||||
|
$(".timeout-grace").click(function() {
|
||||||
|
var code = $(this).closest("tr.checks-row").attr("id");
|
||||||
|
if (!code) {
|
||||||
|
code = this.dataset.code;
|
||||||
|
}
|
||||||
|
|
||||||
|
var url = "/checks/" + code + "/timeout/";
|
||||||
|
|
||||||
|
$("#update-timeout-form").attr("action", url);
|
||||||
|
$("#update-cron-form").attr("action", url);
|
||||||
|
|
||||||
|
// Simple
|
||||||
|
periodSlider.noUiSlider.set(this.dataset.timeout);
|
||||||
|
graceSlider.noUiSlider.set(this.dataset.grace);
|
||||||
|
|
||||||
|
// Cron
|
||||||
|
currentPreviewHash = "";
|
||||||
|
$("#cron-preview").html("<p>Updating...</p>");
|
||||||
|
$("#schedule").val(this.dataset.schedule);
|
||||||
|
document.getElementById("tz").selectize.setValue(this.dataset.tz);
|
||||||
|
var minutes = parseInt(this.dataset.grace / 60);
|
||||||
|
$("#update-timeout-grace-cron").val(minutes);
|
||||||
|
updateCronPreview();
|
||||||
|
|
||||||
|
this.dataset.kind == "simple" ? showSimple() : showCron();
|
||||||
|
$('#update-timeout-modal').modal({"show":true, "backdrop":"static"});
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
function init(code, kind, timeout, grace, schedule, tz) {
|
||||||
|
var url = "/checks/" + code + "/timeout/";
|
||||||
|
|
||||||
|
$("#update-timeout-form").attr("action", url);
|
||||||
|
$("#update-cron-form").attr("action", url);
|
||||||
|
|
||||||
|
// Simple
|
||||||
|
periodSlider.noUiSlider.set(timeout);
|
||||||
|
graceSlider.noUiSlider.set(grace);
|
||||||
|
|
||||||
|
// Cron
|
||||||
|
currentPreviewHash = "";
|
||||||
|
$("#cron-preview").html("<p>Updating...</p>");
|
||||||
|
$("#schedule").val(schedule);
|
||||||
|
document.getElementById("tz").selectize.setValue(tz);
|
||||||
|
var minutes = parseInt(grace / 60);
|
||||||
|
$("#update-timeout-grace-cron").val(minutes);
|
||||||
|
updateCronPreview();
|
||||||
|
|
||||||
|
kind == "simple" ? showSimple() : showCron();
|
||||||
|
$('#update-timeout-modal').modal({"show":true, "backdrop":"static"});
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var MINUTE = {name: "minute", nsecs: 60};
|
||||||
|
var HOUR = {name: "hour", nsecs: MINUTE.nsecs * 60};
|
||||||
|
var DAY = {name: "day", nsecs: HOUR.nsecs * 24};
|
||||||
|
var WEEK = {name: "week", nsecs: DAY.nsecs * 7};
|
||||||
|
var UNITS = [WEEK, DAY, HOUR, MINUTE];
|
||||||
|
|
||||||
|
var secsToText = function(total) {
|
||||||
|
var remainingSeconds = Math.floor(total);
|
||||||
|
var result = "";
|
||||||
|
for (var i=0, unit; unit=UNITS[i]; i++) {
|
||||||
|
if (unit === WEEK && remainingSeconds % unit.nsecs != 0) {
|
||||||
|
// Say "8 days" instead of "1 week 1 day"
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
var count = Math.floor(remainingSeconds / unit.nsecs);
|
||||||
|
remainingSeconds = remainingSeconds % unit.nsecs;
|
||||||
|
|
||||||
|
if (count == 1) {
|
||||||
|
result += "1 " + unit.name + " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count > 1) {
|
||||||
|
result += count + " " + unit.name + "s ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
var periodSlider = document.getElementById("period-slider");
|
||||||
|
noUiSlider.create(periodSlider, {
|
||||||
|
start: [20],
|
||||||
|
connect: "lower",
|
||||||
|
range: {
|
||||||
|
'min': [60, 60],
|
||||||
|
'33%': [3600, 3600],
|
||||||
|
'66%': [86400, 86400],
|
||||||
|
'83%': [604800, 604800],
|
||||||
|
'max': 2592000,
|
||||||
|
},
|
||||||
|
pips: {
|
||||||
|
mode: 'values',
|
||||||
|
values: [60, 1800, 3600, 43200, 86400, 604800, 2592000],
|
||||||
|
density: 4,
|
||||||
|
format: {
|
||||||
|
to: secsToText,
|
||||||
|
from: function() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
periodSlider.noUiSlider.on("update", function(a, b, value) {
|
||||||
|
var rounded = Math.round(value);
|
||||||
|
$("#period-slider-value").text(secsToText(rounded));
|
||||||
|
$("#update-timeout-timeout").val(rounded);
|
||||||
|
});
|
||||||
|
|
||||||
|
var graceSlider = document.getElementById("grace-slider");
|
||||||
|
noUiSlider.create(graceSlider, {
|
||||||
|
start: [20],
|
||||||
|
connect: "lower",
|
||||||
|
range: {
|
||||||
|
'min': [60, 60],
|
||||||
|
'33%': [3600, 3600],
|
||||||
|
'66%': [86400, 86400],
|
||||||
|
'83%': [604800, 604800],
|
||||||
|
'max': 2592000,
|
||||||
|
},
|
||||||
|
pips: {
|
||||||
|
mode: 'values',
|
||||||
|
values: [60, 1800, 3600, 43200, 86400, 604800, 2592000],
|
||||||
|
density: 4,
|
||||||
|
format: {
|
||||||
|
to: secsToText,
|
||||||
|
from: function() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
graceSlider.noUiSlider.on("update", function(a, b, value) {
|
||||||
|
var rounded = Math.round(value);
|
||||||
|
$("#grace-slider-value").text(secsToText(rounded));
|
||||||
|
$("#update-timeout-grace").val(rounded);
|
||||||
|
});
|
||||||
|
|
||||||
|
function showSimple() {
|
||||||
|
$("#update-timeout-form").show();
|
||||||
|
$("#update-cron-form").hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
function showCron() {
|
||||||
|
$("#update-timeout-form").hide();
|
||||||
|
$("#update-cron-form").show();
|
||||||
|
}
|
||||||
|
|
||||||
|
var currentPreviewHash = "";
|
||||||
|
function updateCronPreview() {
|
||||||
|
var schedule = $("#schedule").val();
|
||||||
|
var tz = $("#tz").val();
|
||||||
|
var hash = schedule + tz;
|
||||||
|
|
||||||
|
// Don't try preview with empty values, or if values have not changed
|
||||||
|
if (!schedule || !tz || hash == currentPreviewHash)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// OK, we're good
|
||||||
|
currentPreviewHash = hash;
|
||||||
|
$("#cron-preview-title").text("Updating...");
|
||||||
|
|
||||||
|
var token = $('input[name=csrfmiddlewaretoken]').val();
|
||||||
|
$.ajax({
|
||||||
|
url: "/checks/cron_preview/",
|
||||||
|
type: "post",
|
||||||
|
headers: {"X-CSRFToken": token},
|
||||||
|
data: {schedule: schedule, tz: tz},
|
||||||
|
success: function(data) {
|
||||||
|
if (hash != currentPreviewHash) {
|
||||||
|
return; // ignore stale results
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#cron-preview" ).html(data);
|
||||||
|
var haveError = $("#invalid-arguments").size() > 0;
|
||||||
|
$("#update-cron-submit").prop("disabled", haveError);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wire up events for Timeout/Cron forms
|
||||||
|
$(".kind-simple").click(showSimple);
|
||||||
|
$(".kind-cron").click(showCron);
|
||||||
|
|
||||||
|
$("#schedule").on("keyup", updateCronPreview);
|
||||||
|
$("#tz").selectize({onChange: updateCronPreview});
|
||||||
|
|
||||||
|
});
|
@ -45,7 +45,7 @@
|
|||||||
</head>
|
</head>
|
||||||
<body class="page-{{ page }}">
|
<body class="page-{{ page }}">
|
||||||
<nav class="navbar navbar-default">
|
<nav class="navbar navbar-default">
|
||||||
<div class="container{% if page == "checks" %}-fluid{% endif %}">
|
<div class="container{% if page == "checks" or page == "log" %}-fluid{% endif %}">
|
||||||
<div class="navbar-header">
|
<div class="navbar-header">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@ -154,13 +154,13 @@
|
|||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
{% block containers %}
|
{% block containers %}
|
||||||
<div class="container{% if page == "checks" %}-fluid{% endif %}">
|
<div class="container{% if page == "checks" or page == "log" %}-fluid{% endif %}">
|
||||||
{% block content %}{% endblock %}
|
{% block content %}{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
<footer class="footer">
|
<footer class="footer">
|
||||||
<div class="container{% if page == "checks" %}-fluid{% endif %}">
|
<div class="container{% if page == "checks" or page == "log" %}-fluid{% endif %}">
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
Powered by Healthchecks open-source project
|
Powered by Healthchecks open-source project
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
<div id="details-head" class="col-sm-12">
|
<div id="details-head" class="col-sm-12">
|
||||||
<h1>
|
<h1>
|
||||||
{{ check.name_then_code }}
|
{{ check.name_then_code }}
|
||||||
<button class="btn btn-sm btn-default">Edit</button>
|
<button id="edit-name" class="btn btn-sm btn-default">Edit</button>
|
||||||
</h1>
|
</h1>
|
||||||
{% for tag in check.tags_list %}
|
{% for tag in check.tags_list %}
|
||||||
<span class="label label-tag">{{ tag }}</span>
|
<span class="label label-tag">{{ tag }}</span>
|
||||||
@ -19,15 +19,6 @@
|
|||||||
|
|
||||||
|
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<div class="details-block">
|
|
||||||
<h2>Description
|
|
||||||
<small><a href="#">edit</a></small>
|
|
||||||
</h2>
|
|
||||||
<p>This is for monitoring our fancy backup script.</p>
|
|
||||||
<p>The script runs on a $5 VM and sometimes runs out of memory and crashes.
|
|
||||||
If this happens, contact Ed and ask him to restart it.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="details-block">
|
<div class="details-block">
|
||||||
<h2>How To Ping</h2>
|
<h2>How To Ping</h2>
|
||||||
<div>
|
<div>
|
||||||
@ -37,27 +28,55 @@
|
|||||||
<code>{{ check.email }}</code>
|
<code>{{ check.email }}</code>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-right">
|
<div class="text-right">
|
||||||
<button class="btn btn-sm btn-default">Copy URL</button>
|
<button
|
||||||
<button class="btn btn-sm btn-default">Copy Email</button>
|
data-label="Copy URL"
|
||||||
<button class="btn btn-sm btn-default">Usage Examples</button>
|
data-clipboard-text="{{ check.url }}"
|
||||||
|
class="btn btn-sm btn-default copy-btn">Copy URL</button>
|
||||||
|
<button
|
||||||
|
data-label="Copy Email"
|
||||||
|
data-clipboard-text="{{ check.email }}"
|
||||||
|
class="btn btn-sm btn-default copy-btn">Copy Email</button>
|
||||||
|
<button
|
||||||
|
data-toggle="modal"
|
||||||
|
data-target="#show-usage-modal"
|
||||||
|
class="btn btn-sm btn-default">Usage Examples</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="details-block">
|
<div class="details-block">
|
||||||
<h2>Current Status</h2>
|
<h2>Current Status</h2>
|
||||||
<table>
|
<table>
|
||||||
|
{% with check.get_status as status %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<span class="status icon-{{ check.get_status }}"></span>
|
<span class="status icon-{{ status }}"></span>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
This check is down. Last ping was {{ check.last_ping|naturaltime }}.
|
{% if status == "down" %}
|
||||||
|
This check is down. Last ping was {{ check.last_ping|naturaltime }}.
|
||||||
|
{% elif status == "up" %}
|
||||||
|
This check is up. Last ping was {{ check.last_ping|naturaltime }}.
|
||||||
|
{% elif status == "grace" %}
|
||||||
|
This check is late. Last ping was {{ check.last_ping|naturaltime }}.
|
||||||
|
{% elif status == "paused" %}
|
||||||
|
This check is paused.
|
||||||
|
{% elif status == "new" %}
|
||||||
|
This check has never received a ping.
|
||||||
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
{% endwith %}
|
||||||
</table>
|
</table>
|
||||||
<div class="text-right">
|
<div class="text-right">
|
||||||
<button class="btn btn-sm btn-default">Pause</button>
|
<form action="{% url 'hc-pause' check.code %}" method="post">
|
||||||
<button class="btn btn-sm btn-default">Ping Now!</button>
|
{% csrf_token %}
|
||||||
|
<input type="submit" class="btn btn-sm btn-default" value="Pause" />
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<button
|
||||||
|
id="ping-now"
|
||||||
|
data-url="{{ check.url }}"
|
||||||
|
class="btn btn-sm btn-default">Ping Now!</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -84,7 +103,16 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<div class="text-right">
|
<div class="text-right">
|
||||||
<button class="btn btn-sm btn-default">Change Schedule</button>
|
<button
|
||||||
|
id="edit-timeout"
|
||||||
|
class="btn btn-sm btn-default timeout-grace"
|
||||||
|
data-code="{{ check.code }}"
|
||||||
|
data-kind="{{ check.kind }}"
|
||||||
|
data-timeout="{{ check.timeout.total_seconds }}"
|
||||||
|
data-grace="{{ check.grace.total_seconds }}"
|
||||||
|
data-schedule="{{ check.schedule }}"
|
||||||
|
data-tz="{{ check.tz }}">
|
||||||
|
Change Schedule</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -113,7 +141,11 @@
|
|||||||
<h2>Remove</h2>
|
<h2>Remove</h2>
|
||||||
<p>Permanently remove this check from your account.</p>
|
<p>Permanently remove this check from your account.</p>
|
||||||
<div class="text-right">
|
<div class="text-right">
|
||||||
<button id="details-remove-check" class="btn btn-sm btn-default">Remove This Check</button>
|
<button
|
||||||
|
id="details-remove-check"
|
||||||
|
data-toggle="modal"
|
||||||
|
data-target="#remove-check-modal"
|
||||||
|
class="btn btn-sm btn-default">Remove This Check</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -139,7 +171,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<div class="table-responsive">
|
<div id="log-container">
|
||||||
<table class="table" id="log">
|
<table class="table" id="log">
|
||||||
{% for event in events %}
|
{% for event in events %}
|
||||||
{% if event.n %}
|
{% if event.n %}
|
||||||
@ -175,9 +207,6 @@
|
|||||||
{% if event.ua %}
|
{% if event.ua %}
|
||||||
- {{ event.ua }}
|
- {{ event.ua }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if event.body %}
|
|
||||||
- {{ event.body|trunc }}
|
|
||||||
{% endif %}
|
|
||||||
</span>
|
</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
@ -250,18 +279,24 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<form>
|
|
||||||
{% csrf_token %}
|
|
||||||
</form>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{% include "front/update_name_modal.html" %}
|
||||||
|
{% include "front/update_timeout_modal.html" %}
|
||||||
|
{% include "front/show_usage_modal.html" %}
|
||||||
|
{% include "front/remove_check_modal.html" %}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block scripts %}
|
{% block scripts %}
|
||||||
{% compress js %}
|
{% compress js %}
|
||||||
<script src="{% static 'js/jquery-2.1.4.min.js' %}"></script>
|
<script src="{% static 'js/jquery-2.1.4.min.js' %}"></script>
|
||||||
<script src="{% static 'js/bootstrap.min.js' %}"></script>
|
<script src="{% static 'js/bootstrap.min.js' %}"></script>
|
||||||
|
<script src="{% static 'js/clipboard.min.js' %}"></script>
|
||||||
|
<script src="{% static 'js/selectize.min.js' %}"></script>
|
||||||
|
<script src="{% static 'js/nouislider.min.js' %}"></script>
|
||||||
<script src="{% static 'js/moment.min.js' %}"></script>
|
<script src="{% static 'js/moment.min.js' %}"></script>
|
||||||
|
<script src="{% static 'js/update-timeout-modal.js' %}"></script>
|
||||||
<script src="{% static 'js/log.js' %}"></script>
|
<script src="{% static 'js/log.js' %}"></script>
|
||||||
{% endcompress %}
|
{% endcompress %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -45,308 +45,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="update-name-modal" class="modal">
|
{% include "front/update_name_modal.html" %}
|
||||||
<div class="modal-dialog">
|
{% include "front/update_timeout_modal.html" %}
|
||||||
<form id="update-name-form" class="form-horizontal" method="post">
|
{% include "front/remove_check_modal.html" %}
|
||||||
{% csrf_token %}
|
{% include "front/show_usage_modal.html" %}
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<button type="button" class="close" data-dismiss="modal">×</button>
|
|
||||||
<h4 class="update-timeout-title">Name and Tags</h4>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="update-name-input" class="col-sm-2 control-label">
|
|
||||||
Name
|
|
||||||
</label>
|
|
||||||
<div class="col-sm-9">
|
|
||||||
<input
|
|
||||||
id="update-name-input"
|
|
||||||
name="name"
|
|
||||||
type="text"
|
|
||||||
value="---"
|
|
||||||
placeholder="unnamed"
|
|
||||||
class="input-name form-control" />
|
|
||||||
|
|
||||||
<span class="help-block">
|
|
||||||
Give this check a human-friendly name,
|
|
||||||
so you can easily recognize it later.
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="update-tags-input" class="col-sm-2 control-label">
|
|
||||||
Tags
|
|
||||||
</label>
|
|
||||||
<div class="col-sm-9">
|
|
||||||
<input
|
|
||||||
id="update-tags-input"
|
|
||||||
name="tags"
|
|
||||||
type="text"
|
|
||||||
value=""
|
|
||||||
placeholder="production www"
|
|
||||||
class="form-control" />
|
|
||||||
|
|
||||||
<span class="help-block">
|
|
||||||
Use tags for easy filtering and for status badges.
|
|
||||||
Separate multiple tags with spaces.
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="modal-footer">
|
|
||||||
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
|
||||||
<button type="submit" class="btn btn-primary">Save</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="update-timeout-modal" class="modal">
|
|
||||||
<div class="modal-dialog">
|
|
||||||
<div class="modal-content">
|
|
||||||
<form id="update-timeout-form" method="post">
|
|
||||||
{% csrf_token %}
|
|
||||||
<input type="hidden" name="kind" value="simple" />
|
|
||||||
<input type="hidden" name="timeout" id="update-timeout-timeout" />
|
|
||||||
<input type="hidden" name="grace" id="update-timeout-grace" />
|
|
||||||
|
|
||||||
<div class="modal-body">
|
|
||||||
<div class="update-timeout-info text-center">
|
|
||||||
<span
|
|
||||||
class="update-timeout-label"
|
|
||||||
data-toggle="tooltip"
|
|
||||||
title="Expected time between pings.">
|
|
||||||
Period
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
id="period-slider-value"
|
|
||||||
class="update-timeout-value">
|
|
||||||
1 day
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="period-slider"></div>
|
|
||||||
|
|
||||||
<div class="update-timeout-info text-center">
|
|
||||||
<span
|
|
||||||
class="update-timeout-label"
|
|
||||||
data-toggle="tooltip"
|
|
||||||
title="When check is late, how long to wait until an alert is sent">
|
|
||||||
Grace Time
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
id="grace-slider-value"
|
|
||||||
class="update-timeout-value">
|
|
||||||
1 day
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="grace-slider"></div>
|
|
||||||
|
|
||||||
<div class="update-timeout-terms">
|
|
||||||
<p>
|
|
||||||
<span>Period</span>
|
|
||||||
Expected time between pings.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<span>Grace Time</span>
|
|
||||||
When a check is late, how long to wait until an alert is sent.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="modal-footer">
|
|
||||||
<div class="btn-group pull-left">
|
|
||||||
<label class="btn btn-default kind-simple active">Simple</label>
|
|
||||||
<label class="btn btn-default kind-cron">Cron</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
|
||||||
<button type="submit" class="btn btn-primary">Save</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<form id="update-cron-form" method="post">
|
|
||||||
{% csrf_token %}
|
|
||||||
<input type="hidden" name="kind" value="cron" />
|
|
||||||
<div class="modal-body">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-4">
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="schedule">Cron Expression</label>
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
class="form-control"
|
|
||||||
id="schedule"
|
|
||||||
name="schedule"
|
|
||||||
placeholder="* * * * *">
|
|
||||||
<div id="schedule-hint">
|
|
||||||
m h dom mon dow
|
|
||||||
<a href="{% url 'hc-docs-cron' %}" target="_blank">(cheatsheet)</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-4">
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="tz">Server's Timezone</label>
|
|
||||||
<br />
|
|
||||||
<select id="tz" name="tz" class="form-control">
|
|
||||||
<option>UTC</option>
|
|
||||||
{% for tz in timezones %}
|
|
||||||
<option>{{ tz }}</option>{% endfor %}
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-4">
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="cron-grace">Grace Time</label>
|
|
||||||
<div class="input-group">
|
|
||||||
<input
|
|
||||||
type="number"
|
|
||||||
min="1"
|
|
||||||
max="43200"
|
|
||||||
class="form-control"
|
|
||||||
id="update-timeout-grace-cron"
|
|
||||||
name="grace">
|
|
||||||
<div class="input-group-addon">minutes</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-12">
|
|
||||||
<div id="cron-preview"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="modal-footer">
|
|
||||||
<div class="btn-group pull-left">
|
|
||||||
<label class="btn btn-default kind-simple">Simple</label>
|
|
||||||
<label class="btn btn-default active kind-cron">Cron</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
|
||||||
<button id="update-cron-submit" type="submit" class="btn btn-primary">
|
|
||||||
Save
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="remove-check-modal" class="modal">
|
|
||||||
<div class="modal-dialog">
|
|
||||||
<form id="remove-check-form" method="post">
|
|
||||||
{% csrf_token %}
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<button type="button" class="close" data-dismiss="modal">×</button>
|
|
||||||
<h4 class="remove-check-title">Remove Check <span class="remove-check-name"></span></h4>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<p>You are about to remove check
|
|
||||||
<strong class="remove-check-name">---</strong>.
|
|
||||||
</p>
|
|
||||||
<p>Once it's gone there is no "undo" and you cannot get
|
|
||||||
the old ping URL back.</p>
|
|
||||||
<p>Are you sure?</p>
|
|
||||||
</div>
|
|
||||||
<div class="modal-footer">
|
|
||||||
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
|
||||||
<button type="submit" class="btn btn-danger">Remove</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="show-usage-modal" class="modal">
|
|
||||||
<div class="modal-dialog">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<button type="button" class="close" data-dismiss="modal">×</button>
|
|
||||||
<h4 id="usage-examples-title">Usage Examples</h4>
|
|
||||||
<ul class="nav nav-pills" role="tablist">
|
|
||||||
<li class="active">
|
|
||||||
<a href="#crontab" data-toggle="tab">Crontab</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#bash" data-toggle="tab">Bash</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#python" data-toggle="tab">Python</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#ruby" data-toggle="tab">Ruby</a>
|
|
||||||
</li>
|
|
||||||
<li class="hidden-xs">
|
|
||||||
<a href="#node" data-toggle="tab">Node.js</a>
|
|
||||||
</li>
|
|
||||||
<li class="hidden-xs">
|
|
||||||
<a href="#php" data-toggle="tab">PHP</a>
|
|
||||||
</li>
|
|
||||||
<li class="hidden-xs">
|
|
||||||
<a href="#browser" data-toggle="tab">Browser</a>
|
|
||||||
</li>
|
|
||||||
<li class="hidden-xs">
|
|
||||||
<a href="#powershell" data-toggle="tab">PowerShell</a>
|
|
||||||
</li>
|
|
||||||
<li class="hidden-xs">
|
|
||||||
<a href="#email" data-toggle="tab">Email</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<div class="tab-content">
|
|
||||||
{% with ping_url="<span class='ex'></span>" %}
|
|
||||||
<div role="tabpanel" class="tab-pane active" id="crontab">
|
|
||||||
{% include "front/snippets/crontab.html" %}
|
|
||||||
</div>
|
|
||||||
<div role="tabpanel" class="tab-pane" id="bash">
|
|
||||||
{% include "front/snippets/bash_curl.html" %}
|
|
||||||
{% include "front/snippets/bash_wget.html" %}
|
|
||||||
</div>
|
|
||||||
<div role="tabpanel" class="tab-pane" id="python">
|
|
||||||
{% include "front/snippets/python_urllib2.html" %}
|
|
||||||
{% include "front/snippets/python_requests.html" %}
|
|
||||||
</div>
|
|
||||||
<div role="tabpanel" class="tab-pane" id="ruby">
|
|
||||||
{% include "front/snippets/ruby.html" %}
|
|
||||||
</div>
|
|
||||||
<div role="tabpanel" class="tab-pane" id="node">
|
|
||||||
{% include "front/snippets/node.html" %}
|
|
||||||
</div>
|
|
||||||
<div role="tabpanel" class="tab-pane" id="php">
|
|
||||||
{% include "front/snippets/php.html" %}
|
|
||||||
</div>
|
|
||||||
<div class="tab-pane" id="browser">
|
|
||||||
{% include "front/snippets/browser.html" %}
|
|
||||||
</div>
|
|
||||||
<div class="tab-pane" id="powershell">
|
|
||||||
{% include "front/snippets/powershell.html" %}
|
|
||||||
</div>
|
|
||||||
<div class="tab-pane" id="email">
|
|
||||||
<p>
|
|
||||||
As an alternative to HTTP/HTTPS requests,
|
|
||||||
you can "ping" this check by sending an
|
|
||||||
email message to <code class="em"></code>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
{% endwith %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="modal-footer">
|
|
||||||
<button type="button" class="btn btn-default" data-dismiss="modal">Got It!</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="ping-details-modal" class="modal">
|
<div id="ping-details-modal" class="modal">
|
||||||
<div class="modal-dialog">
|
<div class="modal-dialog">
|
||||||
@ -370,9 +72,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<form id="pause-form" method="post">
|
<form id="pause-form" method="post">{% csrf_token %}</form>
|
||||||
{% csrf_token %}
|
|
||||||
</form>
|
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
@ -384,6 +84,7 @@
|
|||||||
<script src="{% static 'js/nouislider.min.js' %}"></script>
|
<script src="{% static 'js/nouislider.min.js' %}"></script>
|
||||||
<script src="{% static 'js/clipboard.min.js' %}"></script>
|
<script src="{% static 'js/clipboard.min.js' %}"></script>
|
||||||
<script src="{% static 'js/snippet-copy.js' %}"></script>
|
<script src="{% static 'js/snippet-copy.js' %}"></script>
|
||||||
|
<script src="{% static 'js/update-timeout-modal.js' %}"></script>
|
||||||
<script src="{% static 'js/checks.js' %}"></script>
|
<script src="{% static 'js/checks.js' %}"></script>
|
||||||
{% endcompress %}
|
{% endcompress %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
29
templates/front/remove_check_modal.html
Normal file
29
templates/front/remove_check_modal.html
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<div id="remove-check-modal" class="modal">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<form
|
||||||
|
id="remove-check-form"
|
||||||
|
{% if check %}action="{% url 'hc-remove-check' check.code %}"{% endif %}
|
||||||
|
method="post">
|
||||||
|
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal">×</button>
|
||||||
|
<h4 class="remove-check-title">Remove Check <span class="remove-check-name">{{ check.name_then_code }}</span></h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<p>You are about to remove check
|
||||||
|
<strong class="remove-check-name">{{ check.name_then_code }}</strong>.
|
||||||
|
</p>
|
||||||
|
<p>Once it's gone there is no "undo" and you cannot get
|
||||||
|
the old ping URL back.</p>
|
||||||
|
<p>Are you sure?</p>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
||||||
|
<button type="submit" class="btn btn-danger">Remove</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
83
templates/front/show_usage_modal.html
Normal file
83
templates/front/show_usage_modal.html
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
<div id="show-usage-modal" class="modal">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal">×</button>
|
||||||
|
<h4 id="usage-examples-title">Usage Examples</h4>
|
||||||
|
<ul class="nav nav-pills" role="tablist">
|
||||||
|
<li class="active">
|
||||||
|
<a href="#crontab" data-toggle="tab">Crontab</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#bash" data-toggle="tab">Bash</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#python" data-toggle="tab">Python</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#ruby" data-toggle="tab">Ruby</a>
|
||||||
|
</li>
|
||||||
|
<li class="hidden-xs">
|
||||||
|
<a href="#node" data-toggle="tab">Node.js</a>
|
||||||
|
</li>
|
||||||
|
<li class="hidden-xs">
|
||||||
|
<a href="#php" data-toggle="tab">PHP</a>
|
||||||
|
</li>
|
||||||
|
<li class="hidden-xs">
|
||||||
|
<a href="#browser" data-toggle="tab">Browser</a>
|
||||||
|
</li>
|
||||||
|
<li class="hidden-xs">
|
||||||
|
<a href="#powershell" data-toggle="tab">PowerShell</a>
|
||||||
|
</li>
|
||||||
|
<li class="hidden-xs">
|
||||||
|
<a href="#email" data-toggle="tab">Email</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="tab-content">
|
||||||
|
{% with ping_url=check.url|default:'<span class="ex"></span>' %}
|
||||||
|
<div role="tabpanel" class="tab-pane active" id="crontab">
|
||||||
|
{% include "front/snippets/crontab.html" %}
|
||||||
|
</div>
|
||||||
|
<div role="tabpanel" class="tab-pane" id="bash">
|
||||||
|
{% include "front/snippets/bash_curl.html" %}
|
||||||
|
{% include "front/snippets/bash_wget.html" %}
|
||||||
|
</div>
|
||||||
|
<div role="tabpanel" class="tab-pane" id="python">
|
||||||
|
{% include "front/snippets/python_urllib2.html" %}
|
||||||
|
{% include "front/snippets/python_requests.html" %}
|
||||||
|
</div>
|
||||||
|
<div role="tabpanel" class="tab-pane" id="ruby">
|
||||||
|
{% include "front/snippets/ruby.html" %}
|
||||||
|
</div>
|
||||||
|
<div role="tabpanel" class="tab-pane" id="node">
|
||||||
|
{% include "front/snippets/node.html" %}
|
||||||
|
</div>
|
||||||
|
<div role="tabpanel" class="tab-pane" id="php">
|
||||||
|
{% include "front/snippets/php.html" %}
|
||||||
|
</div>
|
||||||
|
<div class="tab-pane" id="browser">
|
||||||
|
{% include "front/snippets/browser.html" %}
|
||||||
|
</div>
|
||||||
|
<div class="tab-pane" id="powershell">
|
||||||
|
{% include "front/snippets/powershell.html" %}
|
||||||
|
</div>
|
||||||
|
<div class="tab-pane" id="email">
|
||||||
|
<p>
|
||||||
|
As an alternative to HTTP/HTTPS requests,
|
||||||
|
you can "ping" this check by sending an
|
||||||
|
email message to
|
||||||
|
<code class="em">{{ check.email }}</code>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{% endwith %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">Got It!</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
62
templates/front/update_name_modal.html
Normal file
62
templates/front/update_name_modal.html
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
<div id="update-name-modal" class="modal">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<form
|
||||||
|
id="update-name-form"
|
||||||
|
{% if check %}action="{% url 'hc-update-name' check.code %}"{% endif %}
|
||||||
|
class="form-horizontal"
|
||||||
|
method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal">×</button>
|
||||||
|
<h4 class="update-timeout-title">Name and Tags</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="update-name-input" class="col-sm-2 control-label">
|
||||||
|
Name
|
||||||
|
</label>
|
||||||
|
<div class="col-sm-9">
|
||||||
|
<input
|
||||||
|
id="update-name-input"
|
||||||
|
name="name"
|
||||||
|
type="text"
|
||||||
|
value="{{ check.name }}"
|
||||||
|
placeholder="unnamed"
|
||||||
|
class="input-name form-control" />
|
||||||
|
|
||||||
|
<span class="help-block">
|
||||||
|
Give this check a human-friendly name,
|
||||||
|
so you can easily recognize it later.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="update-tags-input" class="col-sm-2 control-label">
|
||||||
|
Tags
|
||||||
|
</label>
|
||||||
|
<div class="col-sm-9">
|
||||||
|
<input
|
||||||
|
id="update-tags-input"
|
||||||
|
name="tags"
|
||||||
|
type="text"
|
||||||
|
value="{{ check.tags }}"
|
||||||
|
placeholder="production www"
|
||||||
|
class="form-control" />
|
||||||
|
|
||||||
|
<span class="help-block">
|
||||||
|
Use tags for easy filtering and for status badges.
|
||||||
|
Separate multiple tags with spaces.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
||||||
|
<button type="submit" class="btn btn-primary">Save</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
134
templates/front/update_timeout_modal.html
Normal file
134
templates/front/update_timeout_modal.html
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
<div id="update-timeout-modal" class="modal">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<form id="update-timeout-form" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type="hidden" name="kind" value="simple" />
|
||||||
|
<input type="hidden" name="timeout" id="update-timeout-timeout" />
|
||||||
|
<input type="hidden" name="grace" id="update-timeout-grace" />
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="update-timeout-info text-center">
|
||||||
|
<span
|
||||||
|
class="update-timeout-label"
|
||||||
|
data-toggle="tooltip"
|
||||||
|
title="Expected time between pings.">
|
||||||
|
Period
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
id="period-slider-value"
|
||||||
|
class="update-timeout-value">
|
||||||
|
1 day
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="period-slider"></div>
|
||||||
|
|
||||||
|
<div class="update-timeout-info text-center">
|
||||||
|
<span
|
||||||
|
class="update-timeout-label"
|
||||||
|
data-toggle="tooltip"
|
||||||
|
title="When check is late, how long to wait until an alert is sent">
|
||||||
|
Grace Time
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
id="grace-slider-value"
|
||||||
|
class="update-timeout-value">
|
||||||
|
1 day
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="grace-slider"></div>
|
||||||
|
|
||||||
|
<div class="update-timeout-terms">
|
||||||
|
<p>
|
||||||
|
<span>Period</span>
|
||||||
|
Expected time between pings.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<span>Grace Time</span>
|
||||||
|
When a check is late, how long to wait until an alert is sent.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-footer">
|
||||||
|
<div class="btn-group pull-left">
|
||||||
|
<label class="btn btn-default kind-simple active">Simple</label>
|
||||||
|
<label class="btn btn-default kind-cron">Cron</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
||||||
|
<button type="submit" class="btn btn-primary">Save</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<form id="update-cron-form" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type="hidden" name="kind" value="cron" />
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="schedule">Cron Expression</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control"
|
||||||
|
id="schedule"
|
||||||
|
name="schedule"
|
||||||
|
placeholder="* * * * *">
|
||||||
|
<div id="schedule-hint">
|
||||||
|
m h dom mon dow
|
||||||
|
<a href="{% url 'hc-docs-cron' %}" target="_blank">(cheatsheet)</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="tz">Server's Timezone</label>
|
||||||
|
<br />
|
||||||
|
<select id="tz" name="tz" class="form-control">
|
||||||
|
<option>UTC</option>
|
||||||
|
{% for tz in timezones %}
|
||||||
|
<option>{{ tz }}</option>{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="cron-grace">Grace Time</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input
|
||||||
|
type="number"
|
||||||
|
min="1"
|
||||||
|
max="43200"
|
||||||
|
class="form-control"
|
||||||
|
id="update-timeout-grace-cron"
|
||||||
|
name="grace">
|
||||||
|
<div class="input-group-addon">minutes</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<div id="cron-preview"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-footer">
|
||||||
|
<div class="btn-group pull-left">
|
||||||
|
<label class="btn btn-default kind-simple">Simple</label>
|
||||||
|
<label class="btn btn-default active kind-cron">Cron</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
||||||
|
<button id="update-cron-submit" type="submit" class="btn btn-primary">
|
||||||
|
Save
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
Loading…
x
Reference in New Issue
Block a user