diff --git a/platform/app.py b/platform/app.py index 6dd5964..b695ce1 100644 --- a/platform/app.py +++ b/platform/app.py @@ -377,7 +377,7 @@ def api_container_status(name): @app.route('/api/backups') @login_required def api_backups(): - return jsonify({'local': get_local_backups(), 'vm': get_vm_backups()}) + return jsonify({'local': get_local_backups_with_status(), 'vm': get_vm_backups_with_status()}) @app.route('/api/backups/log') diff --git a/platform/static/js/platform.js b/platform/static/js/platform.js index 05874ef..4b5b391 100644 --- a/platform/static/js/platform.js +++ b/platform/static/js/platform.js @@ -377,8 +377,8 @@ async function refreshBackupsList() { renderBackupList(d.vm, 'vm-backup-list', 'vm'); if (el('stat-local-bk')) el('stat-local-bk').textContent = d.local.length; if (el('stat-vm-bk')) el('stat-vm-bk').textContent = d.vm.length; - if (el('local-options')) el('local-options').innerHTML = d.local.length ? d.local.map((b) => ``).join('') : ''; - if (el('vm-options')) el('vm-options').innerHTML = d.vm.length ? d.vm.map((b) => ``).join('') : ''; + if (el('local-options')) el('local-options').innerHTML = d.local.length ? d.local.map((b) => ``).join('') : ''; + if (el('vm-options')) el('vm-options').innerHTML = d.vm.length ? d.vm.map((b) => ``).join('') : ''; } catch (_) {} } @@ -394,7 +394,13 @@ function renderBackupList(items, id, source) { return; } node.innerHTML = items.map((b) => { - const safe = jsStr(b); + const name = b.name; + const safe = jsStr(name); + const status = b.status || 'unknown'; + const titleParts = [status]; + if (b.apps && b.apps.length) titleParts.push(`apps: ${b.apps.join(', ')}`); + if (b.size_human) titleParts.push(b.size_human); + const title = escapeHtml(titleParts.join(' ยท ')); const uploadBtn = source === 'local' && typeof quickUploadR2 === 'function' ? `` : ''; @@ -402,9 +408,10 @@ function renderBackupList(items, id, source) { ? `` : ''; return ` -