import { apiGet } from '../api.js'; import { getRole, pageHeaderHTML, showToast } from '../app.js'; export async function homeDashboardPage() { const app = document.getElementById('app'); const role = getRole(); const isAdmin = role === 'admin'; app.innerHTML = ` ${pageHeaderHTML('Dashboard', '', { subtitle: `Overview for your ${role === 'admin' ? 'organization' : 'supervised counselors'}`, })}
`; try { const ov = await apiGet('analytics.php?overview=1'); renderHomeDashboard(ov, isAdmin); } catch (e) { showToast(e.message, 'error'); document.getElementById('homeDashboardContent').innerHTML = `

${esc(e.message)}

`; } } function renderHomeDashboard(ov, isAdmin) { const el = document.getElementById('homeDashboardContent'); const qPreview = (ov.questionnaires || []).slice(0, 6).map(q => ` ${esc(q.name)} ${q.completedCount ?? 0} / ${q.eligibleCount ?? 0} ${q.completionRatio ?? 0}% `).join(''); const links = [ { href: '#/questionnaires', label: 'Questionnaires', desc: 'Edit forms, order, and categories' }, { href: '#/clients', label: 'Clients', desc: 'Client codes, counselors, response history' }, { href: '#/coaches', label: 'Counselor activity', desc: 'Uploads and workload per counselor' }, { href: '#/insights', label: 'Insights', desc: 'Charts, completion rates, follow-up' }, { href: '#/export', label: 'Export data', desc: 'Download CSV and bundles' }, { href: '#/assignments', label: 'Assign clients', desc: 'Move clients between counselors' }, { href: '#/users', label: 'Users', desc: 'Admins, supervisors, and counselors' }, { href: '#/translations', label: 'Translations', desc: 'German source and other languages' }, ]; if (isAdmin) { links.push({ href: '#/dev', label: 'Admin settings', desc: 'Dev import, exports, database tools' }); } const scoringProfiles = ov.scoringProfiles || []; const primaryProfile = scoringProfiles[0]; const greenPct = primaryProfile && primaryProfile.clientCount ? Math.round(((primaryProfile.bands?.green ?? 0) / primaryProfile.clientCount) * 100) : null; el.innerHTML = `
${ov.clientCount ?? 0}
Clients
${ov.clientsWithCompletions ?? 0}
With completions
${ov.submissionsLast7d ?? 0}
Uploads (7 days)
${ov.submissionsLast30d ?? 0}
Uploads (30 days)
${primaryProfile ? `
${primaryProfile.clientCount ?? 0}
${esc(primaryProfile.name)} scored
` : ''} ${greenPct != null ? `
${greenPct}%
Green (${esc(primaryProfile.name)})
` : ''}

Quick links

Questionnaire completion

Full report
${(ov.questionnaires || []).length ? `
${qPreview}${(ov.questionnaires.length > 6) ? `` : ''}
QuestionnaireCompletedRate
+ ${ov.questionnaires.length - 6} more — see Insights
` : '

No active questionnaires.

'}
`; } function esc(s) { const d = document.createElement('div'); d.textContent = s ?? ''; return d.innerHTML; }