create adhoc snapshot

This commit is contained in:
Andy Miller
2025-10-18 18:41:39 -06:00
parent c4fb1f7fd8
commit 419fcc3f13
6 changed files with 379 additions and 37 deletions

View File

@@ -981,6 +981,45 @@ class AdminController extends AdminBaseController
return true;
}
/**
* Create a manual safe-upgrade snapshot via Tools.
*
* Route: POST /tools/restore-grav?task:safeUpgradeSnapshot
*
* @return bool
*/
public function taskSafeUpgradeSnapshot()
{
if (!$this->authorizeTask('install grav', ['admin.super'])) {
$this->sendJsonResponse([
'status' => 'error',
'message' => $this->admin::translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK')
]);
return false;
}
$post = $this->getPost($_POST ?? []);
$label = isset($post['label']) ? (string)$post['label'] : null;
$manager = $this->getSafeUpgradeManager();
$result = $manager->queueSnapshot($label);
$status = $result['status'] ?? 'error';
$response = [
'status' => $status === 'error' ? 'error' : 'success',
'data' => $result,
];
if (!empty($result['message'])) {
$response['message'] = $result['message'];
}
$this->sendJsonResponse($response);
return true;
}
/**
* Delete one or more safe-upgrade snapshots via Tools.
*

View File

@@ -223,6 +223,22 @@ class SafeUpgradeManager
]);
}
public function queueSnapshot(?string $label = null): array
{
$options = [
'operation' => 'snapshot',
];
if (null !== $label) {
$label = trim((string)$label);
if ($label !== '') {
$options['label'] = $label;
}
}
return $this->queue($options);
}
/**
* @param array<int, string> $snapshotIds
* @return array<int, array{id:string,status:string,message:?string}>
@@ -515,8 +531,25 @@ class SafeUpgradeManager
$this->log(sprintf('Queued safe upgrade job %s', $jobId));
$queueMessage = $operation === 'restore' ? 'Waiting for restore worker...' : 'Waiting for upgrade worker...';
$this->setProgress('queued', $queueMessage, 0, ['job_id' => $jobId, 'status' => 'queued', 'operation' => $operation]);
if ($operation === 'restore') {
$queueMessage = 'Waiting for restore worker...';
} elseif ($operation === 'snapshot') {
$queueMessage = 'Waiting for snapshot worker...';
} else {
$queueMessage = 'Waiting for upgrade worker...';
}
$queuedExtras = [
'job_id' => $jobId,
'status' => 'queued',
'operation' => $operation,
];
if ($operation === 'snapshot') {
if (isset($options['label']) && is_string($options['label'])) {
$queuedExtras['label'] = $options['label'];
}
$queuedExtras['mode'] = 'manual';
}
$this->setProgress('queued', $queueMessage, 0, $queuedExtras);
if (!function_exists('proc_open')) {
$message = 'proc_open() is disabled on this server; unable to run safe upgrade worker.';
@@ -701,6 +734,10 @@ class SafeUpgradeManager
return $this->runRestore($options);
}
if ($operation === 'snapshot') {
return $this->runSnapshot($options);
}
$force = (bool)($options['force'] ?? false);
$timeout = (int)($options['timeout'] ?? 30);
$overwrite = (bool)($options['overwrite'] ?? false);
@@ -888,6 +925,7 @@ class SafeUpgradeManager
'snapshot' => $snapshotId,
'version' => $version,
'manifest' => $manifest,
'label' => $label,
],
]);
}
@@ -897,6 +935,69 @@ class SafeUpgradeManager
'snapshot' => $snapshotId,
'version' => $version,
'manifest' => $manifest,
'label' => $label,
'context' => $this->buildStatusContext(),
];
}
public function runSnapshot(array $options): array
{
$label = isset($options['label']) ? (string)$options['label'] : null;
if ($label !== null) {
$label = trim($label);
if ($label === '') {
$label = null;
}
}
$this->setProgress('snapshot', 'Creating manual snapshot...', null, [
'operation' => 'snapshot',
'label' => $label,
'mode' => 'manual',
]);
try {
$safeUpgrade = $this->getSafeUpgradeService();
$manifest = $safeUpgrade->createSnapshot($label);
} catch (RuntimeException $e) {
return $this->errorResult($e->getMessage(), [
'operation' => 'snapshot',
]);
} catch (Throwable $e) {
return $this->errorResult($e->getMessage(), [
'operation' => 'snapshot',
]);
}
$snapshotId = $manifest['id'] ?? null;
$version = $manifest['source_version'] ?? $manifest['target_version'] ?? null;
$this->setProgress('complete', sprintf('Snapshot %s created.', $snapshotId ?? '(unknown)'), 100, [
'operation' => 'snapshot',
'snapshot' => $snapshotId,
'version' => $version,
'label' => $label,
'mode' => 'manual',
]);
if ($this->jobManifestPath) {
$this->updateJob([
'result' => [
'status' => 'success',
'snapshot' => $snapshotId,
'version' => $version,
'manifest' => $manifest,
'label' => $label,
],
]);
}
return [
'status' => 'success',
'snapshot' => $snapshotId,
'version' => $version,
'manifest' => $manifest,
'label' => $label,
'context' => $this->buildStatusContext(),
];
}

View File

@@ -859,6 +859,12 @@ PLUGIN_ADMIN:
RESTORE_GRAV_SUCCESS_SIMPLE: "Snapshot %s restored."
RESTORE_GRAV_RUNNING: "Restoring snapshot %s..."
RESTORE_GRAV_FAILED: "Unable to restore the selected snapshot."
RESTORE_GRAV_CREATE_SNAPSHOT: "Create Snapshot"
RESTORE_GRAV_SNAPSHOT_PROMPT: "Enter an optional snapshot label"
RESTORE_GRAV_SNAPSHOT_RUNNING: "Creating snapshot %s..."
RESTORE_GRAV_SNAPSHOT_SUCCESS: "Snapshot %s created."
RESTORE_GRAV_SNAPSHOT_FAILED: "Snapshot creation failed."
RESTORE_GRAV_SNAPSHOT_FALLBACK: "Snapshot creation may have completed. Reloading..."
RESTORE_GRAV_DELETE_SUCCESS: "%d snapshot(s) deleted."
RESTORE_GRAV_DELETE_FAILED: "Failed to delete one or more snapshots."
ROUTE_OVERRIDES: "Route Overrides"

View File

@@ -10,6 +10,7 @@ const base = `${config.base_url_relative}/update.json`;
const urls = {
restore: `${base}/${task}safeUpgradeRestore/${nonce}`,
snapshot: `${base}/${task}safeUpgradeSnapshot/${nonce}`,
status: `${base}/${task}safeUpgradeStatus/${nonce}`,
};
@@ -27,6 +28,74 @@ class RestoreManager {
}
this.startRestore(button);
});
$(document).on('click', '[data-create-snapshot]', (event) => {
event.preventDefault();
const button = $(event.currentTarget);
if (this.job) {
return;
}
this.startSnapshot(button);
});
}
startSnapshot(button) {
let label = null;
if (typeof window !== 'undefined' && window.prompt) {
const promptMessage = translations.PLUGIN_ADMIN?.RESTORE_GRAV_SNAPSHOT_PROMPT || 'Enter an optional snapshot label';
const input = window.prompt(promptMessage, '');
if (input === null) {
return;
}
label = input.trim();
if (label === '') {
label = null;
}
}
button.prop('disabled', true).addClass('is-loading');
const body = {};
if (label) {
body.label = label;
}
request(urls.snapshot, { method: 'post', body }, (response) => {
button.prop('disabled', false).removeClass('is-loading');
if (!response) {
toastr.error(translations.PLUGIN_ADMIN?.RESTORE_GRAV_SNAPSHOT_FAILED || 'Snapshot creation failed.');
return;
}
if (response.status === 'error') {
toastr.error(response.message || translations.PLUGIN_ADMIN?.RESTORE_GRAV_SNAPSHOT_FAILED || 'Snapshot creation failed.');
return;
}
const data = response.data || {};
const jobId = data.job_id || (data.job && data.job.id);
if (!jobId) {
const message = response.message || translations.PLUGIN_ADMIN?.RESTORE_GRAV_SNAPSHOT_FAILED || 'Snapshot creation failed.';
toastr.error(message);
return;
}
this.job = {
id: jobId,
operation: 'snapshot',
snapshot: null,
label
};
this.pollFailures = 0;
const descriptor = label || jobId;
const runningMessage = translations.PLUGIN_ADMIN?.RESTORE_GRAV_SNAPSHOT_RUNNING
? translations.PLUGIN_ADMIN.RESTORE_GRAV_SNAPSHOT_RUNNING.replace('%s', descriptor)
: 'Creating snapshot...';
toastr.info(runningMessage);
this.schedulePoll();
});
}
startRestore(button) {
@@ -62,6 +131,7 @@ class RestoreManager {
this.job = {
id: jobId,
snapshot,
operation: 'restore',
};
this.pollFailures = 0;
@@ -108,9 +178,18 @@ class RestoreManager {
const stage = progress.stage || null;
const status = job.status || progress.status || null;
const operation = progress.operation || this.job.operation || null;
if (!this.job.snapshot && progress.snapshot) {
this.job.snapshot = progress.snapshot;
} else if (!this.job.snapshot && job.result && job.result.snapshot) {
this.job.snapshot = job.result.snapshot;
}
if (stage === 'error' || status === 'error') {
const message = job.error || progress.message || translations.PLUGIN_ADMIN?.RESTORE_GRAV_FAILED || 'Snapshot restore failed.';
const message = job.error || progress.message || (operation === 'snapshot'
? translations.PLUGIN_ADMIN?.RESTORE_GRAV_SNAPSHOT_FAILED || 'Snapshot creation failed.'
: translations.PLUGIN_ADMIN?.RESTORE_GRAV_FAILED || 'Snapshot restore failed.');
toastr.error(message);
this.job = null;
this.clearPoll();
@@ -118,6 +197,19 @@ class RestoreManager {
}
if (stage === 'complete' || status === 'success') {
if (operation === 'snapshot') {
const snapshotId = progress.snapshot || (job.result && job.result.snapshot) || this.job.snapshot || '';
const snapshotLabel = snapshotId || (translations.PLUGIN_ADMIN?.RESTORE_GRAV_TABLE_SNAPSHOT || 'snapshot');
const successMessage = translations.PLUGIN_ADMIN?.RESTORE_GRAV_SNAPSHOT_SUCCESS
? translations.PLUGIN_ADMIN.RESTORE_GRAV_SNAPSHOT_SUCCESS.replace('%s', snapshotLabel)
: (snapshotId ? `Snapshot ${snapshotId} created.` : 'Snapshot created.');
toastr.success(successMessage);
this.job = null;
this.clearPoll();
setTimeout(() => window.location.reload(), 1500);
return;
}
const snapshot = progress.snapshot || this.job.snapshot;
const version = (job.result && job.result.version) || progress.version || '';
let successMessage;
@@ -149,12 +241,18 @@ class RestoreManager {
}
this.pollFailures += 1;
const operation = this.job.operation || 'restore';
const snapshot = this.job.snapshot || '';
if (this.pollFailures >= 3) {
const message = snapshot
? `Snapshot ${snapshot} restore is completing. Reloading...`
: 'Snapshot restore is completing. Reloading...';
let message;
if (operation === 'snapshot') {
message = translations.PLUGIN_ADMIN?.RESTORE_GRAV_SNAPSHOT_FALLBACK || 'Snapshot creation may have completed. Reloading...';
} else {
message = snapshot
? `Snapshot ${snapshot} restore is completing. Reloading...`
: 'Snapshot restore is completing. Reloading...';
}
toastr.info(message);
this.job = null;
this.clearPoll();

View File

@@ -10980,6 +10980,7 @@ var nonce = "admin-nonce".concat(paramSep).concat(external_GravAdmin_namespaceOb
var base = "".concat(external_GravAdmin_namespaceObject.config.base_url_relative, "/update.json");
var urls = {
restore: "".concat(base, "/").concat(task, "safeUpgradeRestore/").concat(nonce),
snapshot: "".concat(base, "/").concat(task, "safeUpgradeSnapshot/").concat(nonce),
status: "".concat(base, "/").concat(task, "safeUpgradeStatus/").concat(nonce)
};
var RestoreManager = /*#__PURE__*/function () {
@@ -10997,11 +10998,78 @@ var RestoreManager = /*#__PURE__*/function () {
}
_this.startRestore(button);
});
external_jQuery_default()(document).on('click', '[data-create-snapshot]', function (event) {
event.preventDefault();
var button = external_jQuery_default()(event.currentTarget);
if (_this.job) {
return;
}
_this.startSnapshot(button);
});
}
return restore_createClass(RestoreManager, [{
key: "startSnapshot",
value: function startSnapshot(button) {
var _this2 = this;
var label = null;
if (typeof window !== 'undefined' && window.prompt) {
var _translations$PLUGIN_;
var promptMessage = ((_translations$PLUGIN_ = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) === null || _translations$PLUGIN_ === void 0 ? void 0 : _translations$PLUGIN_.RESTORE_GRAV_SNAPSHOT_PROMPT) || 'Enter an optional snapshot label';
var input = window.prompt(promptMessage, '');
if (input === null) {
return;
}
label = input.trim();
if (label === '') {
label = null;
}
}
button.prop('disabled', true).addClass('is-loading');
var body = {};
if (label) {
body.label = label;
}
utils_request(urls.snapshot, {
method: 'post',
body: body
}, function (response) {
var _translations$PLUGIN_5;
button.prop('disabled', false).removeClass('is-loading');
if (!response) {
var _translations$PLUGIN_2;
utils_toastr.error(((_translations$PLUGIN_2 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) === null || _translations$PLUGIN_2 === void 0 ? void 0 : _translations$PLUGIN_2.RESTORE_GRAV_SNAPSHOT_FAILED) || 'Snapshot creation failed.');
return;
}
if (response.status === 'error') {
var _translations$PLUGIN_3;
utils_toastr.error(response.message || ((_translations$PLUGIN_3 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) === null || _translations$PLUGIN_3 === void 0 ? void 0 : _translations$PLUGIN_3.RESTORE_GRAV_SNAPSHOT_FAILED) || 'Snapshot creation failed.');
return;
}
var data = response.data || {};
var jobId = data.job_id || data.job && data.job.id;
if (!jobId) {
var _translations$PLUGIN_4;
var message = response.message || ((_translations$PLUGIN_4 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) === null || _translations$PLUGIN_4 === void 0 ? void 0 : _translations$PLUGIN_4.RESTORE_GRAV_SNAPSHOT_FAILED) || 'Snapshot creation failed.';
utils_toastr.error(message);
return;
}
_this2.job = {
id: jobId,
operation: 'snapshot',
snapshot: null,
label: label
};
_this2.pollFailures = 0;
var descriptor = label || jobId;
var runningMessage = (_translations$PLUGIN_5 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) !== null && _translations$PLUGIN_5 !== void 0 && _translations$PLUGIN_5.RESTORE_GRAV_SNAPSHOT_RUNNING ? external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.RESTORE_GRAV_SNAPSHOT_RUNNING.replace('%s', descriptor) : 'Creating snapshot...';
utils_toastr.info(runningMessage);
_this2.schedulePoll();
});
}
}, {
key: "startRestore",
value: function startRestore(button) {
var _this2 = this;
var _this3 = this;
var snapshot = button.data('restore-snapshot');
if (!snapshot) {
return;
@@ -11014,44 +11082,45 @@ var RestoreManager = /*#__PURE__*/function () {
method: 'post',
body: body
}, function (response) {
var _translations$PLUGIN_4;
var _translations$PLUGIN_9;
button.prop('disabled', false).removeClass('is-loading');
if (!response) {
var _translations$PLUGIN_;
utils_toastr.error(((_translations$PLUGIN_ = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) === null || _translations$PLUGIN_ === void 0 ? void 0 : _translations$PLUGIN_.RESTORE_GRAV_FAILED) || 'Snapshot restore failed.');
var _translations$PLUGIN_6;
utils_toastr.error(((_translations$PLUGIN_6 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) === null || _translations$PLUGIN_6 === void 0 ? void 0 : _translations$PLUGIN_6.RESTORE_GRAV_FAILED) || 'Snapshot restore failed.');
return;
}
if (response.status === 'error') {
var _translations$PLUGIN_2;
utils_toastr.error(response.message || ((_translations$PLUGIN_2 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) === null || _translations$PLUGIN_2 === void 0 ? void 0 : _translations$PLUGIN_2.RESTORE_GRAV_FAILED) || 'Snapshot restore failed.');
var _translations$PLUGIN_7;
utils_toastr.error(response.message || ((_translations$PLUGIN_7 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) === null || _translations$PLUGIN_7 === void 0 ? void 0 : _translations$PLUGIN_7.RESTORE_GRAV_FAILED) || 'Snapshot restore failed.');
return;
}
var data = response.data || {};
var jobId = data.job_id || data.job && data.job.id;
if (!jobId) {
var _translations$PLUGIN_3;
var message = response.message || ((_translations$PLUGIN_3 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) === null || _translations$PLUGIN_3 === void 0 ? void 0 : _translations$PLUGIN_3.RESTORE_GRAV_FAILED) || 'Snapshot restore failed.';
var _translations$PLUGIN_8;
var message = response.message || ((_translations$PLUGIN_8 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) === null || _translations$PLUGIN_8 === void 0 ? void 0 : _translations$PLUGIN_8.RESTORE_GRAV_FAILED) || 'Snapshot restore failed.';
utils_toastr.error(message);
return;
}
_this2.job = {
_this3.job = {
id: jobId,
snapshot: snapshot
snapshot: snapshot,
operation: 'restore'
};
_this2.pollFailures = 0;
var runningMessage = (_translations$PLUGIN_4 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) !== null && _translations$PLUGIN_4 !== void 0 && _translations$PLUGIN_4.RESTORE_GRAV_RUNNING ? external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.RESTORE_GRAV_RUNNING.replace('%s', snapshot) : "Restoring snapshot ".concat(snapshot, "...");
_this3.pollFailures = 0;
var runningMessage = (_translations$PLUGIN_9 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) !== null && _translations$PLUGIN_9 !== void 0 && _translations$PLUGIN_9.RESTORE_GRAV_RUNNING ? external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.RESTORE_GRAV_RUNNING.replace('%s', snapshot) : "Restoring snapshot ".concat(snapshot, "...");
utils_toastr.info(runningMessage);
_this2.schedulePoll();
_this3.schedulePoll();
});
}
}, {
key: "schedulePoll",
value: function schedulePoll() {
var _this3 = this;
var _this4 = this;
var delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1200;
this.clearPoll();
this.pollTimer = setTimeout(function () {
return _this3.pollStatus();
return _this4.pollStatus();
}, delay);
}
}, {
@@ -11065,7 +11134,7 @@ var RestoreManager = /*#__PURE__*/function () {
}, {
key: "pollStatus",
value: function pollStatus() {
var _this4 = this;
var _this5 = this;
if (!this.job) {
return;
}
@@ -11075,9 +11144,9 @@ var RestoreManager = /*#__PURE__*/function () {
silentErrors: true
}, function (response) {
handled = true;
_this4.pollFailures = 0;
_this5.pollFailures = 0;
if (!response || response.status !== 'success') {
_this4.schedulePoll();
_this5.schedulePoll();
return;
}
var data = response.data || {};
@@ -11085,38 +11154,57 @@ var RestoreManager = /*#__PURE__*/function () {
var progress = data.progress || {};
var stage = progress.stage || null;
var status = job.status || progress.status || null;
var operation = progress.operation || _this5.job.operation || null;
if (!_this5.job.snapshot && progress.snapshot) {
_this5.job.snapshot = progress.snapshot;
} else if (!_this5.job.snapshot && job.result && job.result.snapshot) {
_this5.job.snapshot = job.result.snapshot;
}
if (stage === 'error' || status === 'error') {
var _translations$PLUGIN_5;
var message = job.error || progress.message || ((_translations$PLUGIN_5 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) === null || _translations$PLUGIN_5 === void 0 ? void 0 : _translations$PLUGIN_5.RESTORE_GRAV_FAILED) || 'Snapshot restore failed.';
var _translations$PLUGIN_0, _translations$PLUGIN_1;
var message = job.error || progress.message || (operation === 'snapshot' ? ((_translations$PLUGIN_0 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) === null || _translations$PLUGIN_0 === void 0 ? void 0 : _translations$PLUGIN_0.RESTORE_GRAV_SNAPSHOT_FAILED) || 'Snapshot creation failed.' : ((_translations$PLUGIN_1 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) === null || _translations$PLUGIN_1 === void 0 ? void 0 : _translations$PLUGIN_1.RESTORE_GRAV_FAILED) || 'Snapshot restore failed.');
utils_toastr.error(message);
_this4.job = null;
_this4.clearPoll();
_this5.job = null;
_this5.clearPoll();
return;
}
if (stage === 'complete' || status === 'success') {
var _translations$PLUGIN_6, _translations$PLUGIN_7;
var snapshot = progress.snapshot || _this4.job.snapshot;
var _translations$PLUGIN_12, _translations$PLUGIN_13;
if (operation === 'snapshot') {
var _translations$PLUGIN_10, _translations$PLUGIN_11;
var snapshotId = progress.snapshot || job.result && job.result.snapshot || _this5.job.snapshot || '';
var snapshotLabel = snapshotId || ((_translations$PLUGIN_10 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) === null || _translations$PLUGIN_10 === void 0 ? void 0 : _translations$PLUGIN_10.RESTORE_GRAV_TABLE_SNAPSHOT) || 'snapshot';
var _successMessage = (_translations$PLUGIN_11 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) !== null && _translations$PLUGIN_11 !== void 0 && _translations$PLUGIN_11.RESTORE_GRAV_SNAPSHOT_SUCCESS ? external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.RESTORE_GRAV_SNAPSHOT_SUCCESS.replace('%s', snapshotLabel) : snapshotId ? "Snapshot ".concat(snapshotId, " created.") : 'Snapshot created.';
utils_toastr.success(_successMessage);
_this5.job = null;
_this5.clearPoll();
setTimeout(function () {
return window.location.reload();
}, 1500);
return;
}
var snapshot = progress.snapshot || _this5.job.snapshot;
var version = job.result && job.result.version || progress.version || '';
var successMessage;
if ((_translations$PLUGIN_6 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) !== null && _translations$PLUGIN_6 !== void 0 && _translations$PLUGIN_6.RESTORE_GRAV_SUCCESS_MESSAGE && version) {
if ((_translations$PLUGIN_12 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) !== null && _translations$PLUGIN_12 !== void 0 && _translations$PLUGIN_12.RESTORE_GRAV_SUCCESS_MESSAGE && version) {
successMessage = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.RESTORE_GRAV_SUCCESS_MESSAGE.replace('%1$s', snapshot).replace('%2$s', version);
} else if ((_translations$PLUGIN_7 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) !== null && _translations$PLUGIN_7 !== void 0 && _translations$PLUGIN_7.RESTORE_GRAV_SUCCESS_SIMPLE) {
} else if ((_translations$PLUGIN_13 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) !== null && _translations$PLUGIN_13 !== void 0 && _translations$PLUGIN_13.RESTORE_GRAV_SUCCESS_SIMPLE) {
successMessage = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN.RESTORE_GRAV_SUCCESS_SIMPLE.replace('%s', snapshot);
} else {
successMessage = version ? "Snapshot ".concat(snapshot, " restored (Grav ").concat(version, ").") : "Snapshot ".concat(snapshot, " restored.");
}
utils_toastr.success(successMessage);
_this4.job = null;
_this4.clearPoll();
_this5.job = null;
_this5.clearPoll();
setTimeout(function () {
return window.location.reload();
}, 1500);
return;
}
_this4.schedulePoll();
_this5.schedulePoll();
}).then(function () {
if (!handled) {
_this4.handleSilentFailure();
_this5.handleSilentFailure();
}
});
}
@@ -11127,9 +11215,16 @@ var RestoreManager = /*#__PURE__*/function () {
return;
}
this.pollFailures += 1;
var operation = this.job.operation || 'restore';
var snapshot = this.job.snapshot || '';
if (this.pollFailures >= 3) {
var message = snapshot ? "Snapshot ".concat(snapshot, " restore is completing. Reloading...") : 'Snapshot restore is completing. Reloading...';
var message;
if (operation === 'snapshot') {
var _translations$PLUGIN_14;
message = ((_translations$PLUGIN_14 = external_GravAdmin_namespaceObject.translations.PLUGIN_ADMIN) === null || _translations$PLUGIN_14 === void 0 ? void 0 : _translations$PLUGIN_14.RESTORE_GRAV_SNAPSHOT_FALLBACK) || 'Snapshot creation may have completed. Reloading...';
} else {
message = snapshot ? "Snapshot ".concat(snapshot, " restore is completing. Reloading...") : 'Snapshot restore is completing. Reloading...';
}
utils_toastr.info(message);
this.job = null;
this.clearPoll();

View File

@@ -55,6 +55,9 @@
</table>
<div class="button-bar">
<button type="button" class="button primary" data-create-snapshot>
{{ "PLUGIN_ADMIN.RESTORE_GRAV_CREATE_SNAPSHOT"|t }}
</button>
<button type="submit" form="snapshot-delete-form" class="button danger" name="task" value="safeUpgradeDelete">
{{ "PLUGIN_ADMIN.RESTORE_GRAV_DELETE_SELECTED"|t }}
</button>