fix: add loading state, widen nullable types, add API response guard in TrainResultsView
This commit is contained in:
parent
b077371107
commit
13d1a394d5
1 changed files with 13 additions and 5 deletions
|
|
@ -10,6 +10,8 @@
|
||||||
<button class="btn-retry" @click="loadResults">Retry</button>
|
<button class="btn-retry" @click="loadResults">Retry</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div v-if="loading" class="loading-state" aria-live="polite">Loading…</div>
|
||||||
|
|
||||||
<div v-if="!error && results.length === 0 && !loading" class="empty-notice">
|
<div v-if="!error && results.length === 0 && !loading" class="empty-notice">
|
||||||
No training results yet. Completed jobs will appear here.
|
No training results yet. Completed jobs will appear here.
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -68,10 +70,10 @@ interface TrainResult {
|
||||||
job_id: string
|
job_id: string
|
||||||
model_type: string
|
model_type: string
|
||||||
base_model: string
|
base_model: string
|
||||||
val_macro_f1: number
|
val_macro_f1: number | null
|
||||||
val_accuracy: number
|
val_accuracy: number | null
|
||||||
sample_count: number
|
sample_count: number
|
||||||
duration_seconds: number
|
duration_seconds: number | null
|
||||||
created_at: string
|
created_at: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -88,8 +90,8 @@ async function loadResults() {
|
||||||
error.value = `Failed to load results (HTTP ${res.status}).`
|
error.value = `Failed to load results (HTTP ${res.status}).`
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const data = await res.json() as { results: TrainResult[] }
|
const raw = await res.json() as { results?: TrainResult[] }
|
||||||
results.value = data.results ?? []
|
results.value = Array.isArray(raw?.results) ? raw.results : []
|
||||||
} catch {
|
} catch {
|
||||||
error.value = 'Network error loading results.'
|
error.value = 'Network error loading results.'
|
||||||
} finally {
|
} finally {
|
||||||
|
|
@ -193,6 +195,12 @@ onMounted(() => loadResults())
|
||||||
border-radius: var(--radius-md, 0.5rem);
|
border-radius: var(--radius-md, 0.5rem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.loading-state {
|
||||||
|
color: var(--color-text-muted, #4a5c7a);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
padding: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
.results-table-wrap { overflow-x: auto; }
|
.results-table-wrap { overflow-x: auto; }
|
||||||
|
|
||||||
.results-table {
|
.results-table {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue