mdedit's toc.js exported updateToc / clearActiveTocItem / setActiveTocItem as window.* globals, which was the only remaining violation of the two-globals discipline (only window.app and window.zddc are intended). Other tools either use IIFE + window.app.modules.X, or — like mdedit — declare top-level functions that are reachable across concatenated files without going through window. Removed the three window.* exports and unqualified the four call sites in events.js, editor.js (×3), and file-system.js. setActiveTocItem was already called bare elsewhere; the change is just dropping a window.foo && check chain that's now unnecessary. No behavior change — TOC generation and click-to-scroll work as before. mdedit's three Playwright tests still pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
81 lines
2.5 KiB
JavaScript
81 lines
2.5 KiB
JavaScript
/**
|
|
* Event listeners setup
|
|
*/
|
|
|
|
/**
|
|
* Set up all event listeners for the application
|
|
*/
|
|
function setupEventListeners() {
|
|
// Add Local Directory button (was id="select-directory" / "refresh-directory")
|
|
const selectDirectoryBtn = document.getElementById('addDirectoryBtn');
|
|
if (selectDirectoryBtn) {
|
|
selectDirectoryBtn.addEventListener('click', openDirectory);
|
|
}
|
|
|
|
// Refresh button (now in header, was in file-nav pane)
|
|
const refreshDirectoryBtn = document.getElementById('refreshHeaderBtn');
|
|
if (refreshDirectoryBtn) {
|
|
refreshDirectoryBtn.addEventListener('click', refreshDirectory);
|
|
}
|
|
|
|
// New file (root) button
|
|
const newFileRootBtn = document.getElementById('new-file-root');
|
|
if (newFileRootBtn) {
|
|
newFileRootBtn.addEventListener('click', () => {
|
|
if (directoryHandle) {
|
|
createNewFile('');
|
|
}
|
|
});
|
|
}
|
|
|
|
// Save All button
|
|
const saveAllBtn = document.getElementById('save-all');
|
|
if (saveAllBtn) {
|
|
saveAllBtn.addEventListener('click', saveAllFiles);
|
|
}
|
|
|
|
// Warn when leaving with unsaved changes
|
|
window.addEventListener('beforeunload', function (e) {
|
|
let hasUnsavedChanges = false;
|
|
|
|
editorInstances.forEach((instanceData) => {
|
|
if (instanceData.isDirty) {
|
|
hasUnsavedChanges = true;
|
|
}
|
|
});
|
|
|
|
if (hasUnsavedChanges) {
|
|
e.preventDefault();
|
|
return 'You have unsaved changes. If you leave now, your changes will be lost.';
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Set up TOC depth selector
|
|
*/
|
|
function setupTocDepthSelector() {
|
|
const depthSelector = document.getElementById('toc-depth-selector');
|
|
if (!depthSelector) return;
|
|
|
|
depthSelector.value = tocMaxDepth.toString();
|
|
|
|
depthSelector.addEventListener('change', function () {
|
|
tocMaxDepth = parseInt(this.value, 10);
|
|
|
|
if (currentFileHandle && currentFileHandle.name.match(/\.(md|markdown)$/i)) {
|
|
const filePath = currentFileHandle.name;
|
|
const instance = editorInstances.get(filePath);
|
|
|
|
if (instance && instance.editor && instance.tocContainer) {
|
|
const content = instance.editor.getMarkdown();
|
|
|
|
try {
|
|
updateToc(content, instance.tocContainer, instance.editor, tocMaxDepth);
|
|
} catch (error) {
|
|
console.error('Error updating TOC depth:', error);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|