|
|
|
@@ -87,6 +87,9 @@ $config = [
|
|
|
|
|
'viewRecord' => Text::_('COM_MOKOJOOMBACKUP_RUNBACKUP_VIEW_RECORD'),
|
|
|
|
|
'leaveWarn' => Text::_('COM_MOKOJOOMBACKUP_RUNBACKUP_LEAVE_WARNING'),
|
|
|
|
|
'continueUpdate' => Text::_('COM_MOKOJOOMBACKUP_RUNBACKUP_CONTINUE_UPDATE'),
|
|
|
|
|
'cancelConfirm1' => Text::_('COM_MOKOJOOMBACKUP_RUNBACKUP_CANCEL_CONFIRM1'),
|
|
|
|
|
'cancelConfirm2' => Text::_('COM_MOKOJOOMBACKUP_RUNBACKUP_CANCEL_CONFIRM2'),
|
|
|
|
|
'cancelling' => Text::_('COM_MOKOJOOMBACKUP_RUNBACKUP_CANCELLING'),
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
@@ -141,6 +144,13 @@ $this->getDocument()->addStyleSheet(Uri::root(true) . '/media/com_mokosuitebacku
|
|
|
|
|
<a href="#" id="msb-rb-continue" class="btn btn-warning d-none"></a>
|
|
|
|
|
<a href="<?php echo $dashboardUrl; ?>" id="msb-rb-dashboard" class="btn btn-secondary d-none"></a>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- Cancel is available while the backup is running; requires a double confirmation. -->
|
|
|
|
|
<div id="msb-rb-cancel-wrap" class="mt-3">
|
|
|
|
|
<button type="button" id="msb-rb-cancel" class="btn btn-outline-danger">
|
|
|
|
|
<?php echo htmlspecialchars(Text::_('COM_MOKOJOOMBACKUP_RUNBACKUP_CANCEL'), ENT_QUOTES, 'UTF-8'); ?>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- Full-bleed progress bar, edge-to-edge along the bottom of the card. -->
|
|
|
|
@@ -157,6 +167,7 @@ $this->getDocument()->addStyleSheet(Uri::root(true) . '/media/com_mokosuitebacku
|
|
|
|
|
var CFG = <?php echo json_encode($config); ?>;
|
|
|
|
|
var L = CFG.labels || {};
|
|
|
|
|
var running = false;
|
|
|
|
|
var cancelled = false;
|
|
|
|
|
var lastRecordId = 0;
|
|
|
|
|
|
|
|
|
|
var el = {
|
|
|
|
@@ -172,9 +183,38 @@ $this->getDocument()->addStyleSheet(Uri::root(true) . '/media/com_mokosuitebacku
|
|
|
|
|
continue: document.getElementById('msb-rb-continue'),
|
|
|
|
|
dashboard: document.getElementById('msb-rb-dashboard'),
|
|
|
|
|
autocontinue: document.getElementById('msb-rb-autocontinue'),
|
|
|
|
|
autocontinueWrap: document.getElementById('msb-rb-autocontinue-wrap')
|
|
|
|
|
autocontinueWrap: document.getElementById('msb-rb-autocontinue-wrap'),
|
|
|
|
|
cancel: document.getElementById('msb-rb-cancel'),
|
|
|
|
|
cancelWrap: document.getElementById('msb-rb-cancel-wrap')
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
function hideCancel() { if (el.cancelWrap) { el.cancelWrap.classList.add('d-none'); } }
|
|
|
|
|
|
|
|
|
|
/* Cancel the running backup — requires DOUBLE confirmation. Stops the step
|
|
|
|
|
loop, tells the server to cancel the record, and leaves to the dashboard
|
|
|
|
|
WITHOUT continuing any pending update. */
|
|
|
|
|
if (el.cancel) {
|
|
|
|
|
el.cancel.addEventListener('click', function () {
|
|
|
|
|
if (!running || cancelled) { return; }
|
|
|
|
|
if (!window.confirm(L.cancelConfirm1 || 'Cancel the backup that is in progress?')) { return; }
|
|
|
|
|
if (!window.confirm(L.cancelConfirm2 || 'Are you sure? The backup will be stopped and the update will NOT continue.')) { return; }
|
|
|
|
|
|
|
|
|
|
cancelled = true;
|
|
|
|
|
running = false; /* also disarms the leave-warning */
|
|
|
|
|
el.cancel.disabled = true;
|
|
|
|
|
if (el.warn) { el.warn.classList.add('d-none'); }
|
|
|
|
|
setStatus(L.cancelling || 'Cancelling…');
|
|
|
|
|
|
|
|
|
|
var go = function () { window.location.href = CFG.dashboardUrl; };
|
|
|
|
|
/* Best-effort server-side cancel of the record, then leave. */
|
|
|
|
|
if (lastRecordId > 0) {
|
|
|
|
|
post({ task: 'ajax.cancelBackup', id: lastRecordId }).then(go, go);
|
|
|
|
|
} else {
|
|
|
|
|
go();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function setBar(pct, striped) {
|
|
|
|
|
pct = Math.max(0, Math.min(100, parseInt(pct, 10) || 0));
|
|
|
|
|
el.bar.style.width = pct + '%';
|
|
|
|
@@ -211,6 +251,7 @@ $this->getDocument()->addStyleSheet(Uri::root(true) . '/media/com_mokosuitebacku
|
|
|
|
|
setBar(100, false);
|
|
|
|
|
el.title.textContent = L.complete || 'Backup complete';
|
|
|
|
|
if (el.warn) { el.warn.classList.add('d-none'); }
|
|
|
|
|
hideCancel();
|
|
|
|
|
|
|
|
|
|
/* Set the one-shot skip flag for THIS action so the following
|
|
|
|
|
server-side onExtensionBefore(Update|Uninstall) backup is skipped once
|
|
|
|
@@ -264,6 +305,7 @@ $this->getDocument()->addStyleSheet(Uri::root(true) . '/media/com_mokosuitebacku
|
|
|
|
|
if (el.warn) { el.warn.classList.add('d-none'); }
|
|
|
|
|
el.title.textContent = L.failed || 'Backup failed';
|
|
|
|
|
setStatus(message || 'Backup failed');
|
|
|
|
|
hideCancel();
|
|
|
|
|
showActions();
|
|
|
|
|
|
|
|
|
|
el.retry.textContent = L.retry || 'Retry';
|
|
|
|
@@ -285,7 +327,10 @@ $this->getDocument()->addStyleSheet(Uri::root(true) . '/media/com_mokosuitebacku
|
|
|
|
|
async function run() {
|
|
|
|
|
if (running) { return; }
|
|
|
|
|
running = true;
|
|
|
|
|
cancelled = false;
|
|
|
|
|
el.actions.classList.add('d-none');
|
|
|
|
|
if (el.cancelWrap) { el.cancelWrap.classList.remove('d-none'); }
|
|
|
|
|
if (el.cancel) { el.cancel.disabled = false; }
|
|
|
|
|
setBar(0, true);
|
|
|
|
|
setPhase('');
|
|
|
|
|
setStatus(L.starting || 'Starting backup…');
|
|
|
|
@@ -303,7 +348,7 @@ $this->getDocument()->addStyleSheet(Uri::root(true) . '/media/com_mokosuitebacku
|
|
|
|
|
if (init.record_id) { lastRecordId = init.record_id; }
|
|
|
|
|
|
|
|
|
|
var done = false;
|
|
|
|
|
while (!done) {
|
|
|
|
|
while (!done && !cancelled) {
|
|
|
|
|
var step = await post({ task: 'ajax.step', session_id: init.session_id });
|
|
|
|
|
|
|
|
|
|
if (!step || step.error) {
|
|
|
|
@@ -317,9 +362,14 @@ $this->getDocument()->addStyleSheet(Uri::root(true) . '/media/com_mokosuitebacku
|
|
|
|
|
done = step.done || false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* User cancelled mid-flight — the click handler already stops the
|
|
|
|
|
loop and navigates away, so do not fall through to completion. */
|
|
|
|
|
if (cancelled) { return; }
|
|
|
|
|
|
|
|
|
|
running = false;
|
|
|
|
|
await onComplete();
|
|
|
|
|
} catch (err) {
|
|
|
|
|
if (cancelled) { return; }
|
|
|
|
|
onError(err && err.message ? err.message : String(err));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|