jQuery(document).ready(function($) {
var migrationSteps = [
'settings',
'clients',
'post_types',
'meta',
'pro_options',
'cleanup'
];
var stepLabels = {
'settings': 'Settings',
'clients': 'Clients',
'post_types': 'Posts',
'meta': 'Meta Data',
'pro_options': 'Pro Options',
'cleanup': 'Cleanup'
};
var currentStep = 0;
var migrationRunning = false;
var migrationLogs = [];
function updateProgress(step, status, message) {
var $step = $('#migration-step-' + step);
$step.removeClass('pending running success error')
.addClass(status);
if (message) {
$step.find('.step-message').text(message);
}
// Update progress bar
var progress = ((currentStep + 1) / migrationSteps.length) * 100;
$('#migration-progress').css('width', progress + '%');
}
function appendLog(message, level) {
var $log = $('#migration-log');
var timestamp = new Date().toLocaleTimeString();
var levelClass = level === 'error' ? 'text-danger' :
level === 'success' ? 'text-success' : 'text-info';
var logEntry = '[' + timestamp + '] ' + message + '\n';
// Store log for copying
migrationLogs.push(logEntry);
$log.append('
' +
'[' + timestamp + '] ' +
'' + message + '' +
'
'
);
// Auto-scroll to bottom
$log.scrollTop($log[0].scrollHeight);
}
function showError(message) {
$('#migration-error').html(message).show();
appendLog(message, 'error');
}
function runMigrationStep() {
if (currentStep >= migrationSteps.length) {
migrationRunning = false;
$('#start-migration').prop('disabled', false).text('Migration Complete');
appendLog('Migration completed successfully', 'success');
return;
}
var step = migrationSteps[currentStep];
updateProgress(step, 'running', 'Running...');
appendLog('Starting ' + stepLabels[step] + ' migration...', 'info');
$.ajax({
url: easyInvoiceMigration.ajaxurl,
type: 'POST',
data: {
action: 'easy_invoice_migration',
nonce: easyInvoiceMigration.nonce,
step: step
},
success: function(response) {
if (response.success) {
var result = response.data;
// Add logs
if (result.log) {
result.log.forEach(function(entry) {
appendLog(entry.message, entry.level);
});
}
if (result.success) {
updateProgress(step, 'success', result.message);
currentStep++;
runMigrationStep();
} else {
updateProgress(step, 'error', result.message);
showError(stepLabels[step] + ' migration failed: ' + result.message);
migrationRunning = false;
$('#start-migration').prop('disabled', false).text('Retry Migration');
}
} else {
updateProgress(step, 'error', response.data.message);
showError(stepLabels[step] + ' migration failed: ' + response.data.message);
migrationRunning = false;
$('#start-migration').prop('disabled', false).text('Retry Migration');
}
},
error: function(xhr, status, error) {
var errorMessage = error;
try {
var response = JSON.parse(xhr.responseText);
if (response.message) {
errorMessage = response.message;
}
} catch (e) {}
updateProgress(step, 'error', 'AJAX error: ' + errorMessage);
showError(stepLabels[step] + ' migration failed: ' + errorMessage);
migrationRunning = false;
$('#start-migration').prop('disabled', false).text('Retry Migration');
// Log the full error details
console.error('Migration AJAX error:', {
status: status,
error: error,
xhr: xhr
});
}
});
}
$('#start-migration').click(function(e) {
e.preventDefault();
if (migrationRunning) {
return;
}
// Reset UI
migrationRunning = true;
currentStep = 0;
migrationLogs = [];
$('#migration-error').hide();
$('#migration-log').empty();
$('.migration-step').removeClass('success error').addClass('pending');
$(this).prop('disabled', true).text('Migration Running...');
// Get migration counts first
$.ajax({
url: easyInvoiceMigration.ajaxurl,
type: 'GET',
data: {
action: 'easy_invoice_migration_counts',
nonce: easyInvoiceMigration.nonce
},
success: function(response) {
if (response.success) {
var counts = response.data;
appendLog('Found items to migrate:', 'info');
appendLog('- Invoices: ' + counts.invoices, 'info');
appendLog('- Quotes: ' + counts.quotes, 'info');
appendLog('- Payments: ' + counts.payments, 'info');
appendLog('- Settings: ' + counts.options, 'info');
// Show detailed counts if available
if (counts.details) {
appendLog('\nDetailed counts:', 'info');
appendLog('- Invoice meta entries: ' + counts.details.invoice_meta_count, 'info');
appendLog('- Quote meta entries: ' + counts.details.quote_meta_count, 'info');
appendLog('- Payment meta entries: ' + counts.details.payment_meta_count, 'info');
}
runMigrationStep();
} else {
showError('Failed to get migration counts: ' + (response.data ? response.data.message : 'Unknown error'));
migrationRunning = false;
$('#start-migration').prop('disabled', false).text('Start Migration');
}
},
error: function(xhr, status, error) {
var errorMessage = error;
try {
var response = JSON.parse(xhr.responseText);
if (response.message) {
errorMessage = response.message;
}
} catch (e) {}
showError('Failed to get migration counts: ' + errorMessage);
migrationRunning = false;
$('#start-migration').prop('disabled', false).text('Start Migration');
// Log the full error details
console.error('Migration counts AJAX error:', {
status: status,
error: error,
xhr: xhr
});
}
});
});
// Copy log functionality
$('#copy-log').click(function() {
var $button = $(this);
var logText = migrationLogs.join('');
// Create temporary textarea
var $temp = $('