import { createClient } from 'https://cdn.jsdelivr.net/npm/@supabase/supabase-js/+esm'; const env = document.getElementById('supabase-env'); const supabaseUrl = env.dataset.url; const supabaseKey = env.dataset.key; const supabase = createClient(supabaseUrl, supabaseKey); const promptContainer = document.getElementById('prompt-container'); const errorBox = document.getElementById('prompt-error'); const formatDate = (dateStr) => { if (!dateStr) return "–"; const date = new Date(dateStr); return isNaN(date.getTime()) ? "Invalid date" : date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric', }); }; function renderPromptCard(prompt) { const sortedTags = (prompt.tags ?? []).slice().sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()) ); const tagSpans = sortedTags.map(tag => `${tag}` ).join(''); const escapedDescription = (prompt.description ?? '').replace(/\n/g, '
'); const notes = prompt.notes ?? ''; return `

${prompt.title}

${prompt.type}

${notes}

${tagSpans}
View Details

Prompt

Edit

${escapedDescription}


Created: ${formatDate(prompt.created_at)} • Updated: ${formatDate(prompt.updated_at)}

`; } function updateFiltersFromTags(prompts) { const sortedTags = Array.from(new Set( prompts.flatMap(p => p.tags ?? []) )).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())); const tagSet = new Set(sortedTags); const tagContainer = document.querySelector('#filters fieldset > div'); if (!tagContainer) return; tagContainer.innerHTML = ''; tagSet.forEach(tag => { const label = document.createElement('label'); label.className = "relative inline-flex items-center cursor-pointer"; label.innerHTML = ` ${tag} `; tagContainer.appendChild(label); }); } function filterCards() { const form = document.getElementById('filter-form'); const cards = document.querySelectorAll('.prompt-card'); const params = new URLSearchParams(new FormData(form)); const type = params.get('type'); const query = params.get('q')?.toLowerCase() || ''; const tagParams = params.getAll('tag'); let visibleCount = 0; cards.forEach(card => { const cardType = card.dataset.type; const cardTags = card.dataset.tags.split(','); const cardText = card.innerText.toLowerCase(); const matchesType = !type || type === cardType; const matchesTags = tagParams.length === 0 || tagParams.some(t => cardTags.includes(t)); const matchesSearch = !query || cardText.includes(query); const show = matchesType && matchesTags && matchesSearch; card.style.display = show ? 'block' : 'none'; if (show) visibleCount++; }); const countLabel = document.getElementById('prompt-count'); if (countLabel) { countLabel.textContent = visibleCount === 1 ? '1 prompt shown' : `${visibleCount} prompts shown`; } } async function loadPrompts() { const { data: prompts, error } = await supabase.from('prompts').select('*').order('title'); if (error) { promptContainer.innerHTML = ''; errorBox.textContent = error.message; errorBox.classList.remove('hidden'); return; } promptContainer.innerHTML = prompts.map(renderPromptCard).join(''); updateFiltersFromTags(prompts); filterCards(); // initial run const form = document.getElementById('filter-form'); form?.addEventListener('input', filterCards); const clearBtn = document.getElementById('clear-filters'); clearBtn?.addEventListener('click', () => { form.reset(); filterCards(); }); } document.addEventListener('DOMContentLoaded', loadPrompts);