diff --git a/frontend/src/components/DatasetStatusView.tsx b/frontend/src/components/DatasetStatusView.tsx
index 70c5d26..6906352 100644
--- a/frontend/src/components/DatasetStatusView.tsx
+++ b/frontend/src/components/DatasetStatusView.tsx
@@ -70,6 +70,8 @@ export function DatasetStatusView({ datasets }: Props) {
{info?.status === 'available' ? (
Local
+ ) : info?.status === 'skipped' ? (
+ N/A
) : (
Missing
)}
diff --git a/frontend/src/components/DatasetStrip.tsx b/frontend/src/components/DatasetStrip.tsx
index 5be0090..99bdcf2 100644
--- a/frontend/src/components/DatasetStrip.tsx
+++ b/frontend/src/components/DatasetStrip.tsx
@@ -19,9 +19,9 @@ export function DatasetStrip({ datasets }: Props) {
{keys.map((key) => {
const info = datasets[key]
- const available = info?.status === 'available'
+ const available = info?.status === 'available' || info?.status === 'skipped'
return (
-
+
{DATASET_LABELS[key]}
{available && info.count != null && info.count > 0 && (
diff --git a/frontend/src/components/MeetingDetailPanel.tsx b/frontend/src/components/MeetingDetailPanel.tsx
index ed55676..aa229a0 100644
--- a/frontend/src/components/MeetingDetailPanel.tsx
+++ b/frontend/src/components/MeetingDetailPanel.tsx
@@ -82,9 +82,11 @@ function SessionDetailBlock({ entry }: { entry: WeekendSession }) {
{key}
|
-
- {available ? (
+ |
+ {info?.status === 'available' ? (
Local
+ ) : info?.status === 'skipped' ? (
+ N/A
) : (
Missing
)}
diff --git a/frontend/src/components/SessionCoverageDots.tsx b/frontend/src/components/SessionCoverageDots.tsx
index 8cd77e3..1cfb33b 100644
--- a/frontend/src/components/SessionCoverageDots.tsx
+++ b/frontend/src/components/SessionCoverageDots.tsx
@@ -9,7 +9,7 @@ export function SessionCoverageDots({ datasets }: Props) {
return (
{RACE_HUB_DATASETS.map((key) => {
- const available = datasets[key]?.status === 'available'
+ const available = datasets[key]?.status === 'available' || datasets[key]?.status === 'skipped'
return
})}
diff --git a/frontend/src/lib/coverage.ts b/frontend/src/lib/coverage.ts
index 575c572..63d5896 100644
--- a/frontend/src/lib/coverage.ts
+++ b/frontend/src/lib/coverage.ts
@@ -18,7 +18,10 @@ export type RaceHubDatasetKey = (typeof RACE_HUB_DATASETS)[number]
export function countRaceHubDatasets(datasets: Record): { 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 }
}
diff --git a/frontend/src/types.ts b/frontend/src/types.ts
index cae761a..edb5c54 100644
--- a/frontend/src/types.ts
+++ b/frontend/src/types.ts
@@ -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
}
diff --git a/internal/query/metadata.go b/internal/query/metadata.go
index 9e38fe2..735fa50 100644
--- a/internal/query/metadata.go
+++ b/internal/query/metadata.go
@@ -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,
diff --git a/internal/query/navigation.go b/internal/query/navigation.go
index e3325a7..b3697db 100644
--- a/internal/query/navigation.go
+++ b/internal/query/navigation.go
@@ -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,
})
diff --git a/internal/query/racehub.go b/internal/query/racehub.go
index 3f0b4df..688a5ae 100644
--- a/internal/query/racehub.go
+++ b/internal/query/racehub.go
@@ -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)
| |