fix: backup storage relative to vault parent + global capture click handler for close button
- _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:
+16
-26
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user