VvebOIDC/public/js/admin/controller/backup.js

141 lines
4.2 KiB
JavaScript

class BackupController {
action(url, params, btn) {
let next = url;
document.getElementById("progress").classList.remove("d-none");
function disableBtn() {
btn.querySelector('.loading').classList.remove('d-none');
btn.querySelector('.button-text').classList.add('d-none');
}
function enableBtn() {
btn.querySelector('.loading').classList.add('d-none');
btn.querySelector('.button-text').classList.remove('d-none');
}
disableBtn();
let request = function () {
return fetch(next, {method: "POST", headers: {
"X-Requested-With": "XMLHttpRequest",
"Content-Type": "application/x-www-form-urlencoded",
}, body: new URLSearchParams({...params, csrf: document.querySelector('[name=csrf]')?.value})})
.then((response) => {
next = false;
if (!response.ok) {
return Promise.resolve(response.text()).then((responseInText) => {
return Promise.reject([response, responseInText]);
});
}
if (!response.ok) {
let message = response.statusText + " " + response.body();
throw new Error(message);
}
return response.json()
})
.then((json) => {
document.getElementById('progress-status').innerHTML = '';
if (json['error']) {
document.getElementById('progress-bar').classList.add('bg-danger');
document.getElementById('progress-status').innerHTML = '<div class="text-danger">' + json['error'] + '</div>';
enableBtn();
}
let percent = (json['position']) * 100 / json['count'];
if (json['success']) {
document.getElementById('progress-bar').style.width = "100%";//.classList.add('bg-success');
document.getElementById('progress-status').innerHTML = '<div class="text-success">' + json['success'] + '</div>';
enableBtn();
}
if (json['table']) {
document.getElementById('progress-status').innerHTML = json['table'];
}
if (json['file']) {
document.getElementById('progress-file').innerHTML = json['file'];
}
if (json['position']) {
document.getElementById('progress-position').innerHTML = json['position'];
}
if (json['count']) {
document.getElementById('progress-count').innerHTML = json['count'];
}
if (json['page']) {
document.getElementById('progress-page').innerHTML = json['page'];
}
if (json['url'] && (!json['count'] || (json['position'] < json['count']))) {
next = json['url'];
ajaxStack.add(request);
} else {
percent = 100;
document.getElementById('progress-bar').classList.add('bg-success');
enableBtn();
document.getElementById('progress-bar').style.width = '100%';
if (json['success']) {
window.location.href += '&success=' + json['success'];
} else {
window.navigation.reload();
}
}
document.getElementById('progress-bar').style.width = percent + '%';
})/*.then((json) => {
if (next) {
ajaxStack.add(request);
}
})*/
.catch(error => {
let [response, responseInText] = error;
let message = response.statusText ?? "Error!";
let progessSuccess, progressStatus;
if (typeof error.json === "function") {
error.json().then(jsonError => {
message = jsonError;
}).catch(genericError => {
message = error.statusText + " " + message;
});
}
displayToast("danger", "Error", message);
if (progessSuccess = document.getElementById('progress-success')) progessSuccess.innerHTML = '';
if (progressStatus = document.getElementById('progress-status')) progressStatus.innerHTML = '<div class="text-danger">' + message + '</div>';
//console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
document.getElementById('progress-bar').classList.add('bg-danger');
enableBtn();
});
};
ajaxStack.add(request);
}
make(url, params = {}, btn = false) {
url = url ?? (window.location.pathname + '?module=tools/backup&action=save');
return this.action(url, params, btn);
}
restore(url, params = {}, btn = false) {
return this.action(url, params, btn);
}
}
let Backup = new BackupController();
export {Backup};
window.Backup = Backup;