================================================================================ AGENT 7 - THUMBNAIL GENERATION CODE CHANGES File: /home/setup/navidocs/client/src/views/DocumentView.vue ================================================================================ CHANGE 1: Add State Variables (Insert after line ~380, after searchStats computed) ================================================================================ // Thumbnail cache and state for search results const thumbnailCache = new Map() // pageNum -> dataURL const thumbnailLoading = ref(new Set()) // Track which thumbnails are currently loading ================================================================================ CHANGE 2: Add Thumbnail Functions (Insert after makeTocEntriesClickable(), before renderPage()) ================================================================================ /** * Generate thumbnail for a specific page * @param {number} pageNum - Page number to generate thumbnail for * @returns {Promise} Data URL of the thumbnail image */ async function generateThumbnail(pageNum) { // Check cache first if (thumbnailCache.has(pageNum)) { return thumbnailCache.get(pageNum) } // Check if already loading if (thumbnailLoading.value.has(pageNum)) { // Wait for the thumbnail to be generated return new Promise((resolve) => { const checkInterval = setInterval(() => { if (thumbnailCache.has(pageNum)) { clearInterval(checkInterval) resolve(thumbnailCache.get(pageNum)) } }, 100) }) } // Mark as loading thumbnailLoading.value.add(pageNum) try { if (!pdfDoc) { throw new Error('PDF document not loaded') } const page = await pdfDoc.getPage(pageNum) // Use small scale for thumbnail (0.2 = 20% of original size) // This produces roughly 80x100px thumbnails for standard letter-sized pages const viewport = page.getViewport({ scale: 0.2 }) // Create canvas for thumbnail rendering const canvas = document.createElement('canvas') const context = canvas.getContext('2d', { alpha: false }) if (!context) { throw new Error('Failed to get canvas context for thumbnail') } canvas.width = viewport.width canvas.height = viewport.height // Render page to canvas await page.render({ canvasContext: context, viewport: viewport }).promise // Convert canvas to data URL const dataURL = canvas.toDataURL('image/png', 0.8) // 0.8 quality for smaller file size // Cache the thumbnail thumbnailCache.set(pageNum, dataURL) return dataURL } catch (err) { console.error(`Failed to generate thumbnail for page ${pageNum}:`, err) // Return a placeholder or empty data URL return '' } finally { // Remove from loading set thumbnailLoading.value.delete(pageNum) } } /** * Check if a thumbnail is currently being generated * @param {number} pageNum - Page number to check * @returns {boolean} True if thumbnail is loading */ function isThumbnailLoading(pageNum) { return thumbnailLoading.value.has(pageNum) } /** * Get thumbnail for a page, generating if needed * @param {number} pageNum - Page number * @returns {Promise} Data URL of thumbnail */ async function getThumbnail(pageNum) { return await generateThumbnail(pageNum) } /** * Clear thumbnail cache (useful when document changes) */ function clearThumbnailCache() { thumbnailCache.clear() thumbnailLoading.value.clear() } ================================================================================ CHANGE 3: Update resetDocumentState() Function ================================================================================ Find the resetDocumentState() function and add this line at the beginning: async function resetDocumentState() { clearImages() clearThumbnailCache() // ADD THIS LINE // ... rest of existing code } ================================================================================ TEMPLATE EXAMPLE: Search Results with Thumbnails ================================================================================
+ {{ hitList.length - 10 }} more matches
================================================================================ CSS ADDITIONS (Add to