Rename plugin to wp-seoprostack-plugin, update file structure
This commit is contained in:
364
admin/js/seoprostack-admin.js
Normal file
364
admin/js/seoprostack-admin.js
Normal file
@ -0,0 +1,364 @@
|
||||
/**
|
||||
* SEO Pro Stack Admin JavaScript
|
||||
*/
|
||||
(function($) {
|
||||
'use strict';
|
||||
|
||||
$(document).ready(function() {
|
||||
// Toggle sections
|
||||
$('.seoprostack-toggle-header').on('click', function() {
|
||||
$(this).toggleClass('active');
|
||||
$(this).next('.seoprostack-toggle-settings').slideToggle(300);
|
||||
});
|
||||
|
||||
// Tabs functionality (if not using WP default tabs)
|
||||
$('.seoprostack-tab-nav a').on('click', function(e) {
|
||||
e.preventDefault();
|
||||
var targetTab = $(this).attr('href').substring(1);
|
||||
|
||||
// Update active tab
|
||||
$('.seoprostack-tab-nav a').removeClass('active');
|
||||
$(this).addClass('active');
|
||||
|
||||
// Show target tab content
|
||||
$('.seoprostack-tab-content').hide();
|
||||
$('#' + targetTab).show();
|
||||
|
||||
// Update URL without refreshing
|
||||
if (history.pushState) {
|
||||
var newUrl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?page=seoprostack&tab=' + targetTab;
|
||||
window.history.pushState({path: newUrl}, '', newUrl);
|
||||
}
|
||||
});
|
||||
|
||||
// Pro Plugins Tab
|
||||
if ($('#pro-plugins').length) {
|
||||
// Category filter
|
||||
$('.seoprostack-category-filter a').on('click', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var category = $(this).data('category');
|
||||
|
||||
// Update active filter
|
||||
$('.seoprostack-category-filter a').removeClass('active');
|
||||
$(this).addClass('active');
|
||||
|
||||
// Show loading
|
||||
$('#seoprostack-plugins-grid').addClass('loading');
|
||||
|
||||
// Load plugins
|
||||
$.ajax({
|
||||
url: seoProStack.ajaxurl,
|
||||
type: 'POST',
|
||||
data: {
|
||||
action: 'seoprostack_get_pro_plugins',
|
||||
category: category,
|
||||
nonce: seoProStack.nonce
|
||||
},
|
||||
success: function(response) {
|
||||
$('#seoprostack-plugins-grid').removeClass('loading');
|
||||
|
||||
if (response.success) {
|
||||
renderPlugins(response.data.plugins);
|
||||
} else {
|
||||
$('#seoprostack-plugins-grid').html('<div class="seoprostack-notice seoprostack-notice-error">' + response.data.message + '</div>');
|
||||
}
|
||||
},
|
||||
error: function() {
|
||||
$('#seoprostack-plugins-grid').removeClass('loading');
|
||||
$('#seoprostack-plugins-grid').html('<div class="seoprostack-notice seoprostack-notice-error">Error connecting to server</div>');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Activate plugin
|
||||
$(document).on('click', '.seoprostack-activate-plugin', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var $button = $(this);
|
||||
var plugin = $button.data('plugin');
|
||||
var $card = $button.closest('.seoprostack-plugin-card');
|
||||
|
||||
// Show loading
|
||||
$button.prop('disabled', true).text('Activating...');
|
||||
|
||||
// Send activation request
|
||||
$.ajax({
|
||||
url: seoProStack.ajaxurl,
|
||||
type: 'POST',
|
||||
data: {
|
||||
action: 'seoprostack_activate_plugin',
|
||||
plugin: plugin,
|
||||
nonce: seoProStack.nonce
|
||||
},
|
||||
success: function(response) {
|
||||
if (response.success) {
|
||||
// Update UI
|
||||
$button.text('Activated').addClass('button-disabled');
|
||||
$card.find('.plugin-status').removeClass('not-installed installed').addClass('active').text('Active');
|
||||
} else {
|
||||
$button.prop('disabled', false).text('Activate');
|
||||
alert(response.data.message);
|
||||
}
|
||||
},
|
||||
error: function() {
|
||||
$button.prop('disabled', false).text('Activate');
|
||||
alert('Error connecting to server');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Render plugins
|
||||
function renderPlugins(plugins) {
|
||||
var html = '';
|
||||
|
||||
if (plugins.length === 0) {
|
||||
html = '<div class="seoprostack-notice seoprostack-notice-info">No plugins found in this category</div>';
|
||||
} else {
|
||||
plugins.forEach(function(plugin) {
|
||||
var statusClass = plugin.active ? 'active' : (plugin.status === 'installed' ? 'installed' : 'not-installed');
|
||||
var statusText = plugin.active ? 'Active' : (plugin.status === 'installed' ? 'Installed' : 'Not Installed');
|
||||
var buttonText = plugin.active ? 'Activated' : 'Activate';
|
||||
var buttonDisabled = plugin.active ? ' button-disabled' : '';
|
||||
|
||||
html += '<div class="seoprostack-plugin-card">';
|
||||
html += '<div class="seoprostack-plugin-card-header">';
|
||||
html += '<span class="plugin-status ' + statusClass + '">' + statusText + '</span>';
|
||||
html += '</div>';
|
||||
html += '<div class="seoprostack-plugin-card-content">';
|
||||
html += '<h3>' + plugin.name + ' <span class="version">v' + plugin.version + '</span></h3>';
|
||||
html += '<p>' + plugin.description + '</p>';
|
||||
html += '<div class="seoprostack-plugin-card-footer">';
|
||||
html += '<a href="' + plugin.url + '" class="button button-secondary" target="_blank">View Details</a>';
|
||||
|
||||
if (!plugin.active) {
|
||||
html += '<button class="button button-primary seoprostack-activate-plugin' + buttonDisabled + '" data-plugin="' + plugin.path + '">' + buttonText + '</button>';
|
||||
} else {
|
||||
html += '<button class="button button-primary' + buttonDisabled + '">' + buttonText + '</button>';
|
||||
}
|
||||
|
||||
html += '</div>';
|
||||
html += '</div>';
|
||||
html += '</div>';
|
||||
});
|
||||
}
|
||||
|
||||
$('#seoprostack-plugins-grid').html(html);
|
||||
}
|
||||
|
||||
// Load initial plugins
|
||||
$('.seoprostack-category-filter a.active').trigger('click');
|
||||
}
|
||||
|
||||
// Advanced Tab Form
|
||||
if ($('#seoprostack-advanced-settings-form').length) {
|
||||
$('#seoprostack-advanced-settings-form').on('submit', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var $form = $(this);
|
||||
var $button = $('#seoprostack-save-advanced-settings');
|
||||
var $spinner = $button.next('.spinner');
|
||||
var $response = $('#advanced-settings-response');
|
||||
|
||||
// Show loading
|
||||
$button.prop('disabled', true);
|
||||
$spinner.css('visibility', 'visible');
|
||||
|
||||
// Get form data
|
||||
var formData = $form.serializeArray();
|
||||
var data = {
|
||||
action: 'seoprostack_save_advanced_settings',
|
||||
nonce: seoProStack.nonce
|
||||
};
|
||||
|
||||
// Convert form data to proper format
|
||||
$.each(formData, function(i, field) {
|
||||
data[field.name] = field.value;
|
||||
});
|
||||
|
||||
// Add checkbox fields that might not be in formData
|
||||
$form.find('input[type="checkbox"]').each(function() {
|
||||
var name = $(this).attr('name');
|
||||
if (data[name] === undefined) {
|
||||
data[name] = 'no';
|
||||
}
|
||||
});
|
||||
|
||||
// Send AJAX request
|
||||
$.post(seoProStack.ajaxurl, data, function(response) {
|
||||
// Hide loading
|
||||
$button.prop('disabled', false);
|
||||
$spinner.css('visibility', 'hidden');
|
||||
|
||||
// Show response
|
||||
if (response.success) {
|
||||
$response.html('<div class="seoprostack-notice seoprostack-notice-success">' + response.data.message + '</div>');
|
||||
} else {
|
||||
$response.html('<div class="seoprostack-notice seoprostack-notice-error">' + response.data.message + '</div>');
|
||||
}
|
||||
|
||||
// Hide response after delay
|
||||
setTimeout(function() {
|
||||
$response.find('.seoprostack-notice').fadeOut(500, function() {
|
||||
$(this).remove();
|
||||
});
|
||||
}, 3000);
|
||||
}).fail(function() {
|
||||
// Hide loading
|
||||
$button.prop('disabled', false);
|
||||
$spinner.css('visibility', 'hidden');
|
||||
|
||||
// Show error
|
||||
$response.html('<div class="seoprostack-notice seoprostack-notice-error">Error connecting to server</div>');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Tools Tab
|
||||
if ($('#tools').length) {
|
||||
// Database Optimization
|
||||
$('#seoprostack-optimize-db').on('click', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var $button = $(this);
|
||||
var $spinner = $button.next('.spinner');
|
||||
var $response = $('#db-optimize-response');
|
||||
|
||||
// Show loading
|
||||
$button.prop('disabled', true);
|
||||
$spinner.css('visibility', 'visible');
|
||||
|
||||
// Send AJAX request
|
||||
$.ajax({
|
||||
url: seoProStack.ajaxurl,
|
||||
type: 'POST',
|
||||
data: {
|
||||
action: 'seoprostack_optimize_database',
|
||||
nonce: seoProStack.nonce
|
||||
},
|
||||
success: function(response) {
|
||||
// Hide loading
|
||||
$button.prop('disabled', false);
|
||||
$spinner.css('visibility', 'hidden');
|
||||
|
||||
// Show response
|
||||
if (response.success) {
|
||||
$response.html('<div class="seoprostack-notice seoprostack-notice-success">' + response.data.message + '</div>');
|
||||
|
||||
// Update stats if provided
|
||||
if (response.data.stats) {
|
||||
updateDbStats(response.data.stats);
|
||||
}
|
||||
} else {
|
||||
$response.html('<div class="seoprostack-notice seoprostack-notice-error">' + response.data.message + '</div>');
|
||||
}
|
||||
|
||||
// Hide response after delay
|
||||
setTimeout(function() {
|
||||
$response.find('.seoprostack-notice').fadeOut(500, function() {
|
||||
$(this).remove();
|
||||
});
|
||||
}, 5000);
|
||||
},
|
||||
error: function() {
|
||||
// Hide loading
|
||||
$button.prop('disabled', false);
|
||||
$spinner.css('visibility', 'hidden');
|
||||
|
||||
// Show error
|
||||
$response.html('<div class="seoprostack-notice seoprostack-notice-error">Error connecting to server</div>');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Function to update database stats
|
||||
function updateDbStats(stats) {
|
||||
if (stats.total_cleaned) {
|
||||
$('#db-total-cleaned').text(stats.total_cleaned);
|
||||
}
|
||||
if (stats.db_size_before) {
|
||||
$('#db-size-before').text(stats.db_size_before);
|
||||
}
|
||||
if (stats.db_size_after) {
|
||||
$('#db-size-after').text(stats.db_size_after);
|
||||
}
|
||||
if (stats.savings_percentage) {
|
||||
$('#db-savings').text(stats.savings_percentage + '%');
|
||||
}
|
||||
}
|
||||
|
||||
// Generate Robots.txt
|
||||
$('#seoprostack-generate-robots').on('click', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var $button = $(this);
|
||||
var $spinner = $button.next('.spinner');
|
||||
var $response = $('#robots-response');
|
||||
var $content = $('#robots-content');
|
||||
|
||||
// Show loading
|
||||
$button.prop('disabled', true);
|
||||
$spinner.css('visibility', 'visible');
|
||||
|
||||
// Send AJAX request
|
||||
$.ajax({
|
||||
url: seoProStack.ajaxurl,
|
||||
type: 'POST',
|
||||
data: {
|
||||
action: 'seoprostack_generate_robots',
|
||||
nonce: seoProStack.nonce
|
||||
},
|
||||
success: function(response) {
|
||||
// Hide loading
|
||||
$button.prop('disabled', false);
|
||||
$spinner.css('visibility', 'hidden');
|
||||
|
||||
// Show response
|
||||
if (response.success) {
|
||||
$response.html('<div class="seoprostack-notice seoprostack-notice-success">' + response.data.message + '</div>');
|
||||
|
||||
// Display robots.txt content
|
||||
if (response.data.content) {
|
||||
$content.val(response.data.content);
|
||||
$content.closest('.seoprostack-setting-row').show();
|
||||
}
|
||||
} else {
|
||||
$response.html('<div class="seoprostack-notice seoprostack-notice-error">' + response.data.message + '</div>');
|
||||
}
|
||||
},
|
||||
error: function() {
|
||||
// Hide loading
|
||||
$button.prop('disabled', false);
|
||||
$spinner.css('visibility', 'hidden');
|
||||
|
||||
// Show error
|
||||
$response.html('<div class="seoprostack-notice seoprostack-notice-error">Error connecting to server</div>');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Copy to Clipboard Functionality
|
||||
$('.seoprostack-copy-to-clipboard').on('click', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var targetId = $(this).data('target');
|
||||
var $target = $('#' + targetId);
|
||||
var $button = $(this);
|
||||
var originalText = $button.text();
|
||||
|
||||
// Copy to clipboard
|
||||
$target.select();
|
||||
document.execCommand('copy');
|
||||
|
||||
// Update button text
|
||||
$button.text('Copied!');
|
||||
|
||||
// Reset button text
|
||||
setTimeout(function() {
|
||||
$button.text(originalText);
|
||||
}, 2000);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
Reference in New Issue
Block a user