import { RACE_HUB_DATASETS, formatCoverageHint } from '../lib/coverage' import { SourceBadge } from './SourceBadge' import { SessionCoverageDots } from './SessionCoverageDots' import { CliCommands, ingestMeetingCommands, ingestSessionCommands, } from './CliCommands' import type { Weekend, WeekendSession } from '../types' interface Props { weekend: Weekend } export function MeetingDetailPanel({ weekend }: Props) { const { meeting, sessions, source } = weekend return (
{meeting.meeting_name}
{meeting.country_name} · meeting_key {meeting.meeting_key}
{sessions.length} session{sessions.length === 1 ? '' : 's'} stored locally
{sessions.length === 0 ? (
No sessions ingested for this meeting. Run{' '} box-box --ingest-meeting {meeting.meeting_key}
) : ( sessions.map((entry) => ( )) )}
Ingest Commands
) } function SessionDetailBlock({ entry }: { entry: WeekendSession }) { const { session, source, datasets } = entry const coverage = formatCoverageHint(datasets) return (
{session.session_name} {session.session_key} {coverage}
{RACE_HUB_DATASETS.map((key) => { const info = datasets[key] const available = info?.status === 'available' return ( ) })}
Dataset Status Records
{key} {info?.status === 'available' ? ( Local ) : info?.status === 'skipped' ? ( N/A ) : ( Missing )} {info?.count != null ? info.count : '—'}
) }