fixes for scheduler-webhook plugin

Signed-off-by: Andy Miller <rhuk@mac.com>
This commit is contained in:
Andy Miller
2026-02-22 22:54:43 -05:00
parent a7407ed4de
commit dd4910d678
2 changed files with 17 additions and 90 deletions

View File

@@ -6,99 +6,20 @@
(function() {
'use strict';
// Wait for DOM to be ready
document.addEventListener('DOMContentLoaded', function() {
// Check if we're on the scheduler config page
const healthStatusEl = document.getElementById('scheduler-health-status');
const triggersEl = document.getElementById('scheduler-triggers');
if (!healthStatusEl && !triggersEl) {
return; // Not on scheduler page
}
// Load scheduler status
loadSchedulerStatus();
// Refresh every 30 seconds if page is visible
let refreshInterval = setInterval(function() {
if (!document.hidden) {
loadSchedulerStatus();
}
}, 30000);
// Clean up interval when leaving page
window.addEventListener('beforeunload', function() {
clearInterval(refreshInterval);
});
});
/**
* Load scheduler status via AJAX
*/
function loadSchedulerStatus() {
const healthStatusEl = document.getElementById('scheduler-health-status');
const triggersEl = document.getElementById('scheduler-triggers');
// Get the admin base URL
const adminBase = GravAdmin ? GravAdmin.config.base_url_relative : '/admin';
const nonce = GravAdmin ? GravAdmin.config.admin_nonce : '';
// Make AJAX request
fetch(adminBase + '/scheduler/status', {
method: 'GET',
headers: {
'Accept': 'application/json',
'X-Requested-With': 'XMLHttpRequest',
'Admin-Nonce': nonce
},
credentials: 'same-origin'
})
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
})
.then(data => {
// Update health status
if (healthStatusEl && data.health) {
healthStatusEl.innerHTML = data.health;
healthStatusEl.classList.remove('text-muted');
}
// Update triggers
if (triggersEl && data.triggers) {
triggersEl.innerHTML = data.triggers;
triggersEl.classList.remove('text-muted');
}
})
.catch(error => {
console.error('Error loading scheduler status:', error);
// Show error message
if (healthStatusEl) {
healthStatusEl.innerHTML = '<div class="alert alert-danger">Failed to load status</div>';
}
if (triggersEl) {
triggersEl.innerHTML = '<div class="alert alert-danger">Failed to load triggers</div>';
}
});
}
/**
* Test scheduler webhook
*/
window.testSchedulerWebhook = function() {
const token = document.querySelector('input[name="data[scheduler][modern][webhook][token]"]')?.value;
if (!token) {
alert('Please set a webhook token first');
return;
}
const siteUrl = window.location.origin;
const webhookUrl = siteUrl + '/scheduler/webhook';
const baseUrl = window.schedulerBaseUrl || window.location.origin;
const webhookUrl = baseUrl + '/scheduler/webhook';
fetch(webhookUrl, {
method: 'POST',
headers: {
@@ -118,27 +39,27 @@
alert('Webhook test error: ' + error.message);
});
};
/**
* Generate secure token
*/
window.generateSchedulerToken = function() {
const tokenField = document.querySelector('input[name="data[scheduler][modern][webhook][token]"]');
if (!tokenField) {
return;
}
// Generate random token (32 bytes = 64 hex chars)
const array = new Uint8Array(32);
crypto.getRandomValues(array);
const token = Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');
tokenField.value = token;
// Trigger change event
const event = new Event('change', { bubbles: true });
tokenField.dispatchEvent(event);
};
})();

View File

@@ -6,6 +6,12 @@
{% set user = grav.scheduler.whoami() %}
{% set webhook_enabled = grav.scheduler.isWebhookEnabled() %}
{% set active_triggers = grav.scheduler.getActiveTriggers() %}
{% set health_data = grav.scheduler.getHealthStatus() %}
<script>
window.schedulerHealthData = {{ health_data|json_encode|raw }};
window.schedulerBaseUrl = '{{ grav.base_url_absolute }}';
</script>
{% if active_triggers|length > 0 %}
{# We have at least one active trigger method #}