fix(web): resolve practice/qualifying partial session bug by flagging starting_grid as N/A

This commit is contained in:
2026-05-25 14:33:14 -04:00
parent 937674f808
commit e060bcba24
9 changed files with 43 additions and 9 deletions

View File

@@ -70,6 +70,8 @@ export function DatasetStatusView({ datasets }: Props) {
<td>
{info?.status === 'available' ? (
<span className="badge badge-local">Local</span>
) : info?.status === 'skipped' ? (
<span className="badge badge-none">N/A</span>
) : (
<span className="badge badge-none">Missing</span>
)}

View File

@@ -19,9 +19,9 @@ export function DatasetStrip({ datasets }: Props) {
<div className="dataset-strip">
{keys.map((key) => {
const info = datasets[key]
const available = info?.status === 'available'
const available = info?.status === 'available' || info?.status === 'skipped'
return (
<div key={key} className="ds-item" title={info ? `${info.source} · ${info.count ?? 0} rows` : 'missing'}>
<div key={key} className="ds-item" title={info ? `${info.status === 'skipped' ? 'N/A' : info.source} · ${info.count ?? 0} rows` : 'missing'}>
<div className={`ds-dot ${available ? 'ds-dot-local' : 'ds-dot-missing'}`} />
<span>{DATASET_LABELS[key]}</span>
{available && info.count != null && info.count > 0 && (

View File

@@ -82,9 +82,11 @@ function SessionDetailBlock({ entry }: { entry: WeekendSession }) {
<td className="mono" style={{ color: 'var(--text-2)' }}>
{key}
</td>
<td>
{available ? (
<td>
{info?.status === 'available' ? (
<span className="badge badge-local">Local</span>
) : info?.status === 'skipped' ? (
<span className="badge badge-none">N/A</span>
) : (
<span className="badge badge-none">Missing</span>
)}

View File

@@ -9,7 +9,7 @@ export function SessionCoverageDots({ datasets }: Props) {
return (
<span className="coverage-dots" aria-hidden="true">
{RACE_HUB_DATASETS.map((key) => {
const available = datasets[key]?.status === 'available'
const available = datasets[key]?.status === 'available' || datasets[key]?.status === 'skipped'
return <span key={key} className={`coverage-dot ${available ? 'on' : 'off'}`} />
})}
</span>

View File

@@ -18,7 +18,10 @@ export type RaceHubDatasetKey = (typeof RACE_HUB_DATASETS)[number]
export function countRaceHubDatasets(datasets: Record<string, DatasetInfo>): { available: number; total: number } {
const total = RACE_HUB_DATASETS.length
const available = RACE_HUB_DATASETS.filter((key) => datasets[key]?.status === 'available').length
const available = RACE_HUB_DATASETS.filter((key) => {
const status = datasets[key]?.status
return status === 'available' || status === 'skipped'
}).length
return { available, total }
}

View File

@@ -1,6 +1,6 @@
export interface DatasetInfo {
status: 'available' | 'missing'
source: 'local' | 'openf1' | 'none'
status: 'available' | 'missing' | 'skipped'
source: 'local' | 'openf1' | 'none' | 'na'
count?: number
}

View File

@@ -1,5 +1,7 @@
package query
import "strings"
const (
DatasetStatusAvailable = "available"
DatasetStatusMissing = "missing"
@@ -20,6 +22,25 @@ type DatasetInfo struct {
Count int `json:"count,omitempty"`
}
func skippedNA() DatasetInfo {
return DatasetInfo{
Status: "skipped",
Source: "na",
Count: 0,
}
}
func isGridExpected(sessionType, sessionName string) bool {
t := strings.ToLower(sessionType)
n := strings.ToLower(sessionName)
// Grid is only expected on main Sprint or Race sessions, not qualifying, practice, or shootout
return (strings.Contains(t, "race") || strings.Contains(n, "race") ||
strings.Contains(t, "sprint") || strings.Contains(n, "sprint")) &&
!strings.Contains(t, "qualifying") && !strings.Contains(n, "qualifying") &&
!strings.Contains(t, "shootout") && !strings.Contains(n, "shootout") &&
!strings.Contains(t, "practice") && !strings.Contains(n, "practice")
}
func availableLocal(count int) DatasetInfo {
return DatasetInfo{
Status: DatasetStatusAvailable,

View File

@@ -64,8 +64,12 @@ func (s *Service) GetWeekend(meetingKey int) (Weekend, error) {
return Weekend{}, err
}
datasets := datasetsFromCounts(true, true, counts)
sessionModel := sessionToModel(sess)
if datasets["starting_grid"].Status == DatasetStatusMissing && !isGridExpected(sessionModel.SessionType, sessionModel.SessionName) {
datasets["starting_grid"] = skippedNA()
}
out.Sessions = append(out.Sessions, WeekendSession{
Session: sessionToModel(sess),
Session: sessionModel,
Source: responseSource(datasets),
Datasets: datasets,
})

View File

@@ -166,6 +166,8 @@ func (s *Service) GetRaceHub(sessionKey int) (RaceHub, error) {
}
hub.StartingGrid = enriched
hub.Datasets["starting_grid"] = availableLocal(len(enriched))
} else if !isGridExpected(sessionModel.SessionType, sessionModel.SessionName) {
hub.Datasets["starting_grid"] = skippedNA()
}
stints, err := s.store.ListStints(sessionKey)