Merge pull request #12 from n8k99/claude/fix-nested-folder-display-015Ytt8mSX9sfytMQC85P4gA

perf(obsidian): optimize folder tree for large vaults
This commit is contained in:
Nathan Eckenrode 2025-11-14 00:19:27 -05:00 committed by GitHub
commit 796fcabfc9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 31 additions and 5 deletions

View file

@ -463,7 +463,7 @@ Add your lore here...
return results; return results;
} }
// List all notes with basic info // List all notes with basic info (reads frontmatter - slow for large vaults)
async function listAllNotes() { async function listAllNotes() {
const allFiles = await getVaultFiles(); const allFiles = await getVaultFiles();
const notes = []; const notes = [];
@ -495,6 +495,25 @@ Add your lore here...
return notes; return notes;
} }
// List just file paths (fast - no content reading)
async function listAllNotePaths() {
const allFiles = await getVaultFiles();
INFO && console.log(`listAllNotePaths: Found ${allFiles.length} files`);
// Convert to note objects with just path and name
const notes = allFiles.map(filePath => ({
path: filePath,
name: filePath.split("/").pop().replace(".md", ""),
folder: filePath.includes("/") ? filePath.substring(0, filePath.lastIndexOf("/")) : ""
}));
// Sort by path
notes.sort((a, b) => a.path.localeCompare(b.path));
return notes;
}
return { return {
init, init,
config, config,
@ -509,7 +528,8 @@ Add your lore here...
findNoteByFmgId, findNoteByFmgId,
generateNoteTemplate, generateNoteTemplate,
searchNotes, searchNotes,
listAllNotes listAllNotes,
listAllNotePaths
}; };
})(); })();

View file

@ -300,16 +300,19 @@ async function promptCreateNewNote(elementId, elementType, coordinates) {
}; };
const showBrowse = async () => { const showBrowse = async () => {
resultsDiv.innerHTML = "<p>Loading all notes...</p>"; resultsDiv.innerHTML = "<p>Loading file list...</p>";
try { try {
const allNotes = await ObsidianBridge.listAllNotes(); // Use fast path-only listing (doesn't read file contents)
const allNotes = await ObsidianBridge.listAllNotePaths();
if (allNotes.length === 0) { if (allNotes.length === 0) {
resultsDiv.innerHTML = "<p style='color: #999;'>No notes in vault</p>"; resultsDiv.innerHTML = "<p style='color: #999;'>No notes in vault</p>";
return; return;
} }
INFO && console.log(`Displaying ${allNotes.length} notes in folder tree`);
// Build folder tree // Build folder tree
const tree = buildFolderTree(allNotes); const tree = buildFolderTree(allNotes);
resultsDiv.innerHTML = renderFolderTree(tree, allNotes); resultsDiv.innerHTML = renderFolderTree(tree, allNotes);
@ -321,12 +324,15 @@ async function promptCreateNewNote(elementId, elementType, coordinates) {
$("#alert").dialog("close"); $("#alert").dialog("close");
try { try {
const note = allNotes[index]; const note = allNotes[index];
// Read the file content only when clicked
const content = await ObsidianBridge.getNote(note.path); const content = await ObsidianBridge.getNote(note.path);
const {frontmatter} = ObsidianBridge.parseFrontmatter(content);
resolve({ resolve({
path: note.path, path: note.path,
name: note.name, name: note.name,
content, content,
frontmatter: note.frontmatter frontmatter
}); });
} catch (error) { } catch (error) {
reject(error); reject(error);