e29cff21ae
Adds a bubbles/table alert list showing Name, Status, Started (relative time), and Ack By columns. Stats bar shows total/firing/resolved counts. Filter cycles firing → resolved → all with [f]. Auto-refresh fires on the configured interval via tea.Tick. Table scrolls with j/k.
105 lines
2.0 KiB
Go
105 lines
2.0 KiB
Go
package tui
|
|
|
|
import (
|
|
tea "github.com/charmbracelet/bubbletea"
|
|
)
|
|
|
|
func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|
switch msg := msg.(type) {
|
|
case tea.WindowSizeMsg:
|
|
m.width = msg.Width
|
|
m.height = msg.Height
|
|
m.rebuildTable()
|
|
return m, nil
|
|
|
|
case connectedMsg:
|
|
m.connected = true
|
|
m.err = nil
|
|
return m, tea.Batch(
|
|
tickCmd(m.refreshInterval),
|
|
fetchAlertsCmd(m.client, m.filterStatus),
|
|
fetchStatsCmd(m.client),
|
|
)
|
|
|
|
case connectErrMsg:
|
|
m.connected = false
|
|
m.err = msg.err
|
|
return m, nil
|
|
|
|
case alertsFetchedMsg:
|
|
m.alerts = msg.alerts
|
|
m.loading = false
|
|
m.rebuildTable()
|
|
return m, nil
|
|
|
|
case statsFetchedMsg:
|
|
m.stats = &msg.stats
|
|
return m, nil
|
|
|
|
case fetchDataErrMsg:
|
|
m.statusMsg = "error: " + msg.err.Error()
|
|
return m, clearStatusCmd()
|
|
|
|
case tickMsg:
|
|
return m, tea.Batch(
|
|
tickCmd(m.refreshInterval),
|
|
fetchAlertsCmd(m.client, m.filterStatus),
|
|
fetchStatsCmd(m.client),
|
|
)
|
|
|
|
case clearStatusMsg:
|
|
m.statusMsg = ""
|
|
return m, nil
|
|
|
|
case tea.KeyMsg:
|
|
if m.activeSection == sectionAlerts && m.connected {
|
|
var tableCmd tea.Cmd
|
|
m.alertTable, tableCmd = m.alertTable.Update(msg)
|
|
m2, ourCmd := m.handleKey(msg)
|
|
return m2, tea.Batch(tableCmd, ourCmd)
|
|
}
|
|
return m.handleKey(msg)
|
|
}
|
|
|
|
return m, nil
|
|
}
|
|
|
|
func (m Model) handleKey(msg tea.KeyMsg) (Model, tea.Cmd) {
|
|
switch msg.String() {
|
|
case "q", "ctrl+c":
|
|
return m, tea.Quit
|
|
|
|
case "tab":
|
|
m.activeSection = (m.activeSection + 1) % 3
|
|
return m, nil
|
|
|
|
case "r":
|
|
if !m.connected {
|
|
return m, connectCmd(m.client)
|
|
}
|
|
m.statusMsg = "Refreshing…"
|
|
return m, tea.Batch(
|
|
fetchAlertsCmd(m.client, m.filterStatus),
|
|
fetchStatsCmd(m.client),
|
|
clearStatusCmd(),
|
|
)
|
|
|
|
case "f":
|
|
if m.activeSection != sectionAlerts || !m.connected {
|
|
return m, nil
|
|
}
|
|
switch m.filterStatus {
|
|
case "firing":
|
|
m.filterStatus = "resolved"
|
|
case "resolved":
|
|
m.filterStatus = ""
|
|
default:
|
|
m.filterStatus = "firing"
|
|
}
|
|
m.loading = true
|
|
return m, fetchAlertsCmd(m.client, m.filterStatus)
|
|
}
|
|
|
|
return m, nil
|
|
}
|