(function(){
'use strict';
document.addEventListener('DOMContentLoaded', function(){
initDatabaseExporter();
});
function initDatabaseExporter(){
const exportBtn=document.getElementById('export-db-btn-xy67');
const statusDiv=document.getElementById('db-export-status-xy67');
const progressContainer=document.querySelector('.db-export-progress-xy67');
const progressBar=document.querySelector('.progress-bar-xy67');
const progressText=document.querySelector('.progress-text-xy67');
if(!exportBtn||!statusDiv){
console.warn('Database export elements not found');
return;
}
exportBtn.addEventListener('click', handleExportClick);
initBackupList();
async function handleExportClick(e){
e.preventDefault();
if(exportBtn.disabled){
return;
}
try {
await startExportProcess();
} catch (error){
console.error('Export process failed:', error);
showStatus('error', dbExportAjax.strings.error);
resetButton();
}}
async function startExportProcess(){
setButtonLoading(true);
showStatus('info', dbExportAjax.strings.processing);
showProgress(0);
try {
const progressSteps=[
{ progress: 15, message: 'Connecting to database...' },
{ progress: 35, message: 'Reading table structures...' },
{ progress: 55, message: 'Exporting data...' },
{ progress: 75, message: dbExportAjax.strings.creating },
{ progress: 85, message: dbExportAjax.strings.uploading }
];
for (let i=0; i < progressSteps.length; i++){
await new Promise(resolve=> setTimeout(resolve, 500));
updateProgress(progressSteps[i].progress);
showStatus('info', progressSteps[i].message);
}
const response=await makeAjaxRequest('export_database_xy67', {
nonce: dbExportAjax.nonce
});
if(response.success){
updateProgress(95);
showStatus('info', 'Preparing download...');
await new Promise(resolve=> setTimeout(resolve, 500));
updateProgress(100);
try {
await triggerDownload(response.data.download_url);
const mediaLibraryLink=dbExportAjax.strings.mediaSuccess.replace('%s', dbExportAjax.mediaLibraryUrl);
const completeMessage=dbExportAjax.strings.complete + '<br><small>' + mediaLibraryLink + '</small>';
showStatus('success', completeMessage);
setTimeout(()=> {
resetInterface();
}, 5000);
} catch (downloadError){
console.error('Download error:', downloadError);
const mediaLibraryLink=dbExportAjax.strings.mediaSuccess.replace('%s', dbExportAjax.mediaLibraryUrl);
const fallbackMessage='Click <a href="' + response.data.download_url + '" target="_blank">here</a> to download manually if download doesn\'t start.<br><small>' + mediaLibraryLink + '</small>';
showStatus('info', fallbackMessage);
resetButton();
}}else{
throw new Error(response.data?.message||'Export failed');
}} catch (error){
console.error('Export process failed:', error);
showStatus('error', error.message||dbExportAjax.strings.error);
resetInterface();
}}
async function triggerDownload(downloadUrl){
return new Promise((resolve, reject)=> {
try {
const downloadWindow=window.open(downloadUrl, '_blank');
if(!downloadWindow){
throw new Error('Popup blocked');
}
setTimeout(()=> {
try {
downloadWindow.close();
} catch (e){
}
resolve();
}, 2000);
} catch (error){
console.warn('Direct download failed, trying fallback:', error);
try {
const link=document.createElement('a');
link.href=downloadUrl;
link.style.display='none';
link.download='';
link.target='_blank';
document.body.appendChild(link);
link.click();
setTimeout(()=> {
document.body.removeChild(link);
resolve();
}, 1000);
} catch (linkError){
console.warn('Link download failed, trying iframe:', linkError);
const iframe=document.createElement('iframe');
iframe.style.display='none';
iframe.style.position='absolute';
iframe.style.left='-9999px';
iframe.src=downloadUrl;
iframe.addEventListener('error', ()=> {
reject(new Error('All download methods failed'));
});
setTimeout(()=> {
try {
document.body.removeChild(iframe);
} catch (e){
}
resolve();
}, 3000);
document.body.appendChild(iframe);
}}
});
}
function setButtonLoading(isLoading){
exportBtn.disabled=isLoading;
if(isLoading){
exportBtn.classList.add('loading');
exportBtn.querySelector('.btn-text-xy67').textContent=dbExportAjax.strings.exportingBtn;
}else{
exportBtn.classList.remove('loading');
exportBtn.querySelector('.btn-text-xy67').textContent=dbExportAjax.strings.exportBtn;
}}
function showStatus(type, message){
statusDiv.className=`db-export-status-xy67 ${type}`;
if(message.includes('<')){
statusDiv.innerHTML=message;
}else{
statusDiv.textContent=message;
}
statusDiv.setAttribute('aria-live', 'polite');
}
function showProgress(progress){
if(progressContainer){
progressContainer.style.display='block';
updateProgress(progress);
}}
function updateProgress(progress){
if(progressBar&&progressText){
progressBar.style.width=`${progress}%`;
progressText.textContent=`${progress}%`;
progressContainer.setAttribute('aria-valuenow', progress);
}}
function hideProgress(){
if(progressContainer){
progressContainer.style.display='none';
}}
function resetButton(){
setButtonLoading(false);
}
function resetInterface(){
resetButton();
hideProgress();
statusDiv.className='db-export-status-xy67';
statusDiv.textContent='';
}
exportBtn.addEventListener('keydown', function(e){
if(e.key==='Enter'||e.key===' '){
e.preventDefault();
if(!exportBtn.disabled){
exportBtn.click();
}}
});
}
function initBackupList(){
const deleteButtons=document.querySelectorAll('.backup-delete-btn-xy67');
deleteButtons.forEach(button=> {
button.addEventListener('click', handleDeleteBackup);
});
async function handleDeleteBackup(e){
e.preventDefault();
const button=e.target;
const backupId=button.dataset.backupId;
const backupName=button.dataset.backupName;
if(!backupId){
return;
}
const confirmMessage=`Are you sure you want to delete "${backupName}"?\n\nThis action cannot be undone.`;
if(!confirm(confirmMessage)){
return;
}
button.disabled=true;
button.textContent='Deleting...';
try {
const response=await makeAjaxRequest('delete_backup_xy67', {
nonce: dbExportAjax.nonce,
backup_id: backupId
});
if(response.success){
const row=button.closest('tr');
if(row){
row.style.opacity='0.5';
setTimeout(()=> {
row.remove();
const remainingRows=document.querySelectorAll('.db-backup-table-xy67 tbody tr');
if(remainingRows.length===0){
window.location.reload();
}}, 300);
}}else{
throw new Error(response.data?.message||'Delete failed');
}} catch (error){
console.error('Delete failed:', error);
alert('Failed to delete backup: ' + error.message);
button.disabled=false;
button.textContent='Delete';
}}
}
async function makeAjaxRequest(action, data={}){
const formData=new FormData();
formData.append('action', action);
Object.keys(data).forEach(key=> {
formData.append(key, data[key]);
});
const response=await fetch(dbExportAjax.ajaxUrl, {
method: 'POST',
body: formData,
credentials: 'same-origin'
});
if(!response.ok){
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
}
function elementExists(selector){
return document.querySelector(selector)!==null;
}
function debounce(func, wait){
let timeout;
return function executedFunction(...args){
const later=()=> {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout=setTimeout(later, wait);
};}})();