/** * WP Prometheus Admin JavaScript * * @package WP_Prometheus */ (function($) { 'use strict'; var importFileContent = null; $(document).ready(function() { // License tab handlers. initLicenseHandlers(); // Custom metrics tab handlers. initCustomMetricsHandlers(); // Dashboards tab handlers. initDashboardsHandlers(); // Runtime metrics reset handler. initResetRuntimeHandler(); }); /** * Initialize license tab handlers. */ function initLicenseHandlers() { // Validate license button. $('#wp-prometheus-validate-license').on('click', function(e) { e.preventDefault(); performLicenseAction('wp_prometheus_validate_license', 'Validating...'); }); // Activate license button. $('#wp-prometheus-activate-license').on('click', function(e) { e.preventDefault(); performLicenseAction('wp_prometheus_activate_license', 'Activating...'); }); // Regenerate token button. $('#wp-prometheus-regenerate-token').on('click', function(e) { e.preventDefault(); if (confirm(wpPrometheus.confirmRegenerateToken)) { var newToken = generateToken(32); $('#wp_prometheus_auth_token').val(newToken); } }); } /** * Initialize custom metrics tab handlers. */ function initCustomMetricsHandlers() { var $formContainer = $('#wp-prometheus-metric-form-container'); var $form = $('#wp-prometheus-metric-form'); var $showFormBtn = $('#show-metric-form'); // Show metric form. $showFormBtn.on('click', function() { resetMetricForm(); $formContainer.slideDown(); $(this).hide(); }); // Cancel metric form. $('#cancel-metric-form').on('click', function() { $formContainer.slideUp(); $showFormBtn.show(); // Remove edit parameter from URL. if (window.location.search.indexOf('edit=') > -1) { window.history.pushState({}, '', window.location.pathname + '?page=wp-prometheus&tab=custom'); } }); // Value type toggle. $('input[name="value_type"]').on('change', function() { var valueType = $(this).val(); if (valueType === 'option') { $('#option-config-row').show(); $('#static-values-row').hide(); } else { $('#option-config-row').hide(); $('#static-values-row').show(); } }); // Add label. $('#add-label').on('click', function() { var $container = $('#metric-labels-container'); var labelCount = $container.find('.metric-label-row').length; if (labelCount >= 5) { alert('Maximum 5 labels allowed per metric.'); return; } var $row = $('
' + response.data.message + '
') .show(); // Reload page after successful validation/activation. setTimeout(function() { location.reload(); }, 1500); } else { $message .removeClass('notice-success') .addClass('notice notice-error') .html('' + (response.data.message || 'An error occurred.') + '
') .show(); } }, error: function() { $spinner.removeClass('is-active'); $message .removeClass('notice-success') .addClass('notice notice-error') .html('Connection error. Please try again.
') .show(); } }); } /** * Save custom metric via AJAX. */ function saveCustomMetric() { var $spinner = $('#wp-prometheus-metric-spinner'); var $message = $('#wp-prometheus-metric-message'); var $form = $('#wp-prometheus-metric-form'); $spinner.addClass('is-active'); $message.hide(); var formData = $form.serialize(); formData += '&action=wp_prometheus_save_custom_metric'; formData += '&nonce=' + wpPrometheus.customMetricNonce; $.ajax({ url: wpPrometheus.ajaxUrl, type: 'POST', data: formData, success: function(response) { $spinner.removeClass('is-active'); if (response.success) { $message .removeClass('notice-error') .addClass('notice notice-success') .html('' + response.data.message + '
') .show(); setTimeout(function() { window.location.href = window.location.pathname + '?page=wp-prometheus&tab=custom'; }, 1000); } else { $message .removeClass('notice-success') .addClass('notice notice-error') .html('' + (response.data.message || 'An error occurred.') + '
') .show(); } }, error: function() { $spinner.removeClass('is-active'); $message .removeClass('notice-success') .addClass('notice notice-error') .html('Connection error. Please try again.
') .show(); } }); } /** * Delete custom metric via AJAX. * * @param {string} id Metric ID. */ function deleteCustomMetric(id) { $.ajax({ url: wpPrometheus.ajaxUrl, type: 'POST', data: { action: 'wp_prometheus_delete_custom_metric', nonce: wpPrometheus.customMetricNonce, id: id }, success: function(response) { if (response.success) { $('tr[data-metric-id="' + id + '"]').fadeOut(function() { $(this).remove(); // Check if table is empty. if ($('.wp-prometheus-custom-metrics tbody tr').length === 0) { location.reload(); } }); } else { alert(response.data.message || 'An error occurred.'); } }, error: function() { alert('Connection error. Please try again.'); } }); } /** * Export metrics via AJAX. */ function exportMetrics() { $.ajax({ url: wpPrometheus.ajaxUrl, type: 'POST', data: { action: 'wp_prometheus_export_metrics', nonce: wpPrometheus.exportNonce }, success: function(response) { if (response.success) { downloadFile(response.data.json, response.data.filename, 'application/json'); } else { alert(response.data.message || 'An error occurred.'); } }, error: function() { alert('Connection error. Please try again.'); } }); } /** * Import metrics via AJAX. * * @param {string} json JSON content. * @param {string} mode Import mode. */ function importMetrics(json, mode) { var $spinner = $('#wp-prometheus-import-spinner'); var $message = $('#wp-prometheus-import-message'); $spinner.addClass('is-active'); $message.hide(); $.ajax({ url: wpPrometheus.ajaxUrl, type: 'POST', data: { action: 'wp_prometheus_import_metrics', nonce: wpPrometheus.importNonce, json: json, mode: mode }, success: function(response) { $spinner.removeClass('is-active'); if (response.success) { $message .removeClass('notice-error') .addClass('notice notice-success') .html('' + response.data.message + '
') .show(); $('#import-options').slideUp(); $('#import-metrics-file').val(''); importFileContent = null; setTimeout(function() { location.reload(); }, 1500); } else { $message .removeClass('notice-success') .addClass('notice notice-error') .html('' + (response.data.message || 'An error occurred.') + '
') .show(); } }, error: function() { $spinner.removeClass('is-active'); $message .removeClass('notice-success') .addClass('notice notice-error') .html('Connection error. Please try again.
') .show(); } }); } /** * Download dashboard via AJAX. * * @param {string} slug Dashboard slug. */ function downloadDashboard(slug) { $.ajax({ url: wpPrometheus.ajaxUrl, type: 'POST', data: { action: 'wp_prometheus_download_dashboard', nonce: wpPrometheus.dashboardNonce, slug: slug }, success: function(response) { if (response.success) { downloadFile(response.data.json, response.data.filename, 'application/json'); } else { alert(response.data.message || 'An error occurred.'); } }, error: function() { alert('Connection error. Please try again.'); } }); } /** * Reset runtime metrics via AJAX. */ function resetRuntimeMetrics() { var $spinner = $('#wp-prometheus-reset-spinner'); var $message = $('#wp-prometheus-reset-message'); $spinner.addClass('is-active'); $message.hide(); $.ajax({ url: wpPrometheus.ajaxUrl, type: 'POST', data: { action: 'wp_prometheus_reset_runtime_metrics', nonce: wpPrometheus.resetRuntimeNonce }, success: function(response) { $spinner.removeClass('is-active'); if (response.success) { $message .removeClass('notice-error') .addClass('notice notice-success') .html('' + response.data.message + '
') .show(); } else { $message .removeClass('notice-success') .addClass('notice notice-error') .html('' + (response.data.message || 'An error occurred.') + '
') .show(); } }, error: function() { $spinner.removeClass('is-active'); $message .removeClass('notice-success') .addClass('notice notice-error') .html('Connection error. Please try again.
') .show(); } }); } /** * Reset the metric form to default state. */ function resetMetricForm() { var $form = $('#wp-prometheus-metric-form'); $form[0].reset(); $('#metric-id').val(''); $('#wp-prometheus-form-title').text('Add New Metric'); $('#option-config-row').hide(); $('#static-values-row').show(); $('#wp-prometheus-metric-message').hide(); // Reset labels to single empty row. $('#metric-labels-container').html( '