monorepo/native/wordpress/maplepress-plugin/includes/admin-initial-sync-page.php

187 lines
8 KiB
PHP

<?php
/**
* Admin sync page template.
* This page is shown when syncing all pages to MaplePress (initial or manual sync).
*
* @package MaplePress
* @subpackage MaplePress/includes
*/
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
$options = get_option( 'maplepress_settings', array() );
?>
<div class="wrap">
<h1><?php esc_html_e( 'Syncing Pages', 'maplepress' ); ?></h1>
<div style="max-width: 800px; margin: 40px auto; text-align: center;">
<div style="background: #fff; border: 1px solid #dcdcde; padding: 40px; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.1);">
<!-- Loading animation -->
<div style="margin-bottom: 30px;">
<span class="spinner is-active" style="float: none; width: 40px; height: 40px; margin: 0 auto; background-size: 40px 40px;"></span>
</div>
<!-- Status heading -->
<h2 id="maplepress-sync-status" style="margin: 20px 0; color: #2271b1; font-size: 24px;">
<?php esc_html_e( 'Preparing to sync your content...', 'maplepress' ); ?>
</h2>
<!-- Details text -->
<p id="maplepress-sync-details" style="color: #666; font-size: 16px; margin: 15px 0;">
<?php esc_html_e( 'This will only take a moment.', 'maplepress' ); ?>
</p>
<!-- Progress bar -->
<div id="maplepress-sync-progressbar" style="margin: 30px 0;">
<div style="background: #f0f0f1; border-radius: 4px; height: 30px; position: relative; overflow: hidden;">
<div id="maplepress-sync-progressbar-fill" style="background: linear-gradient(90deg, #2271b1 0%, #135e96 100%); height: 100%; width: 0%; transition: width 0.5s ease;">
<span id="maplepress-sync-progressbar-text" style="color: #fff; font-size: 14px; font-weight: 600; line-height: 30px; display: block; text-align: center;"></span>
</div>
</div>
</div>
<!-- Batch information -->
<div id="maplepress-sync-batch-info" style="background: #f9f9f9; border: 1px solid #e0e0e0; border-radius: 4px; padding: 20px; margin: 20px 0; display: none;">
<div style="display: flex; justify-content: space-around; text-align: center;">
<div>
<div style="font-size: 28px; font-weight: 600; color: #2271b1;" id="maplepress-sync-pages-synced">0</div>
<div style="color: #666; font-size: 14px;"><?php esc_html_e( 'Pages Synced', 'maplepress' ); ?></div>
</div>
<div>
<div style="font-size: 28px; font-weight: 600; color: #2271b1;" id="maplepress-sync-current-batch">0</div>
<div style="color: #666; font-size: 14px;"><?php esc_html_e( 'Current Batch', 'maplepress' ); ?></div>
</div>
<div>
<div style="font-size: 28px; font-weight: 600; color: #2271b1;" id="maplepress-sync-total-batches">0</div>
<div style="color: #666; font-size: 14px;"><?php esc_html_e( 'Total Batches', 'maplepress' ); ?></div>
</div>
</div>
</div>
<!-- Important note -->
<div style="background: #fff3cd; border: 1px solid #ffc107; border-radius: 4px; padding: 15px; margin-top: 30px; text-align: left;">
<p style="margin: 0; color: #856404;">
<strong><?php esc_html_e( 'Please do not close this page.', 'maplepress' ); ?></strong><br>
<?php esc_html_e( 'We are syncing all your published content to MaplePress.', 'maplepress' ); ?>
</p>
</div>
</div>
</div>
</div>
<script>
jQuery(document).ready(function($) {
var statusText = $('#maplepress-sync-status');
var detailsText = $('#maplepress-sync-details');
var progressBar = $('#maplepress-sync-progressbar-fill');
var progressText = $('#maplepress-sync-progressbar-text');
var batchInfo = $('#maplepress-sync-batch-info');
var pagesSynced = $('#maplepress-sync-pages-synced');
var currentBatch = $('#maplepress-sync-current-batch');
var totalBatches = $('#maplepress-sync-total-batches');
// Start the sync
function startSync() {
statusText.text('<?php esc_html_e( 'Counting pages to sync...', 'maplepress' ); ?>');
detailsText.text('<?php esc_html_e( 'Analyzing your content...', 'maplepress' ); ?>');
progressBar.css('width', '5%');
progressText.text('5%');
$.ajax({
url: ajaxurl,
type: 'POST',
data: {
action: 'maplepress_initial_sync',
nonce: '<?php echo wp_create_nonce( 'maplepress_initial_sync' ); ?>'
},
timeout: 600000, // 10 minute timeout
success: function(response) {
if (response.success) {
// Show completion
progressBar.css('width', '100%');
progressText.text('100%');
statusText.html('<span style="color: #008a00;">✓ ' + response.data.message + '</span>');
detailsText.html(response.data.details || '');
// Redirect to dashboard after 2 seconds
setTimeout(function() {
window.location.href = '<?php echo admin_url( 'admin.php?page=maplepress&sync_status=success&synced_count=' ); ?>' + (response.data.synced_count || 0);
}, 2000);
} else {
// Show error
statusText.html('<span style="color: #d63638;">✗ Sync failed</span>');
detailsText.html('<strong><?php esc_html_e( 'Error:', 'maplepress' ); ?></strong> ' + (response.data || '<?php esc_html_e( 'Unknown error', 'maplepress' ); ?>'));
// Show retry button
$('<div style="margin-top: 20px;"><a href="<?php echo admin_url( 'admin.php?page=maplepress-settings' ); ?>" class="button button-primary"><?php esc_html_e( 'Return to Settings', 'maplepress' ); ?></a></div>').insertAfter('#maplepress-sync-progressbar');
}
},
error: function(xhr, status, error) {
statusText.html('<span style="color: #d63638;">✗ Network error</span>');
detailsText.html('<strong><?php esc_html_e( 'Error:', 'maplepress' ); ?></strong> ' + error);
// Show retry button
$('<div style="margin-top: 20px;"><a href="<?php echo admin_url( 'admin.php?page=maplepress-settings' ); ?>" class="button button-primary"><?php esc_html_e( 'Return to Settings', 'maplepress' ); ?></a></div>').insertAfter('#maplepress-sync-progressbar');
},
xhr: function() {
var xhr = new window.XMLHttpRequest();
var progressSimulator;
var startTime = Date.now();
// Start progress simulation
progressSimulator = setInterval(function() {
var elapsed = (Date.now() - startTime) / 1000;
if (elapsed < 5) {
// 5-15% - Analyzing content
var progress = 5 + (elapsed / 5) * 10;
progressBar.css('width', progress + '%');
progressText.text(Math.round(progress) + '%');
statusText.text('<?php esc_html_e( 'Analyzing your content...', 'maplepress' ); ?>');
} else if (elapsed < 10) {
// 15-30% - Preparing batches
var progress = 15 + ((elapsed - 5) / 5) * 15;
progressBar.css('width', progress + '%');
progressText.text(Math.round(progress) + '%');
statusText.text('<?php esc_html_e( 'Preparing batches for sync...', 'maplepress' ); ?>');
batchInfo.show();
} else if (elapsed < 60) {
// 30-80% - Syncing batches
var progress = 30 + ((elapsed - 10) / 50) * 50;
progressBar.css('width', Math.min(progress, 80) + '%');
progressText.text(Math.round(Math.min(progress, 80)) + '%');
statusText.text('<?php esc_html_e( 'Syncing pages to MaplePress...', 'maplepress' ); ?>');
detailsText.html('<?php esc_html_e( 'Processing batches...', 'maplepress' ); ?><br><small><?php esc_html_e( 'This may take a moment for large sites.', 'maplepress' ); ?></small>');
// Simulate batch progress
var estimatedBatches = Math.ceil(elapsed / 3);
currentBatch.text(estimatedBatches);
totalBatches.text(estimatedBatches + Math.ceil((60 - elapsed) / 3));
pagesSynced.text(estimatedBatches * 950);
} else {
// 80-95% - Finalizing
var progress = 80 + ((elapsed - 60) / 60) * 15;
progressBar.css('width', Math.min(progress, 95) + '%');
progressText.text(Math.round(Math.min(progress, 95)) + '%');
statusText.text('<?php esc_html_e( 'Finalizing sync...', 'maplepress' ); ?>');
detailsText.html('<?php esc_html_e( 'Almost done!', 'maplepress' ); ?>');
}
}, 500);
xhr.addEventListener('loadend', function() {
clearInterval(progressSimulator);
});
return xhr;
}
});
}
// Auto-start sync when page loads
setTimeout(startSync, 500);
});
</script>