async function runAnalysis() { const query = document.getElementById('query').value; const lastPrivate = document.getElementById('last-private').value; // NEW STRUCTURING INPUTS const ipoDiscount = document.getElementById('ipo-discount').value; const greenshoe = document.getElementById('greenshoe').checked; const primaryShares = document.getElementById('primary-shares').value; const loader = document.getElementById('loader'); const dashboard = document.getElementById('dashboard'); // UI State: Loading dashboard.style.display = 'none'; loader.style.display = 'block'; // Prepare form data const formData = new FormData(); formData.append('query', query); if (lastPrivate) formData.append('last_private', lastPrivate); // Append Structuring Levers formData.append('ipo_discount', ipoDiscount); formData.append('greenshoe', greenshoe); formData.append('primary_shares', primaryShares); // NEW: Capture Target Raise const targetRaise = document.getElementById('target-raise').value; formData.append('target_raise', targetRaise); try { const response = await fetch('/analyze', { method: 'POST', body: formData }); if (!response.ok) { const errorText = await response.text(); throw new Error(`Server Error (${response.status}): ${errorText}`); } const data = await response.json(); if (data.error) { alert("Analysis failed: " + data.error); return; } updateDashboard(data); // UI State: Done loader.style.display = 'none'; dashboard.style.display = 'flex'; // Flex layout } catch (e) { console.error(e); alert("System Error: " + e.message); loader.style.display = 'none'; } } function updateDashboard(data) { // 1. Executive Commentary if (data.advisory) { document.getElementById('exec-summary-content').innerHTML = data.advisory.commentary; document.getElementById('m-price').textContent = `$${data.advisory.low} - $${data.advisory.high}`; const statusEl = document.getElementById('m-status'); statusEl.textContent = data.advisory.sentiment; statusEl.style.color = data.advisory.color; // --- METRICS --- document.getElementById('m-momentum').textContent = (data.metrics.avg_momentum ? data.metrics.avg_momentum.toFixed(1) + "%" : "--"); document.getElementById('m-beta').textContent = (data.metrics.avg_beta ? data.metrics.avg_beta.toFixed(2) : "--"); document.getElementById('m-rule-40').textContent = (data.metrics.avg_rule_40 ? data.metrics.avg_rule_40.toFixed(0) : "--"); document.getElementById('m-vix').textContent = (data.macro ? data.macro.vix.toFixed(2) : "--"); // --- RISK CHECKLIST --- const riskBody = document.querySelector('#risk-table tbody'); if (riskBody && data.advisory.risk_matrix) { riskBody.innerHTML = ''; data.advisory.risk_matrix.forEach(r => { const row = `
| Group | Shares (M) | % Own |
|---|---|---|
| Existing | ${existingShares.toFixed(2)} | ${((existingShares / totalShares) * 100).toFixed(1)}% |
| New Investors | ${newShares.toFixed(2)} | ${((newShares / totalShares) * 100).toFixed(1)}% |
| Total | ${totalShares.toFixed(2)} | 100% |