fix: backup storage relative to vault parent + global capture click handler for close button
CI / lint (push) Failing after 4s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / security (push) Failing after 5s

- _backup_file: resolve relative backup path against vault parent (survives CWD changes)
- _get_backup_root: same resolution logic for listing
- backups.js: global document-level capture-phase click handler for .backup-close-btn
  (works regardless of innerHTML replacements, text node targets, or event bubbling)
This commit is contained in:
2026-06-04 15:22:02 -04:00
parent af05604e99
commit bc8083fd6b
2 changed files with 46 additions and 31 deletions
+16 -26
View File
@@ -84,6 +84,16 @@ export async function openBackupViewer(vault, path) {
// DOM helpers
// ---------------------------------------------------------------------------
// Global click handler: catches close button clicks anywhere in the document
document.addEventListener('click', function(e) {
const btn = e.target.closest ? e.target.closest('.backup-close-btn') : null;
if (btn && state.overlay) {
e.stopPropagation();
e.preventDefault();
close();
}
}, true); // capture phase — fires before other handlers
function createOverlay() {
const overlay = document.createElement('div');
overlay.className = 'obsigate-modal-overlay backup-viewer-overlay';
@@ -91,6 +101,11 @@ function createOverlay() {
if (e.target === overlay) close();
});
const panel = document.createElement('div');
panel.className = 'backup-viewer-panel';
panel.id = 'backup-viewer-panel';
overlay.appendChild(panel);
// Keyboard: Escape closes the viewer
_escHandler = (e) => {
if (e.key === 'Escape' && state.overlay) {
@@ -99,37 +114,12 @@ function createOverlay() {
};
document.addEventListener('keydown', _escHandler);
const panel = document.createElement('div');
panel.className = 'backup-viewer-panel';
panel.id = 'backup-viewer-panel';
overlay.appendChild(panel);
// Event delegation fallback for close button (in case inline onclick fails)
panel.addEventListener('click', (e) => {
// e.target might be a text node (e.g. "×") — use parentElement as fallback
const target = e.target.nodeType === Node.TEXT_NODE ? e.target.parentElement : e.target;
const closeBtn = target && target.closest ? target.closest('.backup-close-btn') : null;
if (closeBtn) {
e.stopPropagation();
close();
}
});
return overlay;
}
function setBody(html) {
const panel = document.getElementById('backup-viewer-panel');
if (!panel) return;
panel.innerHTML = html;
// Re-bind close button after innerHTML replacement
const closeBtn = panel.querySelector('.backup-close-btn');
if (closeBtn) {
closeBtn.addEventListener('click', (e) => {
e.stopPropagation();
close();
});
}
if (panel) panel.innerHTML = html;
}
let _escHandler = null;