const form = document.querySelector('#analysis-form'); const button = document.querySelector('#analyze-button'); const errorBox = document.querySelector('#error-message'); const results = document.querySelector('#dashboard'); function expandHome(path) { return path.trim(); } function render(data) { document.querySelectorAll('[data-field]').forEach((element) => { const value = data[element.dataset.field]; element.textContent = value ?? '—'; }); const score = data.score; document.querySelector('#health-score').textContent = score == null ? '—' : `${score}%`; document.querySelector('#score-ring').style.setProperty('--score', score ?? 0); document.querySelector('#health-message').textContent = score == null ? 'Not enough data yet' : score >= 95 ? 'Looking excellent' : score >= 80 ? 'A few things need attention' : 'Review recommended'; document.querySelector('#score-basis').textContent = data.score_basis; document.querySelector('#analysis-time').textContent = `Completed ${new Date().toLocaleTimeString([], {hour: '2-digit', minute: '2-digit'})}`; results.hidden = false; results.scrollIntoView({behavior: 'smooth', block: 'start'}); } form.addEventListener('submit', async (event) => { event.preventDefault(); errorBox.hidden = true; button.disabled = true; button.querySelector('span').textContent = 'Analyzing safely…'; const roots = document.querySelector('#reference-roots').value .split('\n').map((value) => value.trim()).filter(Boolean); try { const response = await fetch('/api/analyze', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ serato: expandHome(document.querySelector('#serato-path').value), music: expandHome(document.querySelector('#music-path').value), reference_roots: roots, }), }); const data = await response.json(); if (!response.ok) throw new Error(data.error || 'Analysis failed'); render(data); } catch (error) { errorBox.textContent = error.message; errorBox.hidden = false; } finally { button.disabled = false; button.querySelector('span').textContent = 'Analyze library'; } });