feat!: stats as a section instead of an overlay
Release / test (push) Failing after 6s
Release / build (amd64, darwin) (push) Has been skipped
Release / build (amd64, linux) (push) Has been skipped
Release / build (arm64, darwin) (push) Has been skipped
Release / build (arm64, linux) (push) Has been skipped
Release / release (push) Has been skipped
Release / test (push) Failing after 6s
Release / build (amd64, darwin) (push) Has been skipped
Release / build (amd64, linux) (push) Has been skipped
Release / build (arm64, darwin) (push) Has been skipped
Release / build (arm64, linux) (push) Has been skipped
Release / release (push) Has been skipped
Stats was the one full-screen view reached by a key of its own rather than by tab, and the interface was less coherent for it. It is now a section sitting third, after Alerts, and behaves like every other one: tab in, tab out, r to refresh. Three things fall out of the move. It auto-refreshes for the first time — the tick handler skips every non-dashboard mode, which is why the overlay never updated while it was open. Its error path no longer forces the queue back into view on a failed fetch, an assumption that only made sense while stats floated above the dashboard. And first-visit loading keys off a statsLoaded flag rather than slice emptiness, because the three empty slices a quiet server returns are a real answer, not a missing one; the loading placeholder is likewise suppressed once something has been drawn, so a background refresh cannot blank the page out from under whoever is reading it. The S key is gone, and with it the ability to peek at statistics from an open incident and land back on it. That round-trip was the only thing statsReturnMode bought, and it was the whole reason stats needed a mode.
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
tea "github.com/charmbracelet/bubbletea"
|
||||
"github.com/yeniklas/terdut-tui/internal/api"
|
||||
)
|
||||
|
||||
@@ -239,7 +240,7 @@ func TestView_TabsAndDashboardRender(t *testing.T) {
|
||||
m.rebuildIncidentTable()
|
||||
|
||||
mustContain(t, m.View(),
|
||||
"Incidents", "Alerts", "Archived", "Schedule", "Users",
|
||||
"Incidents", "Alerts", "Stats", "Archived", "Schedule", "Users",
|
||||
"Triggered: 1", "filter: open",
|
||||
"DiskFull", "critical", "admin",
|
||||
"enter·detail")
|
||||
@@ -254,6 +255,27 @@ func TestView_EmptyStates(t *testing.T) {
|
||||
mustContain(t, m.View(), "No archived incidents.")
|
||||
}
|
||||
|
||||
// The stats page renders inside the normal section chrome now, so it has to
|
||||
// survive the real path: a window size message sizes the viewport and fills it.
|
||||
func TestView_StatsSectionRendersInPlace(t *testing.T) {
|
||||
m := NewModel(nil, "http://test", time.Minute)
|
||||
m.connected = true
|
||||
m.incidentStats = &api.IncidentStats{Total: 3, Triggered: 1}
|
||||
m.topAlerts = []api.TopAlert{{Name: "DiskFull", Count: 4}}
|
||||
m.statsLoaded = true
|
||||
|
||||
next, _ := m.Update(tea.WindowSizeMsg{Width: 120, Height: 40})
|
||||
m = next.(Model)
|
||||
m.activeSection = sectionStats
|
||||
|
||||
out := m.View()
|
||||
mustContain(t, out, "Stats", "Incident Response", "Top Alerts", "DiskFull",
|
||||
"tab·section")
|
||||
if strings.Contains(plain(out), "Loading statistics") {
|
||||
t.Error("loaded stats should not show the loading placeholder")
|
||||
}
|
||||
}
|
||||
|
||||
func TestView_ConnectionError(t *testing.T) {
|
||||
m := sized()
|
||||
m.connected = false
|
||||
|
||||
Reference in New Issue
Block a user