/home/coolpkct/www/websites/alylela.com/wp-content/plugins/wp-db-scout/assets/js/wds-admin.js
/**
* WP DB Scout Admin JavaScript
*/
// Debug: Script loading
console.log('==========================================');
console.log('WDS Admin: SCRIPT FILE LOADING');
console.log('WDS Admin: Time:', new Date().toISOString());
console.log('WDS Admin: jQuery available:', typeof jQuery !== 'undefined');
console.log('WDS Admin: $ available:', typeof $ !== 'undefined');
(function($) {
'use strict';
console.log('WDS Admin: Inside IIFE, $ is:', typeof $);
console.log('WDS Admin: jQuery version:', typeof $ !== 'undefined' && $.fn ? $.fn.jquery : 'N/A');
// Try multiple ready methods
console.log('WDS Admin: Setting up document ready...');
// Method 1: Standard jQuery ready
$(document).ready(function() {
console.log('==========================================');
console.log('WDS Admin: DOCUMENT READY (Method 1)');
console.log('WDS Admin: Time:', new Date().toISOString());
console.log('WDS Admin: Tabs found:', $('.nav-tab').length);
console.log('WDS Admin: Tab panels found:', $('.wds-tab-panel').length);
// Initialize
console.log('WDS Admin: Calling init functions...');
WDSAdmin.init();
WDSLogExporter.init();
WDSLogger.init();
console.log('WDS Admin: Init functions called');
console.log('==========================================');
});
// Method 2: Alternative ready
jQuery(function($) {
console.log('WDS Admin: DOCUMENT READY (Method 2 - Alternative)');
});
// Method 3: Window load as fallback
$(window).on('load', function() {
console.log('WDS Admin: WINDOW LOAD (Fallback)');
if ($('.nav-tab').length > 0 && !$('.nav-tab').data('initialized')) {
console.log('WDS Admin: Tabs not initialized, doing it now...');
$('.nav-tab').data('initialized', true);
WDSAdmin.init();
}
});
var WDSAdmin = {
init: function() {
console.log('WDSAdmin.init: Starting initialization');
console.log('WDSAdmin.init: jQuery version:', $.fn.jquery);
console.log('WDSAdmin.init: Document ready state:', document.readyState);
this.bindEvents();
this.initTabs();
// Автоматически загружаем информацию о сервере
if ($('#server-info-tab').hasClass('active')) {
console.log('WDSAdmin.init: Server info tab is active');
WDSServerInfo.loadServerInfo();
} else {
console.log('WDSAdmin.init: Server info tab NOT active');
}
console.log('WDSAdmin.init: Initialization complete');
},
bindEvents: function() {
console.log('WDSAdmin.bindEvents: Starting');
// Tab switching
var tabsFound = $('.nav-tab').length;
console.log('WDSAdmin.bindEvents: Found', tabsFound, 'tabs');
$(document).on('click', '.nav-tab', function(e) {
console.log('WDSAdmin.bindEvents: Tab clicked!');
WDSAdmin.switchTab.call(this, e);
});
// Password toggle для полей с паролями
$(document).on('click', '.wds-toggle-password', this.togglePasswordVisibility);
console.log('WDSAdmin.bindEvents: Events bound');
},
initTabs: function() {
console.log('WDSAdmin.initTabs: Starting');
console.log('WDSAdmin.initTabs: Tabs found:', $('.nav-tab').length);
console.log('WDSAdmin.initTabs: Panels found:', $('.wds-tab-panel').length);
console.log('WDSAdmin.initTabs: Active tabs:', $('.nav-tab-active').length);
// Cache tab content to prevent loss
$('.wds-tab-panel').each(function() {
var $panel = $(this);
var panelId = $panel.attr('id');
if (!$panel.data('content-cached')) {
$panel.data('original-content', $panel.html());
$panel.data('content-cached', true);
console.log('WDSAdmin.initTabs: Cached content for', panelId);
}
});
// Set first tab as active if none selected
if (!$('.nav-tab-active').length) {
console.log('WDSAdmin.initTabs: No active tab, setting first as active');
$('.nav-tab:first').addClass('nav-tab-active');
$('.wds-tab-panel:first').addClass('active').show();
} else {
console.log('WDSAdmin.initTabs: Active tab already exists');
// Ensure active panel is visible
var activeTab = $('.nav-tab-active').data('tab');
$('#' + activeTab + '-tab').addClass('active').show();
}
console.log('WDSAdmin.initTabs: Complete');
},
switchTab: function(e) {
console.log('WDSAdmin.switchTab: Called');
console.log('WDSAdmin.switchTab: Event:', e);
console.log('WDSAdmin.switchTab: This:', this);
e.preventDefault();
var $tab = $(this);
var target = $tab.data('tab');
console.log('WDSAdmin.switchTab: Target tab:', target);
console.log('WDSAdmin.switchTab: Looking for panel:', '#' + target + '-tab');
// Update tab states
$('.nav-tab').removeClass('nav-tab-active');
$tab.addClass('nav-tab-active');
console.log('WDSAdmin.switchTab: Tab classes updated');
// Hide all panels first
$('.wds-tab-panel').each(function() {
$(this).removeClass('active').hide();
});
// Show the target panel
var $targetPanel = $('#' + target + '-tab');
console.log('WDSAdmin.switchTab: Target panel found:', $targetPanel.length);
if ($targetPanel.length > 0) {
// Check if content is empty and restore if needed
if ($targetPanel.html().trim() === '' || $targetPanel.html().trim() === '<!-- -->') {
console.warn('WDSAdmin.switchTab: Panel content is empty, restoring...');
var cachedContent = $targetPanel.data('original-content');
if (cachedContent) {
$targetPanel.html(cachedContent);
console.log('WDSAdmin.switchTab: Content restored from cache');
} else {
console.error('WDSAdmin.switchTab: No cached content available!');
// Force reload the page to restore content
$targetPanel.html('<div class="notice notice-warning"><p>Content lost. <a href="#" onclick="location.reload(); return false;">Reload page</a></p></div>');
}
}
$targetPanel.addClass('active').show();
console.log('WDSAdmin.switchTab: Panel shown');
} else {
console.error('WDSAdmin.switchTab: Panel not found!', '#' + target + '-tab');
}
console.log('WDSAdmin.switchTab: Complete');
},
togglePasswordVisibility: function(e) {
e.preventDefault();
var $btn = $(this);
var targetId = $btn.data('target');
var $input = $('#' + targetId);
if ($input.attr('type') === 'password') {
$input.attr('type', 'text');
$btn.find('span').removeClass('dashicons-visibility').addClass('dashicons-hidden');
$btn.text(' Скрыть');
} else {
$input.attr('type', 'password');
$btn.find('span').removeClass('dashicons-hidden').addClass('dashicons-visibility');
$btn.text(' Показать');
}
}
};
// Server Info Handler
var WDSServerInfo = {
loadServerInfo: function() {
// Информация уже загружена через PHP, не нужно дополнительных запросов
console.log('Server info already loaded');
}
};
// Copy to clipboard functionality
var WDSClipboard = {
init: function() {
$(document).on('click', '.wds-copy-btn', this.copyToClipboard);
$(document).on('click', '.wds-copy-all-btn', this.copyAllInfo);
},
copyToClipboard: function(e) {
e.preventDefault();
var $btn = $(this);
var targetId = $btn.data('target');
var $input = $('#' + targetId);
// Save original type
var originalType = $input.attr('type');
// Temporarily make visible if password field
if (originalType === 'password') {
$input.attr('type', 'text');
}
// Select and copy
$input.select();
document.execCommand('copy');
// Restore type
if (originalType === 'password') {
$input.attr('type', 'password');
}
// Visual feedback
var originalText = $btn.html();
$btn.html('<span class="dashicons dashicons-yes"></span> Скопировано!');
setTimeout(function() {
$btn.html(originalText);
}, 2000);
},
copyAllInfo: function(e) {
e.preventDefault();
var $btn = $(this);
// Проверяем, нужно ли включать заголовки
var includeHeaders = $('#wds-include-headers').is(':checked');
// Собираем данные из полей
var serverIp = $('#wds-server-ip').val();
var dbHost = $('#wds-db-host').val();
var dbName = $('#wds-db-name').val();
var dbUser = $('#wds-db-user').val();
var dbPass = $('#wds-db-pass').val();
var dbPrefix = $('#wds-db-prefix').val();
var phpVersion = $('#wds-php-version').text();
var mysqlVersion = $('#wds-mysql-version').text();
var wpVersion = $('#wds-wp-version').text();
var serverSoftware = $('#wds-server-software').text();
var memoryLimit = $('#wds-memory-limit').text();
// Форматируем текст для CSV (через точку с запятой для Excel)
var formattedInfo = "";
// Первая строка - заголовки (названия параметров), если чекбокс отмечен
if (includeHeaders) {
formattedInfo = "IP сервера;Хост БД;Имя БД;Пользователь БД;Пароль БД;Префикс таблиц;Версия PHP;Версия MySQL;Версия WordPress;Сервер;Лимит памяти;Дата и время;Сайт\n";
}
// Вторая строка - значения параметров (всегда копируется)
formattedInfo += serverIp + ";" + dbHost + ";" + dbName + ";" + dbUser + ";" + dbPass + ";" + dbPrefix + ";" +
phpVersion + ";" + mysqlVersion + ";" + wpVersion + ";" + serverSoftware + ";" + memoryLimit + ";" +
new Date().toLocaleString('ru-RU') + ";" + window.location.origin;
// Создаем временный элемент для копирования
var $temp = $('<textarea>');
$('body').append($temp);
$temp.val(formattedInfo).select();
// Копируем в буфер обмена
var copied = false;
try {
copied = document.execCommand('copy');
} catch (ex) {
console.error('Ошибка копирования:', ex);
}
// Удаляем временный элемент
$temp.remove();
// Visual feedback
var originalHtml = $btn.html();
if (copied) {
$btn.removeClass('button-primary').addClass('button-success');
$btn.html('<span class="dashicons dashicons-yes"></span> Вся информация скопирована в буфер обмена!');
} else {
$btn.addClass('button-error');
$btn.html('<span class="dashicons dashicons-warning"></span> Ошибка копирования!');
}
setTimeout(function() {
$btn.removeClass('button-success button-error').addClass('button-primary');
$btn.html(originalHtml);
}, 3000);
}
};
// Initialize clipboard
WDSClipboard.init();
// Log Exporter Handler
var WDSLogExporter = {
init: function() {
this.bindEvents();
},
bindEvents: function() {
$(document).on('click', '#wds-export-session-log', this.exportLog);
},
exportLog: function(e) {
e.preventDefault();
var $btn = $(this);
var $status = $('.wds-export-status');
// Show loading state
$btn.prop('disabled', true);
$btn.html('<span class="dashicons dashicons-update spin"></span> Подготовка логов...');
// Make AJAX request
$.ajax({
url: wds_ajax.ajax_url,
type: 'POST',
data: {
action: 'wds_export_session_log',
nonce: wds_ajax.nonce
},
success: function(response) {
if (response.success) {
// Decode base64 content to binary string
var binaryString = atob(response.data.content);
var filename = response.data.filename;
// Convert binary string to Uint8Array
var bytes = new Uint8Array(binaryString.length);
for (var i = 0; i < binaryString.length; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
// Create blob with UTF-8 BOM and download
var blob = new Blob([bytes], { type: 'text/plain;charset=utf-8' });
var url = window.URL.createObjectURL(blob);
var a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
document.body.removeChild(a);
// Show success message
$status.fadeIn().delay(3000).fadeOut();
// Log to console
console.log('Log exported successfully:', filename);
} else {
alert('Ошибка экспорта: ' + (response.data.message || 'Неизвестная ошибка'));
}
},
error: function(xhr, status, error) {
console.error('Export error:', error);
alert('Ошибка при экспорте логов: ' + error);
},
complete: function() {
// Reset button state
$btn.prop('disabled', false);
$btn.html('<span class="dashicons dashicons-download"></span> Сохранить ошибку');
}
});
}
};
// Frontend Logger
var WDSLogger = {
init: function() {
this.logPageLoad();
this.bindEvents();
},
bindEvents: function() {
var self = this;
// Log tab switches
$(document).on('click', '.nav-tab', function() {
var tab = $(this).data('tab');
self.log('tab_switch', {tab: tab}, 'User switched to tab: ' + tab);
});
// Log button clicks
$(document).on('click', 'button, .button', function(e) {
var $btn = $(this);
var btnText = $btn.text().trim();
var btnId = $btn.attr('id') || 'unknown';
// Don't log the logger button itself
if (btnId === 'wds-export-session-log') return;
self.log('button_click', {
button_id: btnId,
button_text: btnText,
button_class: $btn.attr('class')
}, 'Button clicked: ' + btnText);
});
// Log form submissions
$(document).on('submit', 'form', function(e) {
var formId = $(this).attr('id') || 'unknown';
self.log('form_submit', {form_id: formId}, 'Form submitted: ' + formId);
});
// Log search inputs
$(document).on('change', 'input[type="text"], input[type="search"]', function() {
var $input = $(this);
var inputId = $input.attr('id') || 'unknown';
var inputName = $input.attr('name') || 'unknown';
self.log('input_change', {
input_id: inputId,
input_name: inputName,
value_length: $input.val().length
}, 'Input changed: ' + inputName);
});
},
logPageLoad: function() {
var tab = $('.nav-tab-active').data('tab') || 'unknown';
this.log('page_load', {
tab: tab,
url: window.location.href,
referrer: document.referrer
}, 'WP DB Scout page loaded, tab: ' + tab);
},
log: function(eventType, eventData, message) {
// Send log to server
$.ajax({
url: wds_ajax.ajax_url,
type: 'POST',
data: {
action: 'wds_log_frontend_event',
nonce: wds_ajax.nonce,
event_type: eventType,
event_data: eventData,
message: message
},
success: function(response) {
// Silent logging - no user feedback
console.log('Event logged:', eventType);
},
error: function(xhr, status, error) {
console.error('Failed to log event:', error);
}
});
}
};
// Make available globally
window.WDSAdmin = WDSAdmin;
window.WDSServerInfo = WDSServerInfo;
window.WDSLogExporter = WDSLogExporter;
window.WDSLogger = WDSLogger;
})(jQuery);
console.log('WDS Admin: Script file fully loaded');
console.log('==========================================');