diff --git a/index.html b/index.html index 1a7b2bd0..71b80876 100644 --- a/index.html +++ b/index.html @@ -8281,8 +8281,8 @@ - - + + diff --git a/modules/io/obsidian-bridge.js b/modules/io/obsidian-bridge.js index 1d8325fc..06643621 100644 --- a/modules/io/obsidian-bridge.js +++ b/modules/io/obsidian-bridge.js @@ -396,6 +396,66 @@ Add your lore here... `; } + // Search notes by text query (searches in filename and frontmatter) + async function searchNotes(query) { + if (!query || query.trim() === "") { + return []; + } + + const allFiles = await getVaultFiles(); + const searchTerm = query.toLowerCase(); + const results = []; + + for (const filePath of allFiles) { + const fileName = filePath.split("/").pop().replace(".md", "").toLowerCase(); + + // Check if filename matches + if (fileName.includes(searchTerm)) { + try { + const content = await getNote(filePath); + const {frontmatter} = parseFrontmatter(content); + + results.push({ + path: filePath, + name: filePath.split("/").pop().replace(".md", ""), + frontmatter, + matchType: "filename" + }); + } catch (error) { + WARN && console.warn(`Could not read file ${filePath}:`, error); + } + } + } + + return results; + } + + // List all notes with basic info + async function listAllNotes() { + const allFiles = await getVaultFiles(); + const notes = []; + + for (const filePath of allFiles) { + try { + const content = await getNote(filePath); + const {frontmatter} = parseFrontmatter(content); + + notes.push({ + path: filePath, + name: filePath.split("/").pop().replace(".md", ""), + frontmatter, + folder: filePath.includes("/") ? filePath.substring(0, filePath.lastIndexOf("/")) : "" + }); + } catch (error) { + WARN && console.warn(`Could not read file ${filePath}:`, error); + } + } + + // Sort by path + notes.sort((a, b) => a.path.localeCompare(b.path)); + return notes; + } + return { init, config, @@ -408,7 +468,9 @@ Add your lore here... parseFrontmatter, findNotesByCoordinates, findNoteByFmgId, - generateNoteTemplate + generateNoteTemplate, + searchNotes, + listAllNotes }; })(); diff --git a/modules/ui/obsidian-notes-editor.js b/modules/ui/obsidian-notes-editor.js index 78fa133e..b034bb6a 100644 --- a/modules/ui/obsidian-notes-editor.js +++ b/modules/ui/obsidian-notes-editor.js @@ -153,21 +153,49 @@ async function promptCreateNewNote(elementId, elementType, coordinates) { const element = getElementData(elementId, elementType); const suggestedName = element.name || `${elementType}-${element.i}`; + // Build context info for the element + let contextInfo = ""; + if (element.state) { + contextInfo += `
No matching notes found. Create a new note in your Obsidian vault?
-${element.name || elementId}
+ ${contextInfo} +No matching notes found by coordinates.
Or create a new note:
+Enter a search term
"; + return; + } + + resultsDiv.innerHTML = "Searching...
"; + + try { + const results = await ObsidianBridge.searchNotes(query); + + if (results.length === 0) { + resultsDiv.innerHTML = "No matching notes found
"; + return; + } + + resultsDiv.innerHTML = results + .map( + (note, index) => ` +Search failed: ${error.message}
`; + } + }; + + const showBrowse = async () => { + resultsDiv.innerHTML = "Loading all notes...
"; + + try { + const allNotes = await ObsidianBridge.listAllNotes(); + + if (allNotes.length === 0) { + resultsDiv.innerHTML = "No notes in vault
"; + return; + } + + resultsDiv.innerHTML = allNotes + .map( + (note, index) => ` +Failed to load notes: ${error.message}
`; + } + }; + + searchBtn.addEventListener("click", performSearch); + browseBtn.addEventListener("click", showBrowse); + searchInput.addEventListener("keypress", e => { + if (e.key === "Enter") performSearch(); + }); }); } @@ -213,10 +363,35 @@ function getElementData(elementId, elementType) { // Extract element data based on type if (elementType === "burg") { const burgId = parseInt(elementId.replace("burg", "")); - return pack.burgs[burgId]; + const burg = pack.burgs[burgId]; + + // Enhance with state and province names + const stateId = burg.state; + const provinceId = burg.province; + + return { + ...burg, + state: stateId && pack.states[stateId] ? pack.states[stateId].name : null, + province: provinceId && pack.provinces[provinceId] ? pack.provinces[provinceId].name : null + }; } else if (elementType === "marker") { const markerId = parseInt(elementId.replace("marker", "")); - return pack.markers[markerId]; + const marker = pack.markers[markerId]; + + // Enhance with state and province if marker has a cell + if (marker.cell) { + const cell = pack.cells; + const stateId = cell.state[marker.cell]; + const provinceId = cell.province[marker.cell]; + + return { + ...marker, + state: stateId && pack.states[stateId] ? pack.states[stateId].name : null, + province: provinceId && pack.provinces[provinceId] ? pack.provinces[provinceId].name : null + }; + } + + return marker; } else { // Generic element const el = document.getElementById(elementId);