// === 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}
${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 = `
${messagesHtml}
${postsHtml}
${manifestosHtml}
`;
} 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);
};