feat(tui): SLA and history as sidebar detail modes

SLA and History views now render inside the detail sidebar panel
instead of taking over the full screen. Press s/h to switch modes,
Esc to return to default detail view. Cursor movement resets to
default mode.

- Add detailMode state (detailDefault/detailSLA/detailHistory)
- SLA sidebar: period selector, uptime bars, daily breakdown
- History sidebar: sparkline density, transition list, stats
- Panel title shows "SLA · name" or "History · name" in sub-modes
- Period keys [1]-[4] work in SLA mode from dashboard state
This commit is contained in:
2026-06-30 09:09:04 -04:00
parent 2779f9f532
commit 8581662237
4 changed files with 189 additions and 14 deletions
+13 -3
View File
@@ -186,12 +186,18 @@ func (m Model) viewMonitorsLayout() string {
}
topParts = append(topParts, monPanel)
if showDetail {
site := ""
title := ""
if m.cursor < len(m.sites) {
site = m.sites[m.cursor].Name
title = m.sites[m.cursor].Name
}
switch m.detailMode {
case detailSLA:
title = "SLA · " + title
case detailHistory:
title = "History · " + title
}
detail := m.viewDetailInline(detailW - 2)
detailPanel := m.zones.Mark("panel-detail", m.titledPanel(site, detail, detailW, m.focusedPanel == panelDetail))
detailPanel := m.zones.Mark("panel-detail", m.titledPanel(title, detail, detailW, m.focusedPanel == panelDetail))
topParts = append(topParts, detailPanel)
}
@@ -279,6 +285,10 @@ func (m Model) renderFooter(_ dashboardStats) string {
var keys string
if m.focusedPanel == panelMaint {
keys = "[n]New [x]End [d]Del [Esc]Back [S]Settings [T]Theme [q]Quit"
} else if m.detailOpen && m.detailMode == detailSLA {
keys = "[1-4]Period [Esc]Back [S]Settings [T]Theme [q]Quit"
} else if m.detailOpen && m.detailMode == detailHistory {
keys = "[Esc]Back [S]Settings [T]Theme [q]Quit"
} else if m.detailOpen {
keys = "[i]Close [Enter]Expand [h]History [s]SLA [e]Edit [m]Maint [l]Logs [S]Settings [T]Theme [q]Quit"
} else {