var pmusage_ajaxurl = pmusageData.pmusage_ajaxurl; var pmusageNonce = pmusageData.nonce; var lastMemoryUsage = pmusageData.initialMemoryUsage; var pluginMemoryUsage = {}; document.addEventListener('DOMContentLoaded', function() { var toggleButtons = document.querySelectorAll('.toggle-plugin'); toggleButtons.forEach(function(button) { button.addEventListener('click', function() { var plugin = this.dataset.plugin; var action = this.dataset.action; pmusage_togglePlugin(plugin, action, this); }); }); document.getElementById('refresh-memory').addEventListener('click', function() { pmusage_refreshMemoryUsage(null, null); }); pmusage_displayAllPluginHistory(); }); function pmusage_togglePlugin(plugin, action, button) { var xhr = new XMLHttpRequest(); xhr.open('POST', pmusage_ajaxurl, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { try { var response = JSON.parse(xhr.responseText); if (response.success) { button.textContent = action === 'activate' ? 'Deactivate' : 'Activate'; button.dataset.action = action === 'activate' ? 'deactivate' : 'activate'; button.closest('li').classList.toggle('plugin-active'); button.closest('li').classList.toggle('plugin-inactive'); pmusage_refreshMemoryUsage(plugin, action); pmusage_updateAverageMemory(plugin); } else { console.error('Error toggling plugin:', response.data); alert('Error toggling plugin: ' + response.data); } } catch (e) { console.error('Error parsing JSON:', e); alert('Error parsing server response'); } } else { console.error('AJAX request failed with status:', xhr.status); alert('AJAX request failed'); } } }; xhr.send('action=pmusage_toggle_plugin&plugin=' + encodeURIComponent(plugin) + '&toggle_action=' + action + '&nonce=' + pmusageNonce); } function pmusage_updateMemoryHistory(plugin, action, memoryDifference) { var historyList = document.getElementById('memory-history-list'); var listItem = document.createElement('li'); listItem.textContent = pmusage_createMemoryHistoryEntry(plugin, action, memoryDifference); historyList.insertBefore(listItem, historyList.firstChild); } function pmusage_updatePluginMemoryUsage(plugin, memoryDifference) { var absDifference = Math.abs(memoryDifference); pluginMemoryUsage[plugin] = (pluginMemoryUsage[plugin] || 0) + absDifference; var pluginItem = document.querySelector('.plugin-list li .toggle-plugin[data-plugin="' + plugin + '"]').closest('li'); var memoryBar = pluginItem.querySelector('.plugin-memory-fill'); var memoryText = pluginItem.querySelector('.plugin-memory-text'); var avgMemorySpan = pluginItem.querySelector('.avg-memory'); var percentage = (absDifference / lastMemoryUsage) * 100; percentage = Math.max(0, Math.min(100, percentage)); // Ensure percentage is between 0 and 100 memoryBar.style.width = percentage + '%'; memoryText.textContent = pmusage_formatMemoryDifference(absDifference); // Update average memory var avgMemory = pluginMemoryUsage[plugin] / (1024 * 1024); // Convert to MB avgMemorySpan.textContent = '(' + avgMemory.toFixed(2) + ' MB)'; } function pmusage_createMemoryHistoryEntry(pluginName, action, memoryDifference) { var timestamp = new Date().toLocaleString(); if (action === 'increase_memory') { return `${timestamp} - Memory limit increased to ${memoryDifference}`; } else if (action === 'increase_memory_failed') { return `${timestamp} - Failed to increase memory limit: ${memoryDifference}`; } else if (action === 'increase_memory_error') { return `${timestamp} - Error while trying to increase memory limit: ${memoryDifference}`; } else { return `${timestamp} - ${pluginName} (${action}): ${pmusage_formatMemoryDifference(memoryDifference)}`; } } function pmusage_formatMemoryDifference(diffBytes) { var absValue = Math.abs(diffBytes); var sign = diffBytes >= 0 ? '+' : '-'; var mbValue = absValue / (1024 * 1024); // Convert to MB return `${sign}${mbValue.toFixed(2)} MB`; } function pmusage_refreshMemoryUsage(plugin, action) { var refreshButton = document.getElementById('refresh-memory'); refreshButton.textContent = 'Refreshing...'; refreshButton.disabled = true; var xhr = new XMLHttpRequest(); xhr.open('POST', pmusage_ajaxurl, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { try { var response = JSON.parse(xhr.responseText); if (response.success) { refreshButton.textContent = 'Refresh Memory Usage'; refreshButton.disabled = false; document.getElementById('current-memory').textContent = response.data.current_memory; document.getElementById('memory-bar-fill').style.width = response.data.percentage + '%'; document.getElementById('memory-percentage').textContent = response.data.percentage + '%'; var memoryDifference = response.data.current_memory_bytes - lastMemoryUsage; lastMemoryUsage = response.data.current_memory_bytes; if (plugin && action) { pmusage_updateMemoryHistory(plugin, action, memoryDifference); pmusage_updatePluginMemoryUsage(plugin, memoryDifference); pmusage_fetchAndDisplayPluginHistory(plugin); pmusage_updateAverageMemory(plugin); } } else { console.error('Error refreshing memory usage:', response.data); } } catch (e) { console.error('Error parsing JSON:', e); } } else { console.error('AJAX request failed with status:', xhr.status); } refreshButton.textContent = 'Refresh Memory Usage'; refreshButton.disabled = false; } }; var data = 'action=pmusage_refresh_memory_usage&nonce=' + pmusageNonce; if (plugin && action) { data += '&plugin=' + encodeURIComponent(plugin) + '&toggle_action=' + action + '&previous_memory=' + lastMemoryUsage; } xhr.send(data); } function pmusage_fetchAndDisplayPluginHistory(plugin) { var xhr = new XMLHttpRequest(); xhr.open('POST', pmusage_ajaxurl, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { var response = JSON.parse(xhr.responseText); if (response.success) { pmusage_displayPluginHistory(plugin, response.data); } else { console.error('Error fetching plugin history:', response.data); } } }; xhr.send('action=pmusage_get_plugin_history&plugin=' + encodeURIComponent(plugin) + '&nonce=' + pmusageNonce); } function pmusage_displayPluginHistory(plugin, history) { var pluginItem = document.querySelector('.plugin-list li .toggle-plugin[data-plugin="' + plugin + '"]'); if (!pluginItem) return; var historyContainer = pluginItem.closest('li').querySelector('.plugin-history-container'); if (!historyContainer) { historyContainer = document.createElement('div'); historyContainer.className = 'plugin-history-container'; pluginItem.closest('li').appendChild(historyContainer); } historyContainer.innerHTML = ''; history.slice(0, 3).forEach(function(entry, index) { var historyBar = document.createElement('div'); historyBar.className = 'plugin-history-bar'; var percentage = (Math.abs(entry.memory_change) / lastMemoryUsage) * 100; percentage = Math.max(0, Math.min(100, percentage)); historyBar.style.width = percentage + '%'; historyBar.style.backgroundColor = pmusage_getHistoryColor(index); historyBar.title = pmusage_formatMemoryDifference(entry.memory_change) + ' on ' + entry.timestamp; historyContainer.appendChild(historyBar); }); // Ensure the history container is visible historyContainer.style.display = 'block'; } function pmusage_getHistoryColor(index) { var colors = ['#4CAF50', '#8BC34A', '#CDDC39']; return colors[index] || colors[colors.length - 1]; } function pmusage_displayAllPluginHistory() { var pluginHistory = pmusageData.pluginHistory; for (var plugin in pluginHistory) { if (pluginHistory.hasOwnProperty(plugin)) { pmusage_displayPluginHistory(plugin, pluginHistory[plugin]); } } } function pmusage_updateAverageMemory(plugin) { jQuery.ajax({ url: pmusage_ajaxurl, type: 'POST', data: { action: 'pmusage_update_average_memory', plugin_path: plugin, nonce: pmusageNonce }, success: function(response) { if (response.success) { var avgMemorySpan = jQuery('.plugin-list li .toggle-plugin[data-plugin="' + plugin + '"]') .closest('li') .find('.avg-memory'); avgMemorySpan.text('(' + response.data.avg_memory + ' MB)'); } else { console.error('Error updating average memory:', response.data); } }, error: function(xhr, status, error) { console.error('AJAX request failed:', status, error); } }); } jQuery(document).ready(function($) { $('#increase-memory-limit').on('click', function() { $.ajax({ url: pmusageData.pmusage_ajaxurl, type: 'POST', data: { action: 'pmusage_increase_memory_limit', nonce: pmusageData.nonce }, success: function(response) { if (response.success) { $('#memory-increase-result').text('Memory limit increased to ' + response.data.new_limit); // Add to memory history pmusage_updateMemoryHistory('System', 'increase_memory', response.data.new_limit); // Refresh the memory usage display // Refresh the page after a short delay setTimeout(function() { location.reload(); }, 2500); } else { $('#memory-increase-result').text('Failed to increase memory limit: ' + response.data.message); // Add failure to memory history pmusage_updateMemoryHistory('System', 'increase_memory_failed', response.data.message); } }, error: function(xhr, status, error) { console.error('AJAX request failed:', status, error); // Add error to memory history pmusage_updateMemoryHistory('System', 'increase_memory_error', 'AJAX request failed'); } }); }); });