// search.js - Complete MiniSearch implementation with artifacts import { renderSearchTags } from './tags.js'; // Use global areasData (loaded in index.html
) const areasData = window.areasData; let miniSearch; let allArtifacts; // Helper to create and populate a MiniSearch instance function createMiniSearchIndex(data, storeFields) { const search = new MiniSearch({ fields: ['title', 'description', 'areas', 'topics'], storeFields: storeFields }); search.addAll(data); return search; } // Initialize search export async function initializeSearch(artifactsData) { allArtifacts = artifactsData; // Prepare data for MiniSearch const searchData = allArtifacts.map((artifact, index) => ({ id: index, title: artifact.title, description: artifact.description, type: artifact.type, areas: (artifact.areas || []).join(' '), topics: (artifact.topics || []).join(' '), url: artifact.url, date: artifact.date })); // Initialize MiniSearch for artifacts miniSearch = createMiniSearchIndex(searchData, ['title', 'description', 'type', 'areas', 'topics', 'url', 'date']); } export function searchContent(query) { if (!query || query.trim().length < 2) { return { artifacts: [] }; } const artifactResults = miniSearch.search(query, { prefix: true, fuzzy: 0.2, boost: { title: 2, description: 1 } }); return { artifacts: artifactResults }; } // Helper functions function getAreaDisplayName(area) { return areasData[area]?.title || area; } function getSubAreaDisplayName(areaId, subArea) { const area = areasData[areaId]; if (!area || !area.subAreas) return subArea; const subAreaData = area.subAreas[subArea]; return typeof subAreaData === 'string' ? subAreaData : subAreaData?.name || subArea; } // Search UI export function initializeSearchUI(artifactsData) { initializeSearch(artifactsData); const searchInput = document.getElementById('search-input'); const searchResults = document.getElementById('search-results'); if (!searchInput || !searchResults) return; let searchTimeout; // Function to perform search function performSearch() { const query = searchInput.value.trim(); if (query.length < 2) { searchResults.innerHTML = `Enter a search term...
Enter a search term...
No results found for "${query}"