feat(tui): single-dashboard layout with sidebar and overlay
CI / test (pull_request) Successful in 1m44s
CI / lint (pull_request) Successful in 1m16s
CI / vulncheck (pull_request) Successful in 50s

Replace 3-tab navigation with a single monitoring dashboard.

- Replace tab bar with minimal status line (pulse + counts + version)
- Maintenance becomes a toggleable left sidebar (m key)
  - Compact list: active (●) and scheduled (○) windows
  - Enter opens full-screen detail with end/delete actions
- Settings becomes a centered floating overlay (S key)
  - Alerts/Nodes/Users sub-sections with left/right navigation
  - Full CRUD support inside overlay with returnState tracking
- Remove currentTab, switchTab, tab constants, tab click zones
- Replace deleteTab with deleteKind string for cleaner dispatch
- Separate settingsCursor/settingsOffset from main cursor
- Panel focus: maint → monitors → logs → detail
- Context-sensitive footer key hints per focused panel
This commit was merged in pull request #162.
This commit is contained in:
2026-06-29 16:12:53 -04:00
parent aeee2cd0ce
commit 1856820c3e
11 changed files with 744 additions and 554 deletions
+12 -3
View File
@@ -292,10 +292,14 @@ func (m Model) fmtAlertConfigFull(alert models.AlertConfig) string {
}
func (m Model) viewAlertDetailPanel() string {
if m.cursor >= len(m.alerts) {
idx := m.cursor
if m.returnState == stateSettings {
idx = m.settingsCursor
}
if idx >= len(m.alerts) {
return ""
}
a := m.alerts[m.cursor]
a := m.alerts[idx]
h := m.engine.GetAlertHealth(a.ID)
var b strings.Builder
@@ -604,7 +608,12 @@ func (m *Model) submitAlertForm() tea.Cmd {
ctx := m.ctx
id := m.editID
name, aType := d.Name, d.AlertType
m.state = stateDashboard
if m.returnState == stateSettings {
m.state = stateSettings
} else {
m.state = stateDashboard
}
m.returnState = 0
if id > 0 {
return writeCmd("Update alert", func() error {
return st.UpdateAlert(ctx, id, name, aType, settings)