// === TAG EXPLORER FIX (With Data Loading) === window.showTagExplorer = async function(tag) { var modal = document.getElementById('tagExplorerModal'); var content = document.getElementById('tagExplorerContent'); if (!modal || !content) return; modal.classList.add('active'); content.innerHTML = '
Scanning database for #' + escapeHtml(tag) + '...
'; try { var tagLower = tag.toLowerCase(); // 1. Get IDs from Tag Tables var results = await Promise.all([ supabase.from('sloppygram_message_tags').select('message_id').or('tag.ilike.' + tag + ',parent_tag.ilike.' + tag).limit(50), supabase.from('sloppygram_post_tags').select('post_id').or('tag.ilike.' + tag + ',parent_tag.ilike.' + tag).limit(50), supabase.from('sloppygram_manifesto_tags').select('manifesto_id').or('tag.ilike.' + tag + ',parent_tag.ilike.' + tag).limit(50) ]); var messageIds = (results[0].data || []).map(t => t.message_id); var postIds = (results[1].data || []).map(t => t.post_id); var manifestoIds = (results[2].data || []).map(t => t.manifesto_id); // 2. Fetch Content + RELATED DATA var [messagesRes, postsRes, manifestosRes] = await Promise.all([ messageIds.length > 0 ? supabase.from('sloppygram_messages').select('*').in('id', messageIds).order('created_at', { ascending: false }) : { data: [] }, postIds.length > 0 ? supabase.from('sloppygram_posts').select('*').in('id', postIds).order('created_at', { ascending: false }) : { data: [] }, manifestoIds.length > 0 ? supabase.from('sloppygram_manifestos').select('*').in('id', manifestoIds).order('created_at', { ascending: false }) : { data: [] } ]); var matchingMessages = messagesRes.data || []; var matchingPosts = postsRes.data || []; var matchingManifestos = manifestosRes.data || []; // 3. CRITICAL FIX: Load Votes/Comments for these posts if (postIds.length > 0) { await loadPostRelatedData(postIds); } // 4. Render Messages var messagesHtml = ''; if (matchingMessages.length > 0) { messagesHtml = '
' + matchingMessages.map(function(msg) { var time = new Date(msg.created_at).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); var avatar = msg.avatar_url ? `` : (msg.avatar || '👤'); return `
${avatar}
${escapeHtml(msg.username)} ${time}
${parseHackerMarkup(parseChatTags(msg.content || ''))}
`; }).join('') + '
'; } else { messagesHtml = '
No messages found
'; } // 5. Render Posts var postsHtml = ''; if (matchingPosts.length > 0) { postsHtml = '
' + matchingPosts.map(p => renderPostCard(p)).join('') + '
'; } else { postsHtml = '
No posts found
'; } // 6. Render Manifestos var manifestosHtml = ''; if (matchingManifestos.length > 0) { manifestosHtml = '
' + matchingManifestos.map(m => renderManifestoCard(m)).join('') + '
'; } else { manifestosHtml = '
No manifestos found
'; } // 7. Update Modal UI content.innerHTML = `
#${escapeHtml(tag)}
${messagesHtml}
`; } catch (err) { console.error('[TagExplorer] Error:', err); content.innerHTML = '
Error: ' + err.message + '
'; } }; // Helper for tab switching window.switchTagExplorerTab = function(tab, btn) { document.querySelectorAll('.tag-explorer-tabs .tag-tab').forEach(t => t.classList.remove('active')); btn.classList.add('active'); document.getElementById('tagExplorerMessages').style.display = tab === 'messages' ? 'block' : 'none'; document.getElementById('tagExplorerPosts').style.display = tab === 'posts' ? 'block' : 'none'; document.getElementById('tagExplorerManifestos').style.display = tab === 'manifestos' ? 'block' : 'none'; }; // Helper for global filter window.setGlobalTagFilter = function(tag) { closeTagExplorer(); filterByTag(tag); };